Files
ZYZ/shared/db/UserGuildActivityRec.ts
2023-05-24 19:35:21 +08:00

158 lines
5.6 KiB
TypeScript

import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { getZeroPointD } from '../pubUtils/timeUtil';
import { genCode } from '../pubUtils/util';
export class Record {
@prop({ required: true })
round: number; // 第几回合
@prop({ required: true })
dataId: number; // 出兵表上的dataId
@prop({ required: true })
enemyType: number; // 敌人类型 2-小兵 3-小boss 4-大boss
@prop({ required: true })
score: number; // 得分
}
export class DamageRecord {
@prop({ required: true })
round: number; // 第几回合
@prop({ required: true })
hid: number; // 造成伤害的武将
@prop({ required: true })
damage: number; // 伤害
}
@index({ code: 1 })
@index({ sourceCode: 1, roleId: 1 })
@index({ roleId: 1 })
export default class UserGuildActivityRec extends BaseModel {
@prop({ required: true })
code: string; // 本次记录唯一值
@prop({ required: true })
sourceCode: string; // 军团记录的code
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true })
roleName: string; // 军团唯一记录
@prop({ required: true })
guildCode: string; // 军团code
@prop({ required: true })
serverId: number; // 分服
@prop({ required: true })
aid: number; // 军团活动id
@prop({ required: true, default: false })
isSuccess: boolean; // 是否胜利
@prop({ required: true, default: false })
isCompleted: boolean; // 是否完成结算了
@prop({ required: true, default: 0 })
rank: number; // 最终排名
@prop({ required: true, default: 0 })
challengeCnt: number; // 向上累加的挑战次数
@prop({ required: true, type: Number })
heroes: number[]; // 南蛮&诸侯混战 使用的武将
@prop({ required: true })
score: number; // 个人总军功/个人总伤害
// 南蛮入侵字段
@prop({ required: true, type: Record, _id: false })
record: Record[]; // 个人总军功
@prop({ required: true })
round: number; // 回合数
@prop({ required: true })
gateHp: number; // 最终城门血量
// 诸侯混战字段
@prop({ required: true, default: 0 })
challengeTime: number; // cd结束时间
@prop({ required: true, type: DamageRecord, _id: false })
damageRecord: DamageRecord[]; // 城门伤害记录
@prop({ required: true, default: 0 })
cityId: number; // 挑战城池
@prop({ required: true, default: false })
hasShow: boolean; // 是否显示了胜利
// 每天一条记录
public static async getRecord(roleId: string, roleName: string, guildCode: string, serverId: number, sourceCode: string, aid: number) {
let today = getZeroPointD();
let docs = new UserGuildActivityRecModel();
let code = genCode(10);
let update = Object.assign(docs, { code, roleId, roleName, guildCode, serverId, aid });
delete update.heroes;
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate(
{ roleId, sourceCode, createdAt: { $gte: today }},
{ $setOnInsert: update },
{new: true, upsert: true}).lean();
return rec;
}
public static async findByRoleId(roleId: string, sourceCode: string) {
let today = getZeroPointD();
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOne({ roleId, sourceCode, createdAt: { $gte: today }}).lean();
return rec;
}
public static async incChallengeCnt(code: string, heroes: number[], inc: number = 1 ) {
let rec = await UserGuildActivityRecModel.findOneAndUpdate( { code}, { $push: { heroes: { $each: heroes}}, $inc: { challengeCnt: inc }}, {new: true}).lean();
return rec;
}
public static async pushRecord(code: string, records: Record[], round: number) {
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate(
{ code },
{ $push: { record: { $each: records } }, $set: { round } },
{ new: true }
).lean();
return rec;
}
public static async pushCityRecord(code: string, damageRecord: DamageRecord, challengeTime: number) {
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate(
{ code },
{ $push: { damageRecord }, $set: { challengeTime }},
{ new: true }
).lean();
return rec;
}
public static async updateInfo(code: string, update: UserGuildActivityRecUpdateParam) {
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate({ code }, { $set: update }, { new: true }).lean();
return rec;
}
public static async updateInfoByRoleId(roleId: string, update: UserGuildActivityRecUpdateParam) {
let today = getZeroPointD();
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate(
{ roleId, createdAt: { $gte: today } }, { $set: update }, { new: true }).lean();
return rec;
}
}
export const UserGuildActivityRecModel = getModelForClass(UserGuildActivityRec);
export interface UserGuildActivityRecType extends Pick<DocumentType<UserGuildActivityRec>, keyof UserGuildActivityRec> { };
export type UserGuildActivityRecUpdateParam = Partial<UserGuildActivityRecType>; // 将所有字段变成可选项