job,挖矿收益计算

This commit is contained in:
chaosBreaking
2019-09-29 12:59:34 +08:00
parent d15ef1bf7e
commit fc383be299
3 changed files with 91 additions and 76 deletions

View File

@@ -22,8 +22,11 @@ const system = require('../modules/system/system.model');
const { createAction } = require('../modules/action/action.handler'); const { createAction } = require('../modules/action/action.handler');
const { createNewFund } = require('../modules/fund/fund.handler'); const { createNewFund } = require('../modules/fund/fund.handler');
const tokenReleaseRate = 0.2; const tokenReleaseRate = 0.02;
async function awardMine(user, fund, i) { async function awardMine(user, fund) {
if (!user || !fund || fund.fundList.length === 0) return 0;
let sum = 0;
for (let i = 0, len = fund.fundList.length; i < len; ++i) {
const released = fund.releasedAmout || 0; const released = fund.releasedAmout || 0;
if (released === fund.releasedAmout) { if (released === fund.releasedAmout) {
await Fund.findByIdAndUpdate(fund.id, { await Fund.findByIdAndUpdate(fund.id, {
@@ -33,11 +36,12 @@ async function awardMine(user, fund, i) {
}); });
return 0; return 0;
} }
const rewardMine = +fund.amount * tokenReleaseRate; sum += +fund.fundList[i].amount * tokenReleaseRate;
return rewardMine; }
return sum;
} }
function awardInvite(user, fund, allInviteReward) { function awardInvite(user, fund, allInviteReward) {
const rewardInvite = allInviteReward - (fund.option.usedGroupReward || 0); // 求增量: 总额 - 已领取总额(fundSum) const rewardInvite = allInviteReward - (fund.option && fund.option.usedGroupReward || 0); // 求增量: 总额 - 已领取总额(fundSum)
// 挖矿奖励 = 充值金额奖励 + 社区奖励 // 挖矿奖励 = 充值金额奖励 + 社区奖励
return rewardInvite; return rewardInvite;
} }
@@ -46,47 +50,46 @@ const doReward = async (user, fund) => {
// 1.对于充值的fundList的每一项按照2%进行发放累加到asset.vic添加action类型为1 // 1.对于充值的fundList的每一项按照2%进行发放累加到asset.vic添加action类型为1
// 2.对于社团成员进行人头数目按照10vic/人进行奖励累加到asset.vic添加action类型为2 // 2.对于社团成员进行人头数目按照10vic/人进行奖励累加到asset.vic添加action类型为2
if (!user || !fund) return 0; if (!user || !fund) return 0;
const fundlist = fund.fundList;
for (let i = 0, len = fundlist.length; i < len; ++i) {
const fund = fundlist[i];
const allInviteReward = (+user.group.length || 0) * 10; const allInviteReward = (+user.group.length || 0) * 10;
const rewardMine = awardMine(user, fund, i); const rewardMine = await awardMine(user, fund);
const rewardInvite = awardInvite(user, fund, allInviteReward); const rewardInvite = awardInvite(user, fund, allInviteReward);
const reward = rewardMine + rewardInvite; const reward = rewardMine + rewardInvite;
await Fund.findByIdAndUpdate(fund.id, {
reward && await Fund.findByIdAndUpdate(fund.id, {
$inc: { $inc: {
'asset.vic': reward, 'asset.vic': reward,
}, },
$set: { $set: {
'option.usedGroupReward': rewardInvite, // 本次的奖励值累加到已领取团队奖励总和内 'option.usedGroupReward': rewardInvite, // 本次的奖励值累加到已领取团队奖励总和内
'asset.usdt': allInviteReward // 用来记录所有社群奖励总额 'asset.usdt': allInviteReward, // 用来记录所有社群奖励总额
'lastMine': new Date().toISOString()
} }
}).then(() => { }).then(() => {
rewardMine > 0 && createAction(1, { rewardMine > 0 && createAction(1, {
userId: fund.userId, userId: user.id,
tokenType: 'vic', tokenType: 'vic',
amount: rewardMine, amount: rewardMine,
remain: fund.asset remain: fund.asset
}).save(); }).save();
rewardInvite > 0 && createAction(2, { rewardInvite > 0 && createAction(2, {
userId: fund.userId, userId: user.id,
tokenType: 'vic', tokenType: 'vic',
amount: rewardInvite, amount: rewardInvite,
remain: fund.asset remain: fund.asset
}).save(); }).save();
}); });
}
}; };
const mock = {
const jobs = [ touch: () => {console.log('touch');},
{ done: () => {console.log('done');},
name: 'mine', };
processor: async (job, done) => { async function mine (job = mock, done = mock) {
//todo: 程序内检查是否可以执行,保证不会启动时错误的自动执行一次 //todo: 程序内检查是否可以执行,保证不会启动时错误的自动执行一次
mylog.info('[Schedule Job] 开始定时计算作业...'); mylog.info('[Schedule Job] 开始定时计算作业...');
let currentIndex = await system.findOne({ let currentIndex = await system.findOne({
key: 'userIndex4job' key: 'userIndex4job'
}).exec(); }).exec();
currentIndex = currentIndex.value;
if (typeof currentIndex !== 'number') { if (typeof currentIndex !== 'number') {
currentIndex = 0; currentIndex = 0;
await new system({ await new system({
@@ -97,20 +100,31 @@ const jobs = [
// 批量更新,每次十个 // 批量更新,每次十个
const userFundList = await Fund.find().sort('_id').limit(10).skip(currentIndex); const userFundList = await Fund.find().sort('_id').limit(10).skip(currentIndex);
job.touch(); // job.touch();
mylog.info('touch');
if (!userFundList || !Array.isArray(userFundList)) return 0; if (!userFundList || !Array.isArray(userFundList)) return 0;
currentIndex += userFundList.length;
for (let i = 0, len = userFundList.length; i < len; ++i) { for (let i = 0, len = userFundList.length; i < len; ++i) {
const fundItem = userFundList[i]; // 一条数据库fund表记录 const fund = userFundList[i]; // 一条数据库fund表记录
const funds = fundItem.fundList; if (fund.lastMine && new Date(fund.lastMine).getDate() === new Date().getDate()) {
if (!funds || !Array.isArray(funds)) continue; mylog.info('已经计算过...跳过');
const user = await User.findOne({ id: fundItem.userId }).exec(); continue;
doReward(user, funds); }
job.touch(); const user = await User.findById(fund.userId).exec();
await doReward(user, fund);
// job.touch();
await system.updateOne({ key: 'userIndex4job' }, {
$set: {
value: currentIndex
}
});
} }
mylog.info('收益计算分配完成'); mylog.info('收益计算分配完成');
done('收益计算分配完成'); // done('收益计算分配完成');
}, }
const jobs = [
{
name: 'mine',
processor: mine,
type: 'every', type: 'every',
slot: '0 0 3 * * *', slot: '0 0 3 * * *',
priority: 'highest', priority: 'highest',

View File

@@ -241,7 +241,7 @@ module.exports = {
basic: { basic: {
activeFund, activeFund,
revenueLastday, revenueLastday,
revenueAll: fund.asset && fund.asset['vic'] revenueAll: fund.asset && +fund.asset['vic'] - +fund.asset['usdt'] // 总金额 - 社区奖励 = 挖矿奖励
} }
} }
}); });
@@ -262,7 +262,7 @@ module.exports = {
basic: { basic: {
activeFund, //有效矿晶 activeFund, //有效矿晶
revenueLastday, // 昨日收益 revenueLastday, // 昨日收益
revenueAll: newFund.asset['vic'] // 累计总收益 revenueAll: +newFund.asset['vic'] - +newFund.asset['usdt'] // 累计总收益 - 社区奖励 = 挖矿奖励
} }
} }
}); });
@@ -297,7 +297,7 @@ module.exports = {
data: { data: {
activeFund, activeFund,
revenueLastday, revenueLastday,
revenueAll: fund.asset && fund.asset['vic'] revenueAll: fund.asset && +fund.asset['vic'] - +fund.asset['usdt'] // 总金额 - 社区奖励 = 挖矿奖励
} }
}); });
}).catch(err => { }).catch(err => {

View File

@@ -49,7 +49,8 @@ const FundSchema = new mongoose.Schema({
default: 0 default: 0
}, },
lastMine: { lastMine: {
type: String type: String,
default: new Date().toISOString()
}, },
lastDeposit: { lastDeposit: {
type: String type: String