feature:
天梯挂机加速;天梯派遣部分新接口 fixed: 数据库类型和插入数据的用法修复
This commit is contained in:
88
shared/db/TowerTaskRec.ts
Normal file
88
shared/db/TowerTaskRec.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
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<number>; // 派遣武将 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<TowerTask>; // 本批次任务列表
|
||||
@prop({ required: true, type: Number, default: [] })
|
||||
heroes: Array<number>; // 此批派遣使用的全部武将
|
||||
|
||||
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<number>, 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<number>}>, 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);
|
||||
Reference in New Issue
Block a user