将gamerecord的更新改为原子操作

This commit is contained in:
CounterFire2023 2024-03-27 16:15:31 +08:00
parent 203c24b0f7
commit 8ea3064744
2 changed files with 22 additions and 17 deletions

View File

@ -104,10 +104,13 @@ class BoxController extends BaseController {
throw new ZError(15, 'can not enhance self')
}
const score = Math.floor(Math.random() * (chest.bounsCfg[1] - chest.bounsCfg[0] + 1) + chest.bounsCfg[0])
chest.bonusUsers.push(uid)
chest.bonusScores.push(score)
chest.scoreBonus += score
await chest.save()
await ActivityChest.updateOne(
{ _id: chest.id },
{
$inc: { scoreBonus: score },
$push: { bonusUsers: uid, bonusScores: score },
},
)
const chestsForUser = await ActivityChest.find({ user: uid, activity: user.activity })
// 如果用户没有宝箱, 则说明用户是新用户, 生成一个宝箱
if (chestsForUser.length === 0) {

View File

@ -34,8 +34,6 @@ class GameController extends BaseController {
throw new ZError(13, 'had not signed in')
}
const reward = seqSignScore(record.count)
gameRecord.lastSignDay = dateTag
gameRecord.tickets += 1 + reward
const ticketRecord = new TicketRecord({
user: user.id,
activity: user.activity,
@ -43,8 +41,11 @@ class GameController extends BaseController {
data: {},
score: 1 + reward,
})
await ActivityGame.updateOne(
{ user: user.id, activity: user.activity },
{ lastSignDay: dateTag, $inc: { tickets: 1 + reward } },
)
await ticketRecord.save()
await gameRecord.save()
return { ticket: reward + 1 }
}
@ -97,7 +98,7 @@ class GameController extends BaseController {
if (score === 0) {
throw new ZError(15, 'invalid days')
}
const record = new TicketRecord({
const ticketRecord = new TicketRecord({
user: user.id,
activity: user.activity,
type: SIGN_TOTAL,
@ -108,9 +109,8 @@ class GameController extends BaseController {
if (MANUAL_OPEN_GAME && gameRecord.status === 0) {
throw new ZError(12, 'map not open')
}
gameRecord.tickets += score
await gameRecord.save()
await record.save()
await ActivityGame.updateOne({ user: user.id, activity: user.activity }, { $inc: { tickets: score } })
await ticketRecord.save()
return { ticket: score }
}
/**
@ -209,7 +209,6 @@ class GameController extends BaseController {
if (record.tickets < step) {
throw new ZError(13, 'insufficient tickets')
}
record.tickets -= step
const ticketRecord = new TicketRecord({
user: user.id,
activity: user.activity,
@ -217,17 +216,20 @@ class GameController extends BaseController {
data: {},
score: -step,
})
let updateData: any = {
$inc: { tickets: -step },
}
let { score, chests } = generateStepReward(user.id, user.activity, step)
if (chests.length > 0) {
record.maxNoChestCount = 0
updateData.maxNoChestCount = 0
} else {
record.maxNoChestCount += step
if (record.maxNoChestCount >= RESET_STEP) {
record.maxNoChestCount = 0
if (record.maxNoChestCount + step >= RESET_STEP) {
updateData.maxNoChestCount = 0
const level = generateChestLevel()
chests.push(generateNewChest(user.id, user.activity, level, ChestStatusEnum.NORMAL))
}
}
await ActivityGame.updateOne({ user: user.id, activity: user.activity }, updateData)
await updateRankScore({
user: user.id,
score: score,
@ -237,12 +239,12 @@ class GameController extends BaseController {
step: step,
},
})
// batch save chests
for (let chest of chests) {
await chest.save()
}
await ticketRecord.save()
// await ticketRecord.save({ session })
await record.save()
// await session.commitTransaction()
// session.endSession()
return { score, chests: chests.map(chest => chest.toJson()) }