This commit is contained in:
xy
2026-03-13 01:38:40 +00:00
parent e6e4f88257
commit 28855885cd
311 changed files with 89544 additions and 94350 deletions
File diff suppressed because it is too large Load Diff
@@ -1,34 +1,34 @@
import { ACTIVITY_TYPE } from "../../consts/constModules/activityConst";
import { ActivityAuthorGachaRecModel } from "../../db/AuthorGachaRec";
import { UserGachaModel } from "../../db/UserGacha";
import { AuthorGachaData } from "../../domain/activityField/authorGachaField";
import { getGachaRemainFloor } from "../../pubUtils/util";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
export async function getPlayerAuthorGachaData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if(!activityData) return
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new AuthorGachaData(activityData, createTime, serverTime);
if ((playerData?.type || 0) != ACTIVITY_TYPE.AUTHOR_GACHA) return
let playerRecord = await ActivityAuthorGachaRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getUseGachaData(activityId: number, roleId: string, playerData: AuthorGachaData) {
let userGacha = await UserGachaModel.findByRole(roleId, playerData.gachaId, activityId);
let count = userGacha?.count || 0;
let remainFloor = getGachaRemainFloor(playerData.gachaId, userGacha?.floor || []);
return { count, remainFloor }
}
export async function getPlayerAuthorGachaDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerAuthorGachaData(activityId, serverId, roleId);
if (playerData && playerData.canShow && playerData.canShow()) {
return { ...playerData.getShowResult(), ...await getUseGachaData(activityId, roleId, playerData) };
}
return null
}
import { ACTIVITY_TYPE } from "@consts/constModules/activityConst";
import { ActivityAuthorGachaRecModel } from "@db/AuthorGachaRec";
import { UserGachaModel } from "@db/UserGacha";
import { AuthorGachaData } from "@domain/activityField/authorGachaField";
import { getGachaRemainFloor } from "@pubUtils/util";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
export async function getPlayerAuthorGachaData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if(!activityData) return
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new AuthorGachaData(activityData, createTime, serverTime);
if ((playerData?.type || 0) != ACTIVITY_TYPE.AUTHOR_GACHA) return
let playerRecord = await ActivityAuthorGachaRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getUseGachaData(activityId: number, roleId: string, playerData: AuthorGachaData) {
let userGacha = await UserGachaModel.findByRole(roleId, playerData.gachaId, activityId);
let count = userGacha?.count || 0;
let remainFloor = getGachaRemainFloor(playerData.gachaId, userGacha?.floor || []);
return { count, remainFloor }
}
export async function getPlayerAuthorGachaDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerAuthorGachaData(activityId, serverId, roleId);
if (playerData && playerData.canShow && playerData.canShow()) {
return { ...playerData.getShowResult(), ...await getUseGachaData(activityId, roleId, playerData) };
}
return null
}
@@ -1,149 +1,149 @@
import { isNumber } from 'underscore';
import { ACTIVITY_TYPE, BIND_PHONE_STATUS, PUBLIC_ACCOUNT_GIFT, PUSH_ROUTE, SDK_37_CONST, SNS_LINK_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityBindPhoneRewardModel } from '../../db/ActivityBindPhoneReward';
import { ActivityPublicAccountCodeModel } from '../../db/ActivityPublicAccountCode';
import { LinkModel } from '../../db/Link';
import { UserModel, UserType } from '../../db/User';
import { BindPhoneData } from '../../domain/activityField/bindPhoneField';
import { aes128Encrypt } from '../../pubUtils/util';
import { getOnlineRoleByUserCode, getRedis, getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivityById } from './activityService';
import { sendMessageToUserWithSuc } from '../pushService';
/**
* 绑定手机相关数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getAllSnsLinkData(activityId: number, roleId: string, serverId: number, uid: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
if(!activityData || 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 links = await LinkModel.findByServerId(serverId);
playerData.setLinks(links);
let user: UserType;
if(playerData.bindPhone) {
if(!user) user = await UserModel.findUserByUid(uid);
let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid);
playerData.bindPhone.setBindPhoneStatus(user, receiveRec);
}
if(playerData.wxPublicAccount) {
if(!user) user = await UserModel.findUserByUid(uid);
if(user.channelInfo) {
let giftCode = encodeGiftCode(roleId, serverId, user.channelInfo.uid, user.channelInfo.platformAppid, user.channelInfo.childGameId, activityId);
playerData.wxPublicAccount.setEncodeGiftCode(giftCode);
let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, user.channelId);
if(playerRecord) playerData.wxPublicAccount.setPlayerRecord(playerRecord);
}
}
return playerData;
}
/**
* 绑定手机相关数据
*
* @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 || 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 links = await LinkModel.findByServerId(serverId);
playerData.setLinks(links);
let user: UserType;
if(playerData.bindPhone) {
if(!user) user = await UserModel.findUserByUid(uid);
let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid);
playerData.bindPhone.setBindPhoneStatus(user, receiveRec);
}
return playerData;
}
/**
* 微信公众号
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPublicAccountData(activityId: number, roleId: string, serverId: number, user: UserType) {
let activityData: ActivityModelType = await getActivityById(activityId);
if(!activityData || 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 links = await LinkModel.findByServerId(serverId);
playerData.setLinks(links);
if(playerData.wxPublicAccount) {
if(user.channelInfo) {
let giftCode = encodeGiftCode(roleId, serverId, user.channelInfo.uid, user.channelInfo.platformAppid, user.channelInfo.childGameId, activityId);
playerData.wxPublicAccount.setEncodeGiftCode(giftCode);
let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, user.channelId);
if(playerRecord) playerData.wxPublicAccount.setPlayerRecord(playerRecord);
}
}
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getAllSnsLinkDataShow(activityId: number, roleId: string, serverId: number, uid: number) {
let playerData = await getAllSnsLinkData(activityId, roleId, serverId, uid);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
function encodeGiftCode(roleId: string, serverId: number, uid: number, pid: string, gid: string, activityId: number) {
let encodeResult = aes128Encrypt(`${roleId}|${serverId}|${uid}|${pid}|${gid}|${PUBLIC_ACCOUNT_GIFT}${activityId}|${SDK_37_CONST.GIFT_GAME_ID}`, SDK_37_CONST.PUBLIC_GIFT_KEY);
return `FS${encodeResult}`;
}
export async function sendPublicAccountGift(message: string) {
let [_activityId, userCode, channelId] = message?.split('|')||[];
let activityId = parseInt(_activityId);
if(!isNumber(activityId) || !userCode || !channelId) return;
let onlineRoleId = await getOnlineRoleByUserCode(userCode);
// console.log('##### sendPublicAccountGift', message, userCode, onlineRoleId);
if (!!onlineRoleId) { // 在线,推送消息
let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, channelId);
await sendMessageToUserWithSuc(onlineRoleId, PUSH_ROUTE.PUBLIC_ACCOUNT_GIFT, { activityId, type: SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT, status: playerRecord.hasReceived? BIND_PHONE_STATUS.RECEIVED: BIND_PHONE_STATUS.HAS_BIND });
}
}
import { isNumber } from 'underscore';
import { ACTIVITY_TYPE, BIND_PHONE_STATUS, PUBLIC_ACCOUNT_GIFT, PUSH_ROUTE, SDK_37_CONST, SNS_LINK_TYPE } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityBindPhoneRewardModel } from '@db/ActivityBindPhoneReward';
import { ActivityPublicAccountCodeModel } from '@db/ActivityPublicAccountCode';
import { LinkModel } from '@db/Link';
import { UserModel, UserType } from '@db/User';
import { BindPhoneData } from '@domain/activityField/bindPhoneField';
import { aes128Encrypt } from '@pubUtils/util';
import { getOnlineRoleByUserCode, getRedis, getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivityById } from './activityService';
import { sendMessageToUserWithSuc } from '../pushService';
/**
* 绑定手机相关数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getAllSnsLinkData(activityId: number, roleId: string, serverId: number, uid: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
if(!activityData || 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 links = await LinkModel.findByServerId(serverId);
playerData.setLinks(links);
let user: UserType;
if(playerData.bindPhone) {
if(!user) user = await UserModel.findUserByUid(uid);
let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid);
playerData.bindPhone.setBindPhoneStatus(user, receiveRec);
}
if(playerData.wxPublicAccount) {
if(!user) user = await UserModel.findUserByUid(uid);
if(user.channelInfo) {
let giftCode = encodeGiftCode(roleId, serverId, user.channelInfo.uid, user.channelInfo.platformAppid, user.channelInfo.childGameId, activityId);
playerData.wxPublicAccount.setEncodeGiftCode(giftCode);
let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, user.channelId);
if(playerRecord) playerData.wxPublicAccount.setPlayerRecord(playerRecord);
}
}
return playerData;
}
/**
* 绑定手机相关数据
*
* @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 || 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 links = await LinkModel.findByServerId(serverId);
playerData.setLinks(links);
let user: UserType;
if(playerData.bindPhone) {
if(!user) user = await UserModel.findUserByUid(uid);
let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid);
playerData.bindPhone.setBindPhoneStatus(user, receiveRec);
}
return playerData;
}
/**
* 微信公众号
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPublicAccountData(activityId: number, roleId: string, serverId: number, user: UserType) {
let activityData: ActivityModelType = await getActivityById(activityId);
if(!activityData || 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 links = await LinkModel.findByServerId(serverId);
playerData.setLinks(links);
if(playerData.wxPublicAccount) {
if(user.channelInfo) {
let giftCode = encodeGiftCode(roleId, serverId, user.channelInfo.uid, user.channelInfo.platformAppid, user.channelInfo.childGameId, activityId);
playerData.wxPublicAccount.setEncodeGiftCode(giftCode);
let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, user.channelId);
if(playerRecord) playerData.wxPublicAccount.setPlayerRecord(playerRecord);
}
}
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getAllSnsLinkDataShow(activityId: number, roleId: string, serverId: number, uid: number) {
let playerData = await getAllSnsLinkData(activityId, roleId, serverId, uid);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
function encodeGiftCode(roleId: string, serverId: number, uid: number, pid: string, gid: string, activityId: number) {
let encodeResult = aes128Encrypt(`${roleId}|${serverId}|${uid}|${pid}|${gid}|${PUBLIC_ACCOUNT_GIFT}${activityId}|${SDK_37_CONST.GIFT_GAME_ID}`, SDK_37_CONST.PUBLIC_GIFT_KEY);
return `FS${encodeResult}`;
}
export async function sendPublicAccountGift(message: string) {
let [_activityId, userCode, channelId] = message?.split('|')||[];
let activityId = parseInt(_activityId);
if(!isNumber(activityId) || !userCode || !channelId) return;
let onlineRoleId = await getOnlineRoleByUserCode(userCode);
// console.log('##### sendPublicAccountGift', message, userCode, onlineRoleId);
if (!!onlineRoleId) { // 在线,推送消息
let playerRecord = await ActivityPublicAccountCodeModel.findByChannel(activityId, channelId);
await sendMessageToUserWithSuc(onlineRoleId, PUSH_ROUTE.PUBLIC_ACCOUNT_GIFT, { activityId, type: SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT, status: playerRecord.hasReceived? BIND_PHONE_STATUS.RECEIVED: BIND_PHONE_STATUS.HAS_BIND });
}
}
@@ -1,23 +1,23 @@
import { ActivityChongYangRecModel } from "../../db/ActivityChongYangRec";
import { ChongYangData } from "../../domain/activityField/chongyangField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
export async function getPlayerChongYangData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ChongYangData(activityData, createTime, serverTime);
let playerRecord = await ActivityChongYangRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerChongYangDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerChongYangData(activityId, serverId, roleId);
if (playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityChongYangRecModel } from "@db/ActivityChongYangRec";
import { ChongYangData } from "@domain/activityField/chongyangField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
export async function getPlayerChongYangData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ChongYangData(activityData, createTime, serverTime);
let playerRecord = await ActivityChongYangRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerChongYangDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerChongYangData(activityId, serverId, roleId);
if (playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,54 +1,54 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '../../db/ActivityDailyChallenges';
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 dailyChallengesActivity(serverId: number, roleId: string) {
let activityDataArray: ActivityModelType[] = await getActivitiesByType(serverId, ACTIVITY_TYPE.TASK_DAILY_CHALLENGES);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyChallengesData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyChallengesData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let playerRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyChallengesData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '@db/ActivityDailyChallenges';
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 dailyChallengesActivity(serverId: number, roleId: string) {
let activityDataArray: ActivityModelType[] = await getActivitiesByType(serverId, ACTIVITY_TYPE.TASK_DAILY_CHALLENGES);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyChallengesData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyChallengesData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let playerRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyChallengesData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
@@ -1,77 +1,77 @@
import { ACTIVITY_TYPE, MAIL_TYPE, REFRESH_TIME } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityDailyCoinModel, ActivityDailyCoinModelType } from '../../db/ActivityDailyCoin';
import { ServerlistType } from '../../db/Serverlist';
import { DailyCoinData } from '../../domain/activityField/dailyCoinField';
import { RewardInter } from '../../pubUtils/interface';
import { stringWithTypeToRewardInter } from '../../pubUtils/roleUtil';
import { sendMailByContent } from '../mailService';
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 getPlayerDailyCoinData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyCoinData(activityData, createTime, serverTime);
let playerRecord: ActivityDailyCoinModelType = await ActivityDailyCoinModel.findData(serverId, activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function sendUnReceivedActivityDailyCoin(servers: ServerlistType[]) {
let today = new Date().setHours(REFRESH_TIME, 0, 0, 0);
let yesterday = today - 86400000;
let unreceivedRecord = await ActivityDailyCoinModel.findUnreceivedBox(new Date(yesterday), new Date(today));
for(let { serverId } of servers) {
let serverTime = await getServerCreateTime(serverId);
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_COIN);
for(let activityData of activities) {
for(let playerRecord of unreceivedRecord) {
if(playerRecord.activityId != activityData.activityId) continue;
if(playerRecord.serverId != serverId) continue;
await sendUnReceivedRecor(activityData, playerRecord, serverTime);
}
}
}
}
async function sendUnReceivedRecor(activityData: ActivityModelType, playerRecord: ActivityDailyCoinModelType, serverTime: number) {
let createTime = await getRoleCreateTime(playerRecord.roleId);
let playerData = new DailyCoinData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
let unreceivedRecord = playerData.getUnReceivedBox();
if(unreceivedRecord.length > 0) {
let rewards: RewardInter[] = [], boxIds: number[] = [];
for(let { cellIndex, reward } of unreceivedRecord) {
rewards.push(...stringWithTypeToRewardInter(reward));
boxIds.push(cellIndex);
}
await sendMailByContent(MAIL_TYPE.DAILY_COIN, playerRecord.roleId, { goods: rewards });
await ActivityDailyCoinModel.repaireBox(playerRecord._id, boxIds);
}
}
export function mergeData(data: any[]) {
let newDate = [];
for (let item of data) {
let index = newDate.findIndex(obj => { return obj.id === item.id });
if (index != -1) {
newDate[index].count += item.count;
} else {
newDate = newDate.concat(item);
}
}
return newDate;
}
import { ACTIVITY_TYPE, MAIL_TYPE, REFRESH_TIME } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityDailyCoinModel, ActivityDailyCoinModelType } from '@db/ActivityDailyCoin';
import { ServerlistType } from '@db/Serverlist';
import { DailyCoinData } from '@domain/activityField/dailyCoinField';
import { RewardInter } from '@pubUtils/interface';
import { stringWithTypeToRewardInter } from '@pubUtils/roleUtil';
import { sendMailByContent } from '../mailService';
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 getPlayerDailyCoinData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyCoinData(activityData, createTime, serverTime);
let playerRecord: ActivityDailyCoinModelType = await ActivityDailyCoinModel.findData(serverId, activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function sendUnReceivedActivityDailyCoin(servers: ServerlistType[]) {
let today = new Date().setHours(REFRESH_TIME, 0, 0, 0);
let yesterday = today - 86400000;
let unreceivedRecord = await ActivityDailyCoinModel.findUnreceivedBox(new Date(yesterday), new Date(today));
for(let { serverId } of servers) {
let serverTime = await getServerCreateTime(serverId);
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_COIN);
for(let activityData of activities) {
for(let playerRecord of unreceivedRecord) {
if(playerRecord.activityId != activityData.activityId) continue;
if(playerRecord.serverId != serverId) continue;
await sendUnReceivedRecor(activityData, playerRecord, serverTime);
}
}
}
}
async function sendUnReceivedRecor(activityData: ActivityModelType, playerRecord: ActivityDailyCoinModelType, serverTime: number) {
let createTime = await getRoleCreateTime(playerRecord.roleId);
let playerData = new DailyCoinData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
let unreceivedRecord = playerData.getUnReceivedBox();
if(unreceivedRecord.length > 0) {
let rewards: RewardInter[] = [], boxIds: number[] = [];
for(let { cellIndex, reward } of unreceivedRecord) {
rewards.push(...stringWithTypeToRewardInter(reward));
boxIds.push(cellIndex);
}
await sendMailByContent(MAIL_TYPE.DAILY_COIN, playerRecord.roleId, { goods: rewards });
await ActivityDailyCoinModel.repaireBox(playerRecord._id, boxIds);
}
}
export function mergeData(data: any[]) {
let newDate = [];
for (let item of data) {
let index = newDate.findIndex(obj => { return obj.id === item.id });
if (index != -1) {
newDate[index].count += item.count;
} else {
newDate = newDate.concat(item);
}
}
return newDate;
}
@@ -1,77 +1,77 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityDailyGKModel, ActivityDailyGKModelType } from '../../db/ActivityDailyGK';
import { DailyGKData } from '../../domain/activityField/dailyGKField';
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 dailyGKActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_GK);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecord: ActivityDailyGKModelType = await ActivityDailyGKModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyGKData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityDailyGKModelType = await ActivityDailyGKModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 挑战每日关卡成功
*
* @param {number} activityId 活动id
* @param {number} gk 关卡id
*
*/
export async function challengeDailyGK(serverId: number, roleId: string, activityId: number, gk: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGKData(activityData, createTime, serverTime);
let item = playerData.findItemByGK(gk);
if (item) {
let dayIndex = item.dayIndex;
await ActivityDailyGKModel.addRecord(serverId, activityId, roleId, dayIndex);
} else {
console.log('没有找到对应关卡活动数据', activityId, gk)
}
return playerData;
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityDailyGKModel, ActivityDailyGKModelType } from '@db/ActivityDailyGK';
import { DailyGKData } from '@domain/activityField/dailyGKField';
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 dailyGKActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_GK);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecord: ActivityDailyGKModelType = await ActivityDailyGKModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyGKData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityDailyGKModelType = await ActivityDailyGKModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 挑战每日关卡成功
*
* @param {number} activityId 活动id
* @param {number} gk 关卡id
*
*/
export async function challengeDailyGK(serverId: number, roleId: string, activityId: number, gk: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGKData(activityData, createTime, serverTime);
let item = playerData.findItemByGK(gk);
if (item) {
let dayIndex = item.dayIndex;
await ActivityDailyGKModel.addRecord(serverId, activityId, roleId, dayIndex);
} else {
console.log('没有找到对应关卡活动数据', activityId, gk)
}
return playerData;
}
@@ -1,52 +1,52 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityDailyGiftsModel, ActivityDailyGiftsModelType } from '../../db/ActivityDailyGifts';
import { DailyGiftsData } from '../../domain/activityField/dailyGiftsField';
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 dailyGiftsActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_DISCOUNT_GIFT);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGiftsData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGiftsData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityDailyGiftsModel, ActivityDailyGiftsModelType } from '@db/ActivityDailyGifts';
import { DailyGiftsData } from '@domain/activityField/dailyGiftsField';
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 dailyGiftsActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_DISCOUNT_GIFT);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGiftsData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyGiftsData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
@@ -1,54 +1,54 @@
import { ACTIVITY_TYPE, DAILY_MEAL_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityDailyMealModel, ActivityDailyMealModelType } from '../../db/ActivityDailyMeal';
import { DailyMealData } from '../../domain/activityField/dailyMealField';
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 dailyMealActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_MEAL);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyMealData(activityData, createTime, serverTime);
let playerLunchRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.LUNCH, playerData.roundIndex);
let playerDinnerRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.DINNER, playerData.roundIndex);
playerData.setPlayerRecords(playerLunchRecords.concat(playerDinnerRecords));
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyMealData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyMealData(activityData, createTime, serverTime);
let playerLunchRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.LUNCH, playerData.roundIndex);
let playerDinnerRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.DINNER, playerData.roundIndex);
playerData.setPlayerRecords(playerLunchRecords.concat(playerDinnerRecords));
return playerData;
}
import { ACTIVITY_TYPE, DAILY_MEAL_TYPE } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityDailyMealModel, ActivityDailyMealModelType } from '@db/ActivityDailyMeal';
import { DailyMealData } from '@domain/activityField/dailyMealField';
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 dailyMealActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_MEAL);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyMealData(activityData, createTime, serverTime);
let playerLunchRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.LUNCH, playerData.roundIndex);
let playerDinnerRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.DINNER, playerData.roundIndex);
playerData.setPlayerRecords(playerLunchRecords.concat(playerDinnerRecords));
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyMealData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyMealData(activityData, createTime, serverTime);
let playerLunchRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.LUNCH, playerData.roundIndex);
let playerDinnerRecords: ActivityDailyMealModelType[] = await ActivityDailyMealModel.findData(serverId, activityData.activityId, roleId, DAILY_MEAL_TYPE.DINNER, playerData.roundIndex);
playerData.setPlayerRecords(playerLunchRecords.concat(playerDinnerRecords));
return playerData;
}
@@ -1,133 +1,133 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityDailyRMBGiftsModel, ActivityDailyRMBGiftsModelType } from '../../db/ActivityDailyRMBGifts';
import { DailyRMBGiftsData } from '../../domain/activityField/dailyRMBGiftsField';
import moment = require('moment');
import { RewardParam } from '../../domain/activityField/rewardField';
import { addReward, stringToRewardParam } from './giftPackageService';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function dailyRMBGiftsActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_RMB_GIFTS);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerData = await getPlayerDailyRMBGiftsData(activityData.activityId, serverId, roleId);
return playerData
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyRMBGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyRMBGiftsData(activityData, createTime, serverTime);
let playerRecords: ActivityDailyRMBGiftsModelType[] = await ActivityDailyRMBGiftsModel.findBuyRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 结算购买礼包的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeDailyRMBGiftsReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.DAILY_RMB_GIFTS) {
return {
code: STATUS.ACTIVITY_TYPE_ERROR,
}
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyRMBGiftsData(activityData, createTime, serverTime);
let bigGiftProductID = playerData.productID;
if (bigGiftProductID == productID) {//一次性购买7天礼包
let hasBoughtTomorrow = await ActivityDailyRMBGiftsModel.checkHasBought(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex + 1);
if(hasBoughtTomorrow) return STATUS.ORDER_CANNOT_BUY;
let playerRecord: ActivityDailyRMBGiftsModelType = await ActivityDailyRMBGiftsModel.findRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex);
playerData.setPlayerRecords(playerRecord?[playerRecord]: []);
if (playerData.shouldbuyNextDay()) {//今天已经购买过其他奖励
playerData.todayIndex ++;
}
for (let i = 0; i < playerData.day; i++) {
let todayIndex = playerData.todayIndex + i;
await ActivityDailyRMBGiftsModel.buyRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), todayIndex, true);
}
let endTime = moment(playerData.endTime).add(playerData.day, 'd').toDate()
return {
code: 0,
data: Object.assign({}, { item: { endTime, receiveCount: 0 } })
}
} else {
let item = playerData.findProduct(productID);
if (!item) return STATUS.ACTIVITY_NO_PRODUCT;
let hasReceived = await ActivityDailyRMBGiftsModel.checkHasReceive(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex, item.id);
if(hasReceived) {
return STATUS.ORDER_CANNOT_BUY
}
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.DAILY_RMB_GIFT)
await ActivityDailyRMBGiftsModel.receiveRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex, [item.id]);
item.isReceive = true;
return {
code: 0,
data: Object.assign(result, { item })
}
}
}
/**
* 检查每日特惠是否可以购买
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function checkDailyRMBGifts(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyRMBGiftsData(activityData, createTime, serverTime);
let bigGiftProductID = playerData.productID;
if (bigGiftProductID == productID) {//一次性购买7天礼包
let hasBoughtTomorrow = await ActivityDailyRMBGiftsModel.checkHasBought(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex + 1);
return !hasBoughtTomorrow;
} else {
let item = playerData.findProduct(productID);
if (!item) return false
let hasReceived = await ActivityDailyRMBGiftsModel.checkHasReceive(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex, item.id);
return !hasReceived;
}
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityDailyRMBGiftsModel, ActivityDailyRMBGiftsModelType } from '@db/ActivityDailyRMBGifts';
import { DailyRMBGiftsData } from '@domain/activityField/dailyRMBGiftsField';
import moment = require('moment');
import { RewardParam } from '@domain/activityField/rewardField';
import { addReward, stringToRewardParam } from './giftPackageService';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function dailyRMBGiftsActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_RMB_GIFTS);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerData = await getPlayerDailyRMBGiftsData(activityData.activityId, serverId, roleId);
return playerData
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDailyRMBGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyRMBGiftsData(activityData, createTime, serverTime);
let playerRecords: ActivityDailyRMBGiftsModelType[] = await ActivityDailyRMBGiftsModel.findBuyRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 结算购买礼包的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeDailyRMBGiftsReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.DAILY_RMB_GIFTS) {
return {
code: STATUS.ACTIVITY_TYPE_ERROR,
}
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyRMBGiftsData(activityData, createTime, serverTime);
let bigGiftProductID = playerData.productID;
if (bigGiftProductID == productID) {//一次性购买7天礼包
let hasBoughtTomorrow = await ActivityDailyRMBGiftsModel.checkHasBought(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex + 1);
if(hasBoughtTomorrow) return STATUS.ORDER_CANNOT_BUY;
let playerRecord: ActivityDailyRMBGiftsModelType = await ActivityDailyRMBGiftsModel.findRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex);
playerData.setPlayerRecords(playerRecord?[playerRecord]: []);
if (playerData.shouldbuyNextDay()) {//今天已经购买过其他奖励
playerData.todayIndex ++;
}
for (let i = 0; i < playerData.day; i++) {
let todayIndex = playerData.todayIndex + i;
await ActivityDailyRMBGiftsModel.buyRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), todayIndex, true);
}
let endTime = moment(playerData.endTime).add(playerData.day, 'd').toDate()
return {
code: 0,
data: Object.assign({}, { item: { endTime, receiveCount: 0 } })
}
} else {
let item = playerData.findProduct(productID);
if (!item) return STATUS.ACTIVITY_NO_PRODUCT;
let hasReceived = await ActivityDailyRMBGiftsModel.checkHasReceive(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex, item.id);
if(hasReceived) {
return STATUS.ORDER_CANNOT_BUY
}
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.DAILY_RMB_GIFT)
await ActivityDailyRMBGiftsModel.receiveRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex, [item.id]);
item.isReceive = true;
return {
code: 0,
data: Object.assign(result, { item })
}
}
}
/**
* 检查每日特惠是否可以购买
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function checkDailyRMBGifts(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DailyRMBGiftsData(activityData, createTime, serverTime);
let bigGiftProductID = playerData.productID;
if (bigGiftProductID == productID) {//一次性购买7天礼包
let hasBoughtTomorrow = await ActivityDailyRMBGiftsModel.checkHasBought(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex + 1);
return !hasBoughtTomorrow;
} else {
let item = playerData.findProduct(productID);
if (!item) return false
let hasReceived = await ActivityDailyRMBGiftsModel.checkHasReceive(serverId, activityData.activityId, roleId, moment(playerData.beginTime).toDate(), playerData.todayIndex, item.id);
return !hasReceived;
}
}
@@ -1,38 +1,38 @@
import { ActivityDragonBoatModel } from "../../db/ActivityDragonBoat";
import { DragonBoatData } from "../../domain/activityField/dragonBoatField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDragonBoatData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DragonBoatData(activityData, createTime, serverTime);
let playerRecord = await ActivityDragonBoatModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDragonBoatDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerDragonBoatData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityDragonBoatModel } from "@db/ActivityDragonBoat";
import { DragonBoatData } from "@domain/activityField/dragonBoatField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDragonBoatData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new DragonBoatData(activityData, createTime, serverTime);
let playerRecord = await ActivityDragonBoatModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerDragonBoatDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerDragonBoatData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,38 +1,38 @@
import { ActivityEntertainRecModel } from "../../db/ActivityEntertainRec";
import { EntertainData } from "../../domain/activityField/entertainField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerEntertainData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new EntertainData(activityData, createTime, serverTime);
let playerRecord = await ActivityEntertainRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerEntertainDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerEntertainData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityEntertainRecModel } from "@db/ActivityEntertainRec";
import { EntertainData } from "@domain/activityField/entertainField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerEntertainData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new EntertainData(activityData, createTime, serverTime);
let playerRecord = await ActivityEntertainRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerEntertainDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerEntertainData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,88 +1,88 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityFirstGiftModel, ActivityFirstGiftModelType } from '../../db/ActivityFirstGift';
import { RoleModel, RoleType } from '../../db/Role';
import { ServerlistModel } from '../../db/Serverlist';
import { FirstGiftData } from '../../domain/activityField/firstGiftField';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
// /**
// * 获取活动数据
// *
// * @param {number} serverId 区Id
// * @param {number} type 活动类型 ACTIVITY_TYPE
// * @param {string} roleId 角色Id
// *
// */
// export async function firstGiftActivity(serverId: number, roleId: string) {
// let { activityGroupId } = await ServerlistModel.findByServerId(serverId);
// let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(activityGroupId, ACTIVITY_TYPE.FIRST_GIFT, 1)
// if (activityArray.length == 0) {
// return null;
// }
// let activityData = activityArray[0];
// let playerRecord: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findData(activityData.activityId, roleId);
// if (!playerRecord || playerRecord.isOver) {
// return null;
// }
// let { createTime } = await RoleModel.findByRoleId(roleId);
// let playerData = new FirstGiftData(activityData, createTime);
// playerData.setPlayerRecords(playerRecord);
// return playerData;
// }
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerFirstGiftData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord = await ActivityFirstGiftModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new FirstGiftData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 获取可显示的数据
* @param activityId
* @param serverId
* @param roleId
* @returns
*/
export async function getPlayerFirstGiftDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerFirstGiftData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 记录玩家首充记录
* @param {RoleType} role 玩家数据
* @param {number} serverId 区id
*/
export async function recordFirstGift(role: RoleType, serverId: number) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.FIRST_GIFT);
let serverTime = await getServerCreateTime(serverId);
for (let obj of activities) {
let playerData = new FirstGiftData(obj, role.createTime, serverTime);
for(let { pageIndex, targetMoney } of playerData.list) {
if(role.totalPay >= targetMoney) {
await ActivityFirstGiftModel.begin(obj.activityId, role.roleId, pageIndex );
}
}
}
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityFirstGiftModel, ActivityFirstGiftModelType } from '@db/ActivityFirstGift';
import { RoleModel, RoleType } from '@db/Role';
import { ServerlistModel } from '@db/Serverlist';
import { FirstGiftData } from '@domain/activityField/firstGiftField';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
// /**
// * 获取活动数据
// *
// * @param {number} serverId 区Id
// * @param {number} type 活动类型 ACTIVITY_TYPE
// * @param {string} roleId 角色Id
// *
// */
// export async function firstGiftActivity(serverId: number, roleId: string) {
// let { activityGroupId } = await ServerlistModel.findByServerId(serverId);
// let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(activityGroupId, ACTIVITY_TYPE.FIRST_GIFT, 1)
// if (activityArray.length == 0) {
// return null;
// }
// let activityData = activityArray[0];
// let playerRecord: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findData(activityData.activityId, roleId);
// if (!playerRecord || playerRecord.isOver) {
// return null;
// }
// let { createTime } = await RoleModel.findByRoleId(roleId);
// let playerData = new FirstGiftData(activityData, createTime);
// playerData.setPlayerRecords(playerRecord);
// return playerData;
// }
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerFirstGiftData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord = await ActivityFirstGiftModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new FirstGiftData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 获取可显示的数据
* @param activityId
* @param serverId
* @param roleId
* @returns
*/
export async function getPlayerFirstGiftDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerFirstGiftData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 记录玩家首充记录
* @param {RoleType} role 玩家数据
* @param {number} serverId 区id
*/
export async function recordFirstGift(role: RoleType, serverId: number) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.FIRST_GIFT);
let serverTime = await getServerCreateTime(serverId);
for (let obj of activities) {
let playerData = new FirstGiftData(obj, role.createTime, serverTime);
for(let { pageIndex, targetMoney } of playerData.list) {
if(role.totalPay >= targetMoney) {
await ActivityFirstGiftModel.begin(obj.activityId, role.roleId, pageIndex );
}
}
}
}
@@ -1,42 +1,42 @@
import { ActivityForgeModel } from "../../db/ActivityForge";
import { ForgeData } from "../../domain/activityField/forgeField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerForgeData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ForgeData(activityData, createTime, serverTime);
let playerRecords = await ActivityForgeModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerForgeDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerForgeData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export function getMetialStr(material: { id: number, count: number }[]) {
return material.map(({id, count}) => `${id}&${count}`).join('|')
}
import { ActivityForgeModel } from "@db/ActivityForge";
import { ForgeData } from "@domain/activityField/forgeField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerForgeData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ForgeData(activityData, createTime, serverTime);
let playerRecords = await ActivityForgeModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerForgeDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerForgeData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export function getMetialStr(material: { id: number, count: number }[]) {
return material.map(({id, count}) => `${id}&${count}`).join('|')
}
File diff suppressed because it is too large Load Diff
@@ -1,321 +1,321 @@
import { GIFT_PACKAGE_TYPE, ACTIVITY_RESOURCES_TYPE, ITEM_CHANGE_REASON, STATUS } from '../../consts';
import { gameData } from '../../pubUtils/data';
import { addItems } from '../role/rewardService';
import { RewardParam } from '../../domain/activityField/rewardField';
import { CreateHeroParam } from '../../domain/roleField/hero';
import { DicGiftPackage } from '../../pubUtils/dictionary/DicGiftPackage';
import { ItemInter, RewardInter } from '../../pubUtils/interface';
import { decodeArrayListStr, getRandEelmWithWeight, resResult } from '../../pubUtils/util';
import { createHeroes } from '../role/createHero';
import { GuildModel } from '../../db/Guild';
import { pushGuildInfoUpdate } from '../guildService';
import { combineItems } from '../role/util';
import { recordGuildFund } from './timeLimitRankService';
import { filterGoods, isGoodsHidden, isHeroHidden } from '../dataService';
import { DicGiftPackagePlan } from '../../pubUtils/dictionary/DicGiftPackagePlan';
import { Floor, GiftPackageFloorModel, GiftPackageFloorType } from '../../db/GiftPackageFloor';
import { isNumber } from 'underscore';
/**
* 兑换礼包
* @param giftID 礼包id
* @param roleId 角色id
* @param roleName 角色名称
* @param giftCount 一共消耗多少个礼包
* @param sid
*/
export async function useGiftPackage(roleId: string, roleName: string, sid: string, serverId: number, guildCode: string, giftID: number, selected: Array<number> = [], giftCount: number) {
console.log("bbbbbbbb", giftID, selected)
let result: { goods: {id: number, count: number, seqId?: number|string, isBag?: boolean}[], addHeros: any[]} = { goods: [], addHeros: [] }
let giftPackageData = gameData.giftPackage.get(giftID);
if (!giftPackageData) {
return resResult(STATUS.SUCCESS, result);
}
console.log('dddddddddddddd', giftID, JSON.stringify(giftPackageData))
let giftType = giftPackageData.type;//礼包类型
let dicGiftPackagePlan = gameData.giftPackagePlan.get(giftPackageData.id)||[];
switch (giftType) {
case GIFT_PACKAGE_TYPE.ALL://全部
{
let allReward = [];
for (let obj of dicGiftPackagePlan) {
allReward.push({ type: obj.contentType, id: obj.content, count: obj.count * giftCount });
}
result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE);
break;
}
case GIFT_PACKAGE_TYPE.SELECTED_X://手选
{
let count = giftPackageData.count;//选择个数
if (selected.length != count) {
break;
}
let pool = dicGiftPackagePlan.filter(cur => cur.contentType == 1? !isHeroHidden(cur.content): !isGoodsHidden(cur.content));
let selectedReward = getSelectedReward(pool, selected)
let allReward: { type: number, id: number, count: number }[] = [];
for (let obj of selectedReward) {
allReward.push({ type: obj.type, id: obj.id, count: obj.count * giftCount });
}
let gids = allReward.filter(cur => cur.type == 2).map(cur => cur.id);
if(gids.length > 0 && isGoodsHidden(...gids)) return resResult(STATUS.ITEM_IS_HIDDEN);
let hids = allReward.filter(cur => cur.type == 1).map(cur => cur.id);
if(hids.length > 0 && isHeroHidden(...gids)) return resResult(STATUS.HERO_IS_HIDDEN);
result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE);
break;
}
case GIFT_PACKAGE_TYPE.RANDOM_X://随机
{
let count = giftPackageData.count;//随机个数
let pool = dicGiftPackagePlan.filter(cur => cur.contentType == 1? !isHeroHidden(cur.content): !isGoodsHidden(cur.content));
if(pool.length <= 0) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let allReward: { type: number, id: number, count: number }[] = [];
let giftPackage = { giftPackageId: giftID };
const floorPlans = groupByFloorId(pool);
let dropHistory = (floorPlans && Object.keys(floorPlans).length > 0) ? await GiftPackageFloorModel.findByGiftPackageId(roleId, giftID): { floors: [], getSum: 0, allSum: 0 };
for (let i = 0; i < giftCount; i++) {
let { rewards, floors } = await randomSelectedData(dropHistory, pool, roleId, giftID, count);
allReward.push(...rewards);
giftPackage['floors'] = floors;
}
await GiftPackageFloorModel.updateByGiftPackageId(roleId, giftID, {
floors: dropHistory.floors, getSum: dropHistory.getSum, allSum: dropHistory.allSum
});
result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE);
Object.assign(result, { giftPackage });
break;
}
case GIFT_PACKAGE_TYPE.GUILD_FUND: // 军团资金
{
console.log('ccccc',guildCode, giftPackageData.count, giftCount)
if(!guildCode) return resResult(STATUS.ITEM_CANNOT_RECEIVE_NO_GUILD);
const guild = await GuildModel.updateInfo(guildCode, {}, { fund: giftPackageData.count * giftCount });
await pushGuildInfoUpdate(guildCode, { fund: guild.fund });
recordGuildFund(serverId, guild, giftPackageData.count * giftCount);
break;
}
default:
break;
}
return resResult(STATUS.SUCCESS, result);
}
//结算奖励的内容
export async function addReward(roleId: string, roleName: string, sid: string, serverId: number, reward: Array<RewardParam>, reason: number) {
let giftReward = rewardItemData(reward);
let goodArray = giftReward.goods;
let heroArray = giftReward.heroes;
//兑换物品
let goods = await addItems(roleId, roleName, sid, goodArray, reason)
let addHeros = [];
if (heroArray.length > 0) {
let heroResult = await createHeroes(roleId, roleName, sid, serverId, heroArray);
goods = goods.concat(heroResult.goods)
addHeros = addHeros.concat(heroResult.heroes);
}
return { goods: combineItems(goods), addHeros }
}
//表中的奖励数据(包括礼包)转换成具体对应奖励物品的实例
export function rewardItemData(reward: Array<RewardParam>) {
let goods: Array<RewardInter> = [];
let heroes: Array<CreateHeroParam> = [];
for (let obj of reward) {
switch (obj.type) {
case ACTIVITY_RESOURCES_TYPE.HERO:
heroes.push({ hid: obj.id, count: obj.count })
break;
case ACTIVITY_RESOURCES_TYPE.GOODS:
goods.push({ id: obj.id, count: obj.count, expireTime: obj.expireTime })
break;
case ACTIVITY_RESOURCES_TYPE.GIFTPACKAGE://配置成礼包会立刻兑换,配置成物品会把礼包放入背包中
let goodData = gameData.goods.get(obj.id);//礼包物品
let giftPackageData = gameData.giftPackage.get(goodData.gift);//礼包数据
let giftReward = rewardItemData(giftPackageData.reward)
goods = goods.concat(giftReward.goods)
heroes = heroes.concat(giftReward.heroes)
break;
default:
break;
}
}
return { goods, heroes }
}
export function getSelectedReward(plans: DicGiftPackagePlan[], selected: Array<number>): Array<RewardParam> {
let selectedReward: Array<RewardParam> = [];
for (let i = 0; i < selected.length; i++) {
let index = selected[i];
if (plans.length > index) {
let { contentType, content, count } = plans[index];
selectedReward.push({ type: contentType, id: content, count });
}
}
return selectedReward;
}
// 根据是否触发保底,更新抽取次数
function updateFloorCount(floors: Floor[], maxQaulity: number, isTrigger: boolean) {
for (let floor of floors) {
if (!isTrigger) {
floor.count++;
} else {
if (floor.quality <= maxQaulity) {
floor.count = 0;
} else {
floor.count++;
}
}
}
return floors;
}
// 将随机池子根据保底 id 进行分组
function groupByFloorId(plans: DicGiftPackagePlan[]): { [key: number]: DicGiftPackagePlan[] } {
return plans.reduce((acc, cur) => {
if (cur.floorId !== 0) {
if (!acc[cur.floorId]) acc[cur.floorId] = [];
acc[cur.floorId].push(cur);
}
return acc;
}, {} as { [key: number]: DicGiftPackagePlan[] });
}
// 初始化用户某个礼包的保底数据
async function initFloorData(floors: Floor[], floorPlans: { [key: number]: DicGiftPackagePlan[] }) {
for (let floorId in floorPlans) {
let hasFloorFlag = false;
for (let floor of floors) {
if (floor.id === parseInt(floorId)) {
hasFloorFlag = true;
continue;
}
}
if (!hasFloorFlag) {
floors.push({ id: parseInt(floorId), count: 0, quality: gameData.giftPackageFloor.get(parseInt(floorId)).quality });
}
}
}
async function randomSelectedData(dropHistory: {floors: Floor[], getSum: number, allSum: number }, pool: DicGiftPackagePlan[], roleId: string, giftPackageId: number, count: number) {
let rewards: RewardParam[] = [];
const floorPlans = groupByFloorId(pool);
let { floors = [], getSum = 0, allSum = 0 } = dropHistory;
for (let i = 0; i < count; i++) {
let randResult = getRandEelmWithWeight(pool)?.dic;
if (!randResult) continue;
// 如果没有保底池子,直接返回
if (!floorPlans || Object.keys(floorPlans).length === 0) {
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
continue;
}
initFloorData(floors, floorPlans);
// 检查随机结果的 id 是否在 floorPlans 中,是的话抽中保底
let flag = false;
for (let floorId in floorPlans) {
if (floorPlans[floorId].findIndex(cur => cur.id === randResult.id) !== -1) {
flag = true;
break;
}
}
// 检查是否达到了保底次数,并且记录最大品质的 floorId
let maxQaulityFloorId = 0; // 最大品质的 floorId
let maxQaulity = 0;
for (let floor of floors) {
if (floor.count + 1 >= gameData.giftPackageFloor.get(floor.id).times) {
flag = true;
if (gameData.giftPackageFloor.get(floor.id).quality > maxQaulity) {
maxQaulityFloorId = floor.id;
maxQaulity = gameData.giftPackageFloor.get(floor.id).quality;
}
}
}
// 更新抽取次数,确定要返回的物品
if (flag && maxQaulityFloorId == 0) { // 抽到了保底物品
const quality = gameData.giftPackageFloor.get(randResult.floorId).quality;
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
updateFloorCount(floors, quality, true);
getSum++;
console.log('got floorId a: ', randResult.floorId, quality);
} else if (flag && maxQaulityFloorId > 0) { // 次数保底
let floorResult = getRandEelmWithWeight(floorPlans[maxQaulityFloorId])?.dic;
if (!floorResult) continue;
rewards.push({ type: floorResult.contentType, id: floorResult.content, count: floorResult.count });
updateFloorCount(floors, maxQaulity, true);
getSum++;
console.log('got floorId b: ', maxQaulityFloorId, maxQaulity);
} else { // 未达到保底次数
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
updateFloorCount(floors, 0, false);
console.log('got floorId c: ', randResult.floorId, 0);
}
allSum++;
}
let result;
result = Object.assign({}, { rewards })
if(floorPlans && Object.keys(floorPlans).length > 0) {
dropHistory.floors = floors;
dropHistory.getSum = getSum;
dropHistory.allSum = allSum;
Object.assign(result, { giftPackageId, floors });
}
return result;
}
//数据格式转换'类型&id&数量|类型&id&数量|' ->> Array<RewardParam> 活动奖励
export function stringToRewardParam(rewardStr: string): Array<RewardParam> {
let result = new Array<{ type: number, id: number, count: number }>();
if (!rewardStr) return result;
let decodeArr = decodeArrayListStr(rewardStr);
for (let [type, id, count] of decodeArr) {
if (isNaN(parseInt(type)) || isNaN(parseInt(id)) || isNaN(parseInt(count))) {
continue;
}
result.push({ type: parseInt(type), id: parseInt(id), count: parseInt(count) });
}
return result
}
//数据格式转换'类型&id&数量|类型&id&数量|' ->> Array<ItemInter> 资源消耗
export function stringToConsumeParam(...rewardStrs: string[]) {
let result = new Array<{ type: number, id: number, count: number }>();
for(let rewardStr of rewardStrs) {
if(!rewardStr) continue;
let decodeArr = decodeArrayListStr(rewardStr);
for (let [type, id, count] of decodeArr) {
if (isNaN(parseInt(type)) || isNaN(parseInt(id)) || isNaN(parseInt(count))) {
throw new Error('data table format wrong');
}
result.push({ type: parseInt(type), id: parseInt(id), count: parseInt(count) });
}
}
return combineItems(result);
}
//数据格式转换'id&数量|id&数量|' ->> Array<RewardInter> 老资源格式
export function stringToRewardInter(rewardStr: string): Array<RewardInter> {
let result = new Array<{ id: number, count: number }>();
if (!rewardStr) return result;
let decodeArr = decodeArrayListStr(rewardStr);
for (let [type, id, count] of decodeArr) {
if (isNaN(parseInt(id)) || isNaN(parseInt(count))) {
throw new Error('data table format wrong');
}
result.push({ id: parseInt(id), count: parseInt(count) });
}
return result
}
import { GIFT_PACKAGE_TYPE, ACTIVITY_RESOURCES_TYPE, ITEM_CHANGE_REASON, STATUS } from '@consts';
import { gameData } from '@pubUtils/data';
import { addItems } from '../role/rewardService';
import { RewardParam } from '@domain/activityField/rewardField';
import { CreateHeroParam } from '@domain/roleField/hero';
import { DicGiftPackage } from '@pubUtils/dictionary/DicGiftPackage';
import { ItemInter, RewardInter } from '@pubUtils/interface';
import { decodeArrayListStr, getRandEelmWithWeight, resResult } from '@pubUtils/util';
import { createHeroes } from '../role/createHero';
import { GuildModel } from '@db/Guild';
import { pushGuildInfoUpdate } from '../guildService';
import { combineItems } from '../role/util';
import { recordGuildFund } from './timeLimitRankService';
import { filterGoods, isGoodsHidden, isHeroHidden } from '../dataService';
import { DicGiftPackagePlan } from '@pubUtils/dictionary/DicGiftPackagePlan';
import { Floor, GiftPackageFloorModel, GiftPackageFloorType } from '@db/GiftPackageFloor';
import { isNumber } from 'underscore';
/**
* 兑换礼包
* @param giftID 礼包id
* @param roleId 角色id
* @param roleName 角色名称
* @param giftCount 一共消耗多少个礼包
* @param sid
*/
export async function useGiftPackage(roleId: string, roleName: string, sid: string, serverId: number, guildCode: string, giftID: number, selected: Array<number> = [], giftCount: number) {
console.log("bbbbbbbb", giftID, selected)
let result: { goods: {id: number, count: number, seqId?: number|string, isBag?: boolean}[], addHeros: any[]} = { goods: [], addHeros: [] }
let giftPackageData = gameData.giftPackage.get(giftID);
if (!giftPackageData) {
return resResult(STATUS.SUCCESS, result);
}
console.log('dddddddddddddd', giftID, JSON.stringify(giftPackageData))
let giftType = giftPackageData.type;//礼包类型
let dicGiftPackagePlan = gameData.giftPackagePlan.get(giftPackageData.id)||[];
switch (giftType) {
case GIFT_PACKAGE_TYPE.ALL://全部
{
let allReward = [];
for (let obj of dicGiftPackagePlan) {
allReward.push({ type: obj.contentType, id: obj.content, count: obj.count * giftCount });
}
result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE);
break;
}
case GIFT_PACKAGE_TYPE.SELECTED_X://手选
{
let count = giftPackageData.count;//选择个数
if (selected.length != count) {
break;
}
let pool = dicGiftPackagePlan.filter(cur => cur.contentType == 1? !isHeroHidden(cur.content): !isGoodsHidden(cur.content));
let selectedReward = getSelectedReward(pool, selected)
let allReward: { type: number, id: number, count: number }[] = [];
for (let obj of selectedReward) {
allReward.push({ type: obj.type, id: obj.id, count: obj.count * giftCount });
}
let gids = allReward.filter(cur => cur.type == 2).map(cur => cur.id);
if(gids.length > 0 && isGoodsHidden(...gids)) return resResult(STATUS.ITEM_IS_HIDDEN);
let hids = allReward.filter(cur => cur.type == 1).map(cur => cur.id);
if(hids.length > 0 && isHeroHidden(...gids)) return resResult(STATUS.HERO_IS_HIDDEN);
result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE);
break;
}
case GIFT_PACKAGE_TYPE.RANDOM_X://随机
{
let count = giftPackageData.count;//随机个数
let pool = dicGiftPackagePlan.filter(cur => cur.contentType == 1? !isHeroHidden(cur.content): !isGoodsHidden(cur.content));
if(pool.length <= 0) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let allReward: { type: number, id: number, count: number }[] = [];
let giftPackage = { giftPackageId: giftID };
const floorPlans = groupByFloorId(pool);
let dropHistory = (floorPlans && Object.keys(floorPlans).length > 0) ? await GiftPackageFloorModel.findByGiftPackageId(roleId, giftID): { floors: [], getSum: 0, allSum: 0 };
for (let i = 0; i < giftCount; i++) {
let { rewards, floors } = await randomSelectedData(dropHistory, pool, roleId, giftID, count);
allReward.push(...rewards);
giftPackage['floors'] = floors;
}
await GiftPackageFloorModel.updateByGiftPackageId(roleId, giftID, {
floors: dropHistory.floors, getSum: dropHistory.getSum, allSum: dropHistory.allSum
});
result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE);
Object.assign(result, { giftPackage });
break;
}
case GIFT_PACKAGE_TYPE.GUILD_FUND: // 军团资金
{
console.log('ccccc',guildCode, giftPackageData.count, giftCount)
if(!guildCode) return resResult(STATUS.ITEM_CANNOT_RECEIVE_NO_GUILD);
const guild = await GuildModel.updateInfo(guildCode, {}, { fund: giftPackageData.count * giftCount });
await pushGuildInfoUpdate(guildCode, { fund: guild.fund });
recordGuildFund(serverId, guild, giftPackageData.count * giftCount);
break;
}
default:
break;
}
return resResult(STATUS.SUCCESS, result);
}
//结算奖励的内容
export async function addReward(roleId: string, roleName: string, sid: string, serverId: number, reward: Array<RewardParam>, reason: number) {
let giftReward = rewardItemData(reward);
let goodArray = giftReward.goods;
let heroArray = giftReward.heroes;
//兑换物品
let goods = await addItems(roleId, roleName, sid, goodArray, reason)
let addHeros = [];
if (heroArray.length > 0) {
let heroResult = await createHeroes(roleId, roleName, sid, serverId, heroArray);
goods = goods.concat(heroResult.goods)
addHeros = addHeros.concat(heroResult.heroes);
}
return { goods: combineItems(goods), addHeros }
}
//表中的奖励数据(包括礼包)转换成具体对应奖励物品的实例
export function rewardItemData(reward: Array<RewardParam>) {
let goods: Array<RewardInter> = [];
let heroes: Array<CreateHeroParam> = [];
for (let obj of reward) {
switch (obj.type) {
case ACTIVITY_RESOURCES_TYPE.HERO:
heroes.push({ hid: obj.id, count: obj.count })
break;
case ACTIVITY_RESOURCES_TYPE.GOODS:
goods.push({ id: obj.id, count: obj.count, expireTime: obj.expireTime })
break;
case ACTIVITY_RESOURCES_TYPE.GIFTPACKAGE://配置成礼包会立刻兑换,配置成物品会把礼包放入背包中
let goodData = gameData.goods.get(obj.id);//礼包物品
let giftPackageData = gameData.giftPackage.get(goodData.gift);//礼包数据
let giftReward = rewardItemData(giftPackageData.reward)
goods = goods.concat(giftReward.goods)
heroes = heroes.concat(giftReward.heroes)
break;
default:
break;
}
}
return { goods, heroes }
}
export function getSelectedReward(plans: DicGiftPackagePlan[], selected: Array<number>): Array<RewardParam> {
let selectedReward: Array<RewardParam> = [];
for (let i = 0; i < selected.length; i++) {
let index = selected[i];
if (plans.length > index) {
let { contentType, content, count } = plans[index];
selectedReward.push({ type: contentType, id: content, count });
}
}
return selectedReward;
}
// 根据是否触发保底,更新抽取次数
function updateFloorCount(floors: Floor[], maxQaulity: number, isTrigger: boolean) {
for (let floor of floors) {
if (!isTrigger) {
floor.count++;
} else {
if (floor.quality <= maxQaulity) {
floor.count = 0;
} else {
floor.count++;
}
}
}
return floors;
}
// 将随机池子根据保底 id 进行分组
function groupByFloorId(plans: DicGiftPackagePlan[]): { [key: number]: DicGiftPackagePlan[] } {
return plans.reduce((acc, cur) => {
if (cur.floorId !== 0) {
if (!acc[cur.floorId]) acc[cur.floorId] = [];
acc[cur.floorId].push(cur);
}
return acc;
}, {} as { [key: number]: DicGiftPackagePlan[] });
}
// 初始化用户某个礼包的保底数据
async function initFloorData(floors: Floor[], floorPlans: { [key: number]: DicGiftPackagePlan[] }) {
for (let floorId in floorPlans) {
let hasFloorFlag = false;
for (let floor of floors) {
if (floor.id === parseInt(floorId)) {
hasFloorFlag = true;
continue;
}
}
if (!hasFloorFlag) {
floors.push({ id: parseInt(floorId), count: 0, quality: gameData.giftPackageFloor.get(parseInt(floorId)).quality });
}
}
}
async function randomSelectedData(dropHistory: {floors: Floor[], getSum: number, allSum: number }, pool: DicGiftPackagePlan[], roleId: string, giftPackageId: number, count: number) {
let rewards: RewardParam[] = [];
const floorPlans = groupByFloorId(pool);
let { floors = [], getSum = 0, allSum = 0 } = dropHistory;
for (let i = 0; i < count; i++) {
let randResult = getRandEelmWithWeight(pool)?.dic;
if (!randResult) continue;
// 如果没有保底池子,直接返回
if (!floorPlans || Object.keys(floorPlans).length === 0) {
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
continue;
}
initFloorData(floors, floorPlans);
// 检查随机结果的 id 是否在 floorPlans 中,是的话抽中保底
let flag = false;
for (let floorId in floorPlans) {
if (floorPlans[floorId].findIndex(cur => cur.id === randResult.id) !== -1) {
flag = true;
break;
}
}
// 检查是否达到了保底次数,并且记录最大品质的 floorId
let maxQaulityFloorId = 0; // 最大品质的 floorId
let maxQaulity = 0;
for (let floor of floors) {
if (floor.count + 1 >= gameData.giftPackageFloor.get(floor.id).times) {
flag = true;
if (gameData.giftPackageFloor.get(floor.id).quality > maxQaulity) {
maxQaulityFloorId = floor.id;
maxQaulity = gameData.giftPackageFloor.get(floor.id).quality;
}
}
}
// 更新抽取次数,确定要返回的物品
if (flag && maxQaulityFloorId == 0) { // 抽到了保底物品
const quality = gameData.giftPackageFloor.get(randResult.floorId).quality;
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
updateFloorCount(floors, quality, true);
getSum++;
console.log('got floorId a: ', randResult.floorId, quality);
} else if (flag && maxQaulityFloorId > 0) { // 次数保底
let floorResult = getRandEelmWithWeight(floorPlans[maxQaulityFloorId])?.dic;
if (!floorResult) continue;
rewards.push({ type: floorResult.contentType, id: floorResult.content, count: floorResult.count });
updateFloorCount(floors, maxQaulity, true);
getSum++;
console.log('got floorId b: ', maxQaulityFloorId, maxQaulity);
} else { // 未达到保底次数
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
updateFloorCount(floors, 0, false);
console.log('got floorId c: ', randResult.floorId, 0);
}
allSum++;
}
let result;
result = Object.assign({}, { rewards })
if(floorPlans && Object.keys(floorPlans).length > 0) {
dropHistory.floors = floors;
dropHistory.getSum = getSum;
dropHistory.allSum = allSum;
Object.assign(result, { giftPackageId, floors });
}
return result;
}
//数据格式转换'类型&id&数量|类型&id&数量|' ->> Array<RewardParam> 活动奖励
export function stringToRewardParam(rewardStr: string): Array<RewardParam> {
let result = new Array<{ type: number, id: number, count: number }>();
if (!rewardStr) return result;
let decodeArr = decodeArrayListStr(rewardStr);
for (let [type, id, count] of decodeArr) {
if (isNaN(parseInt(type)) || isNaN(parseInt(id)) || isNaN(parseInt(count))) {
continue;
}
result.push({ type: parseInt(type), id: parseInt(id), count: parseInt(count) });
}
return result
}
//数据格式转换'类型&id&数量|类型&id&数量|' ->> Array<ItemInter> 资源消耗
export function stringToConsumeParam(...rewardStrs: string[]) {
let result = new Array<{ type: number, id: number, count: number }>();
for(let rewardStr of rewardStrs) {
if(!rewardStr) continue;
let decodeArr = decodeArrayListStr(rewardStr);
for (let [type, id, count] of decodeArr) {
if (isNaN(parseInt(type)) || isNaN(parseInt(id)) || isNaN(parseInt(count))) {
throw new Error('data table format wrong');
}
result.push({ type: parseInt(type), id: parseInt(id), count: parseInt(count) });
}
}
return combineItems(result);
}
//数据格式转换'id&数量|id&数量|' ->> Array<RewardInter> 老资源格式
export function stringToRewardInter(rewardStr: string): Array<RewardInter> {
let result = new Array<{ id: number, count: number }>();
if (!rewardStr) return result;
let decodeArr = decodeArrayListStr(rewardStr);
for (let [type, id, count] of decodeArr) {
if (isNaN(parseInt(id)) || isNaN(parseInt(count))) {
throw new Error('data table format wrong');
}
result.push({ id: parseInt(id), count: parseInt(count) });
}
return result
}
@@ -1,115 +1,115 @@
import { ACTIVITY_TYPE, GROUP_SHOP_PRICE_STATUS, MAIL_TYPE, PUSH_ROUTE } from "../../consts";
import { ActivityModel, ActivityModelType } from "../../db/Activity";
import { ActivityGroupShopRecModel } from "../../db/ActivityGroupShopRec";
import { ActivityGroupShopRefundModel, RefundRec } from "../../db/ActivityGroupShopRefund";
import { ActivityGroupShopUserRecModel } from "../../db/ActivityGroupShopUserRec";
import { GroupShopData } from "../../domain/activityField/groupShopField";
import { gameData } from "../../pubUtils/data";
import { RewardInter } from "../../pubUtils/interface";
import { sendMailByContent } from "../mailService";
import { sendMessageToGroupShopWithSuc } from "../pushService";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getGoldObject } from "../role/rewardService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getGroupShopData(activityId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if(!activityData) return null
let createTime = await getRoleCreateTime(roleId);
let playerData = new GroupShopData(activityData, createTime, 0);
let serverRecords = await ActivityGroupShopRecModel.findByActivity(activityId);
playerData.setRecords(serverRecords);
let playerRecords = await ActivityGroupShopUserRecModel.findByActivityAndRoleId(activityId, roleId);
playerData.setPlayerRecord(playerRecords);
return playerData;
}
export async function getGroupShopDataShow(activityId: number, roleId: string) {
let playerData = await getGroupShopData(activityId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export function getGroupShopPriceStatus(clientPrice: number, price: number) {
if(clientPrice == price) return GROUP_SHOP_PRICE_STATUS.NORMAL;
if(clientPrice < price) return GROUP_SHOP_PRICE_STATUS.NOT_ENOUGH;
return GROUP_SHOP_PRICE_STATUS.OVER;
}
export async function getGroupShopServerData(activityData: ActivityModelType) {
let playerData = new GroupShopData(activityData, 0, 0);
let serverRecords = await ActivityGroupShopRecModel.findByActivity(activityData.activityId);
playerData.setRecords(serverRecords);
return playerData;
}
export async function getGroupShopTimers(activity: ActivityModelType) {
if(!activity) return [];
let playerData = await getGroupShopServerData(activity);
return playerData?.timer||[];
}
export async function setGroupShopToSetSum(arr: { activityId: number, itemId: number, sum: number }[]) {
console.log('###### setGroupShopToSetSum', JSON.stringify(arr));
for(let { activityId, itemId, sum } of arr) {
let serverRecord = await ActivityGroupShopRecModel.setSum(activityId, itemId, sum);
if(serverRecord) {
let activityData = await getActivityById(activityId);
let playerData = new GroupShopData(activityData, 0, 0);
playerData.setRecords([serverRecord]);
let item = playerData.findItemById(itemId);
let nextDiscount = item.getCurDiscount();
// 推送频道
await sendMessageToGroupShopWithSuc(PUSH_ROUTE.GROUP_SHOP_UPDATE, { activityId, sum, itemId, curDiscount: nextDiscount });
}
}
}
export async function refundGroupShop(isDebug = false) {
console.log('###### refundGroupShop')
let activities = await ActivityModel.findActivityByType(ACTIVITY_TYPE.GROUP_SHOP);
for(let activityData of activities) {
let hasRefund = await ActivityGroupShopRefundModel.check(activityData.activityId);
if(!isDebug && hasRefund) continue;
let playerData = await getGroupShopServerData(activityData);
if(!isDebug && playerData.endTime >= Date.now()) continue;
let items = playerData.items||[];
let refundRecs: RefundRec[] = [];
for(let item of items) {
let curDiscount = item.getCurDiscount();
let playerRecords = await ActivityGroupShopUserRecModel.findByPrice(activityData.activityId, item.itemId, item.getCurDiscount().price);
for(let { roleId, records } of playerRecords) {
let rewards: {id: number, count: number}[] = [], sumGold = 0;
for(let { price, buyCnt } of records) {
if(price <= curDiscount.price) continue;
let diff = (price - curDiscount.price) * buyCnt;
rewards.push(getGoldObject(diff));
sumGold += diff;
refundRecs.push({ roleId, itemId: item.itemId, diff });
}
let itemName = gameData.goods.get(item.id)?.name?? `${item.id}`;
let resultDiscount = curDiscount.discount;
await sendMailByContent(MAIL_TYPE.GROUP_SHOP_REFUND, roleId, { goods: rewards, params: [itemName, `${resultDiscount}`, `${sumGold}`] });
}
}
console.log('###### refundGroupShop refund complete', activityData.activityId)
await ActivityGroupShopRefundModel.refund(activityData.activityId, refundRecs);
}
}
import { ACTIVITY_TYPE, GROUP_SHOP_PRICE_STATUS, MAIL_TYPE, PUSH_ROUTE } from "@consts";
import { ActivityModel, ActivityModelType } from "@db/Activity";
import { ActivityGroupShopRecModel } from "@db/ActivityGroupShopRec";
import { ActivityGroupShopRefundModel, RefundRec } from "@db/ActivityGroupShopRefund";
import { ActivityGroupShopUserRecModel } from "@db/ActivityGroupShopUserRec";
import { GroupShopData } from "@domain/activityField/groupShopField";
import { gameData } from "@pubUtils/data";
import { RewardInter } from "@pubUtils/interface";
import { sendMailByContent } from "../mailService";
import { sendMessageToGroupShopWithSuc } from "../pushService";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getGoldObject } from "../role/rewardService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getGroupShopData(activityId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if(!activityData) return null
let createTime = await getRoleCreateTime(roleId);
let playerData = new GroupShopData(activityData, createTime, 0);
let serverRecords = await ActivityGroupShopRecModel.findByActivity(activityId);
playerData.setRecords(serverRecords);
let playerRecords = await ActivityGroupShopUserRecModel.findByActivityAndRoleId(activityId, roleId);
playerData.setPlayerRecord(playerRecords);
return playerData;
}
export async function getGroupShopDataShow(activityId: number, roleId: string) {
let playerData = await getGroupShopData(activityId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export function getGroupShopPriceStatus(clientPrice: number, price: number) {
if(clientPrice == price) return GROUP_SHOP_PRICE_STATUS.NORMAL;
if(clientPrice < price) return GROUP_SHOP_PRICE_STATUS.NOT_ENOUGH;
return GROUP_SHOP_PRICE_STATUS.OVER;
}
export async function getGroupShopServerData(activityData: ActivityModelType) {
let playerData = new GroupShopData(activityData, 0, 0);
let serverRecords = await ActivityGroupShopRecModel.findByActivity(activityData.activityId);
playerData.setRecords(serverRecords);
return playerData;
}
export async function getGroupShopTimers(activity: ActivityModelType) {
if(!activity) return [];
let playerData = await getGroupShopServerData(activity);
return playerData?.timer||[];
}
export async function setGroupShopToSetSum(arr: { activityId: number, itemId: number, sum: number }[]) {
console.log('###### setGroupShopToSetSum', JSON.stringify(arr));
for(let { activityId, itemId, sum } of arr) {
let serverRecord = await ActivityGroupShopRecModel.setSum(activityId, itemId, sum);
if(serverRecord) {
let activityData = await getActivityById(activityId);
let playerData = new GroupShopData(activityData, 0, 0);
playerData.setRecords([serverRecord]);
let item = playerData.findItemById(itemId);
let nextDiscount = item.getCurDiscount();
// 推送频道
await sendMessageToGroupShopWithSuc(PUSH_ROUTE.GROUP_SHOP_UPDATE, { activityId, sum, itemId, curDiscount: nextDiscount });
}
}
}
export async function refundGroupShop(isDebug = false) {
console.log('###### refundGroupShop')
let activities = await ActivityModel.findActivityByType(ACTIVITY_TYPE.GROUP_SHOP);
for(let activityData of activities) {
let hasRefund = await ActivityGroupShopRefundModel.check(activityData.activityId);
if(!isDebug && hasRefund) continue;
let playerData = await getGroupShopServerData(activityData);
if(!isDebug && playerData.endTime >= Date.now()) continue;
let items = playerData.items||[];
let refundRecs: RefundRec[] = [];
for(let item of items) {
let curDiscount = item.getCurDiscount();
let playerRecords = await ActivityGroupShopUserRecModel.findByPrice(activityData.activityId, item.itemId, item.getCurDiscount().price);
for(let { roleId, records } of playerRecords) {
let rewards: {id: number, count: number}[] = [], sumGold = 0;
for(let { price, buyCnt } of records) {
if(price <= curDiscount.price) continue;
let diff = (price - curDiscount.price) * buyCnt;
rewards.push(getGoldObject(diff));
sumGold += diff;
refundRecs.push({ roleId, itemId: item.itemId, diff });
}
let itemName = gameData.goods.get(item.id)?.name?? `${item.id}`;
let resultDiscount = curDiscount.discount;
await sendMailByContent(MAIL_TYPE.GROUP_SHOP_REFUND, roleId, { goods: rewards, params: [itemName, `${resultDiscount}`, `${sumGold}`] });
}
}
console.log('###### refundGroupShop refund complete', activityData.activityId)
await ActivityGroupShopRefundModel.refund(activityData.activityId, refundRecs);
}
}
@@ -1,207 +1,207 @@
import { ACTIVITY_TYPE, STATUS, TASK_TYPE } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityGrowthFundModel, ActivityGrowthFundModelType } from '../../db/ActivityGrowthFund';
import { ActivityBuyRecordsModel } from '../../db/ActivityBuyRecords';
import { RoleModel } from '../../db/Role';
import { GrowthFundData } from '../../domain/activityField/growthFundField';
import { ServerlistModel } from '../../db/Serverlist';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { RougelikeExtendModel } from '../../db/RougelikeExtend';
import { AuthorBookModel } from '../../db/AuthorBook';
import * as util from 'util';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
/*ACTIVITY_TYPE类型
GROWTH_FUND_MAIN = 6, // 主线成长基金
GROWTH_FUND_MAIN_VIP = 7, // 主线成长基金(高阶)
GROWTH_FUND_TOWER = 8, // 镇念塔成长基金
GROWTH_FUND_TOWER_VIP = 9, // 镇念塔成长基金(高阶)
GROWTH_FUND_MAIN_ELITE = 10, // 精英成长基金
GROWTH_FUND_MAIN_ELITE_VIP = 11, // 精英成长基金(高阶)
GROWTH_FUND_ROUGE = 60, //学宫普通密卷
GROWTH_FUND_ROUGE_VIP = 61, //学宫高级密卷
GROWTH_FUND_AUTHOR = 62, //列传普通密卷
GROWTH_FUND_AUTHOR_VIP = 63, //列传高级密卷
*/
export async function growthFundActivity(type: number, serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, type);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0]
let playerData = await getPlayerGrowthFundData(activityData.activityId, serverId, roleId);
if (playerData.isComplete()) {
return null;
}
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerGrowthFundData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecords: ActivityGrowthFundModelType[] = await ActivityGrowthFundModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthFundData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
if (playerData.isVipActivity()) {//vip高阶需要购买
let buyRecords = await ActivityBuyRecordsModel.findRecordsByActivityId(activityData.activityId, roleId);
playerData.initBuyRecords(buyRecords);
}
let activityType = activityData.type;
switch (activityType) {
case ACTIVITY_TYPE.GROWTH_FUND_MAIN://主线
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP://主线vip
{
let role = await RoleModel.findByRoleId(roleId);
let { warStar = new Array<{ id: number, warType: number, star: number }>() } = role;
let warIDs = warStar.map(cur => cur.id);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.BATTLE_MAIN) {
let index = warIDs.findIndex(id => { return id === item.taskParamArray[1] })
if (index != -1) {
item.isComplete = true;
}
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_TOWER://镇念塔
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP:////镇念塔vip
{
let { towerLv } = await RoleModel.findByRoleId(roleId);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.BATTLE_TOWER_LV) {
if (towerLv >= item.condition) {
item.isComplete = true;
}
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE: //精英
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP: //精英VIP
{
let role = await RoleModel.findByRoleId(roleId);
let { warStar = new Array<{ id: number, warType: number, star: number }>() } = role;
let warIDs = warStar.map(cur => cur.id);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.BATTLE_MAIN_ELITE) {
let index = warIDs.findIndex(id => { return id === item.taskParamArray[1] })
if (index != -1) {
item.isComplete = true;
}
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_ROUGE: //学宫普通密卷
case ACTIVITY_TYPE.GROWTH_FUND_ROUGE_VIP: //学宫高级密卷
{
const dbRougeExtends = await RougelikeExtendModel.findByRoleId(roleId);
if (dbRougeExtends.length <= 0) break;
const limitIdMap = dbRougeExtends.reduce((result, cur) => { result.set(cur.limitId, cur.limitId); return result; }, new Map<number, number>());
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.FUND_ROUGE) {
if (limitIdMap.has(item.taskParamArray[0])) item.isComplete = true;
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_AUTHOR: //列传普通密卷
case ACTIVITY_TYPE.GROWTH_FUND_AUTHOR_VIP: //列传高级密卷
{
const progress = await AuthorBookModel.findProgressByRoleId(roleId);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.FUND_AUTHOR) {
if (progress >= item.taskParamArray[0]) item.isComplete = true;
}
}
}
break;
}
default:
break;
}
return playerData;
}
/**
* 购买高阶版
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeGrowthFund(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP
&& activityData.type !== ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP
&& activityData.type !== ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP
&& activityData.type != ACTIVITY_TYPE.GROWTH_FUND_ROUGE_VIP
&& activityData.type != ACTIVITY_TYPE.GROWTH_FUND_AUTHOR_VIP ) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthFundData(activityData, createTime, serverTime);
let pageData = playerData.findPageByProductID(productID);
let pageIndex = pageData.pageIndex;
let checkResult = await ActivityBuyRecordsModel.checkRecord(activityId, roleId, activityData.type, pageIndex);
if(checkResult) return STATUS.ORDER_CANNOT_BUY;
await ActivityBuyRecordsModel.addRecord(activityId, roleId, activityData.type, pageIndex, true);
return {
code: 0,
data: Object.assign({}, { item: { pageIndex }, activityId: activityId })
}
}
export async function checkGrowthFund(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthFundData(activityData, createTime, serverTime);
let pageData = playerData.findPageByProductID(productID);
let pageIndex = pageData.pageIndex;
let checkResult = await ActivityBuyRecordsModel.checkRecord(activityData.activityId, roleId, activityData.type, pageIndex);
return !checkResult;
}
import { ACTIVITY_TYPE, STATUS, TASK_TYPE } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityGrowthFundModel, ActivityGrowthFundModelType } from '@db/ActivityGrowthFund';
import { ActivityBuyRecordsModel } from '@db/ActivityBuyRecords';
import { RoleModel } from '@db/Role';
import { GrowthFundData } from '@domain/activityField/growthFundField';
import { ServerlistModel } from '@db/Serverlist';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { RougelikeExtendModel } from '@db/RougelikeExtend';
import { AuthorBookModel } from '@db/AuthorBook';
import * as util from 'util';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
/*ACTIVITY_TYPE类型
GROWTH_FUND_MAIN = 6, // 主线成长基金
GROWTH_FUND_MAIN_VIP = 7, // 主线成长基金(高阶)
GROWTH_FUND_TOWER = 8, // 镇念塔成长基金
GROWTH_FUND_TOWER_VIP = 9, // 镇念塔成长基金(高阶)
GROWTH_FUND_MAIN_ELITE = 10, // 精英成长基金
GROWTH_FUND_MAIN_ELITE_VIP = 11, // 精英成长基金(高阶)
GROWTH_FUND_ROUGE = 60, //学宫普通密卷
GROWTH_FUND_ROUGE_VIP = 61, //学宫高级密卷
GROWTH_FUND_AUTHOR = 62, //列传普通密卷
GROWTH_FUND_AUTHOR_VIP = 63, //列传高级密卷
*/
export async function growthFundActivity(type: number, serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, type);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0]
let playerData = await getPlayerGrowthFundData(activityData.activityId, serverId, roleId);
if (playerData.isComplete()) {
return null;
}
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerGrowthFundData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecords: ActivityGrowthFundModelType[] = await ActivityGrowthFundModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthFundData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
if (playerData.isVipActivity()) {//vip高阶需要购买
let buyRecords = await ActivityBuyRecordsModel.findRecordsByActivityId(activityData.activityId, roleId);
playerData.initBuyRecords(buyRecords);
}
let activityType = activityData.type;
switch (activityType) {
case ACTIVITY_TYPE.GROWTH_FUND_MAIN://主线
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP://主线vip
{
let role = await RoleModel.findByRoleId(roleId);
let { warStar = new Array<{ id: number, warType: number, star: number }>() } = role;
let warIDs = warStar.map(cur => cur.id);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.BATTLE_MAIN) {
let index = warIDs.findIndex(id => { return id === item.taskParamArray[1] })
if (index != -1) {
item.isComplete = true;
}
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_TOWER://镇念塔
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP:////镇念塔vip
{
let { towerLv } = await RoleModel.findByRoleId(roleId);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.BATTLE_TOWER_LV) {
if (towerLv >= item.condition) {
item.isComplete = true;
}
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE: //精英
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP: //精英VIP
{
let role = await RoleModel.findByRoleId(roleId);
let { warStar = new Array<{ id: number, warType: number, star: number }>() } = role;
let warIDs = warStar.map(cur => cur.id);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.BATTLE_MAIN_ELITE) {
let index = warIDs.findIndex(id => { return id === item.taskParamArray[1] })
if (index != -1) {
item.isComplete = true;
}
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_ROUGE: //学宫普通密卷
case ACTIVITY_TYPE.GROWTH_FUND_ROUGE_VIP: //学宫高级密卷
{
const dbRougeExtends = await RougelikeExtendModel.findByRoleId(roleId);
if (dbRougeExtends.length <= 0) break;
const limitIdMap = dbRougeExtends.reduce((result, cur) => { result.set(cur.limitId, cur.limitId); return result; }, new Map<number, number>());
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.FUND_ROUGE) {
if (limitIdMap.has(item.taskParamArray[0])) item.isComplete = true;
}
}
}
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_AUTHOR: //列传普通密卷
case ACTIVITY_TYPE.GROWTH_FUND_AUTHOR_VIP: //列传高级密卷
{
const progress = await AuthorBookModel.findProgressByRoleId(roleId);
for (let page of playerData.list) {
for (let item of page.items) {
if (item.taskType == TASK_TYPE.FUND_AUTHOR) {
if (progress >= item.taskParamArray[0]) item.isComplete = true;
}
}
}
break;
}
default:
break;
}
return playerData;
}
/**
* 购买高阶版
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeGrowthFund(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP
&& activityData.type !== ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP
&& activityData.type !== ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP
&& activityData.type != ACTIVITY_TYPE.GROWTH_FUND_ROUGE_VIP
&& activityData.type != ACTIVITY_TYPE.GROWTH_FUND_AUTHOR_VIP ) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthFundData(activityData, createTime, serverTime);
let pageData = playerData.findPageByProductID(productID);
let pageIndex = pageData.pageIndex;
let checkResult = await ActivityBuyRecordsModel.checkRecord(activityId, roleId, activityData.type, pageIndex);
if(checkResult) return STATUS.ORDER_CANNOT_BUY;
await ActivityBuyRecordsModel.addRecord(activityId, roleId, activityData.type, pageIndex, true);
return {
code: 0,
data: Object.assign({}, { item: { pageIndex }, activityId: activityId })
}
}
export async function checkGrowthFund(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthFundData(activityData, createTime, serverTime);
let pageData = playerData.findPageByProductID(productID);
let pageIndex = pageData.pageIndex;
let checkResult = await ActivityBuyRecordsModel.checkRecord(activityData.activityId, roleId, activityData.type, pageIndex);
return !checkResult;
}
@@ -1,59 +1,59 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityGrowthModel, ActivityGrowthModelType } from '../../db/ActivityGrowth';
import { ActivityGrowthPointModel, ActivityGrowthPointModelType } from '../../db/ActivityGrowthPoint';
import { HeroModel } from '../../db/Hero';
import { GrowthData } from '../../domain/activityField/growthField';
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 growthActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.TASK_GROWTH);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityData.activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityData.activityId, roleId);
let userHeroes = await HeroModel.findByRole(roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthData(activityData, createTime, serverTime);
await playerData.setPlayerRecords(playerRecords, roleId, userHeroes);
playerData.setPlayerPointRecord(playerPointRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerGrowthData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let playerRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityId, roleId);
let userHeroes = await HeroModel.findByRole(roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthData(activityData, createTime, serverTime);
await playerData.setPlayerRecords(playerRecords, roleId, userHeroes);
playerData.setPlayerPointRecord(playerPointRecord);
return playerData;
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityGrowthModel, ActivityGrowthModelType } from '@db/ActivityGrowth';
import { ActivityGrowthPointModel, ActivityGrowthPointModelType } from '@db/ActivityGrowthPoint';
import { HeroModel } from '@db/Hero';
import { GrowthData } from '@domain/activityField/growthField';
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 growthActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.TASK_GROWTH);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityData.activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityData.activityId, roleId);
let userHeroes = await HeroModel.findByRole(roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthData(activityData, createTime, serverTime);
await playerData.setPlayerRecords(playerRecords, roleId, userHeroes);
playerData.setPlayerPointRecord(playerPointRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerGrowthData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let playerRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityId, roleId);
let userHeroes = await HeroModel.findByRole(roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new GrowthData(activityData, createTime, serverTime);
await playerData.setPlayerRecords(playerRecords, roleId, userHeroes);
playerData.setPlayerPointRecord(playerPointRecord);
return playerData;
}
@@ -1,106 +1,106 @@
import { ACTIVITY_TYPE } from "../../consts";
import { ActivityGuildPayModel } from "../../db/ActivityGuildPay";
import { RoleType } from "../../db/Role";
import { GuildPayData } from "../../domain/activityField/guildPay";
import { getActivitiesByType, getActivityById, pushActivities, pushActivitiesToGuild, pushActivityInter } from "./activityService";
import { ServerlistModel } from '../../db/Serverlist';
import { ActivityGuildPayRecordModel } from "../../db/ActivityGuildPayRecord";
import { getServerCreateTime } from "../redisService";
/**
* 玩家活动数据
*
* @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 serverTime = await getServerCreateTime(serverId);
let playerData = new GuildPayData(activityData, 0, serverTime);
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) return;
let serverTime = await getServerCreateTime(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, serverTime);
if(obj && obj.canPay()) {
let { isNew, result } = await ActivityGuildPayModel.addRecord(serverId, activityId, obj.roundIndex, guildCode, {
roleId, roleName, price, hasQuit: false
});
if(isNew) {
let { memberRecord = [] } = result;
let payMemberCnt = memberRecord.filter(member => !member.hasQuit).length;
pushResult.push({ activityId, activityType, param: { payMember: roleName, payMemberCnt } });
}
}
}
console.log('##### addGuildPay', pushResult.length)
await pushActivitiesToGuild(pushResult, guildCode);
}
export async function guildPayQuitGuild(serverId: number, guildCode: string, roleId: string) {
if(!guildCode) return;
let serverTime = await getServerCreateTime(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, serverTime);
if(obj && obj.canPay()) {
let result = await ActivityGuildPayModel.quitGuild(serverId, activityId, obj.roundIndex, guildCode, roleId);
if(result) {
let { memberRecord = [] } = result;
let records = memberRecord.filter(member => !member.hasQuit);
let payRecord = records.map(member => member.roleName);
pushResult.push({ activityId, activityType, param: { payRecord, payMemberCnt: payRecord.length } });
}
}
}
await pushActivitiesToGuild(pushResult, guildCode);
}
export async function changeGuildActivity(guildCode: string, serverId: number, roleId: string, sid: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let { activityId, type: activityType } = activityData;
let obj = await getGuildPayData(serverId, activityId, roleId, guildCode);
pushResult.push({ activityId, activityType, param: { payRecord: obj.payRecord, payMemberCnt: obj.payMemberCnt } });
}
await pushActivities(pushResult, roleId, sid);
}
export async function guildDismisActivity(guildCode: string, serverId: number) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let { activityId, type: activityType } = activityData;
pushResult.push({ activityId, activityType, param: { payRecord: [], payMemberCnt: 0 } });
}
await pushActivitiesToGuild(pushResult, guildCode);
}
import { ACTIVITY_TYPE } from "@consts";
import { ActivityGuildPayModel } from "@db/ActivityGuildPay";
import { RoleType } from "@db/Role";
import { GuildPayData } from "@domain/activityField/guildPay";
import { getActivitiesByType, getActivityById, pushActivities, pushActivitiesToGuild, pushActivityInter } from "./activityService";
import { ServerlistModel } from '@db/Serverlist';
import { ActivityGuildPayRecordModel } from "@db/ActivityGuildPayRecord";
import { getServerCreateTime } from "../redisService";
/**
* 玩家活动数据
*
* @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 serverTime = await getServerCreateTime(serverId);
let playerData = new GuildPayData(activityData, 0, serverTime);
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) return;
let serverTime = await getServerCreateTime(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, serverTime);
if(obj && obj.canPay()) {
let { isNew, result } = await ActivityGuildPayModel.addRecord(serverId, activityId, obj.roundIndex, guildCode, {
roleId, roleName, price, hasQuit: false
});
if(isNew) {
let { memberRecord = [] } = result;
let payMemberCnt = memberRecord.filter(member => !member.hasQuit).length;
pushResult.push({ activityId, activityType, param: { payMember: roleName, payMemberCnt } });
}
}
}
console.log('##### addGuildPay', pushResult.length)
await pushActivitiesToGuild(pushResult, guildCode);
}
export async function guildPayQuitGuild(serverId: number, guildCode: string, roleId: string) {
if(!guildCode) return;
let serverTime = await getServerCreateTime(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, serverTime);
if(obj && obj.canPay()) {
let result = await ActivityGuildPayModel.quitGuild(serverId, activityId, obj.roundIndex, guildCode, roleId);
if(result) {
let { memberRecord = [] } = result;
let records = memberRecord.filter(member => !member.hasQuit);
let payRecord = records.map(member => member.roleName);
pushResult.push({ activityId, activityType, param: { payRecord, payMemberCnt: payRecord.length } });
}
}
}
await pushActivitiesToGuild(pushResult, guildCode);
}
export async function changeGuildActivity(guildCode: string, serverId: number, roleId: string, sid: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let { activityId, type: activityType } = activityData;
let obj = await getGuildPayData(serverId, activityId, roleId, guildCode);
pushResult.push({ activityId, activityType, param: { payRecord: obj.payRecord, payMemberCnt: obj.payMemberCnt } });
}
await pushActivities(pushResult, roleId, sid);
}
export async function guildDismisActivity(guildCode: string, serverId: number) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let { activityId, type: activityType } = activityData;
pushResult.push({ activityId, activityType, param: { payRecord: [], payMemberCnt: 0 } });
}
await pushActivitiesToGuild(pushResult, guildCode);
}
@@ -1,157 +1,157 @@
import moment = require('moment');
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityShopModel, ActivityShopModelType } from '../../db/ActivityShop';
import { RoleModel } from '../../db/Role';
import { ServerlistModel } from '../../db/Serverlist';
import { LimitShopData } from '../../domain/activityField/limitShopField';
import { deltaDays } from '../../pubUtils/util';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { addReward, stringToRewardParam } from './giftPackageService';
/**
* 获取新手玩家限购礼包活动数据 新手限定作为开服七天乐的延伸礼包。只存在于开服前七天,七天时间过去,玩家无法购买
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function newPlayerLimitPackageActivity(serverId: number, roleId: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE);
if (activities.length == 0) {
return null;
}
let activityData = activities[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 每日、每周限购礼包活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerLimitPackageData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 获取每日/每周限购礼包数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function limitPackageActivity(serverId: number, roleId: string, type: number) {
let activityArray = await getActivitiesByType(serverId, type);
activityArray = activityArray.sort((a, b) => {
return b.activityId - a.activityId
});
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerData = await getPlayerLimitPackageData(activityData.activityId, serverId, roleId);
return playerData
}
/**
* 玩家活动第几天
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function newPlayerActivityDays(roleId: string) {
let { createTime } = await RoleModel.findByRoleId(roleId);
let createDate = moment(createTime * 1000).toDate();
let todayIndex = deltaDays(createDate, new Date, true) + 1;
return todayIndex;
}
/**
* 结算购买的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeLimitPackageReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE &&
activityData.type !== ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY &&
activityData.type !== ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) {
return STATUS.ACTIVITY_NO_PRODUCT;
}
if (item.countMax > 0 && item.buyCount >= item.countMax) {
return STATUS.ACTIVITY_MAX_COUNT;
}
let rewardArray = stringToRewardParam(item.reward)
let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.BUY_LIMIT_PACKAGE);
await ActivityShopModel.addRecord(activityId, roleId, playerData.roundIndex, item.id, 1);
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item: item, activityId: activityId })
}
}
export async function checkLimitPackageCanBuy(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) return false
if (item.countMax > 0 && item.buyCount >= item.countMax) return false;
return true;
}
import moment = require('moment');
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityShopModel, ActivityShopModelType } from '@db/ActivityShop';
import { RoleModel } from '@db/Role';
import { ServerlistModel } from '@db/Serverlist';
import { LimitShopData } from '@domain/activityField/limitShopField';
import { deltaDays } from '@pubUtils/util';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { addReward, stringToRewardParam } from './giftPackageService';
/**
* 获取新手玩家限购礼包活动数据 新手限定作为开服七天乐的延伸礼包。只存在于开服前七天,七天时间过去,玩家无法购买
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function newPlayerLimitPackageActivity(serverId: number, roleId: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE);
if (activities.length == 0) {
return null;
}
let activityData = activities[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 每日、每周限购礼包活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerLimitPackageData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 获取每日/每周限购礼包数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function limitPackageActivity(serverId: number, roleId: string, type: number) {
let activityArray = await getActivitiesByType(serverId, type);
activityArray = activityArray.sort((a, b) => {
return b.activityId - a.activityId
});
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerData = await getPlayerLimitPackageData(activityData.activityId, serverId, roleId);
return playerData
}
/**
* 玩家活动第几天
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function newPlayerActivityDays(roleId: string) {
let { createTime } = await RoleModel.findByRoleId(roleId);
let createDate = moment(createTime * 1000).toDate();
let todayIndex = deltaDays(createDate, new Date, true) + 1;
return todayIndex;
}
/**
* 结算购买的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeLimitPackageReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE &&
activityData.type !== ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY &&
activityData.type !== ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) {
return STATUS.ACTIVITY_NO_PRODUCT;
}
if (item.countMax > 0 && item.buyCount >= item.countMax) {
return STATUS.ACTIVITY_MAX_COUNT;
}
let rewardArray = stringToRewardParam(item.reward)
let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.BUY_LIMIT_PACKAGE);
await ActivityShopModel.addRecord(activityId, roleId, playerData.roundIndex, item.id, 1);
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item: item, activityId: activityId })
}
}
export async function checkLimitPackageCanBuy(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LimitShopData(activityData, createTime, serverTime);
let playerRecord: ActivityShopModelType = await ActivityShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) return false
if (item.countMax > 0 && item.buyCount >= item.countMax) return false;
return true;
}
@@ -1,35 +1,35 @@
import { ActivityLuckyModel } from "../../db/ActivityLuckyRec";
import { LuckyData } from "../../domain/activityField/luckyField";
import { shouldRefresh } from "../../pubUtils/util";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerLuckyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LuckyData(activityData, createTime, serverTime);
let playerRecord = await ActivityLuckyModel.findByActivityId(serverId, activityId, roleId, playerData.roundIndex);
if(playerRecord && shouldRefresh(playerRecord.refTodayCount, new Date())) {
playerRecord = await ActivityLuckyModel.refreshTodayCount(serverId, activityId, roleId, playerData.roundIndex);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerLuckyDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerLuckyData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityLuckyModel } from "@db/ActivityLuckyRec";
import { LuckyData } from "@domain/activityField/luckyField";
import { shouldRefresh } from "@pubUtils/util";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerLuckyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LuckyData(activityData, createTime, serverTime);
let playerRecord = await ActivityLuckyModel.findByActivityId(serverId, activityId, roleId, playerData.roundIndex);
if(playerRecord && shouldRefresh(playerRecord.refTodayCount, new Date())) {
playerRecord = await ActivityLuckyModel.refreshTodayCount(serverId, activityId, roleId, playerData.roundIndex);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerLuckyDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerLuckyData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,35 +1,35 @@
import { ActivityTurntableModel } from "../../db/ActivityTurntableRec";
import { LuckyTurntableData } from "../../domain/activityField/luckyTurntableField";
import { shouldRefresh } from "../../pubUtils/util";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerLuckyTurntableData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LuckyTurntableData(activityData, createTime, serverTime);
let playerRecord = await ActivityTurntableModel.findByActivityId(serverId, activityId, roleId, playerData.roundIndex);
if(playerRecord && shouldRefresh(playerRecord.refTodayCount, new Date())) {
playerRecord = await ActivityTurntableModel.refreshTodayCount(serverId, activityId, roleId, playerData.roundIndex);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerLuckyTurntableDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerLuckyTurntableData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityTurntableModel } from "@db/ActivityTurntableRec";
import { LuckyTurntableData } from "@domain/activityField/luckyTurntableField";
import { shouldRefresh } from "@pubUtils/util";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerLuckyTurntableData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new LuckyTurntableData(activityData, createTime, serverTime);
let playerRecord = await ActivityTurntableModel.findByActivityId(serverId, activityId, roleId, playerData.roundIndex);
if(playerRecord && shouldRefresh(playerRecord.refTodayCount, new Date())) {
playerRecord = await ActivityTurntableModel.refreshTodayCount(serverId, activityId, roleId, playerData.roundIndex);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerLuckyTurntableDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerLuckyTurntableData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,38 +1,38 @@
import { ActivityMidAutumnRecModel } from "../../db/ActivityMidAutumnRec";
import { MidAutumnData } from "../../domain/activityField/midAutumnField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMidAutumnData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MidAutumnData(activityData, createTime, serverTime);
let playerRecord = await ActivityMidAutumnRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMidAutumnDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerMidAutumnData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityMidAutumnRecModel } from "@db/ActivityMidAutumnRec";
import { MidAutumnData } from "@domain/activityField/midAutumnField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMidAutumnData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MidAutumnData(activityData, createTime, serverTime);
let playerRecord = await ActivityMidAutumnRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMidAutumnDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerMidAutumnData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,46 +1,46 @@
import { ActivityForgeModel } from "../../db/ActivityForge";
import { ActivityMiniGameModel } from "../../db/ActivityMiniGame";
import { ActivityMiniGameRecModel } from "../../db/ActivityMiniGameRec";
import { MiniGameData } from "../../domain/activityField/miniGameField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMiniGameData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MiniGameData(activityData, createTime, serverTime);
let playerRecord = await ActivityMiniGameModel.findData(serverId, activityId, playerData.roundIndex, roleId);
let records = await ActivityMiniGameRecModel.findRecords(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerData(playerRecord);
playerData.setPlayerRecords(records);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMiniGameDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerMiniGameData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export function getMetialStr(material: { id: number, count: number }[]) {
return material.map(({id, count}) => `${id}&${count}`).join('|')
}
import { ActivityForgeModel } from "@db/ActivityForge";
import { ActivityMiniGameModel } from "@db/ActivityMiniGame";
import { ActivityMiniGameRecModel } from "@db/ActivityMiniGameRec";
import { MiniGameData } from "@domain/activityField/miniGameField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMiniGameData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MiniGameData(activityData, createTime, serverTime);
let playerRecord = await ActivityMiniGameModel.findData(serverId, activityId, playerData.roundIndex, roleId);
let records = await ActivityMiniGameRecModel.findRecords(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerData(playerRecord);
playerData.setPlayerRecords(records);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMiniGameDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerMiniGameData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export function getMetialStr(material: { id: number, count: number }[]) {
return material.map(({id, count}) => `${id}&${count}`).join('|')
}
@@ -1,69 +1,69 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityMonopolyModel, ActivityMonopolyModelType } from '../../db/ActivityMonopoly';
import { ActivityMonopolyLandModel, ActivityMonopolyLandModelType } from '../../db/ActivityMonopolyLand';
import { MonopolyData } from '../../domain/activityField/monopolyField';
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 getMonopolyActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.MONOPOLY);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(serverId, activityData.activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType[] = await ActivityMonopolyLandModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonopolyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerMonopolyData, playerLandData);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMonopolyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if (!activityData) {
return null;
}
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(serverId, activityData.activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType[] = await ActivityMonopolyLandModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonopolyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerMonopolyData, playerLandData);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} position 当前位置
* @param {number} addStep 移动步数
* @param {number} max 最大位置
*
*/
export function nextPosition(position: number, addStep: number, max: number) {
let temp = (position + addStep) % max;
return (temp == 0) ? max : temp;
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivityMonopolyModel, ActivityMonopolyModelType } from '@db/ActivityMonopoly';
import { ActivityMonopolyLandModel, ActivityMonopolyLandModelType } from '@db/ActivityMonopolyLand';
import { MonopolyData } from '@domain/activityField/monopolyField';
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 getMonopolyActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.MONOPOLY);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(serverId, activityData.activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType[] = await ActivityMonopolyLandModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonopolyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerMonopolyData, playerLandData);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMonopolyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if (!activityData) {
return null;
}
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(serverId, activityData.activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType[] = await ActivityMonopolyLandModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonopolyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerMonopolyData, playerLandData);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} position 当前位置
* @param {number} addStep 移动步数
* @param {number} max 最大位置
*
*/
export function nextPosition(position: number, addStep: number, max: number) {
let temp = (position + addStep) % max;
return (temp == 0) ? max : temp;
}
@@ -1,96 +1,96 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from "../../consts";
import { ActivityModelType } from "../../db/Activity";
import { ActivityMonthlyFundModel } from "../../db/ActivityMonthlyFund";
import { MonthlyFundData } from "../../domain/activityField/monthlyFundField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
import { stringToRewardParam, addReward } from "./giftPackageService";
/**
* 月基金玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getMonthlyFundData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyFundData(activityData, createTime, serverTime);
let playerRecords = await ActivityMonthlyFundModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 月基金 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getMonthlyFundDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getMonthlyFundData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 月基金 是否可以购买
* @param roleId 玩家id
* @param serverId 服
* @param activityData 活动数据
* @returns
*/
export async function checkMonthlyFund(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData || activityData.type !== ACTIVITY_TYPE.MONTHLY_FUND) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyFundData(activityData, createTime, serverTime);
let playerRecords = await ActivityMonthlyFundModel.findData(serverId, activityData.activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
let page = playerData.findByProductID(productID);
return !page.hasBought;
}
/**
* 周基金购买
* @param roleId 玩家id
* @param roleName 玩家名
* @param sid
* @param serverId 服
* @param activityId 活动
* @param productID 商品id
* @returns
*/
export async function makeMonthlyFund(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.MONTHLY_FUND) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyFundData(activityData, createTime, serverTime);
let playerRecords = await ActivityMonthlyFundModel.findData(serverId, activityData.activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
let page = playerData.findByProductID(productID);
if(page.hasBought) return STATUS.ORDER_CANNOT_BUY;
await ActivityMonthlyFundModel.buy(serverId, activityId, roleId, playerData.roundIndex, page.pageIndex, productID);
let rewardParamArr = stringToRewardParam(page.onceReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.ACT_WEEKLY_FUND_BUY);
return {
code: 0,
data: Object.assign(result, { activityId: activityId, pageIndex: page.pageIndex, roundIndex: playerData.roundIndex })
}
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from "@consts";
import { ActivityModelType } from "@db/Activity";
import { ActivityMonthlyFundModel } from "@db/ActivityMonthlyFund";
import { MonthlyFundData } from "@domain/activityField/monthlyFundField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
import { stringToRewardParam, addReward } from "./giftPackageService";
/**
* 月基金玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getMonthlyFundData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyFundData(activityData, createTime, serverTime);
let playerRecords = await ActivityMonthlyFundModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 月基金 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getMonthlyFundDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getMonthlyFundData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 月基金 是否可以购买
* @param roleId 玩家id
* @param serverId 服
* @param activityData 活动数据
* @returns
*/
export async function checkMonthlyFund(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData || activityData.type !== ACTIVITY_TYPE.MONTHLY_FUND) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyFundData(activityData, createTime, serverTime);
let playerRecords = await ActivityMonthlyFundModel.findData(serverId, activityData.activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
let page = playerData.findByProductID(productID);
return !page.hasBought;
}
/**
* 周基金购买
* @param roleId 玩家id
* @param roleName 玩家名
* @param sid
* @param serverId 服
* @param activityId 活动
* @param productID 商品id
* @returns
*/
export async function makeMonthlyFund(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.MONTHLY_FUND) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyFundData(activityData, createTime, serverTime);
let playerRecords = await ActivityMonthlyFundModel.findData(serverId, activityData.activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecords);
let page = playerData.findByProductID(productID);
if(page.hasBought) return STATUS.ORDER_CANNOT_BUY;
await ActivityMonthlyFundModel.buy(serverId, activityId, roleId, playerData.roundIndex, page.pageIndex, productID);
let rewardParamArr = stringToRewardParam(page.onceReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.ACT_WEEKLY_FUND_BUY);
return {
code: 0,
data: Object.assign(result, { activityId: activityId, pageIndex: page.pageIndex, roundIndex: playerData.roundIndex })
}
}
@@ -1,240 +1,240 @@
import { ACTIVITY_TYPE, HANG_UP_CONSTS, ITEM_CHANGE_REASON, MAIL_TYPE, REFRESH_TIME, STATUS } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityMonthlyTicketModel, ActivityMonthlyTicketModelType } from '../../db/ActivityMonthlyTicket';
import { RewardParam } from '../../domain/activityField/rewardField';
import { MonthlyTicketData } from '../../domain/activityField/monthlyTicketField';
import { addReward, stringToRewardParam } from './giftPackageService';
import moment = require('moment');
import { ServerlistModel } from '../../db/Serverlist';
import { sendMailByContent } from './../mailService';
import { RoleModel, RoleType } from '../../db/Role';
import { getActivitiesByType, getActivityById } from './activityService';
import { RewardInter } from '../../pubUtils/interface';
import { DUNGEON_CONST, PVP, VIP } from '../../pubUtils/dicParam';
import { cal, } from '../../pubUtils/util';
import { stringWithTypeToRewardInter } from '../../pubUtils/roleUtil';
import { pinus } from 'pinus';
import { getGoldId } from '../role/rewardService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function monthlyTicketActivity(serverId: number, roleId: string, type: number) {
let activityArray = await getActivitiesByType(serverId, type);
activityArray = activityArray.sort((a, b) => {
return b.activityId - a.activityId
});
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerRecord: ActivityMonthlyTicketModelType = await ActivityMonthlyTicketModel.findMonthlyTicket(serverId, roleId, activityData.activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
if ((playerData.price > 0 && playerData.isOpen) || playerData.price === 0) {
if (playerData.todayIndex - 1 > playerData.dayIndex) {//过期还没领取
//下发邮件奖励
for (let i = playerData.dayIndex + 1; i < playerData.todayIndex; i++) {
let goods = stringWithTypeToRewardInter(playerData.baseReward)
await sendMailByContent(MAIL_TYPE.MONTHLY_REWARD, roleId, { params: [], goods });
}
await ActivityMonthlyTicketModel.setDayIndex(serverId, roleId, playerData.activityId, playerData.todayIndex - 1);
playerData.dayIndex = playerData.todayIndex - 1;
}
}
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMonthlyTicketData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityMonthlyTicketModelType = await ActivityMonthlyTicketModel.findMonthlyTicket(serverId, roleId, activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家月卡当天的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMonthlyTicketDayReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number,) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
let playerRecord: ActivityMonthlyTicketModelType = await ActivityMonthlyTicketModel.findMonthlyTicket(serverId, roleId, activityId);
if (playerData.price > 0 && !playerRecord) {//没有购买过
return null;
}
playerData.setPlayerRecords(playerRecord);
if ((playerData.price > 0 && playerData.isOpen) || playerData.price == 0) {
if (playerData.todayIndex > playerData.dayIndex) {//今天还没领取
await ActivityMonthlyTicketModel.setDayIndex(serverId, roleId, activityId, playerData.todayIndex);
let rewardParamArr: Array<RewardParam> = stringToRewardParam(playerData.baseReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.MONTHLY_TICKET_DAILY)
return result
}
}
return null
}
/**
* 结算首次购买月卡的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeMonthlyTicketReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.MONTHLY_TICKET_1 && activityData.type !== ACTIVITY_TYPE.MONTHLY_TICKET_2) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
if(!await checkMonthlyTicket(roleId, serverId, activityData)) return STATUS.ORDER_CANNOT_BUY;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
let endTime = playerData.isForever? moment(playerData.endTime).toDate(): moment(new Date()).startOf('d').add(playerData.days, 'day').add(REFRESH_TIME, 'h').toDate();
console.log('endTime', playerData.isForever, moment(new Date()).startOf('d'), endTime, playerData.days)
await ActivityMonthlyTicketModel.buyMonthlyTicket(serverId, roleId, activityId, activityData.type, endTime, playerData.isForever)
if(activityData.type == ACTIVITY_TYPE.MONTHLY_TICKET_2) {
let role = await RoleModel.buyForeverTicket(roleId);
if(sid) await pinus.app.rpc.connector.connectorRemote.setOtherUserSession.toServer(sid,[{ roleId, vipStartTime: role.vipStartTime }]);
}
let firstReward = playerData.firstReward;
let rewardParamArr: Array<RewardParam> = stringToRewardParam(firstReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.MONTHLY_TICKET_FIRST)
return {
code: 0,
data: Object.assign(result, { item: { isOpen: true, todayIndex: 1 }, activityId: activityData.activityId })
}
}
// 是否可以购买月卡
export async function checkMonthlyTicket(roleId: string, serverId: number, activityData: ActivityModelType) {
if(!activityData) return false;
let result = await ActivityMonthlyTicketModel.checkHasBought(serverId, roleId, activityData.activityId, activityData.type);
return !result;
}
// 军团捐献消耗
export function getVipDonateConsume(originConsume: RewardInter, vipStartTime: number) {
if(vipStartTime > 0) {
if(originConsume.id == getGoldId()) {
return [{ id: originConsume.id, count: Math.floor(originConsume.count * VIP.VIP_GUILD_DONATE_COST_GOLD_RATIO) }];
} else {
return [originConsume];
}
} else {
return [originConsume];
}
}
export function getVipHungupReward(startTime: number, endTime: number, baseReward: RewardInter[], notReceivedGoods: {gid: number, count: number}[], vipStartTime: number) {
let multi = Math.floor((endTime - startTime) / HANG_UP_CONSTS.UNIT_TIME);
if(vipStartTime > 0) {
if(vipStartTime > startTime) { // 开始挂机之后买的月卡
let isNotVipNum = Math.floor((vipStartTime - startTime) / HANG_UP_CONSTS.UNIT_TIME); // 不是vip的时间段数
let isVipNum = multi - isNotVipNum; // 是vip的时间段数
multi = cal.add(isNotVipNum, cal.mul(isVipNum, VIP.VIP_TOWER_HUNG_UP_RATIO));
} else {
multi = cal.mul(multi, VIP.VIP_TOWER_HUNG_UP_RATIO);
}
}
let needReceiveGoods: {gid: number, count: number}[] = [];// 由于小数,未能领取的奖励
let timeReward: {id: number, count: number}[] = []; // 本次奖励
for (let { id, count } of baseReward) {
let newCount = cal.mul(count, multi);
let oldGoods = notReceivedGoods.find(cur => cur.gid == id);
if (oldGoods) newCount = cal.add(newCount, oldGoods.count);
let roundCount = Math.floor(newCount);
if (newCount > roundCount) {
needReceiveGoods.push({ gid: id, count: cal.sub(newCount, roundCount) });
}
if (roundCount > 0) {
timeReward.push({ id, count: roundCount })
}
}
return { needReceiveGoods, timeReward }
}
export async function getVipPvpChallengeMaxCnt(roleId: string, vipStartTime?: number) {
if(vipStartTime == undefined) {
let role = await RoleModel.findByRoleId(roleId, 'vipStartTime');
vipStartTime = role.vipStartTime;
}
let count = PVP.PVP_CHALLENGE_COUNTS;
if(vipStartTime > 0) {
count += VIP.VIP_PVP_CHALLENGE_COUNTS_ADD;
}
return count;
}
export function getVipDailyCnt(timesPerDay: number, role: RoleType) {
let vipStartTime = role.vipStartTime;
if(vipStartTime > 0) {
timesPerDay += VIP.VIP_DAILY_TIMERS_PER_DAY_ADD;
}
return timesPerDay
}
export function getVipDungeonCnt(vipStartTime: number) {
let count = DUNGEON_CONST.DUNGEON_CONST_FREE;
if(vipStartTime > 0) {
count += VIP.VIP_DUNGEON_CONST_FREE_ADD;
}
return count
}
export function getVipRegretCnt(vipStartTime: number) {
let count = VIP.VIP_REGRET_CNT_WITHOUT_VIP;
if(vipStartTime > 0) {
count = VIP.VIP_REGRET_CNT_WITH_VIP;
}
return count;
}
export function vipCanSkipTower(recommendCeSum: number, heroesCeSum: number, vipStartTime: number) {
let ratio = vipStartTime > 0? VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP: VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP;
return heroesCeSum > recommendCeSum * ratio;
}
export function vipCanSkipExpedition(recommendCe: number, topLineupCe: number, vipStartTime: number) {
return vipStartTime > 0 && topLineupCe > recommendCe * VIP.EXPENDITION_SKIP_CE_RATIO_WITH_VIP;
}
import { ACTIVITY_TYPE, HANG_UP_CONSTS, ITEM_CHANGE_REASON, MAIL_TYPE, REFRESH_TIME, STATUS } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityMonthlyTicketModel, ActivityMonthlyTicketModelType } from '@db/ActivityMonthlyTicket';
import { RewardParam } from '@domain/activityField/rewardField';
import { MonthlyTicketData } from '@domain/activityField/monthlyTicketField';
import { addReward, stringToRewardParam } from './giftPackageService';
import moment = require('moment');
import { ServerlistModel } from '@db/Serverlist';
import { sendMailByContent } from './../mailService';
import { RoleModel, RoleType } from '@db/Role';
import { getActivitiesByType, getActivityById } from './activityService';
import { RewardInter } from '@pubUtils/interface';
import { DUNGEON_CONST, PVP, VIP } from '@pubUtils/dicParam';
import { cal, } from '@pubUtils/util';
import { stringWithTypeToRewardInter } from '@pubUtils/roleUtil';
import { pinus } from 'pinus';
import { getGoldId } from '../role/rewardService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function monthlyTicketActivity(serverId: number, roleId: string, type: number) {
let activityArray = await getActivitiesByType(serverId, type);
activityArray = activityArray.sort((a, b) => {
return b.activityId - a.activityId
});
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerRecord: ActivityMonthlyTicketModelType = await ActivityMonthlyTicketModel.findMonthlyTicket(serverId, roleId, activityData.activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
if ((playerData.price > 0 && playerData.isOpen) || playerData.price === 0) {
if (playerData.todayIndex - 1 > playerData.dayIndex) {//过期还没领取
//下发邮件奖励
for (let i = playerData.dayIndex + 1; i < playerData.todayIndex; i++) {
let goods = stringWithTypeToRewardInter(playerData.baseReward)
await sendMailByContent(MAIL_TYPE.MONTHLY_REWARD, roleId, { params: [], goods });
}
await ActivityMonthlyTicketModel.setDayIndex(serverId, roleId, playerData.activityId, playerData.todayIndex - 1);
playerData.dayIndex = playerData.todayIndex - 1;
}
}
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMonthlyTicketData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityMonthlyTicketModelType = await ActivityMonthlyTicketModel.findMonthlyTicket(serverId, roleId, activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家月卡当天的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerMonthlyTicketDayReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number,) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
let playerRecord: ActivityMonthlyTicketModelType = await ActivityMonthlyTicketModel.findMonthlyTicket(serverId, roleId, activityId);
if (playerData.price > 0 && !playerRecord) {//没有购买过
return null;
}
playerData.setPlayerRecords(playerRecord);
if ((playerData.price > 0 && playerData.isOpen) || playerData.price == 0) {
if (playerData.todayIndex > playerData.dayIndex) {//今天还没领取
await ActivityMonthlyTicketModel.setDayIndex(serverId, roleId, activityId, playerData.todayIndex);
let rewardParamArr: Array<RewardParam> = stringToRewardParam(playerData.baseReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.MONTHLY_TICKET_DAILY)
return result
}
}
return null
}
/**
* 结算首次购买月卡的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeMonthlyTicketReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.MONTHLY_TICKET_1 && activityData.type !== ACTIVITY_TYPE.MONTHLY_TICKET_2) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
if(!await checkMonthlyTicket(roleId, serverId, activityData)) return STATUS.ORDER_CANNOT_BUY;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new MonthlyTicketData(activityData, createTime, serverTime);
let endTime = playerData.isForever? moment(playerData.endTime).toDate(): moment(new Date()).startOf('d').add(playerData.days, 'day').add(REFRESH_TIME, 'h').toDate();
console.log('endTime', playerData.isForever, moment(new Date()).startOf('d'), endTime, playerData.days)
await ActivityMonthlyTicketModel.buyMonthlyTicket(serverId, roleId, activityId, activityData.type, endTime, playerData.isForever)
if(activityData.type == ACTIVITY_TYPE.MONTHLY_TICKET_2) {
let role = await RoleModel.buyForeverTicket(roleId);
if(sid) await pinus.app.rpc.connector.connectorRemote.setOtherUserSession.toServer(sid,[{ roleId, vipStartTime: role.vipStartTime }]);
}
let firstReward = playerData.firstReward;
let rewardParamArr: Array<RewardParam> = stringToRewardParam(firstReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.MONTHLY_TICKET_FIRST)
return {
code: 0,
data: Object.assign(result, { item: { isOpen: true, todayIndex: 1 }, activityId: activityData.activityId })
}
}
// 是否可以购买月卡
export async function checkMonthlyTicket(roleId: string, serverId: number, activityData: ActivityModelType) {
if(!activityData) return false;
let result = await ActivityMonthlyTicketModel.checkHasBought(serverId, roleId, activityData.activityId, activityData.type);
return !result;
}
// 军团捐献消耗
export function getVipDonateConsume(originConsume: RewardInter, vipStartTime: number) {
if(vipStartTime > 0) {
if(originConsume.id == getGoldId()) {
return [{ id: originConsume.id, count: Math.floor(originConsume.count * VIP.VIP_GUILD_DONATE_COST_GOLD_RATIO) }];
} else {
return [originConsume];
}
} else {
return [originConsume];
}
}
export function getVipHungupReward(startTime: number, endTime: number, baseReward: RewardInter[], notReceivedGoods: {gid: number, count: number}[], vipStartTime: number) {
let multi = Math.floor((endTime - startTime) / HANG_UP_CONSTS.UNIT_TIME);
if(vipStartTime > 0) {
if(vipStartTime > startTime) { // 开始挂机之后买的月卡
let isNotVipNum = Math.floor((vipStartTime - startTime) / HANG_UP_CONSTS.UNIT_TIME); // 不是vip的时间段数
let isVipNum = multi - isNotVipNum; // 是vip的时间段数
multi = cal.add(isNotVipNum, cal.mul(isVipNum, VIP.VIP_TOWER_HUNG_UP_RATIO));
} else {
multi = cal.mul(multi, VIP.VIP_TOWER_HUNG_UP_RATIO);
}
}
let needReceiveGoods: {gid: number, count: number}[] = [];// 由于小数,未能领取的奖励
let timeReward: {id: number, count: number}[] = []; // 本次奖励
for (let { id, count } of baseReward) {
let newCount = cal.mul(count, multi);
let oldGoods = notReceivedGoods.find(cur => cur.gid == id);
if (oldGoods) newCount = cal.add(newCount, oldGoods.count);
let roundCount = Math.floor(newCount);
if (newCount > roundCount) {
needReceiveGoods.push({ gid: id, count: cal.sub(newCount, roundCount) });
}
if (roundCount > 0) {
timeReward.push({ id, count: roundCount })
}
}
return { needReceiveGoods, timeReward }
}
export async function getVipPvpChallengeMaxCnt(roleId: string, vipStartTime?: number) {
if(vipStartTime == undefined) {
let role = await RoleModel.findByRoleId(roleId, 'vipStartTime');
vipStartTime = role.vipStartTime;
}
let count = PVP.PVP_CHALLENGE_COUNTS;
if(vipStartTime > 0) {
count += VIP.VIP_PVP_CHALLENGE_COUNTS_ADD;
}
return count;
}
export function getVipDailyCnt(timesPerDay: number, role: RoleType) {
let vipStartTime = role.vipStartTime;
if(vipStartTime > 0) {
timesPerDay += VIP.VIP_DAILY_TIMERS_PER_DAY_ADD;
}
return timesPerDay
}
export function getVipDungeonCnt(vipStartTime: number) {
let count = DUNGEON_CONST.DUNGEON_CONST_FREE;
if(vipStartTime > 0) {
count += VIP.VIP_DUNGEON_CONST_FREE_ADD;
}
return count
}
export function getVipRegretCnt(vipStartTime: number) {
let count = VIP.VIP_REGRET_CNT_WITHOUT_VIP;
if(vipStartTime > 0) {
count = VIP.VIP_REGRET_CNT_WITH_VIP;
}
return count;
}
export function vipCanSkipTower(recommendCeSum: number, heroesCeSum: number, vipStartTime: number) {
let ratio = vipStartTime > 0? VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP: VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP;
return heroesCeSum > recommendCeSum * ratio;
}
export function vipCanSkipExpedition(recommendCe: number, topLineupCe: number, vipStartTime: number) {
return vipStartTime > 0 && topLineupCe > recommendCe * VIP.EXPENDITION_SKIP_CE_RATIO_WITH_VIP;
}
@@ -1,85 +1,85 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityNewHeroGKModel, ActivityNewHeroGKModelType } from '../../db/ActivityNewHeroGK';
import { NewHeroGKData } from '../../domain/activityField/newHeroGKField';
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 newHeroGKActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_GK);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecord: ActivityNewHeroGKModelType = await ActivityNewHeroGKModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGKData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityNewHeroGKModelType = await ActivityNewHeroGKModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 挑战每日关卡成功
*
* @param {number} activityId 活动id
* @param {number} gk 关卡id
*
*/
// export async function challengeNewHeroGK(serverId: number, roleId: string, activityId: number, pageIndex: number, gk: number) {
// let isFirst = false;
// let activityData: ActivityModelType = await getActivityById(activityId);
// let playerRecords = await ActivityNewHeroGKModel.findData(serverId, activityId, roleId);
// let records = playerRecords && playerRecords.records ? playerRecords.records : [];
// let createTime = await getRoleCreateTime(roleId);
// let serverTime = await getServerCreateTime(serverId);
// let playerData = new NewHeroGKData(activityData, createTime, serverTime);
// let item = playerData.findItemByGK(pageIndex, gk);
// if (item) {
// let index = item.index;
// let recordIndex = records.findIndex(obj => { return obj.pageIndex == pageIndex && obj.index == index });
// if (recordIndex == -1) {
// isFirst = true;
// await ActivityNewHeroGKModel.addRecord(serverId, activityId, roleId, pageIndex, index);
// }
// } else {
// console.log('challengeNewHeroGK没有找到对应关卡活动数据', activityId, gk)
// }
// return isFirst;
// }
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityNewHeroGKModel, ActivityNewHeroGKModelType } from '@db/ActivityNewHeroGK';
import { NewHeroGKData } from '@domain/activityField/newHeroGKField';
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 newHeroGKActivity(serverId: number, roleId: string) {
let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_GK);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let playerRecord: ActivityNewHeroGKModelType = await ActivityNewHeroGKModel.findData(serverId, activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGKData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityNewHeroGKModelType = await ActivityNewHeroGKModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 挑战每日关卡成功
*
* @param {number} activityId 活动id
* @param {number} gk 关卡id
*
*/
// export async function challengeNewHeroGK(serverId: number, roleId: string, activityId: number, pageIndex: number, gk: number) {
// let isFirst = false;
// let activityData: ActivityModelType = await getActivityById(activityId);
// let playerRecords = await ActivityNewHeroGKModel.findData(serverId, activityId, roleId);
// let records = playerRecords && playerRecords.records ? playerRecords.records : [];
// let createTime = await getRoleCreateTime(roleId);
// let serverTime = await getServerCreateTime(serverId);
// let playerData = new NewHeroGKData(activityData, createTime, serverTime);
// let item = playerData.findItemByGK(pageIndex, gk);
// if (item) {
// let index = item.index;
// let recordIndex = records.findIndex(obj => { return obj.pageIndex == pageIndex && obj.index == index });
// if (recordIndex == -1) {
// isFirst = true;
// await ActivityNewHeroGKModel.addRecord(serverId, activityId, roleId, pageIndex, index);
// }
// } else {
// console.log('challengeNewHeroGK没有找到对应关卡活动数据', activityId, gk)
// }
// return isFirst;
// }
@@ -1,120 +1,120 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityNewHeroGiftModel, ActivityNewHeroGiftModelType } from '../../db/ActivityNewHeroGift';
import { ActivityNewHeroGKModel, ActivityNewHeroGKModelType } from '../../db/ActivityNewHeroGK';
import { UserGachaModel, UserGachaType } from '../../db/UserGacha';
import { NewHeroGachaData } from '../../domain/activityField/newHeroGachaField';
import { NewHeroGiftData } from '../../domain/activityField/newHeroGiftField';
import { NewHeroGKData } from '../../domain/activityField/newHeroGKField';
import { gameData } from '../../pubUtils/data';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById, pushActivityInter } from './activityService';
import { refreshGacha } from './gachaService';
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGachaData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGachaData(activityData, createTime, serverTime);
let userGacha: UserGachaType = await UserGachaModel.findByRole(roleId, playerData.gachaId, activityId);
let dicGacha = gameData.gacha.get(playerData.gachaId);
userGacha = await refreshGacha(dicGacha, userGacha);
if(!userGacha.pickHero) {
userGacha = await UserGachaModel.updateInfo(roleId, playerData.gachaId, activityId, { pickHero: playerData.getDefaultHero() })
}
playerData.setPlayerRecords(userGacha, dicGacha);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGKData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityNewHeroGKModelType = await ActivityNewHeroGKModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 挑战每日关卡成功
*
* @param {number} activityId 活动id
* @param {number} warId 关卡id
*
*/
export async function challengeNewHeroGK(serverId: number, roleId: string, activityId: number, warId: number) {
let data = await ActivityNewHeroGKModel.addRecord(serverId, activityId, roleId, warId);
let isFirst = data.records.filter(cur => cur.warId == warId).length <= 1;
return isFirst;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGiftData(activityData, createTime, serverTime);
let playerRecord: ActivityNewHeroGiftModelType = await ActivityNewHeroGiftModel.findData(serverId, activityId, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 任务活动完成后会获得点数
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function newHeroGiftPoint(serverId: number, roleId: string, addPoint: number) {
try {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.NEW_HERO_GIFTS);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let playerData = new NewHeroGiftData(activityData, createTime, serverTime);
if(playerData.canRecordTaskPoint()) {
let result = await ActivityNewHeroGiftModel.addPoint(serverId, activityData.activityId, roleId, addPoint);
if(result) pushResult.push({ activityId: activityData.activityId, activityType: activityData.type, param: { totalPoint: result.totalPoint } });
}
}
return pushResult
} catch(e) {
console.error(e);
return []
}
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityNewHeroGiftModel, ActivityNewHeroGiftModelType } from '@db/ActivityNewHeroGift';
import { ActivityNewHeroGKModel, ActivityNewHeroGKModelType } from '@db/ActivityNewHeroGK';
import { UserGachaModel, UserGachaType } from '@db/UserGacha';
import { NewHeroGachaData } from '@domain/activityField/newHeroGachaField';
import { NewHeroGiftData } from '@domain/activityField/newHeroGiftField';
import { NewHeroGKData } from '@domain/activityField/newHeroGKField';
import { gameData } from '@pubUtils/data';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById, pushActivityInter } from './activityService';
import { refreshGacha } from './gachaService';
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGachaData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGachaData(activityData, createTime, serverTime);
let userGacha: UserGachaType = await UserGachaModel.findByRole(roleId, playerData.gachaId, activityId);
let dicGacha = gameData.gacha.get(playerData.gachaId);
userGacha = await refreshGacha(dicGacha, userGacha);
if(!userGacha.pickHero) {
userGacha = await UserGachaModel.updateInfo(roleId, playerData.gachaId, activityId, { pickHero: playerData.getDefaultHero() })
}
playerData.setPlayerRecords(userGacha, dicGacha);
return playerData;
}
/**
* 玩家玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGKData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: ActivityNewHeroGKModelType = await ActivityNewHeroGKModel.findData(serverId, activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGKData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 挑战每日关卡成功
*
* @param {number} activityId 活动id
* @param {number} warId 关卡id
*
*/
export async function challengeNewHeroGK(serverId: number, roleId: string, activityId: number, warId: number) {
let data = await ActivityNewHeroGKModel.addRecord(serverId, activityId, roleId, warId);
let isFirst = data.records.filter(cur => cur.warId == warId).length <= 1;
return isFirst;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerNewHeroGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NewHeroGiftData(activityData, createTime, serverTime);
let playerRecord: ActivityNewHeroGiftModelType = await ActivityNewHeroGiftModel.findData(serverId, activityId, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 任务活动完成后会获得点数
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function newHeroGiftPoint(serverId: number, roleId: string, addPoint: number) {
try {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.NEW_HERO_GIFTS);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let playerData = new NewHeroGiftData(activityData, createTime, serverTime);
if(playerData.canRecordTaskPoint()) {
let result = await ActivityNewHeroGiftModel.addPoint(serverId, activityData.activityId, roleId, addPoint);
if(result) pushResult.push({ activityId: activityData.activityId, activityType: activityData.type, param: { totalPoint: result.totalPoint } });
}
}
return pushResult
} catch(e) {
console.error(e);
return []
}
}
@@ -1,23 +1,23 @@
import { ActivityNovemberRecModel } from "../../db/ActivityNovemberRec";
import { NovemberData } from "../../domain/activityField/novemberField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
export async function getPlayerNovemberData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NovemberData(activityData, createTime, serverTime);
let playerRecord = await ActivityNovemberRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerNovemberDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerNovemberData(activityId, serverId, roleId);
if (playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityNovemberRecModel } from "@db/ActivityNovemberRec";
import { NovemberData } from "@domain/activityField/novemberField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
export async function getPlayerNovemberData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new NovemberData(activityData, createTime, serverTime);
let playerRecord = await ActivityNovemberRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerNovemberDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerNovemberData(activityId, serverId, roleId);
if (playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,36 +1,36 @@
import { ActivityData } from "../../domain/activityField/activityField";
import { PopNoticeData } from "../../domain/activityField/popNotice";
import { ShopData } from "../../domain/roleField/shop";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPopNoticeData(serverId: number, activityId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new PopNoticeData(activityData, createTime, serverTime);
if(playerData.needActivityTime()) {
let { activityId } = playerData.param;
let curActivity = await getActivityById(activityId);
let data = new ActivityData(curActivity, createTime, serverTime);
playerData.setActivityTime(Math.floor(data.beginTime/1000), Math.floor(data.nextRefreshTime/1000));
}
if(playerData.needShopTime()) {
let { activityId, shopItemId } = playerData.param;
let curActivity = await getActivityById(activityId);
let data = new ShopData(curActivity, createTime, serverTime);
let item = data.findByItemId(shopItemId);
if(item) playerData.setActivityTime(item.beginTime, item.endTime)
}
delete playerData.param;
return playerData;
}
import { ActivityData } from "@domain/activityField/activityField";
import { PopNoticeData } from "@domain/activityField/popNotice";
import { ShopData } from "@domain/roleField/shop";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPopNoticeData(serverId: number, activityId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new PopNoticeData(activityData, createTime, serverTime);
if(playerData.needActivityTime()) {
let { activityId } = playerData.param;
let curActivity = await getActivityById(activityId);
let data = new ActivityData(curActivity, createTime, serverTime);
playerData.setActivityTime(Math.floor(data.beginTime/1000), Math.floor(data.nextRefreshTime/1000));
}
if(playerData.needShopTime()) {
let { activityId, shopItemId } = playerData.param;
let curActivity = await getActivityById(activityId);
let data = new ShopData(curActivity, createTime, serverTime);
let item = data.findByItemId(shopItemId);
if(item) playerData.setActivityTime(item.beginTime, item.endTime)
}
delete playerData.param;
return playerData;
}
@@ -1,203 +1,203 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, PUSH_BATCH, PUSH_INTERVAL, STATUS } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { PopShopItem, PopUpConditionParamInter, PopUpShopData, PopUpShopPackage, PopUpShopItemShow, } from '../../domain/activityField/popUpShopField';
import { RewardParam } from '../../domain/activityField/rewardField';
import { addReward, stringToRewardParam } from './giftPackageService';
import { ActivityPopUpShopModel, ActivityPopUpShopModelType, PopUpShopItem } from '../../db/ActivityPopUpShop';
import { ServerlistModel } from '../../db/Serverlist';
import moment = require('moment');
import { getActivitiesByType, getActivityById, pushActivities, pushActivityInter, pushSingleActivity } from './activityService';
import { RoleModel, RoleType } from '../../db/Role';
import { HeroType } from '../../db/Hero';
import { pinus } from 'pinus';
import { getRandEelm, getRandSingleEelm } from '../../pubUtils/util';
import { getAllOnlineRoles } from '../redisService';
import { GachaResultIndb } from '../../domain/activityField/gachaField';
import { gameData } from '../../pubUtils/data';
import { ActivityPopUpShopRecModel } from '../../db/ActivityPopUpShopRec';
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPopUpShopData(activityId: number, serverId: number, roleId: string, role?: RoleType) {
if(!role) role = await RoleModel.findByRoleId(roleId, 'roleId totalPay lv');
let activityData = await getActivityById(activityId);
let playerRecords = await ActivityPopUpShopModel.findAllEffectData(serverId, activityId, roleId);
let latestRecords = await ActivityPopUpShopModel.findAllLastData(serverId, activityId, roleId);
let playerData = new PopUpShopData(activityData);
playerData.setPlayerRecords(playerRecords, latestRecords, role.totalPay, role.lv);
return playerData;
}
export async function getPopUpShopDataShow(activityId: number, serverId: number, roleId: string, role?: RoleType) {
let playerData = await getPopUpShopData(activityId, serverId, roleId, role);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export async function checkPopUpConditionInCreateHero(serverId: number, roleId: string, result: GachaResultIndb[]) {
let conditions = result.map(gachaResult => {
let dicHero = gameData.hero.get(gachaResult?.hid);
return { conditionType: POP_UP_SHOP_CONDITION_TYPE.GET_HERO_BY_QUALITY, param: { quality: dicHero?.quality } };
});
return await checkPopUpConditions(serverId, roleId, conditions);
}
export async function checkPopUpCondition(serverId: number, roleId: string, conditionType: POP_UP_SHOP_CONDITION_TYPE, param: PopUpConditionParamInter, sid?: string) {
return await checkPopUpConditions(serverId, roleId, [{ conditionType, param }], sid);
}
export async function checkPopUpConditionInEntry(serverId: number, roleId: string, sid: string) {
let guilds = pinus.app.getServersByType('guild');
let guild = getRandSingleEelm(guilds);
let isAuctionPopUpShow = await pinus.app.rpc.guild.guildActivityRemote.getAuctionPopUpShow.toServer(guild.id);
if(isAuctionPopUpShow) {
await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.AUCTION, {}, sid);
}
}
export async function checkPopUpConditionWhenGuildActivityEnd() {
let allOnlineUsers = await getAllOnlineRoles();
let n = Math.ceil(allOnlineUsers.length / PUSH_BATCH); // 一共多少批
let i = -1;
let interval = setInterval(async () => {
if (++i < n) {
// console.log('****', i)
let users = allOnlineUsers.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1);
// console.log('****', users)
for(let { serverId, roleId, sid } of users) {
await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.AUCTION, {}, sid);
}
} else {
clearInterval(interval);
}
}, PUSH_INTERVAL);
}
// 弹出礼包任务
export async function checkPopUpConditions(serverId: number, roleId: string, conditions: { conditionType: POP_UP_SHOP_CONDITION_TYPE, param: PopUpConditionParamInter }[], sid?: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.POP_UP_SHOP);
let pushData: pushActivityInter[] = [];
for(let { activityId, type: activityType } of activities) {
let playerData = await getPopUpShopData(activityId, serverId, roleId);
let pushItems: PopUpShopItemShow[] = [];
for(let { conditionType, param } of conditions) {
for(let pkg of playerData.packages) {
// console.log('##### 3', pkg.id, pkg.checkPackageCanPush(conditionType))
if( !pkg.checkPackageCanPush(conditionType)) { // 筛选推送
continue;
}
let effectTimes = await pkg.getEffectTime();
if(conditionType == POP_UP_SHOP_CONDITION_TYPE.EQUIP_STAR) {
let result = await ActivityPopUpShopRecModel.addRecord(serverId, activityId, roleId, pkg.id, effectTimes.effectBeginTime, effectTimes.effectEndTime, conditionType, param.equipStar);
param.equipStarSum = result.num;
}
let items = pkg.getItemsByCondition(param);
if(items.length > 0) {
let map = new Map<string, PopShopItem[]>();
for(let item of items) {
if(!map.has(item.param)) {
map.set(item.param, []);
}
map.get(item.param).push(item);
}
for(let [_, items] of map) {
let popUpShopRec = await ActivityPopUpShopModel.createRecord({
serverId, activityId, roleId, id: pkg.id,
...effectTimes,
items: items.map(item => new PopUpShopItem(item))
});
let result = pkg.pushPackage(popUpShopRec);
pushItems.push(...result);
}
}
}
}
// console.log('##### 5', pushItems.length)
if(pushItems.length > 0) {
pushData.push({ activityId, activityType, param: { popUpShopItems: pushItems } });
}
}
// console.log('##### 6', pushData.length)
return await pushActivities(pushData, roleId, sid);
}
/**
* 结算购买礼包的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makePopUpShopReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string, paramStr: string, roleInfo: RoleType) {
if (!paramStr) {
return STATUS.ORDER_PARAM_ERROR;
}
let paramObj = JSON.parse(paramStr);
let code = paramObj.code;
let playerData = await getPopUpShopData(activityId, serverId, roleId, roleInfo);
if (!playerData) {
return STATUS.ACTIVITY_MISSING;
}
if (playerData.type !== ACTIVITY_TYPE.POP_UP_SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let playerRecord: ActivityPopUpShopModelType = await ActivityPopUpShopModel.addRecord(serverId, activityId, roleId, code, productID);
if (!playerRecord) {
return STATUS.APPLY_ORDER_ERROR;
}
let item = playerData.updateRecord(playerRecord, productID);
if(!item) return STATUS.NO_PRODUCT_ID
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT)
return {
code: 0,
data: Object.assign(result, { item: item, activityId })
}
}
export async function checkPopUpShopCanBuy(roleId: string, serverId: number, activityId: number, productID: string, paramStr: string) {
if (!paramStr) {
return false;
}
let paramObj = JSON.parse(paramStr);
let code = paramObj.code;
let playerData = await getPopUpShopData(activityId, serverId, roleId);
if (!playerData) {
return false;
}
let playerRecord: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findByCode(serverId, activityId, roleId, code);
if (!playerRecord) {
return false;
}
let item = playerData.checkItem(playerRecord, productID);
if(!item) return false;
return true
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, PUSH_BATCH, PUSH_INTERVAL, STATUS } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { PopShopItem, PopUpConditionParamInter, PopUpShopData, PopUpShopPackage, PopUpShopItemShow, } from '@domain/activityField/popUpShopField';
import { RewardParam } from '@domain/activityField/rewardField';
import { addReward, stringToRewardParam } from './giftPackageService';
import { ActivityPopUpShopModel, ActivityPopUpShopModelType, PopUpShopItem } from '@db/ActivityPopUpShop';
import { ServerlistModel } from '@db/Serverlist';
import moment = require('moment');
import { getActivitiesByType, getActivityById, pushActivities, pushActivityInter, pushSingleActivity } from './activityService';
import { RoleModel, RoleType } from '@db/Role';
import { HeroType } from '@db/Hero';
import { pinus } from 'pinus';
import { getRandEelm, getRandSingleEelm } from '@pubUtils/util';
import { getAllOnlineRoles } from '../redisService';
import { GachaResultIndb } from '@domain/activityField/gachaField';
import { gameData } from '@pubUtils/data';
import { ActivityPopUpShopRecModel } from '@db/ActivityPopUpShopRec';
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPopUpShopData(activityId: number, serverId: number, roleId: string, role?: RoleType) {
if(!role) role = await RoleModel.findByRoleId(roleId, 'roleId totalPay lv');
let activityData = await getActivityById(activityId);
let playerRecords = await ActivityPopUpShopModel.findAllEffectData(serverId, activityId, roleId);
let latestRecords = await ActivityPopUpShopModel.findAllLastData(serverId, activityId, roleId);
let playerData = new PopUpShopData(activityData);
playerData.setPlayerRecords(playerRecords, latestRecords, role.totalPay, role.lv);
return playerData;
}
export async function getPopUpShopDataShow(activityId: number, serverId: number, roleId: string, role?: RoleType) {
let playerData = await getPopUpShopData(activityId, serverId, roleId, role);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
export async function checkPopUpConditionInCreateHero(serverId: number, roleId: string, result: GachaResultIndb[]) {
let conditions = result.map(gachaResult => {
let dicHero = gameData.hero.get(gachaResult?.hid);
return { conditionType: POP_UP_SHOP_CONDITION_TYPE.GET_HERO_BY_QUALITY, param: { quality: dicHero?.quality } };
});
return await checkPopUpConditions(serverId, roleId, conditions);
}
export async function checkPopUpCondition(serverId: number, roleId: string, conditionType: POP_UP_SHOP_CONDITION_TYPE, param: PopUpConditionParamInter, sid?: string) {
return await checkPopUpConditions(serverId, roleId, [{ conditionType, param }], sid);
}
export async function checkPopUpConditionInEntry(serverId: number, roleId: string, sid: string) {
let guilds = pinus.app.getServersByType('guild');
let guild = getRandSingleEelm(guilds);
let isAuctionPopUpShow = await pinus.app.rpc.guild.guildActivityRemote.getAuctionPopUpShow.toServer(guild.id);
if(isAuctionPopUpShow) {
await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.AUCTION, {}, sid);
}
}
export async function checkPopUpConditionWhenGuildActivityEnd() {
let allOnlineUsers = await getAllOnlineRoles();
let n = Math.ceil(allOnlineUsers.length / PUSH_BATCH); // 一共多少批
let i = -1;
let interval = setInterval(async () => {
if (++i < n) {
// console.log('****', i)
let users = allOnlineUsers.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1);
// console.log('****', users)
for(let { serverId, roleId, sid } of users) {
await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.AUCTION, {}, sid);
}
} else {
clearInterval(interval);
}
}, PUSH_INTERVAL);
}
// 弹出礼包任务
export async function checkPopUpConditions(serverId: number, roleId: string, conditions: { conditionType: POP_UP_SHOP_CONDITION_TYPE, param: PopUpConditionParamInter }[], sid?: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.POP_UP_SHOP);
let pushData: pushActivityInter[] = [];
for(let { activityId, type: activityType } of activities) {
let playerData = await getPopUpShopData(activityId, serverId, roleId);
let pushItems: PopUpShopItemShow[] = [];
for(let { conditionType, param } of conditions) {
for(let pkg of playerData.packages) {
// console.log('##### 3', pkg.id, pkg.checkPackageCanPush(conditionType))
if( !pkg.checkPackageCanPush(conditionType)) { // 筛选推送
continue;
}
let effectTimes = await pkg.getEffectTime();
if(conditionType == POP_UP_SHOP_CONDITION_TYPE.EQUIP_STAR) {
let result = await ActivityPopUpShopRecModel.addRecord(serverId, activityId, roleId, pkg.id, effectTimes.effectBeginTime, effectTimes.effectEndTime, conditionType, param.equipStar);
param.equipStarSum = result.num;
}
let items = pkg.getItemsByCondition(param);
if(items.length > 0) {
let map = new Map<string, PopShopItem[]>();
for(let item of items) {
if(!map.has(item.param)) {
map.set(item.param, []);
}
map.get(item.param).push(item);
}
for(let [_, items] of map) {
let popUpShopRec = await ActivityPopUpShopModel.createRecord({
serverId, activityId, roleId, id: pkg.id,
...effectTimes,
items: items.map(item => new PopUpShopItem(item))
});
let result = pkg.pushPackage(popUpShopRec);
pushItems.push(...result);
}
}
}
}
// console.log('##### 5', pushItems.length)
if(pushItems.length > 0) {
pushData.push({ activityId, activityType, param: { popUpShopItems: pushItems } });
}
}
// console.log('##### 6', pushData.length)
return await pushActivities(pushData, roleId, sid);
}
/**
* 结算购买礼包的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makePopUpShopReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string, paramStr: string, roleInfo: RoleType) {
if (!paramStr) {
return STATUS.ORDER_PARAM_ERROR;
}
let paramObj = JSON.parse(paramStr);
let code = paramObj.code;
let playerData = await getPopUpShopData(activityId, serverId, roleId, roleInfo);
if (!playerData) {
return STATUS.ACTIVITY_MISSING;
}
if (playerData.type !== ACTIVITY_TYPE.POP_UP_SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let playerRecord: ActivityPopUpShopModelType = await ActivityPopUpShopModel.addRecord(serverId, activityId, roleId, code, productID);
if (!playerRecord) {
return STATUS.APPLY_ORDER_ERROR;
}
let item = playerData.updateRecord(playerRecord, productID);
if(!item) return STATUS.NO_PRODUCT_ID
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT)
return {
code: 0,
data: Object.assign(result, { item: item, activityId })
}
}
export async function checkPopUpShopCanBuy(roleId: string, serverId: number, activityId: number, productID: string, paramStr: string) {
if (!paramStr) {
return false;
}
let paramObj = JSON.parse(paramStr);
let code = paramObj.code;
let playerData = await getPopUpShopData(activityId, serverId, roleId);
if (!playerData) {
return false;
}
let playerRecord: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findByCode(serverId, activityId, roleId, code);
if (!playerRecord) {
return false;
}
let item = playerData.checkItem(playerRecord, productID);
if(!item) return false;
return true
}
@@ -1,38 +1,38 @@
import { ActivityQixiRecModel } from "../../db/ActivityQixiRec";
import { QixiData } from "../../domain/activityField/qixiField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerQixiData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new QixiData(activityData, createTime, serverTime);
let playerRecord = await ActivityQixiRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerQixiDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerQixiData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { ActivityQixiRecModel } from "@db/ActivityQixiRec";
import { QixiData } from "@domain/activityField/qixiField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerQixiData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new QixiData(activityData, createTime, serverTime);
let playerRecord = await ActivityQixiRecModel.findData(serverId, activityId, playerData.roundIndex, roleId);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerQixiDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerQixiData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,42 +1,42 @@
import { HistoryOrderModel } from "../../db/HistoryOrder";
import { UserModel } from "../../db/User";
import { RebateData } from "../../domain/activityField/rebateField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRebateData(activityId: number, serverId: number, roleId: string, uid: number) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RebateData(activityData, createTime, serverTime);
let user = await UserModel.findUserByUid(uid);
if(user.channelId) {
let playerRecords = await HistoryOrderModel.findByChannelId(user.channelId);
playerData.setPlayerRecords(playerRecords, user);
}
return playerData;
}
/**
* 玩家活动数据显示
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRebateDataShow(activityId: number, serverId: number, roleId: string, uid: number) {
let playerData = await getPlayerRebateData(activityId, serverId, roleId, uid);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { HistoryOrderModel } from "@db/HistoryOrder";
import { UserModel } from "@db/User";
import { RebateData } from "@domain/activityField/rebateField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRebateData(activityId: number, serverId: number, roleId: string, uid: number) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RebateData(activityData, createTime, serverTime);
let user = await UserModel.findUserByUid(uid);
if(user.channelId) {
let playerRecords = await HistoryOrderModel.findByChannelId(user.channelId);
playerData.setPlayerRecords(playerRecords, user);
}
return playerData;
}
/**
* 玩家活动数据显示
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRebateDataShow(activityId: number, serverId: number, roleId: string, uid: number) {
let playerData = await getPlayerRebateData(activityId, serverId, roleId, uid);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,63 +1,63 @@
import { ActivityRechargeMoneyModel, ActivityRechargeMoneyModelType } from '../../db/ActivityRechargeMoney';
import { RechargeMoneyData } from '../../domain/activityField/rechargeMoneyField';
import { getActivitiesByType, getActivityById, pushActivities, pushActivityInter } from './activityService';
import { ACTIVITY_TYPE } from '../../consts';
import { getRoleCreateTime, getRoleOnlineInfo, getServerCreateTime } from '../redisService';
import { getZeroPointD, getZeroPointOfTime } from '../../pubUtils/timeUtil';
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRechargeMoneyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RechargeMoneyData(activityData, createTime, serverTime);
let beginTime = new Date(getZeroPointOfTime(playerData.beginTime));
let endTime = new Date(getZeroPointD().getTime() + 24 * 60 * 60 * 1000);
let playerRecord: ActivityRechargeMoneyModelType[] = await ActivityRechargeMoneyModel.findDataByTime(serverId, roleId, beginTime, endTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerRechargeMoneyDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerRechargeMoneyData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 统计充值金额
*
* @param {number} serverId 区Id
* @param {string} roleId 角色Id
* @param {string} RMB 金额
*
*/
export async function addRechargeMoney(roleId: string, serverId: number, RMB: number) {
let beginTime = getZeroPointD();
let endTime = new Date(getZeroPointD().getTime() + 24 * 60 * 60 * 1000);
let result = await ActivityRechargeMoneyModel.addRMB(serverId, roleId, RMB, beginTime, endTime);
if(result.RMB == RMB) { // 获得木签的时候推送给在线玩家
let onlineUser = await getRoleOnlineInfo(roleId);
if(!!onlineUser.sid) {
let result: pushActivityInter[] = [];
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.RECHARGE_MONEY);
for(let { activityId, type: activityType } of activities) {
let playerData = await getPlayerRechargeMoneyData(activityId, serverId, roleId);
result.push({ activityId, activityType, param: { ticketCnt: playerData.ticketCnt } });
}
await pushActivities(result, roleId, onlineUser.sid);
}
}
}
import { ActivityRechargeMoneyModel, ActivityRechargeMoneyModelType } from '@db/ActivityRechargeMoney';
import { RechargeMoneyData } from '@domain/activityField/rechargeMoneyField';
import { getActivitiesByType, getActivityById, pushActivities, pushActivityInter } from './activityService';
import { ACTIVITY_TYPE } from '@consts';
import { getRoleCreateTime, getRoleOnlineInfo, getServerCreateTime } from '../redisService';
import { getZeroPointD, getZeroPointOfTime } from '@pubUtils/timeUtil';
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRechargeMoneyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RechargeMoneyData(activityData, createTime, serverTime);
let beginTime = new Date(getZeroPointOfTime(playerData.beginTime));
let endTime = new Date(getZeroPointD().getTime() + 24 * 60 * 60 * 1000);
let playerRecord: ActivityRechargeMoneyModelType[] = await ActivityRechargeMoneyModel.findDataByTime(serverId, roleId, beginTime, endTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
export async function getPlayerRechargeMoneyDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerRechargeMoneyData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 统计充值金额
*
* @param {number} serverId 区Id
* @param {string} roleId 角色Id
* @param {string} RMB 金额
*
*/
export async function addRechargeMoney(roleId: string, serverId: number, RMB: number) {
let beginTime = getZeroPointD();
let endTime = new Date(getZeroPointD().getTime() + 24 * 60 * 60 * 1000);
let result = await ActivityRechargeMoneyModel.addRMB(serverId, roleId, RMB, beginTime, endTime);
if(result.RMB == RMB) { // 获得木签的时候推送给在线玩家
let onlineUser = await getRoleOnlineInfo(roleId);
if(!!onlineUser.sid) {
let result: pushActivityInter[] = [];
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.RECHARGE_MONEY);
for(let { activityId, type: activityType } of activities) {
let playerData = await getPlayerRechargeMoneyData(activityId, serverId, roleId);
result.push({ activityId, activityType, param: { ticketCnt: playerData.ticketCnt } });
}
await pushActivities(result, roleId, onlineUser.sid);
}
}
}
@@ -1,174 +1,174 @@
import moment = require('moment');
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityRefreshShopModel, ActivityRefreshShopModelType } from '../../db/ActivityRefreshShop';
import { RoleModel } from '../../db/Role';
import { ServerlistModel } from '../../db/Serverlist';
import { RefreshShopData } from '../../domain/activityField/refreshShopField';
import { deltaDays } from '../../pubUtils/util';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { addReward, stringToRewardParam } from './giftPackageService';
/**
*
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function getRefreshShopActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.REFRESH_SHOP);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
if (!playerRecord) {//生成商店可购买商品的数据
let { lv } = await RoleModel.findByRoleId(roleId);
let randomGoods = playerData.randomGoodsItems(lv);
playerRecord = await ActivityRefreshShopModel.createShop(activityData.activityId, roleId, playerData.roundIndex, randomGoods);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家商店数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRefreshShopData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let role = await RoleModel.findByRoleId(roleId, 'lv createTime');
let createTime = await getRoleCreateTime(roleId, role);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityId, roleId, playerData.roundIndex);
if (!playerRecord) {//生成商店可购买商品的数据
let randomGoods = playerData.randomGoodsItems(role.lv);
playerRecord = await ActivityRefreshShopModel.createShop(activityData.activityId, roleId, playerData.roundIndex, randomGoods);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家商店数据(指定回合数,大富翁商店每回合刷新)
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRefreshShopDataByRoundIndex(activityId: number, serverId: number, roleId: string, roundIndex: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
let role = await RoleModel.findByRoleId(roleId, 'lv createTime');
let createTime = await getRoleCreateTime(roleId, role);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
playerData.roundIndex = roundIndex;
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityId, roleId, playerData.roundIndex);
if (!playerRecord) {//生成商店可购买商品的数据
let randomGoods = playerData.randomGoodsItems(role.lv);
playerRecord = await ActivityRefreshShopModel.createShop(activityData.activityId, roleId, playerData.roundIndex, randomGoods);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动第几天
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function newPlayerActivityDays(roleId: string) {
let { createTime } = await RoleModel.findByRoleId(roleId);
let createDate = moment(createTime * 1000).toDate();
let todayIndex = deltaDays(createDate, new Date, true) + 1;
return todayIndex;
}
/**
* 结算购买的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
* @param {number} roundIndex 大富翁重置回合数
*
*/
export async function makeRefreshShopReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string, roundIndex: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.REFRESH_SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
if (roundIndex) {
playerData.roundIndex = roundIndex;
}
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) {
return STATUS.ACTIVITY_NO_PRODUCT;
}
if (item.countMax > 0 && item.buyCount >= item.countMax) {
return STATUS.ACTIVITY_MAX_COUNT;
}
let rewardArray = stringToRewardParam(item.reward)
let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.BUY_REFRESH_SHOP);
await ActivityRefreshShopModel.addRecord(activityId, roleId, playerData.roundIndex, item.pageIndex, item.id, 1);
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item: item, activityId: activityId })
}
}
export async function checkRefreshShop(roleId: string, serverId: number, activityData: ActivityModelType, productID: string, roundIndex: number) {
if (!activityData) return false;
if (activityData.type !== ACTIVITY_TYPE.REFRESH_SHOP) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
if(!roundIndex) {
roundIndex = playerData.roundIndex;
}
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityData.activityId, roleId, roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) return false;
if (item.countMax > 0 && item.buyCount >= item.countMax) return false;
return true;
}
import moment = require('moment');
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityRefreshShopModel, ActivityRefreshShopModelType } from '@db/ActivityRefreshShop';
import { RoleModel } from '@db/Role';
import { ServerlistModel } from '@db/Serverlist';
import { RefreshShopData } from '@domain/activityField/refreshShopField';
import { deltaDays } from '@pubUtils/util';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { addReward, stringToRewardParam } from './giftPackageService';
/**
*
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function getRefreshShopActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.REFRESH_SHOP);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
if (!playerRecord) {//生成商店可购买商品的数据
let { lv } = await RoleModel.findByRoleId(roleId);
let randomGoods = playerData.randomGoodsItems(lv);
playerRecord = await ActivityRefreshShopModel.createShop(activityData.activityId, roleId, playerData.roundIndex, randomGoods);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家商店数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRefreshShopData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let role = await RoleModel.findByRoleId(roleId, 'lv createTime');
let createTime = await getRoleCreateTime(roleId, role);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityId, roleId, playerData.roundIndex);
if (!playerRecord) {//生成商店可购买商品的数据
let randomGoods = playerData.randomGoodsItems(role.lv);
playerRecord = await ActivityRefreshShopModel.createShop(activityData.activityId, roleId, playerData.roundIndex, randomGoods);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家商店数据(指定回合数,大富翁商店每回合刷新)
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerRefreshShopDataByRoundIndex(activityId: number, serverId: number, roleId: string, roundIndex: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
let role = await RoleModel.findByRoleId(roleId, 'lv createTime');
let createTime = await getRoleCreateTime(roleId, role);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
playerData.roundIndex = roundIndex;
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityId, roleId, playerData.roundIndex);
if (!playerRecord) {//生成商店可购买商品的数据
let randomGoods = playerData.randomGoodsItems(role.lv);
playerRecord = await ActivityRefreshShopModel.createShop(activityData.activityId, roleId, playerData.roundIndex, randomGoods);
}
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动第几天
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function newPlayerActivityDays(roleId: string) {
let { createTime } = await RoleModel.findByRoleId(roleId);
let createDate = moment(createTime * 1000).toDate();
let todayIndex = deltaDays(createDate, new Date, true) + 1;
return todayIndex;
}
/**
* 结算购买的奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
* @param {number} roundIndex 大富翁重置回合数
*
*/
export async function makeRefreshShopReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string, roundIndex: number) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.REFRESH_SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
if (roundIndex) {
playerData.roundIndex = roundIndex;
}
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) {
return STATUS.ACTIVITY_NO_PRODUCT;
}
if (item.countMax > 0 && item.buyCount >= item.countMax) {
return STATUS.ACTIVITY_MAX_COUNT;
}
let rewardArray = stringToRewardParam(item.reward)
let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.BUY_REFRESH_SHOP);
await ActivityRefreshShopModel.addRecord(activityId, roleId, playerData.roundIndex, item.pageIndex, item.id, 1);
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item: item, activityId: activityId })
}
}
export async function checkRefreshShop(roleId: string, serverId: number, activityData: ActivityModelType, productID: string, roundIndex: number) {
if (!activityData) return false;
if (activityData.type !== ACTIVITY_TYPE.REFRESH_SHOP) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshShopData(activityData, createTime, serverTime);
if(!roundIndex) {
roundIndex = playerData.roundIndex;
}
let playerRecord: ActivityRefreshShopModelType = await ActivityRefreshShopModel.findData(activityData.activityId, roleId, roundIndex);
playerData.setPlayerRecords(playerRecord);
let item = playerData.findItemByProductID(productID);
if (!item) return false;
if (item.countMax > 0 && item.buyCount >= item.countMax) return false;
return true;
}
@@ -1,28 +1,28 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityRefreshTaskModel, ActivityRefreshTaskModelType } from '../../db/ActivityRefreshTask';
import { ActivityRefreshTaskPointModel, ActivityRefreshTaskPointModelType } from '../../db/ActivityRefreshTaskPoint';
import { RefreshTaskData } from '../../domain/activityField/refreshTaskField';
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 getPlayerRefreshTaskData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshTaskData(activityData, createTime, serverTime);
let playerRecords: ActivityRefreshTaskModelType[] = await ActivityRefreshTaskModel.findData(serverId, activityId, roleId, playerData.roundIndex);
let pointRecordData: ActivityRefreshTaskPointModelType = await ActivityRefreshTaskPointModel.findData(serverId, activityId, roleId);
playerData.setPlayerRecords(playerRecords, pointRecordData);
return playerData;
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityRefreshTaskModel, ActivityRefreshTaskModelType } from '@db/ActivityRefreshTask';
import { ActivityRefreshTaskPointModel, ActivityRefreshTaskPointModelType } from '@db/ActivityRefreshTaskPoint';
import { RefreshTaskData } from '@domain/activityField/refreshTaskField';
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 getPlayerRefreshTaskData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new RefreshTaskData(activityData, createTime, serverTime);
let playerRecords: ActivityRefreshTaskModelType[] = await ActivityRefreshTaskModel.findData(serverId, activityId, roleId, playerData.roundIndex);
let pointRecordData: ActivityRefreshTaskPointModelType = await ActivityRefreshTaskPointModel.findData(serverId, activityId, roleId);
playerData.setPlayerRecords(playerRecords, pointRecordData);
return playerData;
}
@@ -1,161 +1,161 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, REFRESH_TIME, STATUS } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivitySelfServiceGoodsModel, ActivitySelfServiceGoodsModelType } from '../../db/ActivitySelfServiceGoods';
import { ActivitySelfServiceShopModel, ActivitySelfServiceShopModelType } from '../../db/ActivitySelfServiceShop';
import { ActivitySelfServiceModel } from '../../db/ActivitySelfService';
import { RewardParam } from '../../domain/activityField/rewardField';
import { SelfServiceShopData, SelfServiceShopItem } from '../../domain/activityField/selfServiceShopField';
import { addReward, stringToRewardParam } from './giftPackageService';
import moment = require('moment');
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getSelfServiceShopActivityData(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.SELF_SERVICE_SHOP);
activityArray = activityArray.sort((a, b) => {
return b.activityId - a.activityId
});
if (activityArray.length > 0) {
let activityData = activityArray[0];
let playerData = await getPlayerActivityData(activityData.activityId, serverId, roleId);
return playerData;
}
return null;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerActivityData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SelfServiceShopData(activityData, createTime, serverTime);
let playerRecords: ActivitySelfServiceShopModelType[] = await ActivitySelfServiceShopModel.findDataByPriceType(serverId, activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
let playerSelfServerData = await ActivitySelfServiceModel.findData(serverId, activityId, roleId, playerData.roundIndex);
let buyCount = (playerSelfServerData && playerSelfServerData.unitBuyCount) ? playerSelfServerData.unitBuyCount : 0;
playerData.unitBuyCount = buyCount;
let challengeBeginTime = null;
let challengeEndTime = null;
let curDate = moment(new Date());
if (curDate.hour() < REFRESH_TIME) {
challengeBeginTime = moment(new Date()).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').toDate();
challengeEndTime = moment(challengeBeginTime).add(1, 'd').toDate()
} else {
challengeBeginTime = moment(new Date()).startOf('d').add(REFRESH_TIME, 'h').toDate();
challengeEndTime = moment(challengeBeginTime).add(1, 'd').toDate()
}
let records = (playerSelfServerData && playerSelfServerData.challengeRecords) ? playerSelfServerData.challengeRecords : [];
for (let record of records) {
// console.log(challengeBeginTime, challengeEndTime, record.time)
if (record.time >= challengeBeginTime && record.time <= challengeEndTime) {
playerData.challengeCount++;
}
}
return playerData;
}
/**
* 结算礼包
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {number} roundIndex 周期数
* @param {number} index 货架
* @param {number} price 价格
* @param {number} priceType 价格类型
*
*/
export async function addSelfServiceShopGiftReward(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, roundIndex: number, index: number, item: SelfServiceShopItem) {
let playerGoods: ActivitySelfServiceGoodsModelType[] = await ActivitySelfServiceGoodsModel.findDataByIndex(activityId, roleId, roundIndex, index);
let rewardArray: Array<RewardParam> = [];
for (let obj of playerGoods) {
let selectedIndex = obj.rewardIndex;
let cellIndex = obj.cellIndex;
let giftData = item.findCellIndex(cellIndex);
let rewards: Array<RewardParam> = stringToRewardParam(giftData.gift);
rewardArray = rewardArray.concat(rewards[selectedIndex])
}
let goodsStr = '';
for (let obj of rewardArray) {
goodsStr += `${obj.type}&${obj.id}&${obj.count}|`;
}
let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.SELF_SERVICE_SHOP_BUY_GIFT);
//购买记录
console.log('dddddddd', rewardArray.length, serverId, activityId, roleId, roundIndex, index, goodsStr, JSON.stringify(item))
await ActivitySelfServiceShopModel.addBuyRecord(serverId, activityId, roleId, roundIndex, index, goodsStr);
return result
}
/**
* 购买自选礼包
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeSelfServerShop(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SelfServiceShopData(activityData, createTime, serverTime);
let item: SelfServiceShopItem = playerData.getItemByProductID(productID);
if (!item) {
return STATUS.ACTIVITY_DATA_ERROR
}
if (item.countMax > 0) {//限制购买次数
let playerRecords: ActivitySelfServiceShopModelType[] = await ActivitySelfServiceShopModel.findDataByIndex(serverId, activityId, roleId, playerData.roundIndex, item.index);
if (playerRecords.length >= item.countMax) {
return STATUS.ACTIVITY_MAX_COUNT
}
}
let result = await addSelfServiceShopGiftReward(roleId, roleName, sid, serverId, activityId, playerData.roundIndex, item.index, item);
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item })
}
}
export async function checkSelfServiceShop(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SelfServiceShopData(activityData, createTime, serverTime);
let item: SelfServiceShopItem = playerData.getItemByProductID(productID);
if (!item) return false
if (item.countMax > 0) {//限制购买次数
let playerRecords = await ActivitySelfServiceShopModel.findDataByIndex(serverId, activityData.activityId, roleId, playerData.roundIndex, item.index);
if (playerRecords.length >= item.countMax) return false;
}
return true;
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, REFRESH_TIME, STATUS } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivitySelfServiceGoodsModel, ActivitySelfServiceGoodsModelType } from '@db/ActivitySelfServiceGoods';
import { ActivitySelfServiceShopModel, ActivitySelfServiceShopModelType } from '@db/ActivitySelfServiceShop';
import { ActivitySelfServiceModel } from '@db/ActivitySelfService';
import { RewardParam } from '@domain/activityField/rewardField';
import { SelfServiceShopData, SelfServiceShopItem } from '@domain/activityField/selfServiceShopField';
import { addReward, stringToRewardParam } from './giftPackageService';
import moment = require('moment');
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getSelfServiceShopActivityData(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.SELF_SERVICE_SHOP);
activityArray = activityArray.sort((a, b) => {
return b.activityId - a.activityId
});
if (activityArray.length > 0) {
let activityData = activityArray[0];
let playerData = await getPlayerActivityData(activityData.activityId, serverId, roleId);
return playerData;
}
return null;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerActivityData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SelfServiceShopData(activityData, createTime, serverTime);
let playerRecords: ActivitySelfServiceShopModelType[] = await ActivitySelfServiceShopModel.findDataByPriceType(serverId, activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
let playerSelfServerData = await ActivitySelfServiceModel.findData(serverId, activityId, roleId, playerData.roundIndex);
let buyCount = (playerSelfServerData && playerSelfServerData.unitBuyCount) ? playerSelfServerData.unitBuyCount : 0;
playerData.unitBuyCount = buyCount;
let challengeBeginTime = null;
let challengeEndTime = null;
let curDate = moment(new Date());
if (curDate.hour() < REFRESH_TIME) {
challengeBeginTime = moment(new Date()).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').toDate();
challengeEndTime = moment(challengeBeginTime).add(1, 'd').toDate()
} else {
challengeBeginTime = moment(new Date()).startOf('d').add(REFRESH_TIME, 'h').toDate();
challengeEndTime = moment(challengeBeginTime).add(1, 'd').toDate()
}
let records = (playerSelfServerData && playerSelfServerData.challengeRecords) ? playerSelfServerData.challengeRecords : [];
for (let record of records) {
// console.log(challengeBeginTime, challengeEndTime, record.time)
if (record.time >= challengeBeginTime && record.time <= challengeEndTime) {
playerData.challengeCount++;
}
}
return playerData;
}
/**
* 结算礼包
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {number} roundIndex 周期数
* @param {number} index 货架
* @param {number} price 价格
* @param {number} priceType 价格类型
*
*/
export async function addSelfServiceShopGiftReward(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, roundIndex: number, index: number, item: SelfServiceShopItem) {
let playerGoods: ActivitySelfServiceGoodsModelType[] = await ActivitySelfServiceGoodsModel.findDataByIndex(activityId, roleId, roundIndex, index);
let rewardArray: Array<RewardParam> = [];
for (let obj of playerGoods) {
let selectedIndex = obj.rewardIndex;
let cellIndex = obj.cellIndex;
let giftData = item.findCellIndex(cellIndex);
let rewards: Array<RewardParam> = stringToRewardParam(giftData.gift);
rewardArray = rewardArray.concat(rewards[selectedIndex])
}
let goodsStr = '';
for (let obj of rewardArray) {
goodsStr += `${obj.type}&${obj.id}&${obj.count}|`;
}
let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.SELF_SERVICE_SHOP_BUY_GIFT);
//购买记录
console.log('dddddddd', rewardArray.length, serverId, activityId, roleId, roundIndex, index, goodsStr, JSON.stringify(item))
await ActivitySelfServiceShopModel.addBuyRecord(serverId, activityId, roleId, roundIndex, index, goodsStr);
return result
}
/**
* 购买自选礼包
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeSelfServerShop(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SelfServiceShopData(activityData, createTime, serverTime);
let item: SelfServiceShopItem = playerData.getItemByProductID(productID);
if (!item) {
return STATUS.ACTIVITY_DATA_ERROR
}
if (item.countMax > 0) {//限制购买次数
let playerRecords: ActivitySelfServiceShopModelType[] = await ActivitySelfServiceShopModel.findDataByIndex(serverId, activityId, roleId, playerData.roundIndex, item.index);
if (playerRecords.length >= item.countMax) {
return STATUS.ACTIVITY_MAX_COUNT
}
}
let result = await addSelfServiceShopGiftReward(roleId, roleName, sid, serverId, activityId, playerData.roundIndex, item.index, item);
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item })
}
}
export async function checkSelfServiceShop(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SelfServiceShopData(activityData, createTime, serverTime);
let item: SelfServiceShopItem = playerData.getItemByProductID(productID);
if (!item) return false
if (item.countMax > 0) {//限制购买次数
let playerRecords = await ActivitySelfServiceShopModel.findDataByIndex(serverId, activityData.activityId, roleId, playerData.roundIndex, item.index);
if (playerRecords.length >= item.countMax) return false;
}
return true;
}
@@ -1,129 +1,129 @@
import { ActivityModel, ActivityModelType } from '../../db/Activity';
import { ActivityGrowthModel, ActivityGrowthModelType } from '../../db/ActivityGrowth';
import { ActivityGrowthPointModel, ActivityGrowthPointModelType } from '../../db/ActivityGrowthPoint';
import { SevenDaysData } from '../../domain/activityField/sevenDaysField';
import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '../../db/ActivityDailyChallenges';
import { ActivityDailyGiftsModel, ActivityDailyGiftsModelType } from '../../db/ActivityDailyGifts';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function sevenDaysActivity(serverId: number, roleId: string, type: number) {
let activityDataArray = await getActivitiesByType(serverId, type);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//成长数据
let playerGrowthRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityData.activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityData.activityId, roleId);
playerData.growth.setPlayerRecords(playerGrowthRecords);
playerData.growth.setPlayerPointRecord(playerPointRecord);
//今日挑战
let playerDailyChallengeRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityData.activityId, roleId);
playerData.dailyChallenge.setPlayerRecords(playerDailyChallengeRecords);
//每日特惠礼包
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityData.activityId, roleId);
playerData.dailyGift.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//成长数据
let playerGrowthRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityId, roleId);
playerData.growth.setPlayerRecords(playerGrowthRecords);
playerData.growth.setPlayerPointRecord(playerPointRecord);
//今日挑战
let playerDailyChallengeRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityId, roleId);
playerData.dailyChallenge.setPlayerRecords(playerDailyChallengeRecords);
//每日特惠礼包
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityId, roleId);
playerData.dailyGift.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家成长数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysGrowthData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//成长数据
let playerGrowthRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityId, roleId);
playerData.growth.setPlayerRecords(playerGrowthRecords);
playerData.growth.setPlayerPointRecord(playerPointRecord);
return playerData;
}
/**
* 玩家今日挑战数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysDailyChallengesData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//今日挑战
let playerDailyChallengeRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityId, roleId);
playerData.dailyChallenge.setPlayerRecords(playerDailyChallengeRecords);
return playerData;
}
/**
* 玩家每日特惠礼包数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysDailyGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//每日特惠礼包
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityId, roleId);
playerData.dailyGift.setPlayerRecords(playerRecords);
return playerData;
}
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { ActivityGrowthModel, ActivityGrowthModelType } from '@db/ActivityGrowth';
import { ActivityGrowthPointModel, ActivityGrowthPointModelType } from '@db/ActivityGrowthPoint';
import { SevenDaysData } from '@domain/activityField/sevenDaysField';
import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '@db/ActivityDailyChallenges';
import { ActivityDailyGiftsModel, ActivityDailyGiftsModelType } from '@db/ActivityDailyGifts';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function sevenDaysActivity(serverId: number, roleId: string, type: number) {
let activityDataArray = await getActivitiesByType(serverId, type);
if (activityDataArray.length === 0) {
return null;
}
let activityData: ActivityModelType = activityDataArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//成长数据
let playerGrowthRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityData.activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityData.activityId, roleId);
playerData.growth.setPlayerRecords(playerGrowthRecords);
playerData.growth.setPlayerPointRecord(playerPointRecord);
//今日挑战
let playerDailyChallengeRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityData.activityId, roleId);
playerData.dailyChallenge.setPlayerRecords(playerDailyChallengeRecords);
//每日特惠礼包
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityData.activityId, roleId);
playerData.dailyGift.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//成长数据
let playerGrowthRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityId, roleId);
playerData.growth.setPlayerRecords(playerGrowthRecords);
playerData.growth.setPlayerPointRecord(playerPointRecord);
//今日挑战
let playerDailyChallengeRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityId, roleId);
playerData.dailyChallenge.setPlayerRecords(playerDailyChallengeRecords);
//每日特惠礼包
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityId, roleId);
playerData.dailyGift.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家成长数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysGrowthData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//成长数据
let playerGrowthRecords: ActivityGrowthModelType[] = await ActivityGrowthModel.findData(serverId, activityId, roleId);
let playerPointRecord: ActivityGrowthPointModelType = await ActivityGrowthPointModel.findData(serverId, activityId, roleId);
playerData.growth.setPlayerRecords(playerGrowthRecords);
playerData.growth.setPlayerPointRecord(playerPointRecord);
return playerData;
}
/**
* 玩家今日挑战数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysDailyChallengesData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//今日挑战
let playerDailyChallengeRecords: ActivityDailyChallengesModelType[] = await ActivityDailyChallengesModel.findData(serverId, activityId, roleId);
playerData.dailyChallenge.setPlayerRecords(playerDailyChallengeRecords);
return playerData;
}
/**
* 玩家每日特惠礼包数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSevenDaysDailyGiftsData(activityId: number, serverId: number, roleId: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SevenDaysData(activityData, createTime, serverTime);
//每日特惠礼包
let playerRecords: ActivityDailyGiftsModelType[] = await ActivityDailyGiftsModel.findData(serverId, activityId, roleId);
playerData.dailyGift.setPlayerRecords(playerRecords);
return playerData;
}
+164 -164
View File
@@ -1,164 +1,164 @@
import moment = require('moment');
import { ACTIVITY_TYPE, MAIL_TYPE, SERVER_OPEN_TIME, SIGNIN_VIP_OPEN_LIMIT, STATUS } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivitySignInModel, ActivitySignInModelType } from '../../db/ActivitySignIn';
import { SignInData } from '../../domain/activityField/signInField';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { RewardInter } from '../../pubUtils/interface';
import { stringToRewardInter } from './giftPackageService';
import { sendMailByContent } from '../mailService';
/**
* 获取活动数据
*
* @param {number} type 普通、高级 ACTIVITY_TYPE
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function signInActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.SIGN_IN);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let curDate = moment(new Date()).valueOf();
if (curDate < playerData.beginTime || curDate > playerData.endTime) {//未开启
return null;
}
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 获取活动数据
*
* @param {number} type 普通、高级 ACTIVITY_TYPE
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function signInVIPActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.SIGN_IN_VIP);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let curDate = moment(new Date()).valueOf();
if (curDate < playerData.beginTime || curDate > playerData.endTime) {//未开启
return null;
}
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSignInData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.SIGN_IN_VIP && activityData.type !== ACTIVITY_TYPE.SIGN_IN && activityData.type !== ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN
&& activityData.type !== ACTIVITY_TYPE.COMMON_SIGN_IN) {
return null;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 购买vip签到
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeSignInVIP(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.SIGN_IN_VIP && activityData.type !== ACTIVITY_TYPE.COMMON_SIGN_IN) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let playerData = await getPlayerSignInData(activityId, serverId, roleId);
if (!playerData || playerData.isVip) {
return STATUS.ORDER_CANNOT_BUY;
}
await ActivitySignInModel.buyVIP(activityId, roleId, playerData.roundIndex);
return {
code: 0,
data: Object.assign({}, { item: { isVip: true }, activityId: activityData.activityId })
}
}
//高级签到开启条件
export async function canBuyVip(lv: number) {
//高级签到开启条件
let openTime = SERVER_OPEN_TIME;
if (moment(openTime).valueOf() + 24 * 60 * 60 * 1000 * 8 > moment(new Date()).valueOf()) {//开服时间8天后才能开启vip签到
return false;
}
if (lv < SIGNIN_VIP_OPEN_LIMIT) {//玩家等级大于等于15级才能开启vip签到
return false
}
return true;
}
export async function checkSignInCanBuy(roleId: string, serverId: number, activityId: number, productID: string) {
let playerData = await getPlayerSignInData(activityId, serverId, roleId);
if (!playerData || playerData.isVip) {
return false;
}
return true
}
// 补发签到邮件
export async function repairSignInMail(playerData: SignInData) {
if(!playerData || playerData.productID == '&') return;
let playerRecords = await ActivitySignInModel.findByActivity(playerData.activityId, 1);
let hasRepaireRoleIds: string[] = []
for(let playerRecord of playerRecords) {
if(playerRecord.hasRepair) continue;
let notSendGoods: RewardInter[] = [];
let records = playerRecord.records||[];
for(let item of playerData.list) {
let curRec = records.find(rec => rec.dayIndex == item.dayIndex);
if(!curRec) {
notSendGoods.push(...stringToRewardInter(item.reward));
}
}
if(notSendGoods.length > 0) {
await sendMailByContent(MAIL_TYPE.REPAIRE_SIGN_IN, playerRecord.roleId, { goods: notSendGoods });
hasRepaireRoleIds.push(playerRecord.roleId);
}
}
await ActivitySignInModel.repairSignIn(playerData.activityId, hasRepaireRoleIds);
}
import moment = require('moment');
import { ACTIVITY_TYPE, MAIL_TYPE, SERVER_OPEN_TIME, SIGNIN_VIP_OPEN_LIMIT, STATUS } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { ActivitySignInModel, ActivitySignInModelType } from '@db/ActivitySignIn';
import { SignInData } from '@domain/activityField/signInField';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { RewardInter } from '@pubUtils/interface';
import { stringToRewardInter } from './giftPackageService';
import { sendMailByContent } from '../mailService';
/**
* 获取活动数据
*
* @param {number} type 普通、高级 ACTIVITY_TYPE
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function signInActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.SIGN_IN);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let curDate = moment(new Date()).valueOf();
if (curDate < playerData.beginTime || curDate > playerData.endTime) {//未开启
return null;
}
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 获取活动数据
*
* @param {number} type 普通、高级 ACTIVITY_TYPE
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function signInVIPActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.SIGN_IN_VIP);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let curDate = moment(new Date()).valueOf();
if (curDate < playerData.beginTime || curDate > playerData.endTime) {//未开启
return null;
}
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityData.activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerSignInData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.SIGN_IN_VIP && activityData.type !== ACTIVITY_TYPE.SIGN_IN && activityData.type !== ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN
&& activityData.type !== ACTIVITY_TYPE.COMMON_SIGN_IN) {
return null;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecords(playerRecords);
return playerData;
}
/**
* 购买vip签到
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeSignInVIP(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.SIGN_IN_VIP && activityData.type !== ACTIVITY_TYPE.COMMON_SIGN_IN) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let playerData = await getPlayerSignInData(activityId, serverId, roleId);
if (!playerData || playerData.isVip) {
return STATUS.ORDER_CANNOT_BUY;
}
await ActivitySignInModel.buyVIP(activityId, roleId, playerData.roundIndex);
return {
code: 0,
data: Object.assign({}, { item: { isVip: true }, activityId: activityData.activityId })
}
}
//高级签到开启条件
export async function canBuyVip(lv: number) {
//高级签到开启条件
let openTime = SERVER_OPEN_TIME;
if (moment(openTime).valueOf() + 24 * 60 * 60 * 1000 * 8 > moment(new Date()).valueOf()) {//开服时间8天后才能开启vip签到
return false;
}
if (lv < SIGNIN_VIP_OPEN_LIMIT) {//玩家等级大于等于15级才能开启vip签到
return false
}
return true;
}
export async function checkSignInCanBuy(roleId: string, serverId: number, activityId: number, productID: string) {
let playerData = await getPlayerSignInData(activityId, serverId, roleId);
if (!playerData || playerData.isVip) {
return false;
}
return true
}
// 补发签到邮件
export async function repairSignInMail(playerData: SignInData) {
if(!playerData || playerData.productID == '&') return;
let playerRecords = await ActivitySignInModel.findByActivity(playerData.activityId, 1);
let hasRepaireRoleIds: string[] = []
for(let playerRecord of playerRecords) {
if(playerRecord.hasRepair) continue;
let notSendGoods: RewardInter[] = [];
let records = playerRecord.records||[];
for(let item of playerData.list) {
let curRec = records.find(rec => rec.dayIndex == item.dayIndex);
if(!curRec) {
notSendGoods.push(...stringToRewardInter(item.reward));
}
}
if(notSendGoods.length > 0) {
await sendMailByContent(MAIL_TYPE.REPAIRE_SIGN_IN, playerRecord.roleId, { goods: notSendGoods });
hasRepaireRoleIds.push(playerRecord.roleId);
}
}
await ActivitySignInModel.repairSignIn(playerData.activityId, hasRepaireRoleIds);
}
@@ -1,100 +1,100 @@
import { ACTIVITY_TYPE, STATUS } from "../../consts";
import { ActivityModelType } from "../../db/Activity";
import { ActivityTaskPassModel } from "../../db/ActivityTaskPass";
import { TaskPassData } from "../../domain/activityField/taskPassField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivitiesByType, getActivityById, pushActivityInter } from "./activityService";
export async function getTaskPassData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TaskPassData(activityData, createTime, serverTime);
let record = await ActivityTaskPassModel.findData(serverId, activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecord(record);
return playerData;
}
export async function getTaskPassDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getTaskPassData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 购买高级战令
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeTaskPass(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.TASK_PASS) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TaskPassData(activityData, createTime, serverTime);
let roundIndex = playerData.roundIndex;
let checkResult = await ActivityTaskPassModel.check(serverId, activityData.activityId, roleId, roundIndex, productID);
if(checkResult) return STATUS.ORDER_CANNOT_BUY;
await ActivityTaskPassModel.buy(serverId, activityId, roleId, roundIndex, productID);
return {
code: 0,
data: Object.assign({}, { item: { roundIndex }, activityId: activityId })
}
}
export async function checkTaskPass(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TaskPassData(activityData, createTime, serverTime);
let roundIndex = playerData.roundIndex;
let checkResult = await ActivityTaskPassModel.check(serverId, activityData.activityId, roleId, roundIndex, productID);
return !checkResult;
}
/**
* 任务活动完成后会获得点数
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function addTaskPassPoint(serverId: number, roleId: string, addPoint: number) {
try {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.TASK_PASS);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let playerData = new TaskPassData(activityData, createTime, serverTime);
if(playerData.canShow()) {
let result = await ActivityTaskPassModel.addPoint(serverId, activityData.activityId, roleId, playerData.roundIndex, addPoint);
if(result) pushResult.push({ activityId: activityData.activityId, activityType: activityData.type, param: { totalPoint: result.totalPoint } });
}
}
return pushResult
} catch(e) {
console.error(e);
return []
}
}
import { ACTIVITY_TYPE, STATUS } from "@consts";
import { ActivityModelType } from "@db/Activity";
import { ActivityTaskPassModel } from "@db/ActivityTaskPass";
import { TaskPassData } from "@domain/activityField/taskPassField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivitiesByType, getActivityById, pushActivityInter } from "./activityService";
export async function getTaskPassData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TaskPassData(activityData, createTime, serverTime);
let record = await ActivityTaskPassModel.findData(serverId, activityId, roleId, playerData.roundIndex);
playerData.setPlayerRecord(record);
return playerData;
}
export async function getTaskPassDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getTaskPassData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 购买高级战令
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeTaskPass(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.TASK_PASS) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TaskPassData(activityData, createTime, serverTime);
let roundIndex = playerData.roundIndex;
let checkResult = await ActivityTaskPassModel.check(serverId, activityData.activityId, roleId, roundIndex, productID);
if(checkResult) return STATUS.ORDER_CANNOT_BUY;
await ActivityTaskPassModel.buy(serverId, activityId, roleId, roundIndex, productID);
return {
code: 0,
data: Object.assign({}, { item: { roundIndex }, activityId: activityId })
}
}
export async function checkTaskPass(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TaskPassData(activityData, createTime, serverTime);
let roundIndex = playerData.roundIndex;
let checkResult = await ActivityTaskPassModel.check(serverId, activityData.activityId, roleId, roundIndex, productID);
return !checkResult;
}
/**
* 任务活动完成后会获得点数
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function addTaskPassPoint(serverId: number, roleId: string, addPoint: number) {
try {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.TASK_PASS);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let pushResult: pushActivityInter[] = [];
for(let activityData of activities) {
let playerData = new TaskPassData(activityData, createTime, serverTime);
if(playerData.canShow()) {
let result = await ActivityTaskPassModel.addPoint(serverId, activityData.activityId, roleId, playerData.roundIndex, addPoint);
if(result) pushResult.push({ activityId: activityData.activityId, activityType: activityData.type, param: { totalPoint: result.totalPoint } });
}
}
return pushResult
} catch(e) {
console.error(e);
return []
}
}
@@ -1,72 +1,72 @@
import { ActivityThirtyDaysModel, ActivityThirtyDaysModelType } from '../../db/ActivityThirtyDays';
import { ThirtyDaysData } from '../../domain/activityField/thirtyDaysField';
import { ActivityThirtyDaysPointRewardModel, ActivityThirtyDaysPointRewardModelType } from '../../db/ActivityThirtyDaysPointReward';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function thirtyDaysActivity(type: number, serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, type);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerData = await getPlayerThirtyDaysData(activityData.activityId, serverId, roleId);
return playerData
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerThirtyDaysData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(serverId, activityId, roleId);
let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ThirtyDaysData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
playerData.setPlayerPointRecords(playerPointRecords);
// let playerHeroes = await HeroModel.findByRole(roleId);
// let colorStarHeroes = playerHeroes.filter(obj => { return obj && obj.colorStar > 0 })
// playerData.setColorStarCount(colorStarHeroes.length);
return playerData;
}
/**
* 活动任务添加统计次数
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function addPlayerThirtyDaysTask(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(serverId, activityId, roleId);
let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ThirtyDaysData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
playerData.setPlayerPointRecords(playerPointRecords);
return playerData;
}
import { ActivityThirtyDaysModel, ActivityThirtyDaysModelType } from '@db/ActivityThirtyDays';
import { ThirtyDaysData } from '@domain/activityField/thirtyDaysField';
import { ActivityThirtyDaysPointRewardModel, ActivityThirtyDaysPointRewardModelType } from '@db/ActivityThirtyDaysPointReward';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function thirtyDaysActivity(type: number, serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, type);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerData = await getPlayerThirtyDaysData(activityData.activityId, serverId, roleId);
return playerData
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerThirtyDaysData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(serverId, activityId, roleId);
let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ThirtyDaysData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
playerData.setPlayerPointRecords(playerPointRecords);
// let playerHeroes = await HeroModel.findByRole(roleId);
// let colorStarHeroes = playerHeroes.filter(obj => { return obj && obj.colorStar > 0 })
// playerData.setColorStarCount(colorStarHeroes.length);
return playerData;
}
/**
* 活动任务添加统计次数
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function addPlayerThirtyDaysTask(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(serverId, activityId, roleId);
let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new ThirtyDaysData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecords);
playerData.setPlayerPointRecords(playerPointRecords);
return playerData;
}
@@ -1,138 +1,138 @@
import { ACTIVITY_TYPE, getRedisKeyByRankType, MAIL_TYPE, RANK_TYPE, REDIS_KEY } from "../../consts";
import { ActivityGroupModel } from "../../db/ActivityGroup";
import { ActivityTimeLimitRankModel, ActivityTimeLimitRankModelTypeParam } from "../../db/ActivityTimeLimitRank";
import { GuildModel, GuildType } from "../../db/Guild";
import { RoleModel } from "../../db/Role";
import { TimeLimitRankData } from "../../domain/activityField/timeLimitRankField";
import { GuildRankInfo, RoleRankInfo } from "../../domain/rank";
import { stringWithTypeToRewardInter } from "../../pubUtils/roleUtil";
import { sendMailByContent, sendMailToGuildByContent, sendMailToManyPlayerByContent } from "../mailService";
import { Rank } from "../rankService";
import { getServerCreateTime } from "../redisService";
import { getActivitiesByType, getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getTimeLimitRankData(activityId: number, serverId: number) {
let activityData = await getActivityById(activityId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TimeLimitRankData(activityData, 0, serverTime);
return playerData;
}
export async function getTimeLimitRankDataShow(activityId: number, serverId: number) {
let playerData = await getTimeLimitRankData(activityId, serverId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* @description 记录每次活动获得的资金排行榜
* @param serverId
* @param code
* @param fund
*/
export async function recordGuildFund(serverId: number, guild: GuildType, fund: number) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.TIME_LIMIT_RANK);
for(let activity of activities) {
let serverTime = await getServerCreateTime(serverId);
let playerData = new TimeLimitRankData(activity, 0, serverTime);
if(playerData.canRecord() && playerData.rankType == RANK_TYPE.GUILD_FUND) {
await ActivityTimeLimitRankModel.addGuildScore(serverId, playerData.activityId, playerData.rankType, guild.code, fund, guild._id);
let redisKey = getRedisKeyByRankType(playerData.rankType);
// 加入排行
let r = new Rank(redisKey, { serverId, activityId: playerData.activityId });
await r.setRankWithGuildInfo(guild.code, fund, Date.now(), guild, true);
}
}
}
/**
* 活动结束发送排行榜奖励
* @param data {TimeLimitRankData} 活动数据
* @returns
*/
export async function sendRankMail(data: TimeLimitRankData, serverId: number) {
let redisKey = getRedisKeyByRankType(data.rankType, true);
if (!redisKey) return null;
let r = new Rank(redisKey, { activityId: data.activityId, serverId });
if(r.infoKey == REDIS_KEY.GUILD_INFO) {
let allRank = <GuildRankInfo[]>(await r.getRankByRange());
for(let { rank, code, name, leader } of allRank) {
let reward = data.getRewardByRank(rank);
if(reward) {
let guild = await GuildModel.findByCode(code, serverId, '+members');
// console.log(guild.members)
for(let roleId of guild.members) {
await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, {
params: [data.tabName,`${rank}`],
goods: stringWithTypeToRewardInter(roleId == leader.roleId? reward.rewards: reward.guildRewards)
});
}
}
}
} else {
let allRank = <RoleRankInfo[]>(await r.getRankByRange());
let sentRoleIds: string[] = [];
for(let { rank, roleId } of allRank) {
let reward = data.getRewardByRank(rank);
if(reward) {
await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, {
params: [data.tabName, `${rank}`],
goods: stringWithTypeToRewardInter(reward.rewards)
});
sentRoleIds.push(roleId);
}
}
let lastReward = data.getRewardByRank(9999);
let roles = await RoleModel.findAllRoleForTimeLimitRank(serverId, 16);
let roleIds: string[] = [];
for(let { roleId } of roles) {
if(sentRoleIds.indexOf(roleId) == -1) roleIds.push(roleId);
}
await sendMailToManyPlayerByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleIds, {
params: [data.tabName, '200+'],
goods: stringWithTypeToRewardInter(lastReward.rewards)
});
}
}
export async function takeSnapshot(data: TimeLimitRankData, serverId: number) {
let redisKey = getRedisKeyByRankType(data.rankType);
let targetRedisKey = getRedisKeyByRankType(data.rankType, true);
if (!redisKey || !targetRedisKey || redisKey == targetRedisKey) return null;
let insertInfos: ActivityTimeLimitRankModelTypeParam[] = [];
let r = new Rank(redisKey, { serverId, activityId: data.activityId });
let allRank = await r.getRankDataByRankWithoutDetail();
let targetR = new Rank(targetRedisKey, { serverId, activityId: data.activityId });
for(let rank of allRank) {
await targetR.setRank(rank.myId, rank.scores);
let insertBaseInfo = {
serverId, activityId: data.activityId, rankType: data.rankType, score: rank.scores[0]||0, time: rank.scores[1]||0
}
if(rank.myId.roleId) {
let role = await RoleModel.findByRoleId(rank.myId.roleId, '_id roleId');
if(role) insertInfos.push({ ...insertBaseInfo, roleId: role.roleId, role: role._id });
} else if(rank.myId.guildCode) {
let guild = await GuildModel.findByCode(rank.myId.guildCode, serverId, '_id guildCode');
if(guild) insertInfos.push({ ...insertBaseInfo, guildCode: guild.code, guild: guild._id });
}
}
await ActivityTimeLimitRankModel.insertRanks(insertInfos);
}
import { ACTIVITY_TYPE, getRedisKeyByRankType, MAIL_TYPE, RANK_TYPE, REDIS_KEY } from "@consts";
import { ActivityGroupModel } from "@db/ActivityGroup";
import { ActivityTimeLimitRankModel, ActivityTimeLimitRankModelTypeParam } from "@db/ActivityTimeLimitRank";
import { GuildModel, GuildType } from "@db/Guild";
import { RoleModel } from "@db/Role";
import { TimeLimitRankData } from "@domain/activityField/timeLimitRankField";
import { GuildRankInfo, RoleRankInfo } from "@domain/rank";
import { stringWithTypeToRewardInter } from "@pubUtils/roleUtil";
import { sendMailByContent, sendMailToGuildByContent, sendMailToManyPlayerByContent } from "../mailService";
import { Rank } from "../rankService";
import { getServerCreateTime } from "../redisService";
import { getActivitiesByType, getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getTimeLimitRankData(activityId: number, serverId: number) {
let activityData = await getActivityById(activityId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TimeLimitRankData(activityData, 0, serverTime);
return playerData;
}
export async function getTimeLimitRankDataShow(activityId: number, serverId: number) {
let playerData = await getTimeLimitRankData(activityId, serverId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* @description 记录每次活动获得的资金排行榜
* @param serverId
* @param code
* @param fund
*/
export async function recordGuildFund(serverId: number, guild: GuildType, fund: number) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.TIME_LIMIT_RANK);
for(let activity of activities) {
let serverTime = await getServerCreateTime(serverId);
let playerData = new TimeLimitRankData(activity, 0, serverTime);
if(playerData.canRecord() && playerData.rankType == RANK_TYPE.GUILD_FUND) {
await ActivityTimeLimitRankModel.addGuildScore(serverId, playerData.activityId, playerData.rankType, guild.code, fund, guild._id);
let redisKey = getRedisKeyByRankType(playerData.rankType);
// 加入排行
let r = new Rank(redisKey, { serverId, activityId: playerData.activityId });
await r.setRankWithGuildInfo(guild.code, fund, Date.now(), guild, true);
}
}
}
/**
* 活动结束发送排行榜奖励
* @param data {TimeLimitRankData} 活动数据
* @returns
*/
export async function sendRankMail(data: TimeLimitRankData, serverId: number) {
let redisKey = getRedisKeyByRankType(data.rankType, true);
if (!redisKey) return null;
let r = new Rank(redisKey, { activityId: data.activityId, serverId });
if(r.infoKey == REDIS_KEY.GUILD_INFO) {
let allRank = <GuildRankInfo[]>(await r.getRankByRange());
for(let { rank, code, name, leader } of allRank) {
let reward = data.getRewardByRank(rank);
if(reward) {
let guild = await GuildModel.findByCode(code, serverId, '+members');
// console.log(guild.members)
for(let roleId of guild.members) {
await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, {
params: [data.tabName,`${rank}`],
goods: stringWithTypeToRewardInter(roleId == leader.roleId? reward.rewards: reward.guildRewards)
});
}
}
}
} else {
let allRank = <RoleRankInfo[]>(await r.getRankByRange());
let sentRoleIds: string[] = [];
for(let { rank, roleId } of allRank) {
let reward = data.getRewardByRank(rank);
if(reward) {
await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, {
params: [data.tabName, `${rank}`],
goods: stringWithTypeToRewardInter(reward.rewards)
});
sentRoleIds.push(roleId);
}
}
let lastReward = data.getRewardByRank(9999);
let roles = await RoleModel.findAllRoleForTimeLimitRank(serverId, 16);
let roleIds: string[] = [];
for(let { roleId } of roles) {
if(sentRoleIds.indexOf(roleId) == -1) roleIds.push(roleId);
}
await sendMailToManyPlayerByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleIds, {
params: [data.tabName, '200+'],
goods: stringWithTypeToRewardInter(lastReward.rewards)
});
}
}
export async function takeSnapshot(data: TimeLimitRankData, serverId: number) {
let redisKey = getRedisKeyByRankType(data.rankType);
let targetRedisKey = getRedisKeyByRankType(data.rankType, true);
if (!redisKey || !targetRedisKey || redisKey == targetRedisKey) return null;
let insertInfos: ActivityTimeLimitRankModelTypeParam[] = [];
let r = new Rank(redisKey, { serverId, activityId: data.activityId });
let allRank = await r.getRankDataByRankWithoutDetail();
let targetR = new Rank(targetRedisKey, { serverId, activityId: data.activityId });
for(let rank of allRank) {
await targetR.setRank(rank.myId, rank.scores);
let insertBaseInfo = {
serverId, activityId: data.activityId, rankType: data.rankType, score: rank.scores[0]||0, time: rank.scores[1]||0
}
if(rank.myId.roleId) {
let role = await RoleModel.findByRoleId(rank.myId.roleId, '_id roleId');
if(role) insertInfos.push({ ...insertBaseInfo, roleId: role.roleId, role: role._id });
} else if(rank.myId.guildCode) {
let guild = await GuildModel.findByCode(rank.myId.guildCode, serverId, '_id guildCode');
if(guild) insertInfos.push({ ...insertBaseInfo, guildCode: guild.code, guild: guild._id });
}
}
await ActivityTimeLimitRankModel.insertRanks(insertInfos);
}
@@ -1,160 +1,160 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS, TREASURE_HUNT_DATA_TYPE } from '../../consts';
import { ActivityTreasureHuntShopModel } from '../../db/ActivityTreasureHuntShop';
import { ActivityTreasureHuntTaskModel } from '../../db/ActivityTreasureHuntTask';
import { ActivityTreasureHuntTreasureShopModel } from '../../db/ActivityTreasureHuntTreasureShop';
import { ActivityTreasureHuntFirstPageModel } from '../../db/ActivityTreasureHuntFirstPage';
import { TreasureHuntData } from '../../domain/activityField/treasureHuntField';
import { addReward, stringToConsumeParam, stringToRewardParam } from './giftPackageService';
import { RewardParam } from '../../domain/activityField/rewardField';
import { getActivitiesByType, getActivityById, getActivityByServerId } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { handleCost } from '../role/rewardService';
import { ActivityTreasureHuntChallengeModel } from '../../db/ActivityTreasureHuntChallenge';
import { ActivityModelType } from '../../db/Activity';
export async function getPlayerTreasureHuntDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerTreasureHuntData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerTreasureHuntData(activityId: number, serverId: number, roleId: string, dataType: TREASURE_HUNT_DATA_TYPE = TREASURE_HUNT_DATA_TYPE.ALL) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TreasureHuntData(activityData, createTime, serverTime);
if(dataType == TREASURE_HUNT_DATA_TYPE.FIRST_PAGE || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerTreasureFirstPageRecord = await ActivityTreasureHuntFirstPageModel.findData(serverId, activityId, roleId, playerData.roundIndex);
playerData.firstPage.setPlayerFirstPageRecord(playerTreasureFirstPageRecord);
}
if (dataType == TREASURE_HUNT_DATA_TYPE.SHOP || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerShopRecord = await ActivityTreasureHuntShopModel.findTreasureData(activityId, roleId, playerData.roundIndex, playerData.todayIndex);
playerData.shop.setPlayerShopRecords(playerShopRecord);
}
if (dataType == TREASURE_HUNT_DATA_TYPE.TASK || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerTaskRecord = await ActivityTreasureHuntTaskModel.findDataByRoundIndex(serverId, activityId, roleId, playerData.roundIndex);
playerData.tasks.setPlayerTaskRecords(playerTaskRecord);
}
if(dataType == TREASURE_HUNT_DATA_TYPE.TREASURE_SHOP || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerTreasureShopRecord = await ActivityTreasureHuntTreasureShopModel.findData(activityId, roleId, playerData.roundIndex);
playerData.treasureShop.setPlayerTreasureShopRecords(playerTreasureShopRecord);
}
if(dataType == TREASURE_HUNT_DATA_TYPE.CHALLENGE || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerRecord = await ActivityTreasureHuntChallengeModel.findData(serverId, activityId, roleId, playerData.roundIndex);
playerData.challenge.setChallengeRecord(playerRecord)
}
return playerData;
}
export async function getPlayerTreasureHuntFirstPageData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.FIRST_PAGE);
}
export async function getPlayerTreasureHuntShopData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.SHOP);
}
export async function getPlayerTreasureHuntTaskData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.TASK);
}
export async function getPlayerTreasureHuntChallengeData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.CHALLENGE);
}
export async function getPlayerTreasureHuntTreasureShopData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.TREASURE_SHOP);
}
/**
* 购买每日物资
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeShop(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
// let activityData: ActivityModelType = await ActivityModel.findActivity(activityId);
let playerData = await getPlayerTreasureHuntShopData(activityId, serverId, roleId,);
if (!playerData) {
return {
code: STATUS.ACTIVITY_MISSING,
}
}
let item = playerData.shop.findProductID(productID)
if (!item) {
return {
code: STATUS.ACTIVITY_MISSING,
}
}
if (item.buyCount >= item.countMax) {
return {
code: STATUS.ACTIVITY_MAX_COUNT,
}
}
let cellIndex = item.cellIndex;
//添加购买记录
await ActivityTreasureHuntShopModel.buyShopRecord(activityId, roleId, playerData.roundIndex, playerData.todayIndex, cellIndex, 1);
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.TREASURE_HUNT_SHOP_BUY)
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item })
}
}
export async function checkTreasureHuntShop(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TreasureHuntData(activityData, createTime, serverTime);
let playerShopRecord = await ActivityTreasureHuntShopModel.findTreasureData(activityData.activityId, roleId, playerData.roundIndex, playerData.todayIndex);
playerData.shop.setPlayerShopRecords(playerShopRecord);
let item = playerData.shop.findProductID(productID)
if (!item) return false;
if (item.buyCount >= item.countMax) return false;
return true;
}
export async function treasureHuntChallengeConsume(serverId: number, roleId: string, sid: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.TREASURE_HUNT);
for(let { activityId } of activities) {
let playerData = await getPlayerTreasureHuntChallengeData(activityId, serverId, roleId,);
if (!playerData) return false;
if(playerData.canShow()) {
let challengeData = playerData.challenge;
//消耗资源
let consumeStr = challengeData.consume;
let consume = stringToConsumeParam(consumeStr)
let resourceResult = await handleCost(roleId, sid, consume, ITEM_CHANGE_REASON.TREASURE_HUNT_CHALLENGE);
if (!resourceResult) return false;
let warId = playerData.challenge.randomGK();
await ActivityTreasureHuntChallengeModel.setWarId(serverId, activityId, roleId, playerData.roundIndex, warId);
}
}
return true
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS, TREASURE_HUNT_DATA_TYPE } from '@consts';
import { ActivityTreasureHuntShopModel } from '@db/ActivityTreasureHuntShop';
import { ActivityTreasureHuntTaskModel } from '@db/ActivityTreasureHuntTask';
import { ActivityTreasureHuntTreasureShopModel } from '@db/ActivityTreasureHuntTreasureShop';
import { ActivityTreasureHuntFirstPageModel } from '@db/ActivityTreasureHuntFirstPage';
import { TreasureHuntData } from '@domain/activityField/treasureHuntField';
import { addReward, stringToConsumeParam, stringToRewardParam } from './giftPackageService';
import { RewardParam } from '@domain/activityField/rewardField';
import { getActivitiesByType, getActivityById, getActivityByServerId } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { handleCost } from '../role/rewardService';
import { ActivityTreasureHuntChallengeModel } from '@db/ActivityTreasureHuntChallenge';
import { ActivityModelType } from '@db/Activity';
export async function getPlayerTreasureHuntDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getPlayerTreasureHuntData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerTreasureHuntData(activityId: number, serverId: number, roleId: string, dataType: TREASURE_HUNT_DATA_TYPE = TREASURE_HUNT_DATA_TYPE.ALL) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TreasureHuntData(activityData, createTime, serverTime);
if(dataType == TREASURE_HUNT_DATA_TYPE.FIRST_PAGE || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerTreasureFirstPageRecord = await ActivityTreasureHuntFirstPageModel.findData(serverId, activityId, roleId, playerData.roundIndex);
playerData.firstPage.setPlayerFirstPageRecord(playerTreasureFirstPageRecord);
}
if (dataType == TREASURE_HUNT_DATA_TYPE.SHOP || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerShopRecord = await ActivityTreasureHuntShopModel.findTreasureData(activityId, roleId, playerData.roundIndex, playerData.todayIndex);
playerData.shop.setPlayerShopRecords(playerShopRecord);
}
if (dataType == TREASURE_HUNT_DATA_TYPE.TASK || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerTaskRecord = await ActivityTreasureHuntTaskModel.findDataByRoundIndex(serverId, activityId, roleId, playerData.roundIndex);
playerData.tasks.setPlayerTaskRecords(playerTaskRecord);
}
if(dataType == TREASURE_HUNT_DATA_TYPE.TREASURE_SHOP || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerTreasureShopRecord = await ActivityTreasureHuntTreasureShopModel.findData(activityId, roleId, playerData.roundIndex);
playerData.treasureShop.setPlayerTreasureShopRecords(playerTreasureShopRecord);
}
if(dataType == TREASURE_HUNT_DATA_TYPE.CHALLENGE || dataType == TREASURE_HUNT_DATA_TYPE.ALL) {
let playerRecord = await ActivityTreasureHuntChallengeModel.findData(serverId, activityId, roleId, playerData.roundIndex);
playerData.challenge.setChallengeRecord(playerRecord)
}
return playerData;
}
export async function getPlayerTreasureHuntFirstPageData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.FIRST_PAGE);
}
export async function getPlayerTreasureHuntShopData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.SHOP);
}
export async function getPlayerTreasureHuntTaskData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.TASK);
}
export async function getPlayerTreasureHuntChallengeData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.CHALLENGE);
}
export async function getPlayerTreasureHuntTreasureShopData(activityId: number, serverId: number, roleId: string) {
return await getPlayerTreasureHuntData(activityId, serverId, roleId, TREASURE_HUNT_DATA_TYPE.TREASURE_SHOP);
}
/**
* 购买每日物资
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeShop(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
// let activityData: ActivityModelType = await ActivityModel.findActivity(activityId);
let playerData = await getPlayerTreasureHuntShopData(activityId, serverId, roleId,);
if (!playerData) {
return {
code: STATUS.ACTIVITY_MISSING,
}
}
let item = playerData.shop.findProductID(productID)
if (!item) {
return {
code: STATUS.ACTIVITY_MISSING,
}
}
if (item.buyCount >= item.countMax) {
return {
code: STATUS.ACTIVITY_MAX_COUNT,
}
}
let cellIndex = item.cellIndex;
//添加购买记录
await ActivityTreasureHuntShopModel.buyShopRecord(activityId, roleId, playerData.roundIndex, playerData.todayIndex, cellIndex, 1);
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.TREASURE_HUNT_SHOP_BUY)
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item })
}
}
export async function checkTreasureHuntShop(roleId: string, serverId: number, activityData: ActivityModelType, productID: string) {
if(!activityData) return false;
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new TreasureHuntData(activityData, createTime, serverTime);
let playerShopRecord = await ActivityTreasureHuntShopModel.findTreasureData(activityData.activityId, roleId, playerData.roundIndex, playerData.todayIndex);
playerData.shop.setPlayerShopRecords(playerShopRecord);
let item = playerData.shop.findProductID(productID)
if (!item) return false;
if (item.buyCount >= item.countMax) return false;
return true;
}
export async function treasureHuntChallengeConsume(serverId: number, roleId: string, sid: string) {
let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.TREASURE_HUNT);
for(let { activityId } of activities) {
let playerData = await getPlayerTreasureHuntChallengeData(activityId, serverId, roleId,);
if (!playerData) return false;
if(playerData.canShow()) {
let challengeData = playerData.challenge;
//消耗资源
let consumeStr = challengeData.consume;
let consume = stringToConsumeParam(consumeStr)
let resourceResult = await handleCost(roleId, sid, consume, ITEM_CHANGE_REASON.TREASURE_HUNT_CHALLENGE);
if (!resourceResult) return false;
let warId = playerData.challenge.randomGK();
await ActivityTreasureHuntChallengeModel.setWarId(serverId, activityId, roleId, playerData.roundIndex, warId);
}
}
return true
}
@@ -1,71 +1,71 @@
import { ACTIVITY_TYPE } from '../../consts';
import { ActivityVipRechargeMoneyModel, ActivityVipRechargeMoneyModelType } from '../../db/ActivityVipRechargeMoney';
import { VipRechargeMoneyData } from '../../domain/activityField/vipRechargeMoneyField';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function vipRechargeMoneyActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.VIP_RECHARGE_MONEY);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerRecord: ActivityVipRechargeMoneyModelType = await ActivityVipRechargeMoneyModel.findData(serverId, roleId, activityData.activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new VipRechargeMoneyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerVipRechargeMoneyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if (!activityData) {
return null;
}
let playerRecord: ActivityVipRechargeMoneyModelType = await ActivityVipRechargeMoneyModel.findData(serverId, roleId, activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new VipRechargeMoneyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 统计充值金额
*
* @param {number} serverId 区Id
* @param {string} roleId 角色Id
* @param {string} RMB 金额
*
*/
export async function addVipRechargeMoney(roleId: string, serverId: number, RMB: number) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.VIP_RECHARGE_MONEY);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
await ActivityVipRechargeMoneyModel.addRMB(serverId, roleId, activityData.activityId, RMB);
}
import { ACTIVITY_TYPE } from '@consts';
import { ActivityVipRechargeMoneyModel, ActivityVipRechargeMoneyModelType } from '@db/ActivityVipRechargeMoney';
import { VipRechargeMoneyData } from '@domain/activityField/vipRechargeMoneyField';
import { getActivitiesByType, getActivityById } from './activityService';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function vipRechargeMoneyActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.VIP_RECHARGE_MONEY);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerRecord: ActivityVipRechargeMoneyModelType = await ActivityVipRechargeMoneyModel.findData(serverId, roleId, activityData.activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new VipRechargeMoneyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerVipRechargeMoneyData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
if (!activityData) {
return null;
}
let playerRecord: ActivityVipRechargeMoneyModelType = await ActivityVipRechargeMoneyModel.findData(serverId, roleId, activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new VipRechargeMoneyData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 统计充值金额
*
* @param {number} serverId 区Id
* @param {string} roleId 角色Id
* @param {string} RMB 金额
*
*/
export async function addVipRechargeMoney(roleId: string, serverId: number, RMB: number) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.VIP_RECHARGE_MONEY);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
await ActivityVipRechargeMoneyModel.addRMB(serverId, roleId, activityData.activityId, RMB);
}
@@ -1,29 +1,29 @@
import { WebViewData } from "../../domain/activityField/webviewField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getWebviewData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new WebViewData(activityData, createTime, serverTime);
return playerData;
}
export async function getWebviewDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getWebviewData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
import { WebViewData } from "@domain/activityField/webviewField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getWebviewData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new WebViewData(activityData, createTime, serverTime);
return playerData;
}
export async function getWebviewDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getWebviewData(activityId, serverId, roleId);
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
@@ -1,93 +1,93 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from "../../consts";
import { ActivityModelType } from "../../db/Activity";
import { ActivityWeeklyFundModel } from "../../db/ActivityWeeklyFund";
import { WeeklyFundData } from "../../domain/activityField/weeklyFundField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
import { stringToRewardParam, addReward } from "./giftPackageService";
/**
* 周基金玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getWeeklyFundData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new WeeklyFundData(activityData, createTime, serverTime);
let playerRecord = await ActivityWeeklyFundModel.findData(serverId, activityId, roleId);
playerData.setPlayerRecord(playerRecord);
return playerData;
}
/**
* 周基金 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getWeeklyFundDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getWeeklyFundData(activityId, serverId, roleId);
// console.log('##### weeklyFund', playerData)
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 周基金 是否可以购买
* @param roleId 玩家id
* @param serverId 服
* @param activityData 活动数据
* @returns
*/
export async function checkWeeklyFund(roleId: string, serverId: number, activityData: ActivityModelType) {
if(!activityData || activityData.type !== ACTIVITY_TYPE.WEEKLY_FUND) return false;
let playerRecord = await ActivityWeeklyFundModel.findData(serverId, activityData.activityId, roleId);
return !playerRecord;
}
/**
* 周基金购买
* @param roleId 玩家id
* @param roleName 玩家名
* @param sid
* @param serverId 服
* @param activityId 活动
* @param productID 商品id
* @returns
*/
export async function makeWeeklyFund(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.WEEKLY_FUND) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new WeeklyFundData(activityData, createTime, serverTime);
let playerRecord = await ActivityWeeklyFundModel.findData(serverId, activityData.activityId, roleId);
if(playerRecord) {
return STATUS.ORDER_CANNOT_BUY;
}
await ActivityWeeklyFundModel.buy(serverId, activityId, roleId, productID);
let rewardParamArr = stringToRewardParam(playerData.onceReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.ACT_WEEKLY_FUND_BUY);
return {
code: 0,
data: Object.assign(result, { activityId: activityId })
}
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from "@consts";
import { ActivityModelType } from "@db/Activity";
import { ActivityWeeklyFundModel } from "@db/ActivityWeeklyFund";
import { WeeklyFundData } from "@domain/activityField/weeklyFundField";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getActivityById } from "./activityService";
import { stringToRewardParam, addReward } from "./giftPackageService";
/**
* 周基金玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getWeeklyFundData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new WeeklyFundData(activityData, createTime, serverTime);
let playerRecord = await ActivityWeeklyFundModel.findData(serverId, activityId, roleId);
playerData.setPlayerRecord(playerRecord);
return playerData;
}
/**
* 周基金 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getWeeklyFundDataShow(activityId: number, serverId: number, roleId: string) {
let playerData = await getWeeklyFundData(activityId, serverId, roleId);
// console.log('##### weeklyFund', playerData)
if(playerData && playerData.canShow && playerData.canShow()) {
return playerData.getShowResult();
}
return null
}
/**
* 周基金 是否可以购买
* @param roleId 玩家id
* @param serverId 服
* @param activityData 活动数据
* @returns
*/
export async function checkWeeklyFund(roleId: string, serverId: number, activityData: ActivityModelType) {
if(!activityData || activityData.type !== ACTIVITY_TYPE.WEEKLY_FUND) return false;
let playerRecord = await ActivityWeeklyFundModel.findData(serverId, activityData.activityId, roleId);
return !playerRecord;
}
/**
* 周基金购买
* @param roleId 玩家id
* @param roleName 玩家名
* @param sid
* @param serverId 服
* @param activityId 活动
* @param productID 商品id
* @returns
*/
export async function makeWeeklyFund(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string) {
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return STATUS.ACTIVITY_MISSING;
}
if (activityData.type !== ACTIVITY_TYPE.WEEKLY_FUND) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new WeeklyFundData(activityData, createTime, serverTime);
let playerRecord = await ActivityWeeklyFundModel.findData(serverId, activityData.activityId, roleId);
if(playerRecord) {
return STATUS.ORDER_CANNOT_BUY;
}
await ActivityWeeklyFundModel.buy(serverId, activityId, roleId, productID);
let rewardParamArr = stringToRewardParam(playerData.onceReward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.ACT_WEEKLY_FUND_BUY);
return {
code: 0,
data: Object.assign(result, { activityId: activityId })
}
}
@@ -1,99 +1,99 @@
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { UserOrderModel, UserOrderModelType } from '../../db/UserOrder';
import { RewardParam } from '../../domain/activityField/rewardField';
import { YuanBaoShopData } from '../../domain/activityField/yuanBaoShopField';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { addReward, stringToRewardParam } from './giftPackageService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function yuanbaoActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.YUAN_BAO_SHOP);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerRecord: UserOrderModelType[] = await UserOrderModel.findOrderByActivityID(activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new YuanBaoShopData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerYuanbaoShopData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: UserOrderModelType[] = await UserOrderModel.findOrderByActivityID(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new YuanBaoShopData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 结算奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeYuanbaoShopReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let records = await UserOrderModel.findSuccessOrderByProductID(productID, roleId, activityId);
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.YUAN_BAO_SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new YuanBaoShopData(activityData, createTime, serverTime);
let item = playerData.findItem(productID);
let rewardParamArr: Array<RewardParam> = [];
if (records.length == 0) {//首充
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.baseReward));
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.firstReward));
} else {
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.baseReward));
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.extraReward));
}
let arr: Array<RewardParam> = [];
for (let obj of rewardParamArr) {
let index = arr.findIndex(reward => { return reward.type == obj.type && reward.id == obj.id });
if (index != -1) {
arr[index].count += obj.count;
} else {
arr.push(obj);
}
}
let result = await addReward(roleId, roleName, sid, serverId, arr, ITEM_CHANGE_REASON.YUANBAO_SHOP_BUY)
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item, activityId: activityData.activityId })
}
}
import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, STATUS } from '@consts';
import { ActivityModelType } from '@db/Activity';
import { UserOrderModel, UserOrderModelType } from '@db/UserOrder';
import { RewardParam } from '@domain/activityField/rewardField';
import { YuanBaoShopData } from '@domain/activityField/yuanBaoShopField';
import { getRoleCreateTime, getServerCreateTime } from '../redisService';
import { getActivitiesByType, getActivityById } from './activityService';
import { addReward, stringToRewardParam } from './giftPackageService';
/**
* 获取活动数据
*
* @param {number} serverId 区Id
* @param {number} type 活动类型 ACTIVITY_TYPE
* @param {string} roleId 角色Id
*
*/
export async function yuanbaoActivity(serverId: number, roleId: string) {
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.YUAN_BAO_SHOP);
if (activityArray.length == 0) {
return null;
}
let activityData = activityArray[0];
let playerRecord: UserOrderModelType[] = await UserOrderModel.findOrderByActivityID(activityData.activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new YuanBaoShopData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 玩家活动数据
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
*
*/
export async function getPlayerYuanbaoShopData(activityId: number, serverId: number, roleId: string) {
let activityData = await getActivityById(activityId);
let playerRecord: UserOrderModelType[] = await UserOrderModel.findOrderByActivityID(activityId, roleId);
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new YuanBaoShopData(activityData, createTime, serverTime);
playerData.setPlayerRecords(playerRecord);
return playerData;
}
/**
* 结算奖励
*
* @param {number} serverId 区Id
* @param {number} activityId 活动Id
* @param {string} roleId 角色Id
* @param {string} productID 商品ID
*
*/
export async function makeYuanbaoShopReward(roleId: string, roleName: string, sid: string, serverId: number,
activityId: number, productID: string) {
let records = await UserOrderModel.findSuccessOrderByProductID(productID, roleId, activityId);
let activityData: ActivityModelType = await getActivityById(activityId);
if (activityData.type !== ACTIVITY_TYPE.YUAN_BAO_SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new YuanBaoShopData(activityData, createTime, serverTime);
let item = playerData.findItem(productID);
let rewardParamArr: Array<RewardParam> = [];
if (records.length == 0) {//首充
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.baseReward));
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.firstReward));
} else {
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.baseReward));
rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.extraReward));
}
let arr: Array<RewardParam> = [];
for (let obj of rewardParamArr) {
let index = arr.findIndex(reward => { return reward.type == obj.type && reward.id == obj.id });
if (index != -1) {
arr[index].count += obj.count;
} else {
arr.push(obj);
}
}
let result = await addReward(roleId, roleName, sid, serverId, arr, ITEM_CHANGE_REASON.YUANBAO_SHOP_BUY)
item.buyCount += 1;
return {
code: 0,
data: Object.assign(result, { item, activityId: activityData.activityId })
}
}