From fe29577ebf5579e3a1a71be7b34ebbf2e2493e82 Mon Sep 17 00:00:00 2001 From: luying Date: Mon, 26 Sep 2022 15:25:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=95=87=E5=BF=B5=E5=A1=94=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=A1=A5=E5=8F=91=E6=B4=BE=E9=81=A3=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app/services/battleService.ts | 31 ++++++++++++++++------- shared/db/TowerTaskRec.ts | 3 ++- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index 06baf4b40..4e91c1c4f 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -122,13 +122,16 @@ export async function getTasks(roleId: string) { if(needRefresh) { role = await RoleModel.resetTowerCnt(roleId, curTime); const batchCode = genCode(8); - let preTasks = await TowerTaskRecModel.getPreTasks(roleId); - if(preTasks && preTasks.length) { - let checkResult = checkTaskRewards(preTasks[0].batchCode, preTasks ); - if(checkResult) { - await sendMailByContent(MAIL_TYPE.TOWER_TASK_REWARD, roleId, { goods: checkResult.rewards }); - await TowerTaskRecModel.finishTask(preTasks[0].batchCode, preTasks.map(cur => cur.taskCode)); - }; + let tasksData = await TowerTaskRecModel.getPreTasks(roleId); + let preTasksMap = treatPreTasks(tasksData); + for(let [batchCode, preTasks] of preTasksMap) { + if(preTasks && preTasks.length) { + let checkResult = checkTaskRewards(batchCode, preTasks ); + if(checkResult) { + await sendMailByContent(MAIL_TYPE.TOWER_TASK_REWARD, roleId, { goods: checkResult.rewards }); + await TowerTaskRecModel.finishTask(batchCode, preTasks.map(cur => cur.taskCode)); + }; + } } curTasks = await refreshTasks(towerLv, batchCode, roleId, roleName, []); // 新建任务 @@ -146,13 +149,23 @@ export async function getTasks(roleId: string) { return {curTasks: treatTask(curTasks, curTime), refRemainTime, nextCostGold} } +function treatPreTasks(tasks: TowerTaskRecType[]) { + let map = new Map(); + for(let task of tasks) { + if(!map.has(task.batchCode)) { + map.set(task.batchCode, []); + } + map.get(task.batchCode).push(task); + } + return map +} + export function checkTaskRewards(batchCode: string, tasks: TowerTaskRecType[]) { const curTime = new Date(); let compTasks: string[] = []; let rewards: RewardInter[] = []; for (let task of tasks) { - if(task.batchCode != batchCode) return false; - if ( task.status === TOWER_TASK_STATUS.DOINING) { + if ( task.batchCode == batchCode && task.status === TOWER_TASK_STATUS.DOINING) { let {completeTime, reward, termsForAdd, additionalReward} = gameData.towerTask.get(task.taskId); if (task.sendTime && task.sendTime.getTime() + completeTime * 1000 < curTime.getTime()) { compTasks.push(task.taskCode); diff --git a/shared/db/TowerTaskRec.ts b/shared/db/TowerTaskRec.ts index 511ae4d18..930a40c12 100644 --- a/shared/db/TowerTaskRec.ts +++ b/shared/db/TowerTaskRec.ts @@ -39,6 +39,7 @@ export class TaskHero { */ @index({ roleId: 1, status: 1 }) @index({ batchCode: 1 }) +@index({ createdAt: -1 }) export default class TowerTaskRec extends BaseModel { @prop({ required: true }) roleId: string; // 角色 id @@ -71,7 +72,7 @@ export default class TowerTaskRec extends BaseModel { public static async getPreTasks(roleId: string) { let today = getZeroPointD(); - const recs: TowerTaskRecType[] = await TowerTaskRecModel.find({ roleId, createdAt: { $lt: today }, status: TOWER_TASK_STATUS.DOINING }).sort({ position: 1}).lean(); + const recs: TowerTaskRecType[] = await TowerTaskRecModel.find({ roleId, createdAt: { $lt: today }, status: TOWER_TASK_STATUS.DOINING }).sort({ createdAt: -1, position: 1}).lean(); return recs; }