Files
ZYZ/shared/db/TowerTaskRec.ts
liangtongchuan 33ee71adcd feature:
天梯挂机加速;天梯派遣部分新接口
fixed:
数据库类型和插入数据的用法修复
2020-10-15 01:50:22 +08:00

89 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);