diff --git a/game-server/app/servers/activity/handler/sevenDaysHandler.ts b/game-server/app/servers/activity/handler/sevenDaysHandler.ts new file mode 100644 index 000000000..74308f780 --- /dev/null +++ b/game-server/app/servers/activity/handler/sevenDaysHandler.ts @@ -0,0 +1,35 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, } from '../../../consts'; +import { getActivityData } from '../../../services/sevenDaysService'; + + +export default function (app: Application) { + return new SevenDaysHandler(app); +} + +export class SevenDaysHandler { + constructor(private app: Application) { + } + + /** + * @description 获取七天乐活动数据 + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof SevenDaysHandler + */ + async getActivityData(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + // const funcs: number[] = session.get('funcs'); + // const sid = session.get('sid'); + + let playerData = getActivityData(activityId, serverId, roleId) + + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + return resResult(STATUS.SUCCESS, playerData); + } + +} diff --git a/game-server/app/services/sevenDaysService.ts b/game-server/app/services/sevenDaysService.ts new file mode 100644 index 000000000..0992dc6c8 --- /dev/null +++ b/game-server/app/services/sevenDaysService.ts @@ -0,0 +1,33 @@ +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { SevenDaysData } from '../domain/activityField/sevenDaysField'; + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getActivityData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + return { data: activityData }; +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + + let playerData = new SevenDaysData(activityData); + return { data: activityData }; +} + + + diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts new file mode 100644 index 000000000..589b966eb --- /dev/null +++ b/shared/consts/constModules/activityConst.ts @@ -0,0 +1,9 @@ + + +/** + * 活动类型 + */ + +export enum ACTIVITY_TYPE { + SEVEN_DAYS = 1, // 七天乐活动 +} \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 4704d239b..500c835e1 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -167,7 +167,7 @@ export const STATUS = { HAS_REACH_WISH_DONATE_COUNT_LIMIT: { code: 20929, simStr: '今日捐赠次数已用完,不能捐赠' }, HAS_RECEIVE_WISH_GOOD: { code: 20930, simStr: '玩家已经收到许愿物品' }, NOT_WISH_THE_QUALITY_GOODS: { code: 20931, simStr: '不能够许愿该品质的物品' }, - + GUILD_SCRIPT_IS_OPENED_TODAY: { code: 20950, simStr: '今日演武场已开启' }, GUILD_SCRIPT_NOT_OPENED: { code: 20951, simStr: '演武场未开启' }, GUILD_SCRIPT_IS_BATTLED: { code: 20952, simStr: '今日已挑战过演武场' }, @@ -190,7 +190,7 @@ export const STATUS = { GUILD_TRAIN_QUALITY_REWARD_IS_GOT: { code: 20969, simStr: '军团训练进阶奖励已经领取' }, GUILD_PERSITION_TREE_NOT_LIGHT: { code: 20970, simStr: '军团前置科技树未研发' }, GUILD_TRAIN_BOX_IS_OVER_TIME: { code: 20971, simStr: '军团宝箱超时' }, - GUILD_TRAIN_BOX_INDEX_IS_GOT:{ code: 20972, simStr: '该位置试炼宝箱已经领取过,请重新选择' }, + GUILD_TRAIN_BOX_INDEX_IS_GOT: { code: 20972, simStr: '该位置试炼宝箱已经领取过,请重新选择' }, GUILD_TRAIN_BOX_IS_GOT: { code: 20973, simStr: '玩家已经领取该试炼宝箱' }, GUILD_LOT_NOT_FOUND: { code: 21001, simStr: '拍品未找到' }, @@ -216,7 +216,7 @@ export const STATUS = { ROLE_MATERIAL_NOT_ENOUGH: { code: 30001, simStr: '材料数量不足' }, REWARD_CONDITION_NOT_REACH: { code: 30002, simStr: '未满足领取条件' }, REWARD_HAS_RECEIVED: { code: 30003, simStr: '奖励已领取' }, - + // 武将养成通用 30100 - 30199 // 武将合成,升级,升星,升品相关 30200 - 30299 @@ -312,7 +312,7 @@ export const STATUS = { ITEM_NOT_SOUL: { code: 30902, simStr: '该物品不是将魂' }, SKIN_HAS_NOT_HERO: { code: 30903, simStr: '未拥有该武将不可获得皮肤' }, HERO_NOT_MAX: { code: 30904, simStr: '该武将未升满星' }, - + // 任务相关 31001-31100 TASK_NOT_REACH_CONDITION: { code: 30900, simStr: '任务不满足条件' }, TASK_HAS_RECEIVED: { code: 30901, simStr: '奖励已领取' }, @@ -322,9 +322,10 @@ export const STATUS = { TASK_BOX_HAS_RECEIVED: { code: 30905, simStr: '奖励已领取' }, // 社交相关状态 40000 - 49999 - SYS_CHANNEL_AUTH_NOT_ENOUGH: {code: 40000, simStr: '无法在系统频道发送消息'}, - UPDATE_PRIVATE_MSG_READ_TIME_ERR: {code: 40001, simStr: '更新私聊阅读时间失败'}, + SYS_CHANNEL_AUTH_NOT_ENOUGH: { code: 40000, simStr: '无法在系统频道发送消息' }, + UPDATE_PRIVATE_MSG_READ_TIME_ERR: { code: 40001, simStr: '更新私聊阅读时间失败' }, // 运营模块相关状态 50000 - 59999 + ACTIVITY_MISSING: { code: 50000, simStr: '活动丢失' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/Activity.ts b/shared/db/Activity.ts new file mode 100644 index 000000000..e8d594fef --- /dev/null +++ b/shared/db/Activity.ts @@ -0,0 +1,44 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 活动系统 +*/ +@index({ acvitityId: 1 }) + +export default class Activity extends BaseModel { + @prop({ required: true }) + acvitityId: number; // 活动Id + @prop({ required: true }) + beginTime: Date; // 开启时间 + @prop({ required: true }) + endTime: Date; // 结束时间 + @prop({ required: true }) + type: number; // 活动类型 + @prop({ required: true }) + data: string; // 活动表中的数据 + + //根据活动id查询活动数据 + public static async findActivity(acvitityId: number, lean = true) { + let result: ActivityModelType = await ActivityModel.findOne({ acvitityId }).lean(lean); + return result; + } + + //新增活动 + public static async addActivity(acvitityId: number, beginTime: Date, endTime: Date, type: number, data: string, lean = true) { + let result: ActivityModelType = await ActivityModel.findOneAndUpdate({ acvitityId }, { beginTime, endTime, type, data }, + { upsert: true, new: true }).lean(lean); + return result; + } + + //删除活动 + public static async deleteActivity(acvitityId: number) { + let result = await ActivityModel.deleteMany({ acvitityId }); + return result; + } +} + +export const ActivityModel = getModelForClass(Activity); + +export interface ActivityModelType extends Pick, keyof Activity> { } +export type ActivityModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/activityField.ts b/shared/domain/activityField/activityField.ts new file mode 100644 index 000000000..ca1e35b97 --- /dev/null +++ b/shared/domain/activityField/activityField.ts @@ -0,0 +1,27 @@ +import { prop } from '@typegoose/typegoose'; +import { ActivityModelType } from '../../db/Activity'; + +// 活动数据 +export abstract class ActivityBase { + @prop({ required: true }) + activityId: number = 0; + @prop({ required: true }) + beginTime: Date = null; + @prop({ required: true }) + endTime: Date = null; + @prop({ required: true }) + type: number = 0; + // @prop({ required: true }) + // data: string = ''; + + abstract initData(data: string): void; + + constructor(activityData: ActivityModelType) { + this.activityId = activityData.acvitityId; + this.beginTime = activityData.beginTime; + this.endTime = activityData.endTime; + this.type = activityData.type; + // this.data = activityData.data; + this.initData(activityData.data); + } +} diff --git a/shared/domain/activityField/sevenDaysField.ts b/shared/domain/activityField/sevenDaysField.ts new file mode 100644 index 000000000..f6bf7270f --- /dev/null +++ b/shared/domain/activityField/sevenDaysField.ts @@ -0,0 +1,41 @@ +import { prop } from '@typegoose/typegoose'; +import { ActivityModelType } from '../../db/Activity'; +import { ActivityBase } from './activityField'; + + +// 每日配置数据 +export class SevenDayItem { + @prop({ required: true }) + id: number = 0; + @prop({ required: true }) + count: number = 0; + @prop({ required: true }) + total: number = 0; + @prop({ required: true }) + isReceive: boolean = false; + + constructor(id: number, count: number, total: number, isReceive: boolean) { + this.id = id; + this.count = count; + this.total = total; + this.isReceive = isReceive; + } +} + + +// 七天乐活动数据 +export class SevenDaysData extends ActivityBase { + @prop({ required: true }) + items: Array = []; + + public initData(data: string) { + let arr = JSON.parse(data); + for (let obj of arr) { + this.items.push(new SevenDayItem(obj.id, obj.count, 0, false)); + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + } +} \ No newline at end of file