活动:军团付费
This commit is contained in:
@@ -55,6 +55,7 @@ export enum ACTIVITY_TYPE {
|
||||
LUCKY_TURNTABLE = 40, // 幸运转盘
|
||||
TIME_LIMIT_RANK = 41, // 限时排行榜
|
||||
TASK_PASS = 42, // 战令活动
|
||||
GUILD_PAY = 43, // 军团充值人数
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1005,6 +1005,7 @@ export enum ITEM_CHANGE_REASON {
|
||||
ACT_TURNTABLE_PULL = 141, // 转盘
|
||||
ACT_TASK_PASS = 142, // 活动-战令奖励
|
||||
ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速
|
||||
ACT_GUILD_PAY_REWARD = 144, // 活动-军团人数奖励
|
||||
}
|
||||
|
||||
export enum TA_EVENT {
|
||||
|
||||
60
shared/db/ActivityGuildPay.ts
Normal file
60
shared/db/ActivityGuildPay.ts
Normal file
@@ -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>; // 将所有字段变成可选项
|
||||
46
shared/db/ActivityGuildPayRecord.ts
Normal file
46
shared/db/ActivityGuildPayRecord.ts
Normal file
@@ -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 { ACTIVITY_TIME_TYPE, REFRESH_TIME, SERVER_OPEN_TIME } from '../../consts';
|
||||
import { ACTIVITY_TIME_TYPE, REFRESH_TIME } from '../../consts';
|
||||
import { ActivityModelType } from '../../db/Activity';
|
||||
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.delayDay = activityData.delayDay ? activityData.delayDay : 0;
|
||||
this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf();
|
||||
@@ -60,7 +60,7 @@ export abstract class ActivityBase {
|
||||
console.log('***** activityData', activityData.timeType)
|
||||
switch (activityData.timeType) {
|
||||
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) {
|
||||
this.endTime = moment(this.beginTime).add(activityData.days, 'd').valueOf();
|
||||
} else {
|
||||
|
||||
108
shared/domain/activityField/guildPay.ts
Normal file
108
shared/domain/activityField/guildPay.ts
Normal file
@@ -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,
|
||||
"name": "TASK_PASS",
|
||||
"string": "战令"
|
||||
},
|
||||
{
|
||||
"id": 43,
|
||||
"activityType": 43,
|
||||
"name": "GUILD_PAY",
|
||||
"string": "军团限时付费"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user