task-svr/src/services/rank.svr.ts
2024-01-17 15:49:18 +08:00

66 lines
1.5 KiB
TypeScript

import { ScoreRecord } from 'models/ScoreRecord'
import { RedisClient } from 'redis/RedisClient'
import { formatDate } from 'zutils/utils/date.util'
/**
* 更新排行榜
* @param param0
* user: 用户id
* score: 分数
* activity: 活动id
* scoreType: 分数类型
* scoreParams: 额外的参数
*/
export const updateRankScore = async ({
user,
score,
activity,
scoreType,
scoreParams,
}: {
user: string
score: number
activity: string
scoreType: string
scoreParams: any
}) => {
let record = new ScoreRecord({
user: user,
activity: activity,
score,
type: scoreType,
data: scoreParams,
})
await record.save()
const key = rankKey(activity)
await updateRank(key, score, user)
// add daily score
const dailyKey = rankKey(activity, new Date())
await updateRank(dailyKey, score, user)
}
/**
* 更新排行榜
* @param key
* @param score
* @param member
*/
const updateRank = async (key: string, score: number, member: string) => {
let scoreSaved = (await new RedisClient().zscore(key, member)) + ''
if (scoreSaved) {
scoreSaved = scoreSaved.substring(0, scoreSaved.indexOf('.'))
}
let scoreOld = parseInt(scoreSaved || '0')
score = score + scoreOld
const scoreToSave = score + 1 - Date.now() / 1000 / 10000000000
await new RedisClient().zadd(key, scoreToSave, member)
}
export const rankKey = (activity: string, date?: Date) => {
if (!date) {
return `${activity}:score`
}
const dateTag = formatDate(date)
return `${activity}:score:${dateTag}`
}