33
This commit is contained in:
parent
d8b86a4f3a
commit
5d149a7129
|
|
@ -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>
|
||||
/// 多次无限赏抽奖流程:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user