feat: reward

This commit is contained in:
chaosBreaking
2019-10-26 17:28:52 +08:00
parent de4e1d2683
commit 4688a2fa41
4 changed files with 110 additions and 124 deletions

View File

@@ -38,81 +38,71 @@ const Fund = require('../modules/fund/fund.model');
const system = require('../modules/system/system.model');
const { createAction } = require('../modules/action/action.handler');
const tokenReleaseRate = 0.02;
const inviteReward = 2.5;
const getProfitRate = base => {
if (base > 0 && base <= 10000) {
return 0.0002;
} else if (base > 10000 && base <= 50000) {
return 0.0005;
} else if (base > 50000 && base <= 100000) {
return 0.0008;
} else if (base > 100000 && base <= 200000) {
return 0.0010;
} else if (base > 200000 && base <= 500000) {
return 0.0015;
} else if (base > 500000 && base <= 1000000) {
return 0.0020;
} else if (base > 1000000 && base <= 10000000) {
return 0.0030;
} else return 0;
};
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;
if (released === fund.releasedAmout) {
mylog.info('矿晶失效,开始标记');
await Fund.findByIdAndUpdate(fund.id, {
$set: {
[`fundList.${i}.status`]: 2 //标记失效
}
});
return 0;
}
const profit = +fund.fundList[i].amount * tokenReleaseRate;
await Fund.findByIdAndUpdate(fund.id, {
$inc: {
[`fundList.${i}.mineCount`]: 1,
[`fundList.${i}.releasedAmout`]: profit,
},
});
sum += profit;
}
return sum.toFixed(2);
}
function awardInvite(user, fund) {
const follerNum = user.group.length || 0;
const hasAwardFoller = fund.option && fund.option.usedGroupReward / 10 || 0; // 求增量: 总额 - 已领取总额(fundSum)
const newFoller = follerNum - hasAwardFoller;
if (newFoller < 0) return 0;
// 挖矿奖励 = 充值金额奖励 + 社区奖励
return (newFoller * inviteReward).toFixed(2);
function awardMine(user, fund) {
if (!user || !fund || fund.vicFundSum === 0) return 0;
const base = +fund.vicFundSum;
const rate = getProfitRate(base);
return base * rate;
}
// fund.option.usedGroupReward : 已领取的社群奖励总额
const doReward = async (user, fund) => {
// 1.对于充值的fundList的每一项按照2%进行发放累加到asset.vic添加action类型为1
// 2.对于社团成员进行人头数目按照10vic/人进行奖励累加到asset.vic添加action类型为2
if (!user || !fund) return 0;
const rewardMine = await awardMine(user, fund);
// const rewardInvite = awardInvite(user, fund);
const rewardInvite = 0;
const reward = +rewardMine + rewardInvite;
const rewardMine = awardMine(user, fund);
if (rewardMine === 0) return 0;
const rewardInviter = +user.vicFundSum > 10000 ? rewardMine * 0.04 : 0;
mylog.info('挖矿奖励: ', rewardMine);
mylog.info('社群奖励: ', rewardInvite);
reward && await Fund.findByIdAndUpdate(fund.id, {
rewardMine && await Fund.findByIdAndUpdate(fund.id, {
$inc: {
'asset.vic': reward,
'asset.usdt': rewardInvite, // 用来记录所有社群奖励总额
vicFundSum: rewardMine,
},
$set: {
'option.newFoller': rewardInvite / 5,
'option.usedGroupReward': rewardInvite, // 本次的奖励值累加到已领取团队奖励总和内
'lastMine': new Date().toISOString()
lastMine: new Date().toISOString()
}
}).then(() => {
rewardMine > 0 && createAction(1, {
userId: user.id,
tokenType: 'vic',
tokenType: 'vic2vic', // 新模式标记
amount: rewardMine,
remain: fund.asset
}).save();
rewardInvite > 0 && createAction(2, {
userId: user.id,
tokenType: 'vic',
amount: rewardInvite,
remain: fund.asset
}).save();
if (rewardInviter > 0) {
User.findByIdAndUpdate(user.inviter, {
$inc: {
vicFundSum: rewardInviter
}
}).then(() => {
createAction(2, {
userId: user.inviter,
tokenType: 'vic2vic', // 新模式标记
amount: rewardInviter,
remain: fund.asset
}).save();
}).catch(() => null);
}
});
};
const mock = {
touch: () => {mylog.info('-----------------\n');},
done: () => {mylog.info('done');},
touch: () => { mylog.info('-----------------\n'); },
done: () => { mylog.info('done'); },
};
async function mine (job = mock, done = mock) {
@@ -142,10 +132,10 @@ async function mine (job = mock, done = mock) {
if (!userFundList || !Array.isArray(userFundList)) return 0;
for (let i = 0, len = userFundList.length; i < len; ++i) {
const fund = userFundList[i]; // 一条数据库fund表记录
// if (fund.lastMine && new Date(fund.lastMine).getDate() === new Date().getDate()) {
// mylog.info('已经计算过...跳过');
// continue;
// }
if (fund.lastMine && new Date(fund.lastMine).getDate() === new Date().getDate()) {
mylog.info('已经计算过...跳过');
continue;
}
const user = await User.findById(fund.userId).exec();
mylog.info('No. ', currentIndex, ' - ', i);
mylog.info('开始更新用户: ', user.id);