diff --git a/game-server/app/servers/activity/handler/activityHandler.ts b/game-server/app/servers/activity/handler/activityHandler.ts index ecb0f4c8f..b0ddcaab8 100644 --- a/game-server/app/servers/activity/handler/activityHandler.ts +++ b/game-server/app/servers/activity/handler/activityHandler.ts @@ -29,6 +29,7 @@ export class ActivityHandler { const roleId = session.get('roleId'); const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); + const uid: number = session.get('userid'); const sid: string = session.get('sid'); @@ -41,7 +42,7 @@ export class ActivityHandler { for (let activityId of groupData.activities) { let activityData = await getActivityById(activityId); if (activityData) { - let playerActivityData = await getActivity(serverId, roleId, guildCode, activityId, activityData.type); + let playerActivityData = await getActivity(serverId, roleId, uid, guildCode, activityId, activityData.type); if(playerActivityData) { playerGroupActivityArray.push(playerActivityData); } @@ -64,6 +65,7 @@ export class ActivityHandler { const roleId = session.get('roleId'); const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); + const uid = session.get('userid'); let orderInfo = await UserOrderModel.findOrder(localOrderID); if (!orderInfo || orderInfo.roleId != roleId) { @@ -74,7 +76,7 @@ export class ActivityHandler { for(let activityData of activities) { if (!activityData) continue; - let playerActivityData = await getActivity(serverId, roleId, guildCode, activityData.activityId, activityData.type); + let playerActivityData = await getActivity(serverId, roleId, uid, guildCode, activityData.activityId, activityData.type); if(playerActivityData) { result.push(playerActivityData); } diff --git a/game-server/app/servers/activity/handler/bindPhoneHandler.ts b/game-server/app/servers/activity/handler/bindPhoneHandler.ts new file mode 100644 index 000000000..8a6de39b8 --- /dev/null +++ b/game-server/app/servers/activity/handler/bindPhoneHandler.ts @@ -0,0 +1,80 @@ +import { Application, BackendSession, HandlerService } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { BIND_PHONE_STATUS, ITEM_CHANGE_REASON, STATUS } from '../../../consts'; +import { getPlayerDailyChallengesData } from '../../../services/activity/dailyChallengesService'; +import { DailyItem } from '../../../domain/activityField/dailyChallengesField'; +import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService'; +import { RewardParam } from '../../../domain/activityField/rewardField'; +import { ActivityDailyChallengesModel } from '../../../db/ActivityDailyChallenges'; +import { getBindPhoneData } from '../../../services/activity/bindPhoneService'; +import { ActivityBindPhoneRewardModel } from '../../../db/ActivityBindPhoneReward'; + + +export default function (app: Application) { + new HandlerService(app, {}); + return new BindPhoneHandler(app); +} + +export class BindPhoneHandler { + constructor(private app: Application) { + } + + /************************绑定手机****************************/ + + /** + * @description 绑定手机数据 + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof BindPhoneHandler + */ + async bind(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + const uid = session.get('userid'); + + let playerData = await getBindPhoneData(activityId, roleId, serverId, uid); + if(!playerData) return resResult(STATUS.ACTIVITY_ID_ERROR); + if(playerData.status != BIND_PHONE_STATUS.WAIT_BIND) return resResult(STATUS.ACTIVITY_HAS_BIND); + + await ActivityBindPhoneRewardModel.addRecord(activityId, uid, BIND_PHONE_STATUS.HAS_BIND, { roleId, roleName, serverId }); + + return resResult(STATUS.SUCCESS, { + activityId, + status: BIND_PHONE_STATUS.HAS_BIND + }); + } + + /** + * @description 领取奖励 + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof BindPhoneHandler + */ + async receiveReward(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + const uid = session.get('userid'); + + let playerData = await getBindPhoneData(activityId, roleId, serverId, uid); + if(!playerData) return resResult(STATUS.ACTIVITY_ID_ERROR); + if(playerData.status == BIND_PHONE_STATUS.WAIT_BIND) return resResult(STATUS.ACTIVITY_BIND_ERR); + if(playerData.status == BIND_PHONE_STATUS.RECEIVED) return resResult(STATUS.ACTIVITY_BIND_RECEIVED); + + await ActivityBindPhoneRewardModel.addRecord(activityId, uid, BIND_PHONE_STATUS.RECEIVED, { roleId, roleName, serverId }); + let rewardArray = stringToRewardParam(playerData.rewards) + let { goods, addHeros } = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.ACT_BIND_PHONE); + + return resResult(STATUS.SUCCESS, { + activityId, + status: BIND_PHONE_STATUS.RECEIVED, + goods, addHeros + }); + } + +} diff --git a/game-server/app/services/activity/activityService.ts b/game-server/app/services/activity/activityService.ts index a1d9fe48f..ee59350a8 100644 --- a/game-server/app/services/activity/activityService.ts +++ b/game-server/app/services/activity/activityService.ts @@ -40,6 +40,7 @@ import { getGuideGachaData } from './gachaService'; import { getPopNoticeData } from './popNoticeService'; import { _getActivities, _getActivitiesByServerId, _getActivitiesByType, _getActivityById } from './activityRemoteService'; import { getGroupShopDataShow } from './groupShopService'; +import { getBindPhoneDataShow } from './bindPhoneService'; /** * 获取活动数据 @@ -49,7 +50,7 @@ import { getGroupShopDataShow } from './groupShopService'; * @param {string} roleId 角色Id * */ -export async function getActivity(serverId: number, roleId: string, guildCode: string, activityId: number, activityType: number) { +export async function getActivity(serverId: number, roleId: string, uid: number, guildCode: string, activityId: number, activityType: number) { try { let activityData = null; switch (activityType) { @@ -226,6 +227,11 @@ export async function getActivity(serverId: number, roleId: string, guildCode: s activityData = await getGroupShopDataShow(activityId, roleId); break } + case ACTIVITY_TYPE.BIND_PHONE: + { + activityData = await getBindPhoneDataShow(activityId, roleId, serverId, uid); + break + } default: { console.log('未知活动类型.........', activityType) break; diff --git a/game-server/app/services/activity/bindPhoneService.ts b/game-server/app/services/activity/bindPhoneService.ts new file mode 100644 index 000000000..50ed96bcf --- /dev/null +++ b/game-server/app/services/activity/bindPhoneService.ts @@ -0,0 +1,55 @@ +import { ACTIVITY_TYPE } from '../../consts'; +import { ActivityModel, ActivityModelType } from '../../db/Activity'; +import { ActivityBindPhoneRewardModel } from '../../db/ActivityBindPhoneReward'; +import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '../../db/ActivityDailyChallenges'; +import { RoleModel } from '../../db/Role'; +import { ServerlistModel } from '../../db/Serverlist'; +import { UserModel } from '../../db/User'; +import { BindPhoneData } from '../../domain/activityField/bindPhoneField'; +import { DailyChallengesData } from '../../domain/activityField/dailyChallengesField'; +import { getRoleCreateTime, getServerCreateTime } from '../redisService'; +import { getActivitiesByType, getActivityById } from './activityService'; + + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getBindPhoneData(activityId: number, roleId: string, serverId: number, uid: number) { + + let activityData: ActivityModelType = await getActivityById(activityId); + if(activityData.type != ACTIVITY_TYPE.BIND_PHONE) return null; + + let createTime = await getRoleCreateTime(roleId); + let serverTime = await getServerCreateTime(serverId); + let playerData = new BindPhoneData(activityData, createTime, serverTime); + + let user = await UserModel.findUserByUid(uid); + let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid); + playerData.setRecord(user, receiveRec); + + return playerData; +} + + +/** + * 玩家玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getBindPhoneDataShow(activityId: number, roleId: string, serverId: number, uid: number) { + let playerData = await getBindPhoneData(activityId, roleId, serverId, uid); + if(playerData && playerData.canShow && playerData.canShow()) { + return playerData.getShowResult(); + } + return null +} + + diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index 2ec4c4451..515443e74 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -60,6 +60,7 @@ export enum ACTIVITY_TYPE { GUIDE_GACHA = 45, // 500抽 POP_NOTICE = 46, // 打脸公告 GROUP_SHOP = 49, // 团购 + BIND_PHONE = 50, // 绑定手机号 } /** @@ -249,4 +250,10 @@ export enum GROUP_SHOP_PRICE_STATUS { NOT_ENOUGH = 0, // 客户端的价格不足当前价格 NORMAL = 1, // 正好 OVER = 2, // 客户端的价格高于当前价格 +} + +export enum BIND_PHONE_STATUS { + WAIT_BIND = 0, // 待绑定 + HAS_BIND = 1, // 已绑定待领取 + RECEIVED = 2, // 已领取 } \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 0f9317c0f..11cfd2cbb 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -1047,6 +1047,7 @@ export enum ITEM_CHANGE_REASON { LADDER_BATTLE_REWARD = 152, // 名将擂台关卡奖励 ACT_GROUP_SHOP_BUY = 153, // 团购 ACT_TURNTABLE_RECEIVE_BOX = 154, // 活动 幸运转盘领取宝箱 + ACT_BIND_PHONE = 155, // 活动 绑定手机奖励 } export enum TA_EVENT { diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 3c1b9b4a2..c5d894c0e 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -517,6 +517,9 @@ export const STATUS = { ACTIVITY_GROUP_SHOP_BUY_CNT_MAX: { code: 50039, simStr: '购买次数超过最大值' }, ACTIVITY_GROUP_SHOP_ITEM_NOT_FOUND: { code: 50040, simStr: '未找到该商品' }, ACTIVITY_GROUP_SHOP_PRICE_ERR: { code: 50041, simStr: '提供的折扣未达到该价格' }, + ACTIVITY_BIND_ERR: { code: 50042, simStr: '清先绑定手机' }, + ACTIVITY_BIND_RECEIVED: { code: 50043, simStr: '奖励已领取过' }, + ACTIVITY_HAS_BIND: { code: 50044, simStr: '已绑定' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, diff --git a/shared/db/ActivityBindPhoneReward.ts b/shared/db/ActivityBindPhoneReward.ts new file mode 100644 index 000000000..8ad16a6a7 --- /dev/null +++ b/shared/db/ActivityBindPhoneReward.ts @@ -0,0 +1,44 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + + +/** + * 活动系统 - 团购总记录 +*/ +@index({ activityId: 1, uid: 1 }) + +export default class Activity_Bind_Phone_Reward extends BaseModel { + + @prop({ required: true }) + activityId: number; // 活动Id + + @prop({ required: true }) + uid: number; // 玩家账号id + + @prop({ required: true }) + status: number; // 状态 0-未绑定 1-已绑定 2-已领取 + + @prop({ required: true }) + serverId: number; // 领取时的服务器id + + @prop({ required: true }) + roleId: string; // 领取时的账号 + + @prop({ required: true }) + roleName: string; // 领取时的账号名 + + public static async findByUid(activityId: number, uid: number) { + let result: ActivityBindPhoneRewardType = await ActivityBindPhoneRewardModel.findOne({ activityId, uid }).lean(); + return result; + } + + public static async addRecord(activityId: number, uid: number, status: number, param: ActivityBindPhoneRewardUpdate) { + let result: ActivityBindPhoneRewardType = await ActivityBindPhoneRewardModel.findOneAndUpdate({ activityId, uid }, { $set: { status, ...param} }, { new: true, upsert: true }).lean(); + return result; + } +} + +export const ActivityBindPhoneRewardModel = getModelForClass(Activity_Bind_Phone_Reward); + +export interface ActivityBindPhoneRewardType extends Pick, keyof Activity_Bind_Phone_Reward> { } +export type ActivityBindPhoneRewardUpdate = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/db/User.ts b/shared/db/User.ts index 4db791aba..94a441136 100644 --- a/shared/db/User.ts +++ b/shared/db/User.ts @@ -295,7 +295,6 @@ export default class User extends BaseModel { return user; } - private static getSearchObj(form: SearchUserParam) { let searchObj = {}; if(form['uid']) searchObj['uid'] = form.uid; diff --git a/shared/domain/activityField/bindPhoneField.ts b/shared/domain/activityField/bindPhoneField.ts new file mode 100644 index 000000000..6280fe123 --- /dev/null +++ b/shared/domain/activityField/bindPhoneField.ts @@ -0,0 +1,43 @@ +import { BIND_PHONE_STATUS } from '../../consts'; +import { ActivityModelType } from '../../db/Activity'; +import { ActivityBindPhoneRewardType } from '../../db/ActivityBindPhoneReward'; +import { UserType } from '../../db/User'; +import { ActivityBase } from './activityField'; + +// 数据库 +interface BindPhoneDataInDb { + rewards: string; +} + +// 数据 +export class BindPhoneData extends ActivityBase { + rewards: string; + + status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未绑定 1-已绑定可领取 2-已领取 + + constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { + super(activityData, createTime, serverTime); + this.initData(activityData.data) + } + + public initData(data: string) { + let dataObj: BindPhoneDataInDb = JSON.parse(data); + this.rewards = dataObj.rewards; + } + + public setRecord(user: UserType, data: ActivityBindPhoneRewardType) { + if(user && user.channelInfo && user.channelInfo.is_phone_bind == 1) this.status = BIND_PHONE_STATUS.HAS_BIND; + if(data) this.status = data.status; + } + + public getShowResult() { + if(this.status == BIND_PHONE_STATUS.RECEIVED) return null + + return { + ...this.getBaseKeys(), + rewards: this.rewards, + status: this.status, + } + } + +} \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_activityType.json b/shared/resource/jsons/dic_zyz_activityType.json index ae5a5a13f..770f8e111 100644 --- a/shared/resource/jsons/dic_zyz_activityType.json +++ b/shared/resource/jsons/dic_zyz_activityType.json @@ -256,5 +256,11 @@ "activityType": 49, "name": "GROUP_SHOP", "string": "团购" + }, + { + "id": 50, + "activityType": 50, + "name": "BIND_PHONE", + "string": "绑定手机" } ] \ No newline at end of file