🐞 fix(订单): 各种类型的订单在支付之前校验次数

This commit is contained in:
luying
2023-04-06 13:32:40 +08:00
parent f7ccc14f74
commit 08d5ebedeb
18 changed files with 224 additions and 29 deletions

View File

@@ -68,6 +68,9 @@ export async function makeDailyRMBGiftsReward(roleId: string, roleName: string,
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()) {//今天已经购买过其他奖励
@@ -85,11 +88,12 @@ export async function makeDailyRMBGiftsReward(roleId: string, roleName: string,
}
} else {
let item = playerData.findProduct(productID);
if (!item) {
return {
code: STATUS.ACTIVITY_NO_PRODUCT,
}
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]);
@@ -100,3 +104,30 @@ export async function makeDailyRMBGiftsReward(roleId: string, roleName: string,
}
}
}
/**
* 检查每日特惠是否可以购买
*
* @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;
}
}

View File

@@ -143,9 +143,23 @@ export async function makeGrowthFund(roleId: string, roleName: string, sid: stri
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;
}

View File

@@ -125,9 +125,9 @@ export async function makeLimitPackageReward(roleId: string, roleName: string, s
if (!item) {
return STATUS.ACTIVITY_NO_PRODUCT;
}
// if (item.countMax > 0 && item.buyCount >= item.countMax) {
// return STATUS.ACTIVITY_MAX_COUNT;
// }
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);

View File

@@ -79,7 +79,11 @@ export async function makeMonthlyFund(roleId: string, roleName: string, sid: str
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);

View File

@@ -121,12 +121,15 @@ export async function makeMonthlyTicketReward(roleId: string, roleName: string,
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);
@@ -141,7 +144,13 @@ export async function makeMonthlyTicketReward(roleId: string, roleName: string,
}
}
// 月卡权限
// 是否可以购买月卡
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) {

View File

@@ -168,6 +168,7 @@ export async function makePopUpShopReward(roleId: string, roleName: string, sid:
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)

View File

@@ -153,3 +153,22 @@ export async function makeRefreshShopReward(roleId: string, roleName: string, si
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;
}

View File

@@ -124,25 +124,19 @@ export async function makeSelfServerShop(roleId: string, roleName: string, sid:
let activityData: ActivityModelType = await getActivityById(activityId);
if (!activityData) {
return {
code: STATUS.ACTIVITY_MISSING,
}
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 {
code: STATUS.ACTIVITY_DATA_ERROR,
}
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 {
code: STATUS.ACTIVITY_MAX_COUNT,
}
return STATUS.ACTIVITY_MAX_COUNT
}
}
let result = await addSelfServiceShopGiftReward(roleId, roleName, sid, serverId, activityId, playerData.roundIndex, item.index, item);
@@ -152,3 +146,18 @@ export async function makeSelfServerShop(roleId: string, roleName: string, sid:
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;
}

View File

@@ -101,10 +101,10 @@ export async function makeSignInVIP(roleId: string, roleName: string, sid: strin
if (activityData.type !== ACTIVITY_TYPE.SIGN_IN_VIP && activityData.type !== ACTIVITY_TYPE.COMMON_SIGN_IN) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let serverTime = await getServerCreateTime(serverId);
let playerData = new SignInData(activityData, createTime, serverTime);
let playerData = await getPlayerSignInData(activityId, serverId, roleId);
if (!playerData || playerData.isVip) {
return STATUS.ORDER_CANNOT_BUY;
}
await ActivitySignInModel.buyVIP(activityId, roleId, playerData.roundIndex);
return {

View File

@@ -49,6 +49,9 @@ export async function getTaskPassDataShow(activityId: number, serverId: number,
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,
@@ -56,6 +59,17 @@ export async function getTaskPassDataShow(activityId: number, serverId: number,
}
}
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;
}
/**
* 任务活动完成后会获得点数
*

View File

@@ -10,6 +10,7 @@ import { getActivitiesByType, getActivityById, getActivityByServerId } from './a
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);
@@ -121,6 +122,22 @@ export async function makeShop(roleId: string, roleName: string, sid: string, se
}
}
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) {

View File

@@ -34,6 +34,7 @@ export async function getWeeklyFundData(activityId: number, serverId: number, ro
*/
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();
}
@@ -75,6 +76,11 @@ export async function makeWeeklyFund(roleId: string, roleName: string, sid: stri
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);

View File

@@ -3,16 +3,16 @@ import { ACTIVITY_TYPE, DEBUG_PRICE, MAIL_TYPE, ORDER_STATE, PAY_TYPE, PUSH_ROUT
import { dicRMB } from '../pubUtils/dictionary/DicRMB';
import { makeYuanbaoShopReward } from './activity/yuanbaoService';
import { RoleModel } from '../db/Role';
import { makeMonthlyTicketReward } from './activity/monthlyTicketService';
import { checkMonthlyTicket, makeMonthlyTicketReward } from './activity/monthlyTicketService';
import { checkSignInCanBuy, makeSignInVIP } from './activity/signInService';
import { makeDailyRMBGiftsReward } from './activity/dailyRMBGiftsService';
import { checkDailyRMBGifts, makeDailyRMBGiftsReward } from './activity/dailyRMBGiftsService';
import { checkPopUpShopCanBuy, makePopUpShopReward } from './activity/popUpShopService';
import { ActivityModel, ActivityModelType } from '../db/Activity';
import { makeGrowthFund } from './activity/growthFundService';
import { checkGrowthFund, makeGrowthFund } from './activity/growthFundService';
import { checkLimitPackageCanBuy, makeLimitPackageReward } from './activity/limitPackageService';
import { makeShop } from './activity/treasureHuntService';
import { makeSelfServerShop } from './activity/selfServiceShopActivityService';
import { makeRefreshShopReward } from './activity/refreshShopService';
import { checkTreasureHuntShop, makeShop } from './activity/treasureHuntService';
import { checkSelfServiceShop, makeSelfServerShop } from './activity/selfServiceShopActivityService';
import { checkRefreshShop, makeRefreshShopReward } from './activity/refreshShopService';
import { ActivityMonopolyModel, ActivityMonopolyModelType } from '../db/ActivityMonopoly';
import { ActivityMonopolyLandModel, ActivityMonopolyLandModelType } from '../db/ActivityMonopolyLand';
import { parseGoodStr, resResult } from '../pubUtils/util';
@@ -26,7 +26,7 @@ import { PayCallback37Data } from '../domain/sdk';
import { reportTAEvent, reportTAUserSet } from './sdkService';
import { savePayLog } from '../pubUtils/logUtil';
import { recordFirstGift } from './activity/firstGiftService';
import { makeTaskPass } from './activity/taskPassService';
import { checkTaskPass, makeTaskPass } from './activity/taskPassService';
import { addGuildPay } from './activity/guildPayService';
import { sendMessageToUserWithSuc } from './pushService';
import { checkParamPrice, needRebate } from '../pubUtils/sdkUtil';
@@ -69,6 +69,48 @@ export async function checkOrderCanBuy(roleId: string, serverId: number, activit
{
return await checkMonthlyFund(roleId, serverId, activityData, productID);
}
case ACTIVITY_TYPE.DAILY_RMB_GIFTS:
{
return await checkDailyRMBGifts(roleId, serverId, activityData, productID);
}
case ACTIVITY_TYPE.MONTHLY_TICKET_1:
case ACTIVITY_TYPE.MONTHLY_TICKET_2:
{
return await checkMonthlyTicket(roleId, serverId, activityData);
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP: //主线成长基金(高阶)
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP://镇念塔成长基金(高阶)
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP://精英成长基金(高阶)
{
return await checkGrowthFund(roleId, serverId, activityData, productID);
}
case ACTIVITY_TYPE.SELF_SERVICE_SHOP:
{
return await checkSelfServiceShop(roleId, serverId, activityData, productID);
}
case ACTIVITY_TYPE.TASK_PASS:
{
return await checkTaskPass(roleId, serverId, activityData, productID);
}
case ACTIVITY_TYPE.REFRESH_SHOP://通用的刷新商店分页可刷新限制购买次数支持rmb与资源兑换
{
if (paramStr) {//大富翁商店结算
let paramObj = JSON.parse(paramStr);
let activityId = paramObj.activityId;//大富翁活动id orderInfo.activityId是大富翁中的商店活动id
if (activityId) {
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(serverId, activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType = await ActivityMonopolyLandModel.findDataByPosition(serverId, activityId, roleId, playerMonopolyData.curPosition);
let roundIndex = playerLandData.stopCount;
return await checkRefreshShop(roleId, serverId, activityData, productID, roundIndex);
}
}
//正常商店结算
return await checkRefreshShop(roleId, serverId, activityData, productID, 0);
}
case ACTIVITY_TYPE.TREASURE_HUNT://寻宝奇兵活动-每日物资商店
{
return await checkTreasureHuntShop(roleId, serverId, activityData, productID);
}
}
return true
}

View File

@@ -203,11 +203,17 @@ export async function checkShopItemCanBuy(activityId: number, shopItemId: number
if (activityData.type !== ACTIVITY_TYPE.SHOP) {
return STATUS.ACTIVITY_TYPE_ERROR;
}
let createTime = await getRoleCreateTime(roleId);
let role = await RoleModel.findByRoleId(roleId, 'guildCode createTime vipStartTime');
let { createTime, guildCode, vipStartTime } = role;
let serverTime = await getServerCreateTime(serverId);
let shopData = new ShopData(activityData, createTime, serverTime);
let dicItem = shopData.findByProductID(productID);
if(!dicItem) return STATUS.DIC_DATA_NOT_FOUND;
let userShop = await UserShopModel.findByRoleAndItem(roleId, dicItem, seasonNum);
let result = await checkShopItemCanBuy(activityId, dicItem.id, roleId, serverId, guildCode, vipStartTime, 1, userShop?.count||0, dicItem);
if(result.code != STATUS.SUCCESS.code) return result;
let reward = [{
id: dicItem.goodId,
count: 1

View File

@@ -40,6 +40,10 @@ export default class Activity_Buy_Records extends BaseModel {
public static async deleteActivity(activityId: number, roleId: string, pageIndex: number, cellIndex: number) {
await ActivityBuyRecordsModel.deleteMany({ roleId, activityId, pageIndex, cellIndex });
}
public static async checkRecord(activityId: number, roleId: string, type: number, pageIndex: number) {
return await ActivityBuyRecordsModel.exists({ roleId, activityId, type, pageIndex });
}
}
export const ActivityBuyRecordsModel = getModelForClass(Activity_Buy_Records);

View File

@@ -73,6 +73,16 @@ export default class Activity_Daily_RMB_Gifts extends BaseModel {
return result;
}
// 检查是否购买过
public static async checkHasBought(serverId: number, activityId: number, roleId: string, beginTime: Date, todayIndex: number) {
return await ActivityDailyRMBGiftsModel.exists({ serverId, roleId, activityId, beginTime, todayIndex });
}
public static async checkHasReceive(serverId: number, activityId: number, roleId: string, beginTime: Date, todayIndex: number, id: number) {
return await ActivityDailyRMBGiftsModel.exists({ serverId, roleId, activityId, beginTime, todayIndex, 'records.id': id });
}
//删除活动领取记录
public static async deleteActivity(serverId: number, activityId: number, roleId: string) {
await ActivityDailyRMBGiftsModel.deleteMany({ serverId, roleId, activityId });

View File

@@ -41,6 +41,10 @@ export default class Activity_Monthly_Ticket extends BaseModel {
public static async buyMonthlyTicket(serverId: number, roleId: string, activityId: number, activityType: number, endTime: Date, isForever: boolean) {
await ActivityMonthlyTicketModel.findOneAndUpdate({ serverId, roleId, activityId, activityType }, { $set: { endTime, dayIndex: 0, isForever } }, { upsert: true, new: true }).lean();
}
public static async checkHasBought(serverId: number, roleId: string, activityId: number, activityType: number,) {
return await ActivityMonthlyTicketModel.exists({ serverId, roleId, activityId, activityType, endTime: { $gt: new Date() } });
}
}
export const ActivityMonthlyTicketModel = getModelForClass(Activity_Monthly_Ticket);

View File

@@ -62,6 +62,11 @@ export default class Activity_Task_Pass extends BaseModel {
return result;
}
// 是否买过
public static async check(serverId: number, activityId: number, roleId: string, roundIndex: number, productID: string) {
return await ActivityTaskPassModel.exists({ serverId, roleId, activityId, roundIndex, productIDs: productID });
}
public static async receiveItems(serverId: number, activityId: number, roleId: string, roundIndex: number, receivedReward: ReceivedReward[]) {
// console.log(receivedReward)
let result: ActivityTaskPassModelType = await ActivityTaskPassModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex},