'use strict'; const mongoose = require('mongoose'); const Fund = require('./src/modules/fund/fund.model'); const Action = require('./src/modules/action/action.model'); const PrettyStream = require('bunyan-pretty-colors'); const bunyan = require('bunyan'); const path = require('path'); const fs = require('fs'); const prettyStdOut = new PrettyStream(); if (!fs.existsSync('clean')) { fs.mkdirSync('clean'); } const logger = function (option) { option = option || {}; return bunyan.createLogger({ name: "log", src: false, streams: [ { level: 'info', stream: prettyStdOut }, { level: 'info', type: 'rotating-file', path: path.join(option.root, option.file || 'info.log'), period: '1d', // daily rotation count: 365 // keep 30 days } ] }); }; const filename = 'clean' + new Date().getFullYear() + new Date().getMonth() + new Date().getDate(); const mylog = logger(({ root: 'clean', file: filename })); const probe = { currentIndex: 0 }; async function clean () { let allFund = await Fund.find({ fundSum: { $gt: 0 } }); // 批量更新,每次十个 for (let currentIndex = 0; currentIndex < allFund.length; currentIndex++) { const userFund = allFund[currentIndex]; const fundList = userFund.fundList; const boughtAmountSum = fundList.reduce((sum, fund) => sum + +fund.amount, 0); const releasedAmout = (await Action.find({ type: '1', userId: userFund.userId })).reduce((sum, action) => sum + +action.amount, 0); const rest = boughtAmountSum - releasedAmout; mylog.info('No. ', currentIndex, '用户' + userFund.userId, '剩余 ', rest); const vic = userFund.asset.vic || 0; const newFund = vic + rest; await Fund.findByIdAndUpdate(userFund.id, { vicFundSum: newFund, 'asset.vic': 0, 'asset.usdt': 0, fundList: [], snapshot: { asset: userFund.asset, fundList } }); probe.currentIndex = currentIndex; } } const start = async (job, done) => { const SysConfig = require('./configSec'); mongoose.set('useCreateIndex', true); const { DB_USER_NAME, DB_PASSWD, DB_HOST, DB_PORT, DB_NAME } = SysConfig; const db = mongoose.connection; db.on('error', mylog.error); db.once('open', function() { mylog.info('数据库连接成功...'); }); mylog.info('开始连接数据库...'); await mongoose.connect(`mongodb://${DB_USER_NAME}:${DB_PASSWD}@${DB_HOST}:${DB_PORT}/${DB_NAME}`, { useNewUrlParser: true, bufferMaxEntries: 0, autoReconnect: true, useFindAndModify: false, useUnifiedTopology: true }); const beforeExit = async (msg) => { mylog.info('意外退出', msg); mylog.info('进行到第'+ probe.currentIndex + '个用户'); process.exit(0); }; process.on('SIGINT', beforeExit); process.on('uncaughtException', beforeExit); process.on('unhandledRejection', beforeExit); typeof process.send === 'function' && process.send('子进程开始执行mine'); clean(job, done); typeof process.send === 'function' && process.send('子进程mine执行完毕'); process.exit(); }; start();