后台:虚拟充值

This commit is contained in:
luying
2022-02-10 20:20:31 +08:00
parent c77337d139
commit 04ebd0a9d7
7 changed files with 236 additions and 2 deletions

View File

@@ -0,0 +1,119 @@
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 { makeOrder, settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService';
import { getActivityProducts } from '../../../services/gmService';
import { ActivityGroupModel } from '../../../db/ActivityGroup';
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);
}
getParamStr(beginTimeStamp: number, monopolyActivityId: number) {
let param = {};
if(beginTimeStamp) {
param['beginTimeStamp'] = beginTimeStamp;
}
if(monopolyActivityId) {
param['monopolyActivityId'] = monopolyActivityId;
}
return JSON.stringify(param);
}
/**
* @description 虚拟充值
* @param {{productID:string, magicWord:string, paramStr: string }} msg
* @param {BackendSession} session
* @memberof orderHandler
*/
async applyOrder(msg: { productID: string, activityId: number, beginTimeStamp: number, monopolyActivityId: number }, session: BackendSession) {
const { productID, activityId, beginTimeStamp, monopolyActivityId } = msg;
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const sid = session.get('sid');
const roleName = session.get('roleName');
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 orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, this.getParamStr(beginTimeStamp, monopolyActivityId), message);
//订单成功
if(!orderInfo) {
return resResult(STATUS.NO_ORDER);
}
let result = await settleOrder(orderInfo, serverId, sid);
orderInfo = await UserOrderModel.success(roleId, localOrderID, JSON.stringify(result));
console.log(`测试支付完成!!!!!!!!!!!!! serverId:${serverId}, productID:${productID}, productType:${productType}, roleId:${roleId}, localOrderID:${localOrderID}, payType:${payType}`)
return resResult(STATUS.SUCCESS, result);
}
}

View File

@@ -1,5 +1,5 @@
import Marquee, { MarqueeType, MarqueeModel } from "../db/Marquee";
import { GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MARQUEE_SHOW_TYPE, MARQUEE_TIME_TYPE, REF_CIRCLE_MAIL_TIME, SERVER_STATUS } from "../consts";
import { ACTIVITY_TYPE, GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MARQUEE_SHOW_TYPE, MARQUEE_TIME_TYPE, REF_CIRCLE_MAIL_TIME, SERVER_STATUS } from "../consts";
import { scheduleJob, scheduledJobs, Job } from 'node-schedule';
import { createMarqueeMsg as sysCreateMarqueeMsg, pushMarqueeMsg as sysPushMarqueeMsg } from './sysChatService';
import { GroupMessageType } from "../db/GroupMessage";
@@ -12,9 +12,20 @@ import GMMail, { GMMailModel, GMMailType } from '../db/GMMail';
import moment = require("moment");
import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
import { CreateServerParam } from "../domain/backEndField/params";
import { SignInData } from "../domain/activityField/signInField";
import { RegionModel, RegionType } from "../db/Region";
import { GMMail as StategyMail } from "../db/ServerStategy";
import { uniq } from "underscore";
import { ActivityModelType } from "../db/Activity";
import { dicRMB } from "../pubUtils/dictionary/DicRMB";
import { LimitShopData } from "../domain/activityField/limitShopField";
import { YuanBaoShopData } from "../domain/activityField/yuanBaoShopField";
import { MonthlyTicketData } from "../domain/activityField/monthlyTicketField";
import { DailyRMBGiftsData } from "../domain/activityField/dailyRMBGiftsField";
import { PopUpShopData } from "../domain/activityField/popUpShopField";
import { GrowthFundData } from "../domain/activityField/growthFundField";
import { TreasureHuntData } from "../domain/activityField/treasureHuntField";
import { RefreshShopData } from "../domain/activityField/refreshShopField";
// —————————————— 跑马灯 —————————————— //
// 初始
@@ -188,4 +199,85 @@ export async function createNewServer(region: RegionType ,serverId: number, para
if(params.openMail) await sendOpenServerMail('openMail', params.openMail, newServer, uid);
if(params.circleMail) await sendOpenServerMail('circleMail', params.circleMail, newServer, uid);
await RegionModel.newServer(region.id, newServer);
}
function getDicRMB(productID: string) {
let dic = dicRMB.get(productID);
if(!dic) return null
return {
value: dic.productID,
label: `${dic.message}(${dic.productID})`,
}
};
export function getActivityProducts(activity: ActivityModelType) {
switch(activity.type) {
case ACTIVITY_TYPE.SIGN_IN_VIP: // 高级签到
{
let data = new SignInData(activity, 0);
return [getDicRMB(data.productID)];
}
case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE: // 新手限定RMB购买礼包
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY: // 日限购
case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY: // 周限购
{
let data = new LimitShopData(activity, 0);
return data.list.map(item => {
return getDicRMB(item.productID);
});
}
case ACTIVITY_TYPE.YUAN_BAO_SHOP: // 元宝
{
let data = new YuanBaoShopData(activity, 0);
return data.list.map(item => {
return getDicRMB(item.productID);
});
}
case ACTIVITY_TYPE.MONTHLY_TICKET_1:
case ACTIVITY_TYPE.MONTHLY_TICKET_2:
{
let data = new MonthlyTicketData(activity, 0);
return [getDicRMB(data.productID)];
}
case ACTIVITY_TYPE.DAILY_RMB_GIFTS:
{
let data = new DailyRMBGiftsData(activity, 0);
return [getDicRMB(data.productID)];
}
case ACTIVITY_TYPE.POP_UP_SHOP://弹出礼包
{
let data = new PopUpShopData(activity, 0);
return [getDicRMB(data.productID)];
}
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP: //主线成长基金(高阶)
case ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP://镇念塔成长基金(高阶)
case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP://精英成长基金(高阶)
{
let data = new GrowthFundData(activity, 0);
return data.list.map(item => {
return getDicRMB(item.productID);
});
}
case ACTIVITY_TYPE.TREASURE_HUNT:
{
let data = new TreasureHuntData(activity, 0);
let shop = data.shop;
return shop.list.map(item => {
return getDicRMB(item.productID);
});
}
case ACTIVITY_TYPE.REFRESH_SHOP:
{
let data = new RefreshShopData(activity, 0);
let products: { label: string, value: string }[] = [];
for(let shop of data.list) {
for(let item of shop.items) {
products.push(getDicRMB(item.productID));
}
}
return products;
}
}
return false
}

View File

@@ -720,6 +720,7 @@ export class Rank {
let myId = this.decodeFields(this.key, field);
const scores = this.decodeScore(rankFromDb[ii + 1]);
const info = await redisClient().hgetAsync(this.infoKey, this.composeFields(this.infoKey, myId));
if(!info) continue;
const userInfo = JSON.parse(info);
let param: RoleRankInfo | GuildRankInfo;

View File

@@ -22,7 +22,8 @@ export default class Activity extends BaseModel {
type: number; // 活动类型
@prop({ required: true })
data: string; // 活动表中的数据
@prop({ required: true })
name: string; // 活动名
@prop({ required: true })
timeType: number; // 活动时间类型 ACTIVITY_TIME_TYPE 1.服务器开启时间 2.角色创建时间 3.指定开启时间(beginTime,endTime)

View File

@@ -36,6 +36,11 @@ export default class Activity_Group extends BaseModel {
return result;
}
public static async findByServerId(serverId: number) {
let result: ActivityGroupModelType[] = await ActivityGroupModel.find({ serverIds: serverId }).lean();
return result;
}
//查询组
public static async findGroupsData(groupIds: number[]) {
let result: ActivityGroupModelType[] = await ActivityGroupModel.find({ groupId: { $in: groupIds } }).lean();

View File

@@ -96,6 +96,7 @@ export class ActivityInRemote {
days: number; // 活动持续天数 timeType=1、2
delayDay: number; // 迟几天开启活动0表示按照规定时间开启
interval: number; // 周期性活动时间间隔,秒
name: string;
constructor(activity?: ActivityModelType) {
this.groupId = activity.groupId;
@@ -108,6 +109,7 @@ export class ActivityInRemote {
this.days = activity.days;
this.delayDay = activity.delayDay;
this.interval = activity.interval;
this.name = activity.name;
}
}

View File

@@ -775,5 +775,19 @@
"name": "设置武将",
"module": "user",
"type": "update"
},
{
"id": 112,
"api": "gm.gmOrderHandler.getActivitiesCanBuy",
"name": "获取可以购买的活动",
"module": "order",
"type": "get"
},
{
"id": 113,
"api": "gm.gmOrderHandler.applyOrder",
"name": "虚拟充值",
"module": "order",
"type": "update"
}
]