diff --git a/src/jobs/jobs.js b/src/jobs/jobs.js index 4cb5a13..bc11dc3 100644 --- a/src/jobs/jobs.js +++ b/src/jobs/jobs.js @@ -15,115 +15,9 @@ * } */ const mongoose = require('mongoose'); -const User = require('../modules/user/user.model'); const Fund = require('../modules/fund/fund.model'); -const Action = require('../modules/action/action.model'); -const system = require('../modules/system/system.model'); -const { createAction } = require('../modules/action/action.handler'); -const { createNewFund } = require('../modules/fund/fund.handler'); const exec = require('child_process').exec; -const tokenReleaseRate = 0.02; -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) { - await Fund.findByIdAndUpdate(fund.id, { - $set: { - [`fundList.${i}.status`]: 2 //标记失效 - } - }); - return 0; - } - sum += +fund.fundList[i].amount * tokenReleaseRate; - } - return sum; -} -function awardInvite(user, fund, allInviteReward) { - const rewardInvite = allInviteReward - (fund.option && fund.option.usedGroupReward || 0); // 求增量: 总额 - 已领取总额(fundSum) - // 挖矿奖励 = 充值金额奖励 + 社区奖励 - return rewardInvite; -} -// 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 allInviteReward = (+user.group.length || 0) * 5; - const rewardMine = await awardMine(user, fund); - const rewardInvite = awardInvite(user, fund, allInviteReward); - const reward = rewardMine + rewardInvite; - - reward && await Fund.findByIdAndUpdate(fund.id, { - $inc: { - 'asset.vic': reward, - }, - $set: { - 'option.usedGroupReward': rewardInvite, // 本次的奖励值累加到已领取团队奖励总和内 - 'asset.usdt': allInviteReward, // 用来记录所有社群奖励总额 - 'lastMine': new Date().toISOString() - } - }).then(() => { - rewardMine > 0 && createAction(1, { - userId: user.id, - tokenType: 'vic', - amount: rewardMine, - remain: fund.asset - }).save(); - rewardInvite > 0 && createAction(2, { - userId: user.id, - tokenType: 'vic', - amount: rewardInvite, - remain: fund.asset - }).save(); - }); -}; -const mock = { - touch: () => {console.log('touch');}, - done: () => {console.log('done');}, -}; -async function mine (job = mock, done = mock) { - //todo: 程序内检查是否可以执行,保证不会启动时错误的自动执行一次 - mylog.info('[Schedule Job] 挖矿程序 开始定时计算作业...'); - let currentIndex = await system.findOne({ - key: 'userIndex4job' - }).exec(); - currentIndex = currentIndex.value; - if (typeof currentIndex !== 'number') { - currentIndex = 0; - await new system({ - key: 'userIndex4job', - value: currentIndex - }).save(); - } - - // 批量更新,每次十个 - const userFundList = await Fund.find().sort('_id').limit(10).skip(currentIndex); - typeof job.touch === 'function' && job.touch(); - mylog.info('touch'); - 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; - } - const user = await User.findById(fund.userId).exec(); - mylog.info('开始更新用户: ', user.id); - await doReward(user, fund); - mylog.info('用户: ', user.id, '更新完毕'); - typeof job.touch === 'function' && job.touch(); - await system.updateOne({ key: 'userIndex4job' }, { - $set: { - value: currentIndex - } - }); - } - mylog.info('收益计算分配完成'); - typeof done === 'function' && done('收益计算分配完成'); -} async function confirm (job = mock, done = mock) { mylog.info('[Schedule Job] 矿晶确认程序开始执行......'); const unconfirmed = await Fund.find({ @@ -160,7 +54,12 @@ async function mineJob (job = mock, done = mock) { mylog.info('child process exited with code ' + code); // 输出到控制台 mylog.info('挖矿程序执行完毕'); }); - typeof done === 'function' && done('挖矿程序执行完毕'); + rl.on('message', function () { + job.touch(); + }); + rl.on('exit', function () { + typeof done === 'function' && done('挖矿程序执行完毕'); + }); } const jobs = [ diff --git a/src/jobs/mine.js b/src/jobs/mine.js index c5621f5..126c847 100644 --- a/src/jobs/mine.js +++ b/src/jobs/mine.js @@ -56,7 +56,14 @@ async function awardMine(user, fund) { }); return 0; } - sum += +fund.fundList[i].amount * tokenReleaseRate; + 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); } @@ -156,14 +163,17 @@ async function mine (job = mock, done = mock) { value: -1 } }); + typeof process.send === 'function' && process.send('tick'); } currentIndex += 10; probe.currentIndex = currentIndex; } mylog.info('收益计算分配完成'); + typeof process.send === 'function' && process.send('tick'); await system.findOneAndUpdate({ key: 'userIndex4job' }, { $set: { value: 0 } }).exec(); + typeof process.send === 'function' && process.send('tick'); await system.findOneAndUpdate({ key: 'mineCount', }, { @@ -171,12 +181,13 @@ async function mine (job = mock, done = mock) { value: 1 } }, { upsert: true }); + typeof process.send === 'function' && process.send('tick'); await system.findOneAndUpdate({ key: 'lastMine', }, { value: new Date().toISOString() }, { upsert: true }); - + typeof process.send === 'function' && process.send('tick'); typeof done === 'function' && done('收益计算分配完成'); process.exit(); } diff --git a/src/modules/admin/admin.controller.js b/src/modules/admin/admin.controller.js index c9f3b2a..2d2234c 100644 --- a/src/modules/admin/admin.controller.js +++ b/src/modules/admin/admin.controller.js @@ -149,9 +149,9 @@ module.exports = { async handleVreq (req, res) { const { adminId } = res.locals.user; if (!adminId) return res.json({ code: 1, msg: '非法访问' }); - const { vreqId } = req.body.query; + const { vreqId, op, info } = req.body.query; // op 1为通过验证 0为拒绝验证 return await Vreq.findById(vreqId).then(vreq => { - handleReq(vreq, adminId).then(data => { + handleReq(vreq, adminId, op, info).then(data => { return res.json(data); }); }); diff --git a/src/modules/vreq/vreq.handler.js b/src/modules/vreq/vreq.handler.js index 46e082b..b4f1be0 100644 --- a/src/modules/vreq/vreq.handler.js +++ b/src/modules/vreq/vreq.handler.js @@ -9,30 +9,48 @@ function createVerifyReq (data) { }); } -async function handleReq (vreq, adminName) { - await User.findByIdAndUpdate(vreq.userId, { - verifyLevel: vreq.verifyLevel - }).catch(err => { - mylog.error(err); +async function handleReq (vreq, adminName, op, info) { + if (+op === 1) { // 认证通过 + await User.findByIdAndUpdate(vreq.userId, { + verifyLevel: vreq.verifyLevel + }).catch(err => { + mylog.error(err); + return { + code: 2, + msg: 'error', + err: err.msg + }; + }); + const resInfo = info || '审核通过'; + await vreq.updateOne({ status: 1, info: resInfo, handler: adminName }) + .catch(err => { + mylog.error(err); + return { + code: 2, + msg: 'error', + err: err.msg + }; + }); return { - code: 2, - msg: 'error', - err: err.msg + code: 0, + msg: '认证成功' }; - }); - await vreq.updateOne({ status: 1, info: '审核通过', handler: adminName }) - .catch(err => { - mylog.error(err); + } else if (+op === 0) { + const resInfo = info || '审核不通过'; + await vreq.updateOne({ status: 2, info: resInfo, handler: adminName }) + .catch(err => { + mylog.error(err); + return { + code: 2, + msg: 'error', + err: err.msg + }; + }); return { - code: 2, - msg: 'error', - err: err.msg + code: 0, + msg: '认证成功' }; - }); - return { - code: 0, - msg: '认证成功' - }; + } } module.exports = {