|
@@ -84,15 +84,40 @@ namespace Kitty_Fall.Woker.Services
|
|
|
var monthKey = targetMonth.Year * 100 + targetMonth.Month;
|
|
var monthKey = targetMonth.Year * 100 + targetMonth.Month;
|
|
|
|
|
|
|
|
var draw = await EnsureDrawAsync(dbContext, monthKey, cancellationToken);
|
|
var draw = await EnsureDrawAsync(dbContext, monthKey, cancellationToken);
|
|
|
- if (draw.Status >= DrawStatusCompleted)
|
|
|
|
|
|
|
+ if (draw.Status == DrawStatusCompleted)
|
|
|
{
|
|
{
|
|
|
log.Debug($"Monthly winner already completed. monthKey={monthKey}, drawId={draw.DrawId}");
|
|
log.Debug($"Monthly winner already completed. monthKey={monthKey}, drawId={draw.DrawId}");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (draw.Status != DrawStatusNew)
|
|
|
|
|
+ {
|
|
|
|
|
+ // LOCKED/DRAWING la ky da tung bat dau. Khong tu tiep tuc sau loi/restart;
|
|
|
|
|
+ // admin phai doi soat va quyet dinh xu ly thu cong.
|
|
|
|
|
+ log.Warn($"Monthly winner requires manual review. monthKey={monthKey}, drawId={draw.DrawId}, status={draw.Status}");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var startedAt = DateTime.Now;
|
|
|
|
|
+ // Claim ky quay truoc khi sinh ticket/chon winner. UPDATE co dieu kien bao dam
|
|
|
|
|
+ // nhieu instance worker khong the cung xu ly mot thang.
|
|
|
|
|
+ var claimed = await dbContext.GameMonthlyDraws
|
|
|
|
|
+ .Where(x => x.DrawId == draw.DrawId && x.Status == DrawStatusNew)
|
|
|
|
|
+ .ExecuteUpdateAsync(setters => setters
|
|
|
|
|
+ .SetProperty(x => x.Status, DrawStatusDrawing)
|
|
|
|
|
+ .SetProperty(x => x.UpdatedTime, startedAt), cancellationToken);
|
|
|
|
|
+ if (claimed != 1)
|
|
|
|
|
+ {
|
|
|
|
|
+ log.Warn($"Monthly winner was claimed by another worker. monthKey={monthKey}, drawId={draw.DrawId}");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ draw.Status = DrawStatusDrawing;
|
|
|
|
|
+ draw.UpdatedTime = startedAt;
|
|
|
|
|
+
|
|
|
await EnsureTicketsAsync(dbContext, draw, cancellationToken);
|
|
await EnsureTicketsAsync(dbContext, draw, cancellationToken);
|
|
|
|
|
|
|
|
- if (GetBool("MonthlyWinner:AutoSelectDraftWinners", true))
|
|
|
|
|
|
|
+ if (GetBool("MonthlyWinner:AutoSelectDraftWinners", false))
|
|
|
{
|
|
{
|
|
|
await EnsureDraftWinnersAsync(dbContext, draw, cancellationToken);
|
|
await EnsureDraftWinnersAsync(dbContext, draw, cancellationToken);
|
|
|
}
|
|
}
|
|
@@ -128,16 +153,11 @@ namespace Kitty_Fall.Woker.Services
|
|
|
|
|
|
|
|
private async Task EnsureTicketsAsync(ModelContext dbContext, GameMonthlyDraw draw, CancellationToken cancellationToken)
|
|
private async Task EnsureTicketsAsync(ModelContext dbContext, GameMonthlyDraw draw, CancellationToken cancellationToken)
|
|
|
{
|
|
{
|
|
|
- if (draw.Status >= DrawStatusLocked) return;
|
|
|
|
|
-
|
|
|
|
|
var hasTicket = await dbContext.GameMonthlyDrawTickets
|
|
var hasTicket = await dbContext.GameMonthlyDrawTickets
|
|
|
.AsNoTracking()
|
|
.AsNoTracking()
|
|
|
.AnyAsync(x => x.DrawId == draw.DrawId, cancellationToken);
|
|
.AnyAsync(x => x.DrawId == draw.DrawId, cancellationToken);
|
|
|
if (hasTicket)
|
|
if (hasTicket)
|
|
|
{
|
|
{
|
|
|
- draw.Status = DrawStatusLocked;
|
|
|
|
|
- draw.UpdatedTime = DateTime.Now;
|
|
|
|
|
- await dbContext.SaveChangesAsync(cancellationToken);
|
|
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -203,7 +223,6 @@ namespace Kitty_Fall.Woker.Services
|
|
|
|
|
|
|
|
draw.TotalEligible = totalEligible;
|
|
draw.TotalEligible = totalEligible;
|
|
|
draw.TotalTicket = totalTicket;
|
|
draw.TotalTicket = totalTicket;
|
|
|
- draw.Status = DrawStatusLocked;
|
|
|
|
|
draw.UpdatedTime = now;
|
|
draw.UpdatedTime = now;
|
|
|
|
|
|
|
|
await dbContext.SaveChangesAsync(cancellationToken);
|
|
await dbContext.SaveChangesAsync(cancellationToken);
|
|
@@ -236,10 +255,6 @@ namespace Kitty_Fall.Woker.Services
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- draw.Status = DrawStatusDrawing;
|
|
|
|
|
- draw.UpdatedTime = DateTime.Now;
|
|
|
|
|
- await dbContext.SaveChangesAsync(cancellationToken);
|
|
|
|
|
-
|
|
|
|
|
var excludedMsisdns = await GetRecentWinnerMsisdnsAsync(dbContext, draw.MonthKey, cancellationToken);
|
|
var excludedMsisdns = await GetRecentWinnerMsisdnsAsync(dbContext, draw.MonthKey, cancellationToken);
|
|
|
var existingWinners = await dbContext.GameMonthlyWinners
|
|
var existingWinners = await dbContext.GameMonthlyWinners
|
|
|
.AsNoTracking()
|
|
.AsNoTracking()
|