From 4e4849eac12709b115c7edf9811906c5d456b30c Mon Sep 17 00:00:00 2001 From: zpc Date: Sun, 8 Feb 2026 11:41:30 +0800 Subject: [PATCH] 21 --- .../Models/Goods/PrizeModels.cs | 27 +++ .../Services/GoodsService.cs | 119 +++++++++++- .../admin-web/src/api/business/goods.ts | 8 + .../goods/components/PrizeAddDialog.vue | 42 ++--- .../goods/components/PrizeEditDialog.vue | 48 ++--- .../goods/components/PrizeRewardConfig.vue | 119 ++++++++++++ .../business/goods/config/typeFieldConfig.ts | 8 +- .../WelfareLotteryService.cs | 170 +++++++++++------- .../HoneyBox.Core/Services/RewardService.cs | 8 +- 9 files changed, 406 insertions(+), 143 deletions(-) create mode 100644 server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeRewardConfig.vue diff --git a/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/PrizeModels.cs b/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/PrizeModels.cs index db1673c1..c8b77347 100644 --- a/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/PrizeModels.cs +++ b/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/PrizeModels.cs @@ -113,6 +113,28 @@ public class PrizeCreateRequest /// 系统会自动为所有箱号中的同一父奖品创建对应的子奖品 /// public int GoodsListId { get; set; } + + /// + /// 奖励配置列表 + /// 用于配置抽中该奖品时发放的货币奖励 + /// + public List? Rewards { get; set; } +} + +/// +/// 奖品奖励配置项 +/// +public class PrizeRewardItem +{ + /// + /// 奖励类型:1=钻石(HH币) 2=UU币(积分) 3=哈尼券 + /// + public int Type { get; set; } + + /// + /// 奖励数量 + /// + public int Amount { get; set; } } /// @@ -272,6 +294,11 @@ public class PrizeDto /// public int GoodsListId { get; set; } + /// + /// 奖励配置列表 + /// + public List? Rewards { get; set; } + /// /// 创建时间 /// diff --git a/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs b/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs index c97a803c..ea67699e 100644 --- a/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs +++ b/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs @@ -307,6 +307,51 @@ public class GoodsService : IGoodsService #region 奖品管理 + /// + /// 创建奖品奖励配置 + /// 在 rewards 表中创建对应的奖励记录 + /// + /// 奖品编码,用作 reward_id + /// 奖励配置列表 + /// 当前时间 + /// 生成的 reward_id + private async Task CreatePrizeRewardsAsync(string prizeCode, List rewards, DateTime now) + { + // 使用 prize_code 作为 reward_id,确保唯一性 + var rewardId = $"PRIZE_{prizeCode}"; + + // 删除已存在的同 reward_id 的记录(如果有) + var existingRewards = await _dbContext.Rewards + .Where(r => r.RewardId == rewardId) + .ToListAsync(); + if (existingRewards.Any()) + { + _dbContext.Rewards.RemoveRange(existingRewards); + } + + // 创建新的奖励记录 + foreach (var item in rewards.Where(r => r.Amount > 0)) + { + var reward = new HoneyBox.Model.Entities.Reward + { + RewardId = rewardId, + RewardType = item.Type, + RewardValue = item.Amount, + RewardExtend = null, + CreatedAt = now, + UpdatedAt = now + }; + _dbContext.Rewards.Add(reward); + } + + await _dbContext.SaveChangesAsync(); + + _logger.LogInformation("创建奖品奖励配置: RewardId={RewardId}, Count={Count}", + rewardId, rewards.Count(r => r.Amount > 0)); + + return rewardId; + } + /// public async Task> GetPrizesAsync(int goodsId) { @@ -337,7 +382,31 @@ public class GoodsService : IGoodsService .Where(pl => shangIds.Contains(pl.Id)) .ToDictionaryAsync(pl => pl.Id, pl => new PrizeLevelInfo { Title = pl.Title, Color = pl.Color }); - return prizes.Select(p => MapToPrizeDto(p, prizeLevels)).ToList(); + // 获取所有奖励ID + var rewardIds = prizes + .Where(p => !string.IsNullOrEmpty(p.RewardId)) + .Select(p => p.RewardId!) + .Distinct() + .ToList(); + + // 批量查询奖励配置 + var rewardsDict = new Dictionary>(); + if (rewardIds.Any()) + { + var rewards = await _dbContext.Rewards + .AsNoTracking() + .Where(r => rewardIds.Contains(r.RewardId)) + .ToListAsync(); + + rewardsDict = rewards + .GroupBy(r => r.RewardId) + .ToDictionary( + g => g.Key, + g => g.Select(r => new PrizeRewardItem { Type = r.RewardType, Amount = (int)r.RewardValue }).ToList() + ); + } + + return prizes.Select(p => MapToPrizeDto(p, prizeLevels, rewardsDict)).ToList(); } /// @@ -362,6 +431,13 @@ public class GoodsService : IGoodsService var now = DateTime.Now; var prizeCode = GeneratePrizeCode(); + // 处理奖励配置:如果有 rewards 配置,创建 rewards 表记录 + var rewardId = request.RewardId; + if (request.Rewards != null && request.Rewards.Count > 0) + { + rewardId = await CreatePrizeRewardsAsync(prizeCode, request.Rewards, now); + } + // 根据商品类型决定添加逻辑 // 无限赏(2)、盲盒(8)、扭蛋(9)、福利屋(15)、连抽赏(16)、大乱斗(17):num = 0(模板奖品,只添加一条) // 一番赏(1)、擂台赏(3)、福袋(5)、幸运赏(6)、积分商城(10)、转转赏(11):为每个箱子都添加一条奖品 @@ -370,7 +446,7 @@ public class GoodsService : IGoodsService // 处理宝箱子奖品的情况 if (request.GoodsListId > 0) { - return await AddChildPrizeAsync(goodsId, request, now); + return await AddChildPrizeAsync(goodsId, request, now, rewardId); } if (templateTypes.Contains(goods.Type)) @@ -399,7 +475,7 @@ public class GoodsService : IGoodsService PrizeCode = prizeCode, Type = (byte)request.Type, LianJiType = (byte)request.LianJiType, - RewardId = request.RewardId, + RewardId = rewardId, Doubling = request.Doubling, IsLingzhu = (byte)request.IsLingzhu, PrizeNum = 1, @@ -456,7 +532,7 @@ public class GoodsService : IGoodsService PrizeCode = prizeCode, // 同一个 prize_code,表示是同一个奖品配置 Type = (byte)request.Type, LianJiType = (byte)request.LianJiType, - RewardId = request.RewardId, + RewardId = rewardId, Doubling = request.Doubling, IsLingzhu = (byte)request.IsLingzhu, PrizeNum = 1, @@ -486,7 +562,7 @@ public class GoodsService : IGoodsService /// 添加宝箱子奖品 /// 当父奖品存在于多个箱号中时,会为每个箱号的父奖品都创建对应的子奖品 /// - private async Task AddChildPrizeAsync(int goodsId, PrizeCreateRequest request, DateTime now) + private async Task AddChildPrizeAsync(int goodsId, PrizeCreateRequest request, DateTime now, string? rewardId = null) { // 获取父奖品信息 var parentPrize = await _dbContext.GoodsItems @@ -506,6 +582,12 @@ public class GoodsService : IGoodsService // 子奖品生成自己的 prize_code var childPrizeCode = GeneratePrizeCode(); + + // 如果有 rewards 配置但没有传入 rewardId,创建 rewards 表记录 + if (string.IsNullOrEmpty(rewardId) && request.Rewards != null && request.Rewards.Count > 0) + { + rewardId = await CreatePrizeRewardsAsync(childPrizeCode, request.Rewards, now); + } // 查找所有箱号中具有相同 prize_code 的父奖品(同一个宝箱配置在不同箱号中的记录) var sameParentPrizes = await _dbContext.GoodsItems @@ -542,7 +624,7 @@ public class GoodsService : IGoodsService PrizeCode = childPrizeCode, // 子奖品使用自己的 prize_code Type = (byte)request.Type, LianJiType = (byte)request.LianJiType, - RewardId = request.RewardId, + RewardId = rewardId, Doubling = request.Doubling, IsLingzhu = (byte)request.IsLingzhu, PrizeNum = 1, @@ -572,6 +654,17 @@ public class GoodsService : IGoodsService throw new BusinessException(BusinessErrorCodes.NotFound, "奖品不存在"); } + var now = DateTime.Now; + + // 处理奖励配置:如果有 rewards 配置,创建/更新 rewards 表记录 + var rewardId = request.RewardId; + if (request.Rewards != null && request.Rewards.Count > 0) + { + // 使用现有的 prize_code 或生成新的 + var prizeCode = prize.PrizeCode ?? GeneratePrizeCode(); + rewardId = await CreatePrizeRewardsAsync(prizeCode, request.Rewards, now); + } + prize.Title = request.Title; prize.ImgUrl = request.ImgUrl; prize.ImgUrlDetail = request.ImgUrlDetail; @@ -590,10 +683,10 @@ public class GoodsService : IGoodsService prize.CardNo = request.CardNo; prize.Type = (byte)request.Type; prize.LianJiType = (byte)request.LianJiType; - prize.RewardId = request.RewardId; + prize.RewardId = rewardId; prize.Doubling = request.Doubling; prize.IsLingzhu = (byte)request.IsLingzhu; - prize.UpdatedAt = DateTime.Now; + prize.UpdatedAt = now; var result = await _dbContext.SaveChangesAsync() > 0; @@ -944,7 +1037,7 @@ public class GoodsService : IGoodsService /// /// 映射奖品到DTO /// - private PrizeDto MapToPrizeDto(GoodsItem prize, Dictionary? prizeLevels = null) + private PrizeDto MapToPrizeDto(GoodsItem prize, Dictionary? prizeLevels = null, Dictionary>? rewardsDict = null) { string? shangTitle = null; string? shangColor = null; @@ -955,6 +1048,13 @@ public class GoodsService : IGoodsService shangColor = level.Color; } + // 获取奖励配置 + List? rewards = null; + if (!string.IsNullOrEmpty(prize.RewardId) && rewardsDict != null && rewardsDict.TryGetValue(prize.RewardId, out var rewardList)) + { + rewards = rewardList; + } + return new PrizeDto { Id = prize.Id, @@ -985,6 +1085,7 @@ public class GoodsService : IGoodsService Doubling = prize.Doubling, IsLingzhu = prize.IsLingzhu, GoodsListId = prize.GoodsListId, + Rewards = rewards, CreatedAt = prize.CreatedAt, UpdatedAt = prize.UpdatedAt }; diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/business/goods.ts b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/business/goods.ts index be995324..6497579f 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/business/goods.ts +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/business/goods.ts @@ -245,11 +245,18 @@ export interface PrizeItem { doubling: number isLingzhu: number goodsListId: number // 父奖品ID,0表示父奖品,>0表示子奖品 + rewards?: PrizeRewardItem[] // 奖励配置 createdAt: string | null updatedAt: string children?: PrizeItem[] // 子奖品列表(前端构建树形结构用) } +/** 奖品奖励配置项 */ +export interface PrizeRewardItem { + type: number // 奖励类型:1=钻石 2=UU币 3=哈尼券 + amount: number // 数量 +} + /** 创建奖品请求 */ export interface PrizeCreateRequest { title: string @@ -273,6 +280,7 @@ export interface PrizeCreateRequest { doubling: number isLingzhu: number goodsListId?: number // 父奖品ID,添加宝箱子奖品时使用 + rewards?: PrizeRewardItem[] // 奖励配置 } /** 更新奖品请求 */ diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeAddDialog.vue b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeAddDialog.vue index ba7fabd9..bbee6f44 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeAddDialog.vue +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeAddDialog.vue @@ -168,36 +168,9 @@ 赠送配置 - - - - - - - - - - - - - - - - - + + + @@ -255,6 +228,12 @@ import { } from '@/api/business/goods' import { getPrizeLevelOptionsByType, type PrizeLevelOptionResponse } from '@/api/business/prizelevel' import ImageUpload from '@/components/ImageUpload/index.vue' +import PrizeRewardConfig from './PrizeRewardConfig.vue' + +interface RewardItem { + type: number + amount: number +} interface Props { modelValue: boolean @@ -346,6 +325,7 @@ const formData = reactive({ cardNo: '', lianJiType: 0, rewardId: '', + rewards: [] as RewardItem[], }) // 表单验证规则 @@ -382,6 +362,7 @@ const resetForm = () => { formData.cardNo = '' formData.lianJiType = 0 formData.rewardId = '' + formData.rewards = [] formRef.value?.resetFields() } @@ -435,6 +416,7 @@ const handleSubmit = async () => { doubling: formData.doubling, isLingzhu: formData.isLingzhu, goodsListId: props.parentPrizeId, // 父奖品ID + rewards: formData.rewards.length > 0 ? formData.rewards : undefined, } await addPrize(props.goodsId, requestData) diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeEditDialog.vue b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeEditDialog.vue index 88d1933b..c9f76f2b 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeEditDialog.vue +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeEditDialog.vue @@ -169,36 +169,9 @@ 赠送配置 - - - - - - - - - - - - - - - - - + + + @@ -263,6 +236,12 @@ import { } from '@/api/business/goods' import { getPrizeLevelOptionsByType, type PrizeLevelOptionResponse } from '@/api/business/prizelevel' import ImageUpload from '@/components/ImageUpload/index.vue' +import PrizeRewardConfig from './PrizeRewardConfig.vue' + +interface RewardItem { + type: number + amount: number +} interface Props { modelValue: boolean @@ -342,6 +321,7 @@ const formData = reactive({ cardNo: '', lianJiType: 0, rewardId: '', + rewards: [] as RewardItem[], }) // 表单验证规则 @@ -377,6 +357,12 @@ const fillFormData = (data: PrizeItem) => { formData.cardNo = data.cardNo || '' formData.lianJiType = data.lianJiType formData.rewardId = data.rewardId || '' + // 加载奖励配置 + if (data.rewards && data.rewards.length > 0) { + formData.rewards = data.rewards.map(r => ({ type: r.type, amount: r.amount })) + } else { + formData.rewards = [] + } } // 重置表单 @@ -402,6 +388,7 @@ const resetForm = () => { formData.cardNo = '' formData.lianJiType = 0 formData.rewardId = '' + formData.rewards = [] formRef.value?.resetFields() } @@ -458,6 +445,7 @@ const handleSubmit = async () => { rewardId: formData.rewardId || undefined, doubling: formData.doubling, isLingzhu: formData.isLingzhu, + rewards: formData.rewards.length > 0 ? formData.rewards : undefined, } await updatePrize(props.prizeId, requestData) diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeRewardConfig.vue b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeRewardConfig.vue new file mode 100644 index 00000000..5b7dddaa --- /dev/null +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/components/PrizeRewardConfig.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/config/typeFieldConfig.ts b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/config/typeFieldConfig.ts index 8a271246..ea712468 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/config/typeFieldConfig.ts +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/business/goods/config/typeFieldConfig.ts @@ -120,8 +120,8 @@ export const defaultFieldConfig: GoodsTypeFieldConfig = { showLianji: false, showTimeConfig: false, showAutoXiajia: false, - showCoupon: true, - showIntegral: true, + showCoupon: false, + showIntegral: false, showDescription: false, showQuanjuXiangou: false, showShowIs: true, @@ -148,7 +148,7 @@ export const GoodsTypeFieldConfigs: Record = { showStock: true, showLock: true, showDailyLimit: true, showRage: false, showItemCard: false, showLingzhu: false, showLianji: false, showTimeConfig: false, showAutoXiajia: false, - showCoupon: true, showIntegral: true, showDescription: false, + showCoupon: false, showIntegral: false, showDescription: false, showQuanjuXiangou: false, showShowIs: true, showUnlockAmount: true, showCoverImage: true, showDetailImage: true, showPrice: true, showShouZhe: true, @@ -158,7 +158,7 @@ export const GoodsTypeFieldConfigs: Record = { showStock: false, showLock: false, showDailyLimit: false, showRage: false, showItemCard: false, showLingzhu: false, showLianji: false, showTimeConfig: false, showAutoXiajia: false, - showCoupon: true, showIntegral: true, showDescription: false, + showCoupon: false, showIntegral: false, showDescription: false, showQuanjuXiangou: false, showShowIs: false, showUnlockAmount: true, showCoverImage: true, showDetailImage: true, showPrice: true, showShouZhe: true, diff --git a/server/HoneyBox/src/HoneyBox.Api/BackgroundServices/WelfareLotteryService.cs b/server/HoneyBox/src/HoneyBox.Api/BackgroundServices/WelfareLotteryService.cs index a68c7a65..7e425146 100644 --- a/server/HoneyBox/src/HoneyBox.Api/BackgroundServices/WelfareLotteryService.cs +++ b/server/HoneyBox/src/HoneyBox.Api/BackgroundServices/WelfareLotteryService.cs @@ -89,6 +89,14 @@ public class WelfareLotteryService : BackgroundService .Where(gi => gi.GoodsId == goods.Id && gi.Num == 0) .ToListAsync(stoppingToken); + // 添加调试日志:输出所有奖品信息 + _logger.LogInformation("福利屋奖品列表: GoodsId={GoodsId}, 奖品数量={Count}", goods.Id, prizeList.Count); + foreach (var p in prizeList) + { + _logger.LogInformation(" 奖品: Id={Id}, Title={Title}, GoodsType={GoodsType}, RewardId={RewardId}, Stock={Stock}, SurplusStock={SurplusStock}, ScMoney={ScMoney}", + p.Id, p.Title, p.GoodsType, p.RewardId ?? "(空)", p.Stock, p.SurplusStock, p.ScMoney); + } + // 展开奖品列表(根据库存数量) var expandedPrizes = new List(); foreach (var prize in prizeList) @@ -176,9 +184,14 @@ public class WelfareLotteryService : BackgroundService } // 发放奖励 + // 添加调试日志 + _logger.LogInformation("准备发放奖励: PrizeId={PrizeId}, Title={Title}, GoodsType={GoodsType}, RewardId={RewardId}, ScMoney={ScMoney}, UserId={UserId}", + prize.Id, prize.Title, prize.GoodsType, prize.RewardId ?? "(空)", prize.ScMoney, participant.UserId); + // 1. 如果有reward_id(字符串类型奖励码),通过奖励配置发放 if (!string.IsNullOrEmpty(prize.RewardId)) { + _logger.LogInformation("尝试通过RewardId发放奖励: RewardId={RewardId}", prize.RewardId); var rewardSent = await SendRewardByCodeAsync(dbContext, participant.UserId, prize.RewardId, $"{goods.Title}开奖-{prize.Title}", stoppingToken); if (rewardSent) @@ -188,13 +201,14 @@ public class WelfareLotteryService : BackgroundService } else { - _logger.LogWarning("奖励配置不存在: GoodsId={GoodsId}, UserId={UserId}, Prize={Prize}, RewardCode={RewardCode}", + _logger.LogWarning("奖励配置不存在或发放失败: GoodsId={GoodsId}, UserId={UserId}, Prize={Prize}, RewardCode={RewardCode}", goods.Id, participant.UserId, prize.Title, prize.RewardId); } } // 2. 如果是货币类型奖品(GoodsType=3)且没有reward_id,直接发放ScMoney金额 else if (prize.GoodsType == 3 && prize.ScMoney > 0) { + _logger.LogInformation("尝试通过GoodsType=3发放货币奖品: ScMoney={ScMoney}", prize.ScMoney); await SendCurrencyPrizeAsync(dbContext, participant.UserId, prize.ScMoney, $"{goods.Title}开奖-{prize.Title}", stoppingToken); _logger.LogInformation("发放货币奖品成功: GoodsId={GoodsId}, UserId={UserId}, Prize={Prize}, Amount={Amount}", @@ -202,8 +216,8 @@ public class WelfareLotteryService : BackgroundService } else { - _logger.LogInformation("发放奖品成功: GoodsId={GoodsId}, UserId={UserId}, Prize={Prize}", - goods.Id, participant.UserId, prize.Title); + _logger.LogInformation("实物奖品,无需发放货币: GoodsId={GoodsId}, UserId={UserId}, Prize={Prize}, GoodsType={GoodsType}", + goods.Id, participant.UserId, prize.Title, prize.GoodsType); } prizeIndex++; @@ -240,6 +254,7 @@ public class WelfareLotteryService : BackgroundService /// /// 通过奖励码发放奖励 + /// 支持同一个 reward_id 对应多条奖励记录(如同时赠送钻石和积分) /// /// 数据库上下文 /// 用户ID @@ -254,17 +269,28 @@ public class WelfareLotteryService : BackgroundService string remark, CancellationToken stoppingToken) { - // 通过奖励码查询奖励配置 - var reward = await dbContext.Rewards + _logger.LogInformation("SendRewardByCodeAsync开始: UserId={UserId}, RewardCode={RewardCode}", userId, rewardCode); + + // 通过奖励码查询所有奖励配置(同一个 reward_id 可能有多条记录) + var rewards = await dbContext.Rewards .Where(r => r.RewardId == rewardCode) - .FirstOrDefaultAsync(stoppingToken); + .ToListAsync(stoppingToken); - if (reward == null) + _logger.LogInformation("查询rewards表结果: RewardCode={RewardCode}, 找到记录数={Count}", rewardCode, rewards?.Count ?? 0); + + if (rewards == null || rewards.Count == 0) { _logger.LogWarning("奖励配置不存在: RewardCode={RewardCode}", rewardCode); return false; } + // 输出每条奖励记录的详情 + foreach (var r in rewards) + { + _logger.LogInformation(" 奖励记录: Id={Id}, RewardId={RewardId}, RewardType={RewardType}, RewardValue={RewardValue}", + r.Id, r.RewardId, r.RewardType, r.RewardValue); + } + var user = await dbContext.Users .Where(u => u.Id == userId) .FirstOrDefaultAsync(stoppingToken); @@ -275,74 +301,86 @@ public class WelfareLotteryService : BackgroundService return false; } - var rewardTypeName = ""; + _logger.LogInformation("用户当前余额: UserId={UserId}, Money={Money}, Integral={Integral}, Money2={Money2}", + userId, user.Money, user.Integral, user.Money2); - // 根据奖励类型发放 - switch (reward.RewardType) + var rewardDetails = new List(); + + // 遍历所有奖励记录,根据类型发放 + foreach (var reward in rewards) { - case 1: // 钻石/余额 (HH币) - user.Money += reward.RewardValue; - // 记录流水 - dbContext.ProfitMoneys.Add(new ProfitMoney - { - UserId = userId, - ChangeMoney = reward.RewardValue, - Money = user.Money, - Type = 6, // 签到赠送/福利奖励 - Content = remark, - ShareUid = 0, - CreatedAt = DateTime.Now - }); - rewardTypeName = "钻石/HH币"; - _logger.LogInformation("发放钻石: UserId={UserId}, Amount={Amount}, After={After}, Remark={Remark}", - userId, reward.RewardValue, user.Money, remark); - break; + switch (reward.RewardType) + { + case 1: // 钻石 + user.Money += reward.RewardValue; + // 记录流水 + dbContext.ProfitMoneys.Add(new ProfitMoney + { + UserId = userId, + ChangeMoney = reward.RewardValue, + Money = user.Money, + Type = 6, // 签到赠送/福利奖励 + Content = remark, + ShareUid = 0, + CreatedAt = DateTime.Now + }); + rewardDetails.Add($"钻石{reward.RewardValue}"); + _logger.LogInformation("发放钻石: UserId={UserId}, Amount={Amount}, After={After}, Remark={Remark}", + userId, reward.RewardValue, user.Money, remark); + break; - case 2: // 积分/UU币 - user.Integral += reward.RewardValue; - // 记录流水 - dbContext.ProfitIntegrals.Add(new ProfitIntegral - { - UserId = userId, - ChangeMoney = reward.RewardValue, - Money = user.Integral, - Type = 4, // 抽赏奖励 - Content = remark, - ShareUid = 0, - CreatedAt = DateTime.Now - }); - rewardTypeName = "积分/UU币"; - _logger.LogInformation("发放积分: UserId={UserId}, Amount={Amount}, After={After}, Remark={Remark}", - userId, reward.RewardValue, user.Integral, remark); - break; + case 2: // HH币 + user.Integral += reward.RewardValue; + // 记录流水 + dbContext.ProfitIntegrals.Add(new ProfitIntegral + { + UserId = userId, + ChangeMoney = reward.RewardValue, + Money = user.Integral, + Type = 4, // 抽赏奖励 + Content = remark, + ShareUid = 0, + CreatedAt = DateTime.Now + }); + rewardDetails.Add($"HH币{reward.RewardValue}"); + _logger.LogInformation("发放HH币: UserId={UserId}, Amount={Amount}, After={After}, Remark={Remark}", + userId, reward.RewardValue, user.Integral, remark); + break; - case 3: // 哈尼券/达达卷 - user.Money2 = (user.Money2 ?? 0) + reward.RewardValue; - // 记录流水 - dbContext.ProfitMoney2s.Add(new ProfitMoney2 - { - UserId = userId, - ChangeMoney = reward.RewardValue, - Money = user.Money2 ?? 0, - Type = 5, // 推荐奖励/福利奖励 - Content = remark, - ShareUid = 0, - CreatedAt = DateTime.Now - }); - rewardTypeName = "哈尼券"; - _logger.LogInformation("发放哈尼券: UserId={UserId}, Amount={Amount}, After={After}, Remark={Remark}", - userId, reward.RewardValue, user.Money2, remark); - break; + case 3: // 哈尼券 + user.Money2 = (user.Money2 ?? 0) + reward.RewardValue; + // 记录流水 + dbContext.ProfitMoney2s.Add(new ProfitMoney2 + { + UserId = userId, + ChangeMoney = reward.RewardValue, + Money = user.Money2 ?? 0, + Type = 5, // 推荐奖励/福利奖励 + Content = remark, + ShareUid = 0, + CreatedAt = DateTime.Now + }); + rewardDetails.Add($"哈尼券{reward.RewardValue}"); + _logger.LogInformation("发放哈尼券: UserId={UserId}, Amount={Amount}, After={After}, Remark={Remark}", + userId, reward.RewardValue, user.Money2, remark); + break; - default: - _logger.LogWarning("未知奖励类型: Type={Type}, RewardCode={RewardCode}", reward.RewardType, rewardCode); - return false; + default: + _logger.LogWarning("未知奖励类型: Type={Type}, RewardCode={RewardCode}", reward.RewardType, rewardCode); + break; + } + } + + if (rewardDetails.Count == 0) + { + _logger.LogWarning("没有有效的奖励类型: RewardCode={RewardCode}", rewardCode); + return false; } await dbContext.SaveChangesAsync(stoppingToken); - _logger.LogInformation("福利屋奖励发放成功: UserId={UserId}, RewardCode={RewardCode}, Type={Type}, Value={Value}, Remark={Remark}", - userId, rewardCode, rewardTypeName, reward.RewardValue, remark); + _logger.LogInformation("福利屋奖励发放成功: UserId={UserId}, RewardCode={RewardCode}, Rewards={Rewards}, Remark={Remark}", + userId, rewardCode, string.Join("+", rewardDetails), remark); return true; } diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/RewardService.cs b/server/HoneyBox/src/HoneyBox.Core/Services/RewardService.cs index 360e2ccb..82c56256 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/RewardService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/RewardService.cs @@ -123,16 +123,16 @@ public class RewardService : IRewardService detail.Message = $"获得钻石*{rewardValue}"; break; - case 2: // UU币 (Integral) + case 2: // HH币 (Integral) await AddIntegralAsync(userId, user, rewardValue, source); detail.Success = true; - detail.Message = $"获得UU币*{rewardValue}"; + detail.Message = $"获得HH币*{rewardValue}"; break; - case 3: // 达达券 (Money2) + case 3: // 哈尼券 (Money2) await AddMoney2Async(userId, user, rewardValue, source); detail.Success = true; - detail.Message = $"获得达达券*{rewardValue}"; + detail.Message = $"获得哈尼券*{rewardValue}"; break; case 4: // 优惠券