diff --git a/src/checkredis2.ts b/src/checkredis2.ts new file mode 100644 index 0000000..a66bc82 --- /dev/null +++ b/src/checkredis2.ts @@ -0,0 +1,58 @@ +import mongoose from 'mongoose' +import * as dotenv from 'dotenv' + +const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' +dotenv.config({ path: envFile }) +console.log(process.env.DB_MAIN) +import { ActivityChest } from 'models/ActivityChest' +import { ScoreRecord } from 'models/ScoreRecord' +import { DeleteRecord } from 'models/DeleteRecord' +import { rankKey, updateRank, updateRankInvite } from 'services/rank.svr' +import { ZRedisClient } from 'zutils' +import { RANK_SCORE_SCALE } from 'common/Constants' +const db = mongoose.connection + +const totalKey = 'uaw_activity:score' +const keyInvite = `uaw_activity:invite` + +;(async () => { + try { + let records = await ScoreRecord.aggregate([ + { $match: { type: 'invite_rebate' } }, + { + $group: { + _id: { + user: '$user', + from: '$data.fromUser', + }, + count: { $sum: '$score' }, + }, + }, + ]) + console.time('first') + // _id, count + console.log('records: ', records.length) + let opts = { url: process.env.REDIS } + new ZRedisClient(opts) + let vals = [] + for (let i = 0, l = records.length; i < l; i++) { + const score = parseInt(records[i].count * 100 + '') + const id = `${records[i]._id.from}_${records[i]._id.user}` + let totalScoreStr = await new ZRedisClient().zscore(keyInvite, id) + let totalScore = parseInt(totalScoreStr + '') + if (score != totalScore) { + if (Math.abs(score - totalScore) > 1) { + console.log(`user: ${records[i]._id.from}_${records[i]._id.user}, score: ${score}, redis: ${totalScore}`) + } + } + if (i % 1000 === 0) { + console.log(i) + } + } + console.timeEnd('first') + } catch (e) { + console.log(e) + } + console.log('end') + process.exit(0) +})() diff --git a/src/controllers/activity.controller.ts b/src/controllers/activity.controller.ts index 34759d0..26d5b68 100644 --- a/src/controllers/activity.controller.ts +++ b/src/controllers/activity.controller.ts @@ -7,7 +7,7 @@ import { ScoreRecord } from 'models/ScoreRecord' import { formatAddress } from 'zutils/utils/chain.util' import { formatNumShow, isValidShareCode } from 'common/Utils' import { checkReCaptcha } from 'services/google.svr' -import { RANK_SCORE_SCALE } from 'common/Constants' +import { RANK_SCORE_SCALE, SCORE_INVITE_REBATE } from 'common/Constants' import logger from 'logger/logger' const MAX_LIMIT = 100 @@ -93,12 +93,20 @@ export default class ActivityController extends BaseController { const totalKey = rankKey(user.activity) const keyInvite = `${user.activity}:invite` let users = await ActivityUser.find({ inviteUser: user.id }) + let records = await ScoreRecord.find({ type: SCORE_INVITE_REBATE, user: user.id, activity: user.activity }) + let scoreMap = new Map() + for (let r of records) { + if (!scoreMap.has(r.data.fromUser)) { + scoreMap.set(r.data.fromUser, 0) + } + scoreMap.set(r.data.fromUser, scoreMap.get(r.data.fromUser) + r.score) + } let results = [] for (let u of users) { const totalScore = await new ZRedisClient().zscore(totalKey, u.id) - const inviteScore = await new ZRedisClient().zscore(keyInvite, `${user.id}_${u.id}`) + // const inviteScore = await new ZRedisClient().zscore(keyInvite, `${user.id}_${u.id}`) const score = totalScore ? parseInt(totalScore + '') / RANK_SCORE_SCALE : 0 - const scoreInvite = inviteScore ? parseInt(inviteScore + '') / RANK_SCORE_SCALE : 0 + const scoreInvite = scoreMap.get(u.id) || 0 results.push({ // user: u.id, level: rankLevel(score),