This commit is contained in:
zpc 2026-01-25 15:44:12 +08:00
parent d8b86a4f3a
commit 5d149a7129

View File

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