Files
ZYZ/game-server/app/servers/gm/handler/gmOrderHandler.ts
2022-03-04 09:47:24 +08:00

125 lines
5.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Application, BackendSession, pinus } from 'pinus';
import { genCode, getRandSingleEelm, resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import { PAY_TYPE } from '../../../consts';
import _ = require('underscore');
import { dicRMB } from '../../../pubUtils/dictionary/DicRMB';
import { getActivityById } from '../../../services/activity/activityService';
import { UserOrderModel } from '../../../db/UserOrder';
import { settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService';
import { getActivityProducts, getParamStr } from '../../../services/gmService';
import { ActivityGroupModel } from '../../../db/ActivityGroup';
import { Receiver } from '../../../db/GMMail';
import { getRoleOnlineInfo } from '../../../services/redisService';
import { RoleModel } from '../../../db/Role';
export interface Cascader {
value: number|string;
label: number|string;
children?: Cascader[];
}
export default function (app: Application) {
return new GmOrderHandler(app);
}
export class GmOrderHandler {
constructor(private app: Application) {
}
async getActivitiesCanBuy(msg: { serverId: number }, session: BackendSession) {
const { serverId } = msg;
let groups = await ActivityGroupModel.findByServerId(serverId);
let result: Cascader[] = [];
for (let groupData of groups) {
let activities: Cascader[] = [];
for (let activityId of groupData.activities) {
let activityData = await getActivityById(activityId);
let products = getActivityProducts(activityData);
if(products) {
let children = products.filter(cur => !!cur);
if(children.length > 0) {
activities.push({
value: activityData.activityId,
label: activityData.name,
children
});
}
}
}
if(activities.length > 0) {
result.push({
value: groupData.groupId,
label: groupData.groupName,
children: activities
});
}
}
return resResult(STATUS.SUCCESS, result);
}
/**
* @description 虚拟充值
* @param {BackendSession} session
* @memberof orderHandler
*/
async applyOrder(msg: { serverId: number, activityId: (number|string)[], receiver: Receiver[] }, session: BackendSession) {
const { activityId: activityIds, receiver } = msg;
let activityId = <number>activityIds[1];
let productID = <string>activityIds[2];
let payType = PAY_TYPE.TEST
//如果有特殊情况activityId可为0
if (!productID || !_.isString(productID)) {
return resResult(STATUS.WRONG_PARMS);
}
//商品价格信息
let productInfo = dicRMB.get(productID)
if (!productInfo) {
console.log('productID', productID)
return resResult(STATUS.NO_PRODUCT_ID);
}
let price = productInfo.price;//价格
let productType = productInfo.type;//类型
let message = productInfo.message;//商品信息
let localOrderID = genCode(32);//本地订单号
let orderID = '';//平台订单号
let sdkOrderInfo = null;//客户端需要的平台订单信息
let activityData = await getActivityById(activityId);
if (!activityData) return resResult(STATUS.ACTIVITY_MISSING);
let results = [];
for(let { roleId, serverId } of receiver) {
let role = await RoleModel.findByRoleId(roleId);
if(!role && role.serverId != serverId) {
results.push(resResult(STATUS.ROLE_NOT_FOUND));
continue;
}
let paramStr = await getParamStr(activityData, productID, role);
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message);
//订单成功
if(!orderInfo) {
results.push(resResult(STATUS.NO_ORDER));
continue;
}
let onlineUser = await getRoleOnlineInfo(roleId);
let result = await settleOrder(orderInfo, serverId, onlineUser?.sid);
orderInfo = await UserOrderModel.success(roleId, localOrderID, JSON.stringify(result));
console.log(`测试支付完成!!!!!!!!!!!!! serverId:${serverId}, productID:${productID}, productType:${productType}, roleId:${roleId}, localOrderID:${localOrderID}, payType:${payType}`)
results.push(resResult(STATUS.SUCCESS));
}
let findResultErrCode = results.find(cur => cur.code != 0);
if(!findResultErrCode) {
return resResult(STATUS.SUCCESS);
} else {
return findResultErrCode;
}
}
}