Files
ZYZ/shared/db/TowerTaskRec.ts
2020-10-16 14:54:28 +08:00

111 lines
3.6 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;
}
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);