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
+443 -443
View File
@@ -1,443 +1,443 @@
import { UserOrderModel, UserOrderModelType } from '../db/UserOrder';
import { ACTIVITY_TYPE, DEBUG_PRICE, MAIL_TYPE, ORDER_STATE, PAY_TYPE, PUSH_ROUTE, REFUND_PRICE_TO_GOLD, STATUS, TASK_TYPE, TA_EVENT, TA_USERSET_TYPE } from '../consts';
import { dicRMB } from '../pubUtils/dictionary/DicRMB';
import { makeYuanbaoShopReward } from './activity/yuanbaoService';
import { RoleModel } from '../db/Role';
import { checkMonthlyTicket, makeMonthlyTicketReward } from './activity/monthlyTicketService';
import { checkSignInCanBuy, makeSignInVIP } from './activity/signInService';
import { checkDailyRMBGifts, makeDailyRMBGiftsReward } from './activity/dailyRMBGiftsService';
import { checkPopUpShopCanBuy, makePopUpShopReward } from './activity/popUpShopService';
import { ActivityModel, ActivityModelType } from '../db/Activity';
import { checkGrowthFund, makeGrowthFund } from './activity/growthFundService';
import { checkLimitPackageCanBuy, makeLimitPackageReward } from './activity/limitPackageService';
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';
import { checkOrderWX } from './pay/weixinPay';
import { addRechargeMoney } from './activity/rechargeMoneyService';
import { addVipRechargeMoney } from './activity/vipRechargeMoneyService';
import { checkTask } from './task/taskService';
import { checkOrderALI } from './pay/aliPay';
import { getRoleOnlineInfo } from './redisService';
import { PayCallback37Data } from '../domain/sdk';
import { reportTAEvent, reportTAUserSet } from './sdkService';
import { savePayLog } from '../pubUtils/logUtil';
import { recordFirstGift } from './activity/firstGiftService';
import { checkTaskPass, makeTaskPass } from './activity/taskPassService';
import { addGuildPay } from './activity/guildPayService';
import { sendMessageToUserWithSuc } from './pushService';
import { checkParamPrice, needRebate } from '../pubUtils/sdkUtil';
import { checkShopCanBuyInOrder, makeShopOrder } from './shopService';
import { checkWeeklyFund, makeWeeklyFund } from './activity/weeklyFundService';
import { checkMonthlyFund, makeMonthlyFund } from './activity/monthlyFundService';
import { gameData } from '../pubUtils/data';
export async function checkOrderCanBuy(roleId: string, serverId: number, activityData: ActivityModelType, productID: string, paramStr: string) {
let activityId = activityData.activityId;
switch(activityData.type) {
case ACTIVITY_TYPE.SIGN_IN_VIP:
case ACTIVITY_TYPE.COMMON_SIGN_IN:
{
return await checkSignInCanBuy(roleId, serverId, activityId, productID)
}
case ACTIVITY_TYPE.POP_UP_SHOP:
{
return await checkPopUpShopCanBuy(roleId, serverId, activityId, productID, paramStr)
}
case ACTIVITY_TYPE.SHOP:
{
return await checkShopCanBuyInOrder(roleId, serverId, activityData, productID)
}
case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE:
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY:
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY:
{
return await checkLimitPackageCanBuy(roleId, serverId, activityData, productID)
}
case ACTIVITY_TYPE.WEEKLY_FUND:
{
return await checkWeeklyFund(roleId, serverId, activityData);
}
case ACTIVITY_TYPE.MONTHLY_FUND:
{
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
}
/**
* 结算账单
* @param localOrderID 本地订单号
*/
export async function makeOrder(orderInfo: UserOrderModelType, sid: string) {
//商品价格信息
let productInfo = dicRMB.get(orderInfo.productID)
let productType = productInfo.type;//类型
let price = orderInfo.price;//下单时的价格
let payType = orderInfo.payType;//支付类型
let roleId = orderInfo.roleId;//角色
const roleInfo = await RoleModel.increaseTotalPay(roleId, price);
let rewardResult: any = { code: 0, data: null };
switch (productType) {
case ACTIVITY_TYPE.SIGN_IN_VIP:
case ACTIVITY_TYPE.COMMON_SIGN_IN:
{
rewardResult = await makeSignInVIP(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE:
{
rewardResult = await makeLimitPackageReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY:
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY:
{
rewardResult = await makeLimitPackageReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.YUAN_BAO_SHOP:
{
rewardResult = await makeYuanbaoShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.MONTHLY_TICKET_1:
case ACTIVITY_TYPE.MONTHLY_TICKET_2:
{
rewardResult = await makeMonthlyTicketReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.DAILY_RMB_GIFTS:
{
rewardResult = await makeDailyRMBGiftsReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.POP_UP_SHOP://弹出礼包
{
rewardResult = await makePopUpShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID, orderInfo.paramStr, roleInfo)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP: //主线成长基金(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP://镇念塔成长基金(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP://精英成长基金(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_ROUGE_VIP://学宫密卷(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_AUTHOR_VIP://列传密卷(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.TREASURE_HUNT://寻宝奇兵活动-每日物资商店
{
rewardResult = await makeShop(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.SELF_SERVICE_SHOP://自选商店-购买礼包(糜家商队)
{
rewardResult = await makeSelfServerShop(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.REFRESH_SHOP://通用的刷新商店(分页,可刷新,限制购买次数,支持rmb与资源兑换)
{
if (orderInfo.paramStr) {//大富翁商店结算
let paramObj = JSON.parse(orderInfo.paramStr);
let activityId = paramObj.activityId;//大富翁活动id; orderInfo.activityId是大富翁中的商店活动id
if (activityId) {
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(orderInfo.serverId, activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType = await ActivityMonopolyLandModel.findDataByPosition(orderInfo.serverId, activityId, roleId, playerMonopolyData.curPosition);
let roundIndex = playerLandData.stopCount;
rewardResult = await makeRefreshShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID, roundIndex)
break;
}
}
//正常商店结算
rewardResult = await makeRefreshShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID, 0)
break;
}
case ACTIVITY_TYPE.TASK_PASS: // 战令-高级卡
{
rewardResult = await makeTaskPass(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.SHOP: // 商店
{
rewardResult = await makeShopOrder(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.WEEKLY_FUND: // 周基金
{
rewardResult = await makeWeeklyFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.MONTHLY_FUND: // 月基金
{
rewardResult = await makeMonthlyFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
default:
rewardResult = STATUS.ERROR_TYPE;
break;
}
if(rewardResult.code == 0) {
await recordFirstGift(roleInfo, orderInfo.serverId);
}
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PLAYER_DATA_CHANGE, { totalPay: roleInfo.totalPay }, sid);
return {...rewardResult, roleInfo}
}
export async function settleOrder(order: UserOrderModelType, serverId: number, sid?: string) {
if(!sid) {
let onlineUser = await getRoleOnlineInfo(order.roleId);
sid = onlineUser.sid;
}
//结算奖励
let result = await makeOrder(order, sid);
if (result.code !== 0) {//结算失败
console.log(`支付失败..... ${JSON.stringify(result)}`)
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_FAIL, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType, pay_type: order.useVoucher? "现金": "代金券" })
savePayLog(order);
return resResult(result);
}
//推送
console.log('***** settleOrder', order.roleId, sid)
//活动统计
await addRechargeMoney(order.roleId, serverId, order.price);
await addVipRechargeMoney(order.roleId, serverId, order.price);
await addGuildPay(result.roleInfo, order.price)
//成长任务
checkTask(serverId, order.roleId, null, TASK_TYPE.ACTIVITY_RMB, { count: order.price });
if(order.payType != PAY_TYPE.TEST) {
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_SUCCESS, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType, pay_type: getVoucherType(order.useVoucher, order.voucherId) })
reportTAUserSet(TA_USERSET_TYPE.SET_ONCE, order.roleId, { first_pay_time: new Date() });
reportTAUserSet(TA_USERSET_TYPE.SET, order.roleId, { last_pay_time: new Date() });
reportTAUserSet(TA_USERSET_TYPE.ADD, order.roleId, { total_revenue: order.price });
}
savePayLog(order);
if(!!sid) {
sendMessageToUserWithSuc(order.roleId, PUSH_ROUTE.ORDER, {
...result.data,
price: order.price,
state: order.state,
localOrderID: order.localOrderID}, sid);
}
return result.data;
}
function getVoucherType(useVoucher: boolean, voucherId: number) {
if(useVoucher) {
let dicGood = gameData.goods.get(voucherId);
if(!dicGood) return '未知';
return dicGood.name;
}
return '现金'
}
export async function settleOrderWx(order: UserOrderModelType, serverId: number, sid: string) {
if (order.state == ORDER_STATE.RESULT_SUCCESS) {
return STATUS.DUPLICATE_ORDER;
}
order = await UserOrderModel.check(order.roleId, order.localOrderID);
if (!order) {
return STATUS.DUPLICATE_ORDER;
}
let weixinResult = await checkOrderWX(order.localOrderID);
if (weixinResult.code == 0) {
console.log('微信订单查询失败')
return STATUS.ORDER_ERROR;
}
if (parseInt(weixinResult.data.total_fee) / 100 != order.price) {
console.log('订单价格错误')
return STATUS.PRICE_ERROR;
}
if (weixinResult.data.trade_state != "SUCCESS" ||
weixinResult.data.result_code != "SUCCESS" ||
weixinResult.data.return_code != "SUCCESS") {
return STATUS.NO_PAY;
}
let result = await settleOrder(order, serverId, sid);
order = await UserOrderModel.success(order.roleId, order.localOrderID, result);
return STATUS.SUCCESS
}
export async function settleOrderAli(order: UserOrderModelType, serverId: number, sid: string) {
if (order.state == ORDER_STATE.RESULT_SUCCESS) {
return STATUS.DUPLICATE_ORDER;
}
let aliResult = await checkOrderALI(order.localOrderID);
if (aliResult.code == 0) {
console.log('支付宝订单查询失败')
return STATUS.ORDER_ERROR;
}
if (parseInt(aliResult.data.total_amount) != order.price) {
console.log('订单价格错误')
return STATUS.PRICE_ERROR;
}
if (aliResult.data.trade_status != "TRADE_SUCCESS") {
return STATUS.NO_PAY;
}
let aliOrderID = aliResult.data.trade_no;
let result = await settleOrder(order, serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, aliOrderID, result);
return STATUS.SUCCESS
}
export async function settleOrderFromRedisPub(message: string) {
console.log('**********settleOrderFromRedisPub*******')
console.log('message: ', message);
let params: PayCallback37Data;
try {
params = JSON.parse(message);
} catch(e) {
return false;
}
let order = await UserOrderModel.findOrder(params.order_no);
if(!order || order.state != ORDER_STATE.CHECK_ORDER) {
console.log('订单状态错误');
return false;
}
if(order.roleId != params.actor_id) {
console.log('订单玩家错误');
return false;
}
if((!checkParamPrice(order.price, params.money))) {
console.log('订单金额错误');
return false;
}
let aliOrderID = params.order_id;
let result = await settleOrder(order, parseInt(`${params.sid}`));
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, aliOrderID, JSON.stringify(result));
return true
}
export async function settleOrderFromHandler(localOrderID: string, roleId: string, serverId: number, sid: string ) {
let order = await UserOrderModel.findOrder(localOrderID);
if(!order || order.state != ORDER_STATE.APPLY) {
return STATUS.DUPLICATE_ORDER;
}
if(order.roleId != roleId) {
console.log('订单玩家错误');
return STATUS.ORDER_STATUS_ERROR;
}
let result = await settleOrder(order, serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, '', JSON.stringify(result));
return STATUS.SUCCESS
}
export async function refundOrderFromRedisPub(message: string) {
console.log('**********refundOrderFromRedisPub*******')
console.log('message: ', message);
let params: PayCallback37Data;
try {
params = JSON.parse(message);
} catch(e) {
return false;
}
let order = await UserOrderModel.findOrder(params.order_no);
if(!order || order.state != ORDER_STATE.CHECK_TO_REFUND) {
console.log('订单状态错误');
return false;
}
if(order.roleId != params.actor_id) {
console.log('订单玩家错误');
return false;
}
let price = order.price;
let refundGold = price * REFUND_PRICE_TO_GOLD;
let role = await RoleModel.incRoleInfo(order.roleId, { gold: -refundGold }, {});
let onlineUser = await getRoleOnlineInfo(order.roleId);
let sid = onlineUser.sid;
sendMessageToUserWithSuc(order.roleId, PUSH_ROUTE.PLAYER_DATA_CHANGE, { gold: role.gold }, sid);
await UserOrderModel.refund(order.roleId, order.localOrderID, message);
return true
}
import { UserOrderModel, UserOrderModelType } from '@db/UserOrder';
import { ACTIVITY_TYPE, DEBUG_PRICE, MAIL_TYPE, ORDER_STATE, PAY_TYPE, PUSH_ROUTE, REFUND_PRICE_TO_GOLD, STATUS, TASK_TYPE, TA_EVENT, TA_USERSET_TYPE } from '@consts';
import { dicRMB } from '@pubUtils/dictionary/DicRMB';
import { makeYuanbaoShopReward } from './activity/yuanbaoService';
import { RoleModel } from '@db/Role';
import { checkMonthlyTicket, makeMonthlyTicketReward } from './activity/monthlyTicketService';
import { checkSignInCanBuy, makeSignInVIP } from './activity/signInService';
import { checkDailyRMBGifts, makeDailyRMBGiftsReward } from './activity/dailyRMBGiftsService';
import { checkPopUpShopCanBuy, makePopUpShopReward } from './activity/popUpShopService';
import { ActivityModel, ActivityModelType } from '@db/Activity';
import { checkGrowthFund, makeGrowthFund } from './activity/growthFundService';
import { checkLimitPackageCanBuy, makeLimitPackageReward } from './activity/limitPackageService';
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';
import { checkOrderWX } from './pay/weixinPay';
import { addRechargeMoney } from './activity/rechargeMoneyService';
import { addVipRechargeMoney } from './activity/vipRechargeMoneyService';
import { checkTask } from './task/taskService';
import { checkOrderALI } from './pay/aliPay';
import { getRoleOnlineInfo } from './redisService';
import { PayCallback37Data } from '@domain/sdk';
import { reportTAEvent, reportTAUserSet } from './sdkService';
import { savePayLog } from '@pubUtils/logUtil';
import { recordFirstGift } from './activity/firstGiftService';
import { checkTaskPass, makeTaskPass } from './activity/taskPassService';
import { addGuildPay } from './activity/guildPayService';
import { sendMessageToUserWithSuc } from './pushService';
import { checkParamPrice, needRebate } from '@pubUtils/sdkUtil';
import { checkShopCanBuyInOrder, makeShopOrder } from './shopService';
import { checkWeeklyFund, makeWeeklyFund } from './activity/weeklyFundService';
import { checkMonthlyFund, makeMonthlyFund } from './activity/monthlyFundService';
import { gameData } from '@pubUtils/data';
export async function checkOrderCanBuy(roleId: string, serverId: number, activityData: ActivityModelType, productID: string, paramStr: string) {
let activityId = activityData.activityId;
switch(activityData.type) {
case ACTIVITY_TYPE.SIGN_IN_VIP:
case ACTIVITY_TYPE.COMMON_SIGN_IN:
{
return await checkSignInCanBuy(roleId, serverId, activityId, productID)
}
case ACTIVITY_TYPE.POP_UP_SHOP:
{
return await checkPopUpShopCanBuy(roleId, serverId, activityId, productID, paramStr)
}
case ACTIVITY_TYPE.SHOP:
{
return await checkShopCanBuyInOrder(roleId, serverId, activityData, productID)
}
case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE:
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY:
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY:
{
return await checkLimitPackageCanBuy(roleId, serverId, activityData, productID)
}
case ACTIVITY_TYPE.WEEKLY_FUND:
{
return await checkWeeklyFund(roleId, serverId, activityData);
}
case ACTIVITY_TYPE.MONTHLY_FUND:
{
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
}
/**
* 结算账单
* @param localOrderID 本地订单号
*/
export async function makeOrder(orderInfo: UserOrderModelType, sid: string) {
//商品价格信息
let productInfo = dicRMB.get(orderInfo.productID)
let productType = productInfo.type;//类型
let price = orderInfo.price;//下单时的价格
let payType = orderInfo.payType;//支付类型
let roleId = orderInfo.roleId;//角色
const roleInfo = await RoleModel.increaseTotalPay(roleId, price);
let rewardResult: any = { code: 0, data: null };
switch (productType) {
case ACTIVITY_TYPE.SIGN_IN_VIP:
case ACTIVITY_TYPE.COMMON_SIGN_IN:
{
rewardResult = await makeSignInVIP(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE:
{
rewardResult = await makeLimitPackageReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY:
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY:
{
rewardResult = await makeLimitPackageReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.YUAN_BAO_SHOP:
{
rewardResult = await makeYuanbaoShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.MONTHLY_TICKET_1:
case ACTIVITY_TYPE.MONTHLY_TICKET_2:
{
rewardResult = await makeMonthlyTicketReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.DAILY_RMB_GIFTS:
{
rewardResult = await makeDailyRMBGiftsReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.POP_UP_SHOP://弹出礼包
{
rewardResult = await makePopUpShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID, orderInfo.paramStr, roleInfo)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP: //主线成长基金(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP://镇念塔成长基金(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP://精英成长基金(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_ROUGE_VIP://学宫密卷(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.GROWTH_FUND_AUTHOR_VIP://列传密卷(高阶)
{
rewardResult = await makeGrowthFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.TREASURE_HUNT://寻宝奇兵活动-每日物资商店
{
rewardResult = await makeShop(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.SELF_SERVICE_SHOP://自选商店-购买礼包(糜家商队)
{
rewardResult = await makeSelfServerShop(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.REFRESH_SHOP://通用的刷新商店(分页,可刷新,限制购买次数,支持rmb与资源兑换)
{
if (orderInfo.paramStr) {//大富翁商店结算
let paramObj = JSON.parse(orderInfo.paramStr);
let activityId = paramObj.activityId;//大富翁活动id; orderInfo.activityId是大富翁中的商店活动id
if (activityId) {
let playerMonopolyData: ActivityMonopolyModelType = await ActivityMonopolyModel.findData(orderInfo.serverId, activityId, roleId);
let playerLandData: ActivityMonopolyLandModelType = await ActivityMonopolyLandModel.findDataByPosition(orderInfo.serverId, activityId, roleId, playerMonopolyData.curPosition);
let roundIndex = playerLandData.stopCount;
rewardResult = await makeRefreshShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID, roundIndex)
break;
}
}
//正常商店结算
rewardResult = await makeRefreshShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID, 0)
break;
}
case ACTIVITY_TYPE.TASK_PASS: // 战令-高级卡
{
rewardResult = await makeTaskPass(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.SHOP: // 商店
{
rewardResult = await makeShopOrder(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.WEEKLY_FUND: // 周基金
{
rewardResult = await makeWeeklyFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
case ACTIVITY_TYPE.MONTHLY_FUND: // 月基金
{
rewardResult = await makeMonthlyFund(roleId, roleInfo.roleName, sid, orderInfo.serverId, orderInfo.activityId, orderInfo.productID)
break;
}
default:
rewardResult = STATUS.ERROR_TYPE;
break;
}
if(rewardResult.code == 0) {
await recordFirstGift(roleInfo, orderInfo.serverId);
}
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PLAYER_DATA_CHANGE, { totalPay: roleInfo.totalPay }, sid);
return {...rewardResult, roleInfo}
}
export async function settleOrder(order: UserOrderModelType, serverId: number, sid?: string) {
if(!sid) {
let onlineUser = await getRoleOnlineInfo(order.roleId);
sid = onlineUser.sid;
}
//结算奖励
let result = await makeOrder(order, sid);
if (result.code !== 0) {//结算失败
console.log(`支付失败..... ${JSON.stringify(result)}`)
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_FAIL, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType, pay_type: order.useVoucher? "现金": "代金券" })
savePayLog(order);
return resResult(result);
}
//推送
console.log('***** settleOrder', order.roleId, sid)
//活动统计
await addRechargeMoney(order.roleId, serverId, order.price);
await addVipRechargeMoney(order.roleId, serverId, order.price);
await addGuildPay(result.roleInfo, order.price)
//成长任务
checkTask(serverId, order.roleId, null, TASK_TYPE.ACTIVITY_RMB, { count: order.price });
if(order.payType != PAY_TYPE.TEST) {
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_SUCCESS, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType, pay_type: getVoucherType(order.useVoucher, order.voucherId) })
reportTAUserSet(TA_USERSET_TYPE.SET_ONCE, order.roleId, { first_pay_time: new Date() });
reportTAUserSet(TA_USERSET_TYPE.SET, order.roleId, { last_pay_time: new Date() });
reportTAUserSet(TA_USERSET_TYPE.ADD, order.roleId, { total_revenue: order.price });
}
savePayLog(order);
if(!!sid) {
sendMessageToUserWithSuc(order.roleId, PUSH_ROUTE.ORDER, {
...result.data,
price: order.price,
state: order.state,
localOrderID: order.localOrderID}, sid);
}
return result.data;
}
function getVoucherType(useVoucher: boolean, voucherId: number) {
if(useVoucher) {
let dicGood = gameData.goods.get(voucherId);
if(!dicGood) return '未知';
return dicGood.name;
}
return '现金'
}
export async function settleOrderWx(order: UserOrderModelType, serverId: number, sid: string) {
if (order.state == ORDER_STATE.RESULT_SUCCESS) {
return STATUS.DUPLICATE_ORDER;
}
order = await UserOrderModel.check(order.roleId, order.localOrderID);
if (!order) {
return STATUS.DUPLICATE_ORDER;
}
let weixinResult = await checkOrderWX(order.localOrderID);
if (weixinResult.code == 0) {
console.log('微信订单查询失败')
return STATUS.ORDER_ERROR;
}
if (parseInt(weixinResult.data.total_fee) / 100 != order.price) {
console.log('订单价格错误')
return STATUS.PRICE_ERROR;
}
if (weixinResult.data.trade_state != "SUCCESS" ||
weixinResult.data.result_code != "SUCCESS" ||
weixinResult.data.return_code != "SUCCESS") {
return STATUS.NO_PAY;
}
let result = await settleOrder(order, serverId, sid);
order = await UserOrderModel.success(order.roleId, order.localOrderID, result);
return STATUS.SUCCESS
}
export async function settleOrderAli(order: UserOrderModelType, serverId: number, sid: string) {
if (order.state == ORDER_STATE.RESULT_SUCCESS) {
return STATUS.DUPLICATE_ORDER;
}
let aliResult = await checkOrderALI(order.localOrderID);
if (aliResult.code == 0) {
console.log('支付宝订单查询失败')
return STATUS.ORDER_ERROR;
}
if (parseInt(aliResult.data.total_amount) != order.price) {
console.log('订单价格错误')
return STATUS.PRICE_ERROR;
}
if (aliResult.data.trade_status != "TRADE_SUCCESS") {
return STATUS.NO_PAY;
}
let aliOrderID = aliResult.data.trade_no;
let result = await settleOrder(order, serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, aliOrderID, result);
return STATUS.SUCCESS
}
export async function settleOrderFromRedisPub(message: string) {
console.log('**********settleOrderFromRedisPub*******')
console.log('message: ', message);
let params: PayCallback37Data;
try {
params = JSON.parse(message);
} catch(e) {
return false;
}
let order = await UserOrderModel.findOrder(params.order_no);
if(!order || order.state != ORDER_STATE.CHECK_ORDER) {
console.log('订单状态错误');
return false;
}
if(order.roleId != params.actor_id) {
console.log('订单玩家错误');
return false;
}
if((!checkParamPrice(order.price, params.money))) {
console.log('订单金额错误');
return false;
}
let aliOrderID = params.order_id;
let result = await settleOrder(order, parseInt(`${params.sid}`));
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, aliOrderID, JSON.stringify(result));
return true
}
export async function settleOrderFromHandler(localOrderID: string, roleId: string, serverId: number, sid: string ) {
let order = await UserOrderModel.findOrder(localOrderID);
if(!order || order.state != ORDER_STATE.APPLY) {
return STATUS.DUPLICATE_ORDER;
}
if(order.roleId != roleId) {
console.log('订单玩家错误');
return STATUS.ORDER_STATUS_ERROR;
}
let result = await settleOrder(order, serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, '', JSON.stringify(result));
return STATUS.SUCCESS
}
export async function refundOrderFromRedisPub(message: string) {
console.log('**********refundOrderFromRedisPub*******')
console.log('message: ', message);
let params: PayCallback37Data;
try {
params = JSON.parse(message);
} catch(e) {
return false;
}
let order = await UserOrderModel.findOrder(params.order_no);
if(!order || order.state != ORDER_STATE.CHECK_TO_REFUND) {
console.log('订单状态错误');
return false;
}
if(order.roleId != params.actor_id) {
console.log('订单玩家错误');
return false;
}
let price = order.price;
let refundGold = price * REFUND_PRICE_TO_GOLD;
let role = await RoleModel.incRoleInfo(order.roleId, { gold: -refundGold }, {});
let onlineUser = await getRoleOnlineInfo(order.roleId);
let sid = onlineUser.sid;
sendMessageToUserWithSuc(order.roleId, PUSH_ROUTE.PLAYER_DATA_CHANGE, { gold: role.gold }, sid);
await UserOrderModel.refund(order.roleId, order.localOrderID, message);
return true
}