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);
+ // 领主逻辑失败不影响抽奖结果
+ }
+ }
+
///
///
/// 多次无限赏抽奖流程: