🐞 fix(遗迹): 遗迹挑战机器人时交换排名有并发问题

This commit is contained in:
luying
2023-06-16 14:34:58 +08:00
parent b790c6039d
commit 58177dd58c
2 changed files with 7 additions and 7 deletions

View File

@@ -359,11 +359,11 @@ export class GVGProduceHandler {
let historyData = await GVGVestigeRankModel.findByRole(rec.vestigeId, roleId);
let historyRank = historyData?.rank||0;
// 交换排名
let { isChange, atkData, defData, endTime } = await GVGVestigeRankModel.changeRank(isSuccess, rec.vestigeId, rec.attackInfo, rec.defenseInfo);
let { isChange, atkData, defData, oldAtkData, endTime } = await GVGVestigeRankModel.changeRank(isSuccess, rec.vestigeId, rec.attackInfo, rec.defenseInfo);
atkData = await updateMyVestigeRank(isChange, atkData, defData, historyRank, rec);
// 更新vestigeRec
if(isChange) {
rec = await GVGVestigeRecModel.battleEnd(battleCode, isSuccess, endTime, atkData?.rank, defData? defData.rank: (isSuccess?rec.attackInfo.oldRank: rec.defenseInfo.oldRank));
rec = await GVGVestigeRecModel.battleEnd(battleCode, isSuccess, endTime, atkData?.rank, defData? defData.rank: oldAtkData?.rank);
} else {
rec = await GVGVestigeRecModel.battleEnd(battleCode, isSuccess, endTime);
}

View File

@@ -106,15 +106,15 @@ export default class GVGVestigeRank extends BaseModel {
await GVGVestigeRankModel.updateMany({ day: today, hasDefense: true, roleId, 'lineup.actorId': hid }, { $set: { 'lineup.$.ce': ce } });
}
public static async changeRank(isSuccess: boolean, vestigeId: number, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
public static async changeRank(isSuccess: boolean, vestigeId: number, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, oldAtkData?: GVGVestigeRankType, endTime: number }> {
let today = getZeroPoint();
const session = await mongoose.connection.startSession();
session.startTransaction()
try {
let newAtkData: GVGVestigeRankType, newDefData: GVGVestigeRankType, isChange = false, endTime = Date.now();
let newAtkData: GVGVestigeRankType, newDefData: GVGVestigeRankType, atkData: GVGVestigeRankType, isChange = false, endTime = Date.now();
if(defenseInfo.isRobot) {
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
if(isSuccess && atkData && (atkData.rank == 0 || atkData.rank > defenseInfo.oldRank)) {
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
isChange = true;
@@ -123,7 +123,7 @@ export default class GVGVestigeRank extends BaseModel {
newAtkData = atkData;
}
} else {
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
let defData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: defenseInfo.roleId }).lean();
if(isSuccess && atkData && defData && (atkData.rank == 0 || atkData.rank > defData.rank)) {
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
@@ -136,7 +136,7 @@ export default class GVGVestigeRank extends BaseModel {
}
}
await session.commitTransaction()
return { isChange, atkData: newAtkData, defData: newDefData, endTime }
return { isChange, atkData: newAtkData, defData: newDefData, oldAtkData: atkData, endTime }
} finally {
session.endSession()
}