天梯挂机加速;天梯派遣部分新接口
fixed:
数据库类型和插入数据的用法修复
This commit is contained in:
liangtongchuan
2020-10-15 01:49:26 +08:00
parent 2b1575516f
commit 33ee71adcd
14 changed files with 380 additions and 21 deletions

View File

@@ -70,7 +70,14 @@ export const EXPEDITION_INCREASE_POINT = 2; // 远征每成功一次累计的点
export const HANG_UP_CONSTS = {
ENABLE_LV: 2,
UNIT_TIME: 10 * 60 * 1000,
MAX_TIME: 12 * 60 * 60 * 1000
MAX_TIME: 12 * 60 * 60 * 1000,
MAX_SPD_UP_CNT: 6,
REFRESH_TIME: 5
}
export const TOWER_TASK_CONST = {
REFRESH_TIME: 5,
RAND_CNT: [1, 1, 1, 1, 1],
}
export const WAR_JSON_ATTRIBUTE_TYPE = {

View File

@@ -32,7 +32,7 @@ export default class HangUpRecord extends BaseModel {
public static async initRecord(roleId: string, roleName: string, lean = true) {
const curTime = new Date();
const recDoc = new HangUpRecordModel();
const update = Object.assign({roleId, roleName, startTime: curTime}, recDoc.toJSON());
const update = Object.assign(recDoc.toJSON(), {roleId, roleName, startTime: curTime});
const rec = await HangUpRecordModel.findOneAndUpdate({roleId, startLv: HANG_UP_CONSTS.ENABLE_LV}, update, {upsert: true, new: true}).lean(lean);
return rec;
}
@@ -45,7 +45,7 @@ export default class HangUpRecord extends BaseModel {
public static async updateRec(roleId: string, roleName: string, endLv: number, endTime: Date, lean = true) {
await HangUpRecordModel.findOneAndUpdate({roleId, received: false}, {endLv, endTime, received: true}).lean(lean);
const recDoc = new HangUpRecordModel();
const update = Object.assign({roleId, roleName, startTime: endTime}, recDoc.toJSON());
const update = Object.assign(recDoc.toJSON(), {roleId, roleName, startTime: endTime});
const newRec = await HangUpRecordModel.findOneAndUpdate({roleId, startLv: endLv}, update, {upsert: true, new: true}).lean(lean);
return newRec;
}

View File

@@ -0,0 +1,29 @@
import { HANG_UP_CONSTS } from './../consts/consts';
import BaseModel from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose';
/**
* 挂机记录表
*/
@index({ roleId: 1, lv: 1 })
export default class HangUpSpdUpRec extends BaseModel {
@prop({ required: true })
roleId: string; // 角色 id
@prop({ required: true })
roleName: string; // 角色名
@prop({required: true, default: 1})
cnt: number; // 加速次数
@prop({required: true, default: 1})
lv: number; // 天梯层数
public static async updateRec(roleId, roleName, multi, lv, lean = true ) {
if (multi <= 0) return null;
let rec = await HangUpSpdUpRecModel.findOneAndUpdate({roleId, lv, roleName}, {$inc: {cnt: multi}}, {upsert: true, new: true}).lean(lean);
return rec;
}
}
export const HangUpSpdUpRecModel = getModelForClass(HangUpSpdUpRec);

View File

@@ -37,7 +37,7 @@ export default class Item extends BaseModel {
public static async createItem(itemInfo: {roleId: string, roleName: string, itemid: number, seqId: number, itemName: string, count: number}, lean = true) {
const doc = new ItemModel();
const update = Object.assign(itemInfo, doc.toJSON());
const update = Object.assign(doc.toJSON(), itemInfo);
const item = await ItemModel.findOneAndUpdate({ seqId: itemInfo.seqId }, update, {upsert: true, new: true}).lean(lean);
return item;
}

View File

@@ -1,6 +1,8 @@
import { HANG_UP_CONSTS } from './../consts/consts';
import BaseModel from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose';
import User from './User';
import { shouldRefresh } from '../util/util';
/**
* 角色字段接口
@@ -99,6 +101,11 @@ export default class Role extends BaseModel {
// @prop({ required: false })
// hangUpTime: Date; // 当前挂机开始时间
@prop({ required: true, default: HANG_UP_CONSTS.MAX_SPD_UP_CNT})
hangUpSpdUpCnt: number; // 挂机加速次数
@prop({ required: true, default: new Date()})
lastSpdUpTime: Date; // 最后一次挂机加速时间
@prop({ required: true })
expeditionPoint: number; // 远征点数
@@ -118,7 +125,7 @@ export default class Role extends BaseModel {
const user = await User.findUserByUid(uid);
if (!user) return null;
const doc = new RoleModel();
const update = Object.assign(roleInfo, { userInfo: user, serverType: user.serverType, serverId }, doc.toJSON());
const update = Object.assign(doc.toJSON(), roleInfo, { userInfo: user, serverType: user.serverType, serverId });
const role = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, update, { upsert: true, new: true }).lean(lean);
return role;
}
@@ -141,7 +148,20 @@ export default class Role extends BaseModel {
}
public static async towerLvUp(roleId: string, lean = true) {
let role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerLv: 1}}).lean(lean);
let role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerLv: 1}}, {new: true}).lean(lean);
return role;
}
public static async hangUpSpdUp(roleId: string, cnt: number, curTime: Date, lean = true) {
if (cnt < 0) return null;
const {lastSpdUpTime} = await RoleModel.findOneAndUpdate({roleId}, {$inc: {hangUpSpdUpCnt: -cnt}, lastSpdUpTime: curTime}, {new: true}).lean(lean);
let role = null;
if (shouldRefresh(lastSpdUpTime, curTime, HANG_UP_CONSTS.REFRESH_TIME, 1) && cnt <= HANG_UP_CONSTS.MAX_SPD_UP_CNT) {
role = await RoleModel.findOneAndUpdate({roleId}, {hangUpSpdUpCnt: HANG_UP_CONSTS.MAX_SPD_UP_CNT - cnt, lastSpdUpTime: curTime}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId, hangUpSpdUpCnt: {$gte: cnt}}, {$inc: {hangUpSpdUpCnt: -cnt}, lastSpdUpTime: curTime}, {new: true}).lean(lean);
}
return role;
}

View File

@@ -35,7 +35,7 @@ export default class TowerRecord extends BaseModel {
public static async createRecord(towerInfo: {roleId: string, lv: number, warStatus: Array<WarStatus>}, lean = true) {
const recDoc = new TowerRecordModel();
const update = Object.assign(recDoc.toJSON(), towerInfo);
const update = Object.assign(towerInfo, recDoc.toJSON());
const { roleId, lv } = towerInfo;
let rec = await TowerRecordModel.findOneAndUpdate({roleId, lv}, {$set: update}, {upsert: true, new: true}).lean(lean);
return rec;

88
shared/db/TowerTaskRec.ts Normal file
View 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);

View File

@@ -0,0 +1,72 @@
[
{
"taskId": 1,
"taskName": "任务1",
"quality": 1,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "2&2&1",
"actorCnt": 1,
"completeTime": 30
},
{
"taskId": 2,
"taskName": "任务2",
"quality": 2,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "1&5&2",
"actorCnt": 2,
"completeTime": 40
},
{
"taskId": 3,
"taskName": "任务3",
"quality": 3,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "3&1&1",
"actorCnt": 1,
"completeTime": 50
},
{
"taskId": 4,
"taskName": "任务4",
"quality": 4,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "1&5&2|2&2&1|3&1&1",
"actorCnt": 1,
"completeTime": 50
},
{
"taskId": 5,
"taskName": "任务5",
"quality": 4,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "1&5&2|2&2&1|3&1&1",
"actorCnt": 1,
"completeTime": 30
},
{
"taskId": 6,
"taskName": "任务6",
"quality": 5,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "1&5&2|2&2&1|3&1&1",
"actorCnt": 1,
"completeTime": 30
},
{
"taskId": 7,
"taskName": "任务7",
"quality": 5,
"reward": "1&2|2&1",
"bonus": "3&2|4&1",
"bonusCondition": "1&5&2|2&2&1|3&1&1",
"actorCnt": 1,
"completeTime": 30
}
]