活动:军团付费
This commit is contained in:
@@ -28,6 +28,7 @@ export class ActivityHandler {
|
|||||||
const { } = msg;
|
const { } = msg;
|
||||||
const roleId = session.get('roleId');
|
const roleId = session.get('roleId');
|
||||||
const serverId = session.get('serverId');
|
const serverId = session.get('serverId');
|
||||||
|
const guildCode = session.get('guildCode');
|
||||||
const sid: string = session.get('sid');
|
const sid: string = session.get('sid');
|
||||||
|
|
||||||
|
|
||||||
@@ -41,7 +42,7 @@ export class ActivityHandler {
|
|||||||
for (let activityId of groupData.activities) {
|
for (let activityId of groupData.activities) {
|
||||||
let activityData = await getActivityById(activityId);
|
let activityData = await getActivityById(activityId);
|
||||||
if (activityData) {
|
if (activityData) {
|
||||||
let playerActivityData = await getActivity(serverId, roleId, activityId, activityData.type);
|
let playerActivityData = await getActivity(serverId, roleId, guildCode, activityId, activityData.type);
|
||||||
if(playerActivityData) {
|
if(playerActivityData) {
|
||||||
playerGroupActivityArray.push(playerActivityData);
|
playerGroupActivityArray.push(playerActivityData);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
import { Application, BackendSession, HandlerService, pinus, } from 'pinus';
|
||||||
|
import { isNumber } from 'underscore';
|
||||||
|
import { ITEM_CHANGE_REASON, STATUS } from '../../../consts';
|
||||||
|
import { ActivityGuildPayRecordModel } from '../../../db/ActivityGuildPayRecord';
|
||||||
|
import { RewardParam } from '../../../domain/activityField/rewardField';
|
||||||
|
import { resResult } from '../../../pubUtils/util';
|
||||||
|
import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService';
|
||||||
|
import { getGuildPayDataShow, getGuildPayData } from '../../../services/activity/guildPayService';
|
||||||
|
|
||||||
|
|
||||||
|
export default function (app: Application) {
|
||||||
|
return new GuildPayHandler(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GuildPayHandler {
|
||||||
|
constructor(private app: Application) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 获取活动数据
|
||||||
|
* @param {{ }} msg
|
||||||
|
* @param {BackendSession} session
|
||||||
|
* @memberof GuildPayHandler
|
||||||
|
*/
|
||||||
|
async getGuildPayData(msg: { activityId: number }, session: BackendSession) {
|
||||||
|
const { activityId } = msg;
|
||||||
|
const roleId = session.get('roleId');
|
||||||
|
const serverId = session.get('serverId');
|
||||||
|
const guildCode = session.get('guildCode');
|
||||||
|
|
||||||
|
let playerData = await getGuildPayDataShow(serverId, activityId, roleId, guildCode);
|
||||||
|
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||||
|
|
||||||
|
return resResult(STATUS.SUCCESS, { playerData });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description (一键)领取奖励
|
||||||
|
* @param {{ }} msg
|
||||||
|
* @param {BackendSession} session
|
||||||
|
* @memberof GuildPayHandler
|
||||||
|
*/
|
||||||
|
async receiveItems(msg: { activityId: number, cellIndex: number }, session: BackendSession) {
|
||||||
|
const { activityId, cellIndex } = msg;
|
||||||
|
const roleId = session.get('roleId');
|
||||||
|
const roleName = session.get('roleName');
|
||||||
|
const sid = session.get('sid');
|
||||||
|
const serverId = session.get('serverId');
|
||||||
|
const guildCode = session.get('guildCode');
|
||||||
|
|
||||||
|
if(!isNumber(cellIndex)) return resResult(STATUS.WRONG_PARMS);
|
||||||
|
|
||||||
|
let playerData = await getGuildPayData(serverId, activityId, roleId, guildCode);
|
||||||
|
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||||
|
|
||||||
|
let items = playerData.receiveItems(cellIndex);
|
||||||
|
if(!items) return resResult(STATUS.ACTIVITY_ITEM_CANNOT_RECEIVE);
|
||||||
|
|
||||||
|
|
||||||
|
let records: number[] = [], rewards: RewardParam[] = [];
|
||||||
|
for(let item of items) {
|
||||||
|
records.push(item.cellIndex);
|
||||||
|
rewards.push(...stringToRewardParam(item.reward));
|
||||||
|
}
|
||||||
|
await ActivityGuildPayRecordModel.receiveItems(serverId, activityId, playerData.roundIndex, roleId, records);
|
||||||
|
let result = await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.ACT_GUILD_PAY_REWARD);
|
||||||
|
|
||||||
|
return resResult(STATUS.SUCCESS, { items, ...result });
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -61,9 +61,9 @@ export class LuckyTurntableHandler {
|
|||||||
|
|
||||||
let { result, records, goodResult } = playerData.pull(roleName, count);
|
let { result, records, goodResult } = playerData.pull(roleName, count);
|
||||||
await ActivityTurntableModel.updateData(serverId, activityId, roleId, pick(playerData, ['todayCount', 'count', 'records', 'greatRewardCount']));
|
await ActivityTurntableModel.updateData(serverId, activityId, roleId, pick(playerData, ['todayCount', 'count', 'records', 'greatRewardCount']));
|
||||||
let goods = await addItems(roleId, roleName, sid, goodResult, ITEM_CHANGE_REASON.ACT_TURNTABLE_PULL);
|
await addItems(roleId, roleName, sid, goodResult, ITEM_CHANGE_REASON.ACT_TURNTABLE_PULL);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { result, records, goods: combineItems(goods) });
|
return resResult(STATUS.SUCCESS, { result, records });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export class RechargeMoneyHandler {
|
|||||||
let playerData = await getPlayerRechargeMoneyDataShow(activityId, serverId, roleId);
|
let playerData = await getPlayerRechargeMoneyDataShow(activityId, serverId, roleId);
|
||||||
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, playerData);
|
return resResult(STATUS.SUCCESS, {playerData});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -446,4 +446,18 @@ export class GuildRemote {
|
|||||||
errlogger.error(`remote ${__filename} \n ${e.stack}`);
|
errlogger.error(`remote ${__filename} \n ${e.stack}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 活动推送
|
||||||
|
* @param guildCode 军团code
|
||||||
|
* @param path 推送地址
|
||||||
|
* @param param 内容
|
||||||
|
*/
|
||||||
|
public async pushActivityoGuild(guildCode: string, path: string, param: any) {
|
||||||
|
try {
|
||||||
|
this.pushMessage(guildCode, path, param);
|
||||||
|
} catch(e) {
|
||||||
|
errlogger.error(`remote ${__filename} \n ${e.stack}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -37,6 +37,7 @@ import { getTimeLimitRankDataShow } from './timeLimitRankService';
|
|||||||
import { ActivityTaskPointModel } from '../../db/ActivityTaskPoint';
|
import { ActivityTaskPointModel } from '../../db/ActivityTaskPoint';
|
||||||
import { getRoleOnlineInfo } from '../redisService';
|
import { getRoleOnlineInfo } from '../redisService';
|
||||||
import { addTaskPassPoint } from './taskPassService';
|
import { addTaskPassPoint } from './taskPassService';
|
||||||
|
import { getGuildChannelSid } from '../chatService';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取活动数据
|
* 获取活动数据
|
||||||
@@ -46,7 +47,7 @@ import { addTaskPassPoint } from './taskPassService';
|
|||||||
* @param {string} roleId 角色Id
|
* @param {string} roleId 角色Id
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export async function getActivity(serverId: number, roleId: string, activityId: number, activityType: number) {
|
export async function getActivity(serverId: number, roleId: string, guildCode: string, activityId: number, activityType: number) {
|
||||||
let activityData = null;
|
let activityData = null;
|
||||||
switch (activityType) {
|
switch (activityType) {
|
||||||
case ACTIVITY_TYPE.SIGN_IN://签到 4
|
case ACTIVITY_TYPE.SIGN_IN://签到 4
|
||||||
@@ -200,6 +201,10 @@ export async function getActivity(serverId: number, roleId: string, activityId:
|
|||||||
activityData = await getTimeLimitRankDataShow(activityId);
|
activityData = await getTimeLimitRankDataShow(activityId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ACTIVITY_TYPE.GUILD_PAY:
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
console.log('未知活动类型.........', activityType)
|
console.log('未知活动类型.........', activityType)
|
||||||
break;
|
break;
|
||||||
@@ -357,6 +362,8 @@ export async function addActvityTaskPoint(type: number, id: number, session: Bac
|
|||||||
interface pushActivityParamInter {
|
interface pushActivityParamInter {
|
||||||
ticketCnt?: number; // 木签活动的签数(type21)
|
ticketCnt?: number; // 木签活动的签数(type21)
|
||||||
totalPoint?: number; // 新将好礼(type37)和战令(type42)更新后的积分
|
totalPoint?: number; // 新将好礼(type37)和战令(type42)更新后的积分
|
||||||
|
payMemberCnt?: number; // 军团充值活动,你的军团充值的人数
|
||||||
|
payMember?: string; // 军团充值活动,充值人员名字,添加到payRecord里面
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface pushActivityInter {
|
export interface pushActivityInter {
|
||||||
@@ -374,9 +381,23 @@ export async function pushActivities(arr: pushActivityInter[], roleId: string, s
|
|||||||
let onlineUser = await getRoleOnlineInfo(roleId);
|
let onlineUser = await getRoleOnlineInfo(roleId);
|
||||||
sid = onlineUser.sid;
|
sid = onlineUser.sid;
|
||||||
}
|
}
|
||||||
pinus.app.get('channelService').pushMessageByUids('onActivityUpdate',
|
if(!!sid && arr.length > 0) {
|
||||||
resResult(STATUS.SUCCESS, {
|
pinus.app.get('channelService').pushMessageByUids('onActivityUpdate',
|
||||||
activities: arr
|
resResult(STATUS.SUCCESS, {
|
||||||
}),
|
activities: arr
|
||||||
[{ uid: roleId, sid }]);
|
}),
|
||||||
|
[{ uid: roleId, sid }]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function pushActivitiesToGuild(arr: pushActivityInter[], guildCode: string) {
|
||||||
|
let chatSid = await getGuildChannelSid(guildCode);
|
||||||
|
console.log('####', chatSid, arr)
|
||||||
|
if(!!chatSid && arr.length > 0) {
|
||||||
|
pinus.app.rpc.chat.guildRemote.sendMailToGuild.toServer(chatSid, guildCode, 'onActivityUpdate',
|
||||||
|
resResult(STATUS.SUCCESS, {
|
||||||
|
activities: arr
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
import { ACTIVITY_TYPE } from "../../consts";
|
||||||
|
import { ActivityGuildPayModel } from "../../db/ActivityGuildPay";
|
||||||
|
import { RoleType } from "../../db/Role";
|
||||||
|
import { GuildPayData } from "../../domain/activityField/guildPay";
|
||||||
|
import { getActivitiesByType, getActivityById, pushActivitiesToGuild, pushActivityInter } from "./activityService";
|
||||||
|
import { ServerlistModel } from '../../db/Serverlist';
|
||||||
|
import { ActivityGuildPayRecordModel } from "../../db/ActivityGuildPayRecord";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 玩家活动数据
|
||||||
|
*
|
||||||
|
* @param {number} serverId 区Id
|
||||||
|
* @param {number} activityId 活动Id
|
||||||
|
* @param {string} roleId 角色Id
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export async function getGuildPayData(serverId: number, activityId: number, roleId: string, guildCode: string) {
|
||||||
|
let activityData = await getActivityById(activityId);
|
||||||
|
let { openTime } = await ServerlistModel.findByServerId(serverId);
|
||||||
|
|
||||||
|
let playerData = new GuildPayData(activityData, 0, openTime * 1000);
|
||||||
|
let receiveRecord = await ActivityGuildPayRecordModel.findData(serverId, activityId, playerData.roundIndex, roleId);
|
||||||
|
playerData.setReceiveRecord(receiveRecord);
|
||||||
|
if(guildCode) {
|
||||||
|
let guildRecord = await ActivityGuildPayModel.findData(serverId, activityId, playerData.roundIndex, guildCode);
|
||||||
|
playerData.setGuildRecord(guildRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
return playerData;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getGuildPayDataShow(serverId: number, activityId: number, roleId: string, guildCode: string) {
|
||||||
|
let playerData = await getGuildPayData(serverId, activityId, roleId, guildCode);
|
||||||
|
if(playerData && playerData.canShow && playerData.canShow()) {
|
||||||
|
return playerData.getShowResult();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function addGuildPay(role: RoleType, price: number) {
|
||||||
|
let { hasGuild, roleId, roleName, serverId, guildCode } = role;
|
||||||
|
if(hasGuild) { // 向全军团推送充值的人
|
||||||
|
let { openTime } = await ServerlistModel.findByServerId(serverId);
|
||||||
|
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY);
|
||||||
|
let pushResult: pushActivityInter[] = [];
|
||||||
|
for(let activityData of activities) {
|
||||||
|
let { activityId, type: activityType } = activityData;
|
||||||
|
let obj = new GuildPayData(activityData, 0, openTime * 1000);
|
||||||
|
|
||||||
|
let { isNew, result } = await ActivityGuildPayModel.addRecord(serverId, activityId, obj.roundIndex, guildCode, {
|
||||||
|
roleId, roleName, price
|
||||||
|
});
|
||||||
|
if(isNew) {
|
||||||
|
let { memberRecord } = result;
|
||||||
|
pushResult.push({ activityId, activityType, param: { payMember: roleName, payMemberCnt: memberRecord.length } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await pushActivitiesToGuild(pushResult, guildCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ import { reportTAEvent, reportTAUserSet } from './sdkService';
|
|||||||
import { savePayLog } from '../pubUtils/logUtil';
|
import { savePayLog } from '../pubUtils/logUtil';
|
||||||
import { recordFirstGift } from './activity/firstGiftService';
|
import { recordFirstGift } from './activity/firstGiftService';
|
||||||
import { makeTaskPass } from './activity/taskPassService';
|
import { makeTaskPass } from './activity/taskPassService';
|
||||||
|
import { addGuildPay } from './activity/guildPayService';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,7 +152,7 @@ export async function makeOrder(orderInfo: UserOrderModelType, sid: string) {
|
|||||||
totalPay: roleInfo.totalPay
|
totalPay: roleInfo.totalPay
|
||||||
}), [{ uid: roleId, sid }]);
|
}), [{ uid: roleId, sid }]);
|
||||||
|
|
||||||
return rewardResult
|
return {...rewardResult, roleInfo}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function settleOrder(order: UserOrderModelType, serverId: number, sid?: string) {
|
export async function settleOrder(order: UserOrderModelType, serverId: number, sid?: string) {
|
||||||
@@ -180,6 +181,7 @@ export async function settleOrder(order: UserOrderModelType, serverId: number, s
|
|||||||
//活动统计
|
//活动统计
|
||||||
addRechargeMoney(order.roleId, serverId, order.price);
|
addRechargeMoney(order.roleId, serverId, order.price);
|
||||||
addVipRechargeMoney(order.roleId, serverId, order.price);
|
addVipRechargeMoney(order.roleId, serverId, order.price);
|
||||||
|
addGuildPay(result.roleInfo, order.price)
|
||||||
//成长任务
|
//成长任务
|
||||||
await checkActivityTask(serverId, sid, order.roleId, TASK_TYPE.ACTIVITY_RMB, order.price, { activityId: order.activityId });
|
await checkActivityTask(serverId, sid, order.roleId, TASK_TYPE.ACTIVITY_RMB, order.price, { activityId: order.activityId });
|
||||||
if(order.payType != PAY_TYPE.TEST) {
|
if(order.payType != PAY_TYPE.TEST) {
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ export enum ACTIVITY_TYPE {
|
|||||||
LUCKY_TURNTABLE = 40, // 幸运转盘
|
LUCKY_TURNTABLE = 40, // 幸运转盘
|
||||||
TIME_LIMIT_RANK = 41, // 限时排行榜
|
TIME_LIMIT_RANK = 41, // 限时排行榜
|
||||||
TASK_PASS = 42, // 战令活动
|
TASK_PASS = 42, // 战令活动
|
||||||
|
GUILD_PAY = 43, // 军团充值人数
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1005,6 +1005,7 @@ export enum ITEM_CHANGE_REASON {
|
|||||||
ACT_TURNTABLE_PULL = 141, // 转盘
|
ACT_TURNTABLE_PULL = 141, // 转盘
|
||||||
ACT_TASK_PASS = 142, // 活动-战令奖励
|
ACT_TASK_PASS = 142, // 活动-战令奖励
|
||||||
ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速
|
ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速
|
||||||
|
ACT_GUILD_PAY_REWARD = 144, // 活动-军团人数奖励
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum TA_EVENT {
|
export enum TA_EVENT {
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import BaseModel from './BaseModel';
|
||||||
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||||
|
|
||||||
|
class MemberRecord {
|
||||||
|
@prop({ required: true })
|
||||||
|
roleId: string;
|
||||||
|
@prop({ required: true })
|
||||||
|
roleName: string;
|
||||||
|
@prop({ required: true })
|
||||||
|
price: number; // 金额
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 活动系统 - 成长任务活动积分点兑换奖励
|
||||||
|
*/
|
||||||
|
@index({ serverId: 1, guildCode: 1, activityId: 1, roundIndex: 1 })
|
||||||
|
|
||||||
|
export default class Activity_Guild_Pay extends BaseModel {
|
||||||
|
@prop({ required: true })
|
||||||
|
serverId: number; // 区服id
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
activityId: number; // 活动Id
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
roundIndex: number; // 活动第几轮
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
guildCode: string; // 军团code
|
||||||
|
|
||||||
|
@prop({ required: true, type: MemberRecord, _id: false })
|
||||||
|
memberRecord: MemberRecord[]; // 充值的玩家
|
||||||
|
|
||||||
|
//当日奖章领取记录
|
||||||
|
public static async addRecord(serverId: number, activityId: number, roundIndex: number, guildCode: string, memberRecord: MemberRecord) {
|
||||||
|
let result: ActivityGuildPayModelType = await ActivityGuildPayModel.findOne({ serverId, guildCode, activityId, roundIndex }).lean();
|
||||||
|
let hasUser = result?.memberRecord?.find(cur => cur.roleId == memberRecord.roleId);
|
||||||
|
if(!hasUser) {
|
||||||
|
result = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex }, { $push: { memberRecord } }, { new: true, upsert: true }).lean();
|
||||||
|
} else {
|
||||||
|
result = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex, 'memberRecord.roleId': memberRecord.roleId }, {
|
||||||
|
$set: { 'memberRecord.$.roleName': memberRecord.roleName },
|
||||||
|
$inc: { 'memberRecord.$.price': memberRecord.price }
|
||||||
|
}, { new: true }).lean();
|
||||||
|
}
|
||||||
|
return { result, isNew: !hasUser };
|
||||||
|
}
|
||||||
|
|
||||||
|
//根据活动id查询活动数据
|
||||||
|
public static async findData(serverId: number, activityId: number, roundIndex: number, guildCode: string) {
|
||||||
|
let result: ActivityGuildPayModelType = await ActivityGuildPayModel.findOne({ serverId, activityId, roundIndex, guildCode }).lean(true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ActivityGuildPayModel = getModelForClass(Activity_Guild_Pay);
|
||||||
|
|
||||||
|
export interface ActivityGuildPayModelType extends Pick<DocumentType<Activity_Guild_Pay>, keyof Activity_Guild_Pay> { }
|
||||||
|
export type ActivityGuildPayModelTypeParam = Partial<ActivityGuildPayModelType>; // 将所有字段变成可选项
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import BaseModel from './BaseModel';
|
||||||
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 活动系统 - 成长任务活动积分点兑换奖励
|
||||||
|
*/
|
||||||
|
@index({ serverId: 1, guildCode: 1, activityId: 1, roundIndex: 1 })
|
||||||
|
|
||||||
|
export default class Activity_Guild_Pay_Record extends BaseModel {
|
||||||
|
@prop({ required: true })
|
||||||
|
serverId: number; // 区服id
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
activityId: number; // 活动Id
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
roundIndex: number; // 活动第几轮
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
roleId: string; // 军团code
|
||||||
|
|
||||||
|
@prop({ required: true, type: Number })
|
||||||
|
receiveRecord: number[]; // 领取记录, cellIndex
|
||||||
|
|
||||||
|
|
||||||
|
//根据活动id查询活动数据
|
||||||
|
public static async findData(serverId: number, activityId: number, roundIndex: number, roleId: string) {
|
||||||
|
let result: ActivityGuildPayRecordModelType = await ActivityGuildPayRecordModel.findOne({ serverId, roleId, activityId, roundIndex }).lean(true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async receiveItems(serverId: number, activityId: number, roundIndex: number, roleId: string, records: number[]) {
|
||||||
|
let result: ActivityGuildPayRecordModelType = await ActivityGuildPayRecordModel.findOneAndUpdate(
|
||||||
|
{ serverId, roleId, activityId, roundIndex },
|
||||||
|
{ $push: { receiveRecord: { $each: records } } },
|
||||||
|
{ upsert: true, new: true }
|
||||||
|
).lean(true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ActivityGuildPayRecordModel = getModelForClass(Activity_Guild_Pay_Record);
|
||||||
|
|
||||||
|
export interface ActivityGuildPayRecordModelType extends Pick<DocumentType<Activity_Guild_Pay_Record>, keyof Activity_Guild_Pay_Record> { }
|
||||||
|
export type ActivityGuildPayRecordModelTypeParam = Partial<ActivityGuildPayRecordModelType>; // 将所有字段变成可选项
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import moment = require('moment');
|
import moment = require('moment');
|
||||||
import { ACTIVITY_TIME_TYPE, REFRESH_TIME, SERVER_OPEN_TIME } from '../../consts';
|
import { ACTIVITY_TIME_TYPE, REFRESH_TIME } from '../../consts';
|
||||||
import { ActivityModelType } from '../../db/Activity';
|
import { ActivityModelType } from '../../db/Activity';
|
||||||
import { deltaDays } from '../../pubUtils/util';
|
import { deltaDays } from '../../pubUtils/util';
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ export abstract class ActivityBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(activityData: ActivityModelType, createTime: number) {
|
constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) {
|
||||||
this.activityId = activityData.activityId;
|
this.activityId = activityData.activityId;
|
||||||
this.delayDay = activityData.delayDay ? activityData.delayDay : 0;
|
this.delayDay = activityData.delayDay ? activityData.delayDay : 0;
|
||||||
this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf();
|
this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf();
|
||||||
@@ -60,7 +60,7 @@ export abstract class ActivityBase {
|
|||||||
console.log('***** activityData', activityData.timeType)
|
console.log('***** activityData', activityData.timeType)
|
||||||
switch (activityData.timeType) {
|
switch (activityData.timeType) {
|
||||||
case ACTIVITY_TIME_TYPE.SERVER_OPEN_TIME: {
|
case ACTIVITY_TIME_TYPE.SERVER_OPEN_TIME: {
|
||||||
this.beginTime = moment(SERVER_OPEN_TIME).add(this.delayDay, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf();
|
this.beginTime = moment(serverTime).add(this.delayDay, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf();
|
||||||
if (activityData.days > 0) {
|
if (activityData.days > 0) {
|
||||||
this.endTime = moment(this.beginTime).add(activityData.days, 'd').valueOf();
|
this.endTime = moment(this.beginTime).add(activityData.days, 'd').valueOf();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
// 军团限时充值人数活动
|
||||||
|
|
||||||
|
import { ActivityModelType } from "../../db/Activity";
|
||||||
|
import { ActivityGuildPayModelType } from "../../db/ActivityGuildPay";
|
||||||
|
import { ActivityGuildPayRecordModelType } from "../../db/ActivityGuildPayRecord";
|
||||||
|
import { ActivityBase } from "./activityField";
|
||||||
|
|
||||||
|
interface GuildPayRewardInDb {
|
||||||
|
cellIndex: number; // 第几条
|
||||||
|
memberCnt: number; // 充值金额达到目标金额的玩家人数
|
||||||
|
reward: string; // 奖励 type&id&count
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GuildPayDataInDb {
|
||||||
|
rewards: GuildPayRewardInDb[];
|
||||||
|
payDays: number; // 充值计入的天数,这之后到活动endTime为公示期,充值不会计入活动
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GuildPayReward {
|
||||||
|
cellIndex: number; // 第几条
|
||||||
|
memberCnt: number; // 充值金额达到目标金额的玩家人数
|
||||||
|
reward: string; // 奖励 type&id&count
|
||||||
|
|
||||||
|
hasReceived: boolean = false; // 玩家是否已领取
|
||||||
|
|
||||||
|
constructor(data: GuildPayRewardInDb) {
|
||||||
|
this.cellIndex = data.cellIndex;
|
||||||
|
this.memberCnt = data.memberCnt;
|
||||||
|
this.reward = data.reward;
|
||||||
|
}
|
||||||
|
|
||||||
|
public setHasReceived(hasReceived: boolean) {
|
||||||
|
this.hasReceived = hasReceived;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GuildPayData extends ActivityBase {
|
||||||
|
payEndTime: number;
|
||||||
|
rewards: GuildPayReward[] = [];
|
||||||
|
map: Map<number, number> = new Map();
|
||||||
|
|
||||||
|
payMemberCnt: number = 0;
|
||||||
|
payRecord: string[] = [];
|
||||||
|
|
||||||
|
constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) {
|
||||||
|
super(activityData, createTime, serverTime)
|
||||||
|
this.initData(activityData.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
public initData(data: string) {
|
||||||
|
let dataObj: GuildPayDataInDb = JSON.parse(data);
|
||||||
|
this.payEndTime = this.beginTime + dataObj.payDays * 24 * 60 * 60 * 1000;
|
||||||
|
for(let reward of dataObj.rewards) {
|
||||||
|
let obj = new GuildPayReward(reward);
|
||||||
|
this.rewards.push(obj);
|
||||||
|
this.map.set(obj.cellIndex, this.rewards.length - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public findRewardItemByCellIndex(cellIndex: number) {
|
||||||
|
let index = this.map.get(cellIndex);
|
||||||
|
return this.rewards[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public setReceiveRecord(receiveRecord: ActivityGuildPayRecordModelType) {
|
||||||
|
if(!receiveRecord) return;
|
||||||
|
for(let cellIndex of receiveRecord.receiveRecord) {
|
||||||
|
let reward = this.findRewardItemByCellIndex(cellIndex);
|
||||||
|
reward.setHasReceived(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public setGuildRecord(guildRecord: ActivityGuildPayModelType) {
|
||||||
|
if(!guildRecord) return;
|
||||||
|
this.payMemberCnt = guildRecord.memberRecord.length;
|
||||||
|
this.payRecord = guildRecord.memberRecord.map(cur => cur.roleName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getShowResult() {
|
||||||
|
return {
|
||||||
|
...this.getBaseKeys(),
|
||||||
|
payEndTime: this.payEndTime,
|
||||||
|
rewards: this.rewards,
|
||||||
|
payMemberCnt: this.payMemberCnt,
|
||||||
|
payRecord: this.payRecord
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public receiveItems(cellIndex: number) {
|
||||||
|
let items: GuildPayReward[] = [];
|
||||||
|
if(cellIndex == 0) {
|
||||||
|
for(let reward of this.rewards) {
|
||||||
|
if(reward.memberCnt <= this.payMemberCnt && !reward.hasReceived) {
|
||||||
|
reward.setHasReceived(true);
|
||||||
|
items.push(reward);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let reward = this.findRewardItemByCellIndex(cellIndex);
|
||||||
|
if(reward && !reward.hasReceived && reward.memberCnt <= this.payMemberCnt) {
|
||||||
|
reward.setHasReceived(true);
|
||||||
|
items.push(reward);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(items.length <= 0) return false;
|
||||||
|
return items
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -250,5 +250,11 @@
|
|||||||
"activityType": 42,
|
"activityType": 42,
|
||||||
"name": "TASK_PASS",
|
"name": "TASK_PASS",
|
||||||
"string": "战令"
|
"string": "战令"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"activityType": 43,
|
||||||
|
"name": "GUILD_PAY",
|
||||||
|
"string": "军团限时付费"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user