diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/LotteryEngine.cs b/server/HoneyBox/src/HoneyBox.Core/Services/LotteryEngine.cs index b4fb59d4..150918c6 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/LotteryEngine.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/LotteryEngine.cs @@ -391,6 +391,9 @@ public class LotteryEngine : ILotteryEngine var boxResults = await DrawInfiniteBoxPrizesAsync(request, selectedPrize.GoodsItemId); result.BoxPrizes = boxResults; } + + // 7. 处理领主赏逻辑(type=8) + await ProcessLingZhuLogicAsync(request.UserId, request.GoodsId, selectedPrize.ShangId, selectedPrize.IsLingzhu, orderItem.Id); } catch (Exception ex) { @@ -402,6 +405,145 @@ public class LotteryEngine : ILotteryEngine return result; } + /// + /// 处理领主赏逻辑 + /// + private async Task ProcessLingZhuLogicAsync(int userId, int goodsId, int? shangId, int isLingzhu, int orderItemId) + { + try + { + // 获取商品的领主赏配置 + var goods = await _dbContext.Goods + .Where(g => g.Id == goodsId) + .Select(g => new { g.Type, g.LingzhuIs, g.LingzhuShangId, g.KingUserId, g.LingzhuFan }) + .FirstOrDefaultAsync(); + + // 只有领主赏类型(type=8)且开启了领主功能才处理 + if (goods == null || goods.Type != 8 || goods.LingzhuIs != 1) + { + return; + } + + // 检查是否抽中领主奖品 + bool isLingzhuPrize = (shangId == goods.LingzhuShangId) || (isLingzhu == 1); + + if (isLingzhuPrize) + { + // 抽中领主奖品 - 成为新领主 + var currentTimestamp = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + + // 如果当前有领主,结束其领主记录 + if (goods.KingUserId > 0) + { + var currentKingRank = await _dbContext.GoodsKingRanks + .Where(r => r.UserId == goods.KingUserId && r.GoodsId == goodsId && r.EndTime == 0) + .OrderByDescending(r => r.Id) + .FirstOrDefaultAsync(); + + if (currentKingRank != null) + { + currentKingRank.EndTime = currentTimestamp; + } + } + + // 更新商品的领主用户 + await _dbContext.Goods + .Where(g => g.Id == goodsId) + .ExecuteUpdateAsync(s => s.SetProperty(g => g.KingUserId, userId)); + + // 计算多少发晋升领主 + var luckNo = await _dbContext.OrderItems + .Where(oi => oi.GoodsId == goodsId && oi.Id <= orderItemId) + .CountAsync(); + + // 创建新的领主记录 + var newKingRank = new GoodsKingRank + { + UserId = userId, + GoodsId = goodsId, + Count = luckNo, + OrderListId = orderItemId, + Addtime = currentTimestamp, + EndTime = 0, + ZNums = 0, + Money = 0 + }; + _dbContext.GoodsKingRanks.Add(newKingRank); + await _dbContext.SaveChangesAsync(); + + _logger.LogInformation("New king crowned: UserId={UserId}, GoodsId={GoodsId}, LuckNo={LuckNo}", + userId, goodsId, luckNo); + } + else + { + // 未抽中领主奖品 - 增加当前领主的被挑战次数 + if (goods.KingUserId > 0) + { + var kingRank = await _dbContext.GoodsKingRanks + .Where(r => r.UserId == goods.KingUserId && r.GoodsId == goodsId && r.EndTime == 0) + .OrderByDescending(r => r.Id) + .FirstOrDefaultAsync(); + + // 如果没有领主记录(可能是从旧系统迁移的),创建一条初始记录 + if (kingRank == null) + { + kingRank = new GoodsKingRank + { + UserId = goods.KingUserId, + GoodsId = goodsId, + Count = 0, // 未知占领时的抽奖次数 + OrderListId = 0, + Addtime = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds(), + EndTime = 0, + ZNums = 0, + Money = 0 + }; + _dbContext.GoodsKingRanks.Add(kingRank); + _logger.LogInformation("Created initial king rank record for migrated king: UserId={UserId}, GoodsId={GoodsId}", + goods.KingUserId, goodsId); + } + + kingRank.ZNums += 1; + + // 领主收益(如果配置了) + if (goods.LingzhuFan > 0) + { + kingRank.Money += goods.LingzhuFan; + + // 给领主增加积分收益 + var kingUser = await _dbContext.Users.FindAsync(goods.KingUserId); + if (kingUser != null) + { + var beforeIntegral = kingUser.Integral; + kingUser.Integral += goods.LingzhuFan; + + // 记录积分流水 + var profitIntegral = new ProfitIntegral + { + UserId = goods.KingUserId, + Type = 4, // 领主收益 + ChangeMoney = goods.LingzhuFan, + Money = kingUser.Integral, + Content = "领主收益", + ShareUid = 0, + CreatedAt = DateTime.Now + }; + _dbContext.ProfitIntegrals.Add(profitIntegral); + } + } + + await _dbContext.SaveChangesAsync(); + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to process lingzhu logic: UserId={UserId}, GoodsId={GoodsId}", + userId, goodsId); + // 领主逻辑失败不影响抽奖结果 + } + } + /// /// /// 多次无限赏抽奖流程: