111 lines
3.6 KiB
TypeScript
111 lines
3.6 KiB
TypeScript
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;
|
||
}
|
||
|
||
function getRefTime(curTime = new Date()) {
|
||
if (curTime.getHours() < 5) {
|
||
curTime.setDate(curTime.getDate() - 1);
|
||
}
|
||
curTime.setHours(5, 0, 0, 0);
|
||
return curTime;
|
||
}
|
||
|
||
/**
|
||
* 天梯派遣记录表
|
||
*/
|
||
@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-已完成,3-已领取
|
||
@prop({ required: true, type: Number, default: [] })
|
||
heroes: Array<number>; // 此批派遣使用的全部武将
|
||
|
||
@prop({ required: true})
|
||
taskId: number; // 任务唯一 Id,来自任务表
|
||
@prop({ required: true })
|
||
taskCode: string; // 服务器生成的任务唯一编号
|
||
@prop({ required: false })
|
||
sendTime: Date; // 派遣时间
|
||
|
||
public static async getCurTasks(roleId: string, lean = true) {
|
||
const refTime = getRefTime();
|
||
const recs = await TowerTaskRecModel.find({roleId, createdAt: {$gte: refTime}}).lean(lean);
|
||
return recs;
|
||
}
|
||
|
||
public static async createTasks(roleId: string, roleName: string, taskIds: Array<number>/*, lean = true*/) {
|
||
const batchCode = genCodeTmp(8);
|
||
const tasksData = taskIds.map(id => {
|
||
const taskModel = new TowerTaskRecModel();
|
||
const taskCode = genCodeTmp(6);
|
||
const taskData = Object.assign(taskModel.toJSON(), {batchCode, taskId: id, taskCode, roleId, roleName});
|
||
return taskData;
|
||
});
|
||
const recs = await TowerTaskRecModel.insertMany(tasksData, {ordered: false});
|
||
return recs;
|
||
}
|
||
|
||
public static async getTasksByCode(batchCode: string, lean = true) {
|
||
const recs = await TowerTaskRecModel.find({batchCode}).lean(lean);
|
||
return recs;
|
||
}
|
||
|
||
public static async sendHeroes(_roleId: string, batchCode: string, tasks: Array<{taskCode:string, heroes: Array<number>}>, sendTime: Date, lean = true) {
|
||
let recs = new Array();
|
||
const refTime = getRefTime();
|
||
for (let task of tasks) {
|
||
const rec = await TowerTaskRecModel.findOneAndUpdate(
|
||
{batchCode, taskCode: task.taskCode, createdAt: {$gte: refTime}},
|
||
{heroes: task.heroes, status: 1, sendTime},
|
||
{new: true}).lean(lean);
|
||
|
||
recs.push(rec);
|
||
}
|
||
return recs;
|
||
}
|
||
|
||
public static async finishTask(batchCode: string, tasks: Array<string>, lean = true) {
|
||
let recs = new Array();
|
||
// const refTime = getRefTime();
|
||
for (let task of tasks) {
|
||
const rec = await TowerTaskRecModel.findOneAndUpdate(
|
||
{batchCode, taskCode: task},
|
||
{status: 3},
|
||
{new: true}).lean(lean);
|
||
|
||
recs.push(rec);
|
||
}
|
||
return recs;
|
||
}
|
||
}
|
||
|
||
export const TowerTaskRecModel = getModelForClass(TowerTaskRec);
|