diff --git a/game-server/app/services/normalBattleService.ts b/game-server/app/services/normalBattleService.ts index a26fe6684..aa1641f1b 100644 --- a/game-server/app/services/normalBattleService.ts +++ b/game-server/app/services/normalBattleService.ts @@ -4,7 +4,7 @@ import Role, { RoleModel, RoleType, WarCount } from '../db/Role' import { getLvByExp, getExpByLv, gameData, getDicApByLv } from '../pubUtils/data'; import { updateRoleOnlineInfo, updateUserInfo } from './redisService'; // import { switchOnFunc } from './funcSwitchService'; -import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE, STATUS, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, HERO_SYSTEM_TYPE, PUSH_ROUTE } from '../consts'; +import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE, STATUS, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, HERO_SYSTEM_TYPE, PUSH_ROUTE, REBATE_LV } from '../consts'; import { BackendSession, pinus } from 'pinus'; import { REDIS_KEY } from '../consts'; import { Rank } from './rankService'; @@ -20,6 +20,7 @@ import { calculateCeWithRole } from './playerCeService'; import { sendMessageToUserWithSuc } from './pushService'; import { ActionPointModel } from '../db/ActionPoint'; import { GK_MAIN, GK_MAINELITE } from '../pubUtils/dicParam'; +import { rebateHistoryOrder } from './orderService'; export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kingExp: number = 0, session: BackendSession) { const serverId = session.get('serverId'); @@ -51,7 +52,10 @@ export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kin // await calculateCeWithRole(HERO_SYSTEM_TYPE.ROLE_LV, roleId, serverId, sid, { lv: newLv }); await updateRoleOnlineInfo(roleId, { lv: newLv }); - + // 达到等级返利 + if(lv < REBATE_LV && newLv >= REBATE_LV) { + rebateHistoryOrder(roleId, role.userInfo?.uid); + } } let actordata: { lv: number, exp: number, getExp: number, mostExp: number }[] = []; for (let i = lv; i <= newLv; i++) { diff --git a/game-server/app/services/orderService.ts b/game-server/app/services/orderService.ts index f06793b23..f860e0272 100644 --- a/game-server/app/services/orderService.ts +++ b/game-server/app/services/orderService.ts @@ -1,5 +1,5 @@ import { UserOrderModel, UserOrderModelType } from '../db/UserOrder'; -import { ACTIVITY_TYPE, DEBUG_PRICE, ORDER_STATE, PAY_TYPE, PUSH_ROUTE, REFUND_PRICE_TO_GOLD, STATUS, TASK_TYPE, TA_EVENT, TA_USERSET_TYPE } from '../consts'; +import { ACTIVITY_TYPE, DEBUG_PRICE, MAIL_TYPE, ORDER_STATE, PAY_TYPE, PUSH_ROUTE, REBATE_RATIO, 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'; @@ -34,6 +34,10 @@ import { sendMessageToUserWithSuc } from './pushService'; import { gameData } from '../pubUtils/data'; import { checkParamPrice } from '../pubUtils/sdkUtil'; import { checkShopCanBuyInOrder, makeShopOrder } from './shopService'; +import { UserModel } from '../db/User'; +import { HistoryOrderModel } from '../db/HistoryOrder'; +import { sendMailByContent } from './mailService'; +import { getGoldObject } from './role/rewardService'; export async function checkOrderCanBuy(roleId: string, serverId: number, activityData: ActivityModelType, productID: string, paramStr: string) { let activityId = activityData.activityId; @@ -349,4 +353,18 @@ export async function refundOrderFromRedisPub(message: string) { await UserOrderModel.refund(order.roleId, order.localOrderID, message); return true +} + +export async function rebateHistoryOrder(roleId: string, uid: number) { + let user = await UserModel.findUserByUid(uid); + if(user) { + let historyOrder = await HistoryOrderModel.findByChannelId(user.channelId); + if(historyOrder && !historyOrder.isReceived) { + let totalPay = historyOrder.totalPay; + if(totalPay > 0) { + await sendMailByContent(MAIL_TYPE.REBATE, roleId, { goods: [getGoldObject(totalPay * REBATE_RATIO)] }); + await HistoryOrderModel.receive(user.channelId, roleId); + } + } + } } \ No newline at end of file diff --git a/shared/consts/constModules/mailConst.ts b/shared/consts/constModules/mailConst.ts index a9b453e04..b613377b9 100644 --- a/shared/consts/constModules/mailConst.ts +++ b/shared/consts/constModules/mailConst.ts @@ -59,6 +59,7 @@ export enum MAIL_TYPE { GUILD_DISSMISS = 29, // 军团解散 LADDER = 30, // 名将擂台 GUILD_MAIL = 31, // 军团邮件 + REBATE = 32, // 返利邮件 }; export const SEND_NAME = '系统'; diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index c450ac1f6..2f137f630 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -1145,4 +1145,8 @@ export enum SYSTEM_OPEN_ID { EXPEDITION = 36, // 远征 } -export const DEBUG_PRICE = 0.01; \ No newline at end of file +export const DEBUG_PRICE = 0.01; + +// 返利等级 +export const REBATE_LV = 10; +export const REBATE_RATIO = 10; \ No newline at end of file diff --git a/shared/db/HistoryOrder.ts b/shared/db/HistoryOrder.ts new file mode 100644 index 000000000..cfa02842b --- /dev/null +++ b/shared/db/HistoryOrder.ts @@ -0,0 +1,46 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 累计充值活动 +*/ +@index({ channelId: 1 }) + +export default class HistoryOrder extends BaseModel { + + @prop({ required: true }) + serverId: number; // 区号 + + @prop({ required: true }) + channelId: string; // 37账号id + + @prop({ required: true }) + roleId: string; // 当时的玩家id + + @prop({ required: true }) + roleName: string; // 当时的玩家名 + + @prop({ required: true }) + totalPay: number; // 总支付金额 + + @prop({ required: true }) + isReceived: boolean; // 是否领取 + + @prop({ required: true }) + receiveRoleId: string; // 领取的玩家id + + public static async findByChannelId(channelId: string) { + let result: HistoryOrderModelType = await HistoryOrderModel.findOne({ channelId }).lean(); + return result; + } + + public static async receive(channelId: string, roleId: string) { + let result: HistoryOrderModelType = await HistoryOrderModel.findOneAndUpdate({ channelId }, { $set: { isReceived: true, roleId } }, { new: true }).lean(); + return result; + } +} + +export const HistoryOrderModel = getModelForClass(HistoryOrder); + +export interface HistoryOrderModelType extends Pick, keyof HistoryOrder> { } +export type HistoryOrderModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/resource/jsons/dic_email_content.json b/shared/resource/jsons/dic_email_content.json index db6ddbd7c..07059dbee 100644 --- a/shared/resource/jsons/dic_email_content.json +++ b/shared/resource/jsons/dic_email_content.json @@ -222,5 +222,12 @@ "sendName": "&", "content": "%d", "time": 720 + }, + { + "id": 32, + "title": "返利邮件", + "sendName": "&", + "content": "%d", + "time": 720 } ] \ No newline at end of file