团购活动:定时退费

This commit is contained in:
luying
2022-10-09 19:11:29 +08:00
parent e9170e61e1
commit 1f196a5d36
5 changed files with 74 additions and 6 deletions
@@ -1,11 +1,14 @@
import { ACTIVITY_TYPE, GROUP_SHOP_PRICE_STATUS, PUSH_ROUTE } from "../../consts";
import { ACTIVITY_TYPE, GROUP_SHOP_PRICE_STATUS, MAIL_TYPE, PUSH_ROUTE } from "../../consts";
import { ActivityModel, ActivityModelType } from "../../db/Activity";
import { ActivityGroupShopRecModel } from "../../db/ActivityGroupShopRec";
import { ActivityGroupShopRefundModel, RefundRec } from "../../db/ActivityGroupShopRefund";
import { ActivityGroupShopUserRecModel } from "../../db/ActivityGroupShopUserRec";
import { GroupShopData } from "../../domain/activityField/groupShopField";
import { RewardInter } from "../../pubUtils/interface";
import { sendMailByContent } from "../mailService";
import { sendMessageToGroupShopWithSuc } from "../pushService";
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
import { getGoldObject } from "../role/rewardService";
import { getActivityById } from "./activityService";
/**
@@ -76,13 +79,33 @@ export async function setGroupShopToSetSum(arr: { activityId: number, itemId: nu
export async function refundGroupShop() {
let activities = await ActivityModel.findActivityByType(ACTIVITY_TYPE.GROUP_SHOP);
let recs = new Map<string, { activityId: number, itemId: number, reward: RewardInter[] }[]>();
for(let activityData of activities) {
let hasRefund = await ActivityGroupShopRefundModel.check(activityData.activityId);
if(!hasRefund) continue;
let recs = new Map<string, { itemId: number, diff: number }[]>();
let playerData = await getGroupShopServerData(activityData);
if(playerData.endTime >= Date.now()) continue;
let items = playerData.items||[];
for(let item of items) {
let playerRecords = await ActivityGroupShopUserRecModel.findByPrice(activityData.activityId, item.id, item.getCurDiscount().price);
for(let { roleId, records } of playerRecords) {
for(let { price, buyCnt } of records) {
if(price <= item.getCurDiscount().price) continue;
let diff = (price - item.getCurDiscount().price) * buyCnt;
if(!recs.has(roleId)) recs.set(roleId, []);
recs.get(roleId).push({ itemId: item.id, diff });
}
}
}
let refundRecs: RefundRec[] = [];
for(let [ roleId, arr ] of recs) {
let reward = arr.map(({ diff }) => getGoldObject(diff));
await sendMailByContent(MAIL_TYPE.GROUP_SHOP_REFUND, roleId, { goods: reward });
refundRecs.push(...arr.map(cur => ({ roleId, ...cur })));
}
await ActivityGroupShopRefundModel.refund(activityData.activityId, refundRecs);
}
}