import BaseModel from './BaseModel'; import { index, getModelForClass, prop } from '@typegoose/typegoose'; class TowerTask { @prop({ required: true }) id: number; // 任务唯一 Id,来自任务表 @prop({ required: true}) taskCode: string; // 服务器生成的任务唯一编号 @prop({ required: true, type: Number, default: []}) heroes: Array; // 派遣武将 hid @prop({ required: true }) status: boolean; // 派遣任务当前状态,0-可派遣,1-已派遣,2-已完成,3-已领取 } function genCodeTmp(len) { const chars = '123456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijklmnopqrstuvwxyz'; const charArr = chars.split(''); let code = ''; for (let i = 0; i < len; i++) { code += charArr[Math.floor(Math.random() * charArr.length)]; } return code; } /** * 天梯派遣记录表 */ @index({ roleId: 1, status: 1 }) @index({ batchCode: 1 }) export default class TowerTaskRec extends BaseModel { @prop({ required: true }) roleId: string; // 角色 id @prop({ required: true }) roleName: string; // 角色名 @prop({ required: true}) batchCode: string; // 本批派遣任务唯一标识 @prop({ required: true, default: 0}) status: number; // 本批任务是否完成,0-未完成,1-已完成,2-已领取 @prop({ required: true, type: TowerTask, default: [] }) tasks: Array; // 本批次任务列表 @prop({ required: true, type: Number, default: [] }) heroes: Array; // 此批派遣使用的全部武将 public static async getCurTask(roleId: string, lean = true) { const curTime = new Date(); curTime.setHours(5, 0, 0, 0); const rec = await TowerTaskRecModel.findOne({roleId, createdAt: {$gte: curTime}}).lean(lean); return rec; } public static async createTask(roleId: string, roleName: string, taskIds: Array, lean = true) { const batchCode = genCodeTmp(8); const tasksData = taskIds.map(id => { const taskCode = genCodeTmp(6); const taskData = Object.assign(new TowerTask(), {id, taskCode}); return taskData; }); const recDoc = new TowerTaskRecModel(); const update = Object.assign(recDoc.toJSON(), {tasks: tasksData, roleId, roleName}); const rec = await TowerTaskRecModel.findOneAndUpdate({roleId, batchCode}, update, {upsert: true, new: true}).lean(lean); return rec; } public static async updateTask(roleId: string, batchCode: string, tasks: Array<{taskCode:string, heroes: Array}>, lean = true) { let allHeroes = []; tasks.forEach(task => { allHeroes.concat(task.heroes); }) const curRec = await TowerTaskRecModel.findOne({batchCode, heroes: {$nin: allHeroes}}).lean(lean); if (!curRec) return null; let {status, tasks: recTasks, heroes: recHeroes} = curRec; if (status == 2 || status == 1) return curRec; for (let task of tasks) { for (let recTask of recTasks) { if (task.taskCode == recTask.taskCode) { recTask.heroes = task.heroes; recHeroes.concat(task.heroes); } } } const newRec = await TowerTaskRecModel.findOneAndUpdate({batchCode}, {heroes: recHeroes, tasks: recTasks}, {new: true}).lean(lean); return newRec; } } export const TowerTaskRecModel = getModelForClass(TowerTaskRec);