|
|
|
@ -22,7 +22,8 @@ namespace Build_God_Api.Services |
|
|
|
Task<bool> ClaimReward(int characterId, int dailyMissionId); |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 检查并完成所有到期任务
|
|
|
|
/// 检查进行中任务的时限:仅在客观目标(击杀/收集等)已全部达成时标记为完成;
|
|
|
|
/// 超时且未达成的重置为待接取并清除进度记录。
|
|
|
|
/// </summary>
|
|
|
|
Task CheckAndCompleteExpiredMissions(); |
|
|
|
|
|
|
|
@ -316,6 +317,25 @@ namespace Build_God_Api.Services |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
private async Task<bool> AreDailyMissionObjectivesSatisfied(int dailyMissionId, Mission mission) |
|
|
|
{ |
|
|
|
if (mission.Progresses == null || mission.Progresses.Count == 0) |
|
|
|
return false; |
|
|
|
|
|
|
|
var characterProgressList = await _db.Queryable<CharacterMissionProgress>() |
|
|
|
.Where(x => x.DailyMissionId == dailyMissionId) |
|
|
|
.ToListAsync(); |
|
|
|
|
|
|
|
foreach (var p in mission.Progresses) |
|
|
|
{ |
|
|
|
var cp = characterProgressList.FirstOrDefault(x => x.MissionProgressId == p.Id); |
|
|
|
if (cp == null || cp.CurrentCount < p.TargetCount) |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
public async Task CheckAndCompleteExpiredMissions() |
|
|
|
{ |
|
|
|
var now = GetBeijingTime(); |
|
|
|
@ -324,12 +344,45 @@ namespace Build_God_Api.Services |
|
|
|
.Where(x => x.Status == DailyMissionStatus.InProgress && x.EndTime <= now) |
|
|
|
.ToListAsync(); |
|
|
|
|
|
|
|
foreach (var mission in expiredMissions) |
|
|
|
foreach (var dm in expiredMissions) |
|
|
|
{ |
|
|
|
var mission = await _db.Queryable<Mission>() |
|
|
|
.Includes(x => x.Progresses) |
|
|
|
.FirstAsync(x => x.Id == dm.MissionId); |
|
|
|
|
|
|
|
if (mission == null) |
|
|
|
continue; |
|
|
|
|
|
|
|
if (await AreDailyMissionObjectivesSatisfied(dm.Id, mission)) |
|
|
|
{ |
|
|
|
dm.Status = DailyMissionStatus.Completed; |
|
|
|
await _db.Updateable(dm).ExecuteCommandAsync(); |
|
|
|
|
|
|
|
_logger.LogInformation( |
|
|
|
"每日任务实例 {DailyMissionId}(配置 {MissionId})已在时限内达成目标,角色 {CharacterId} 待领取", |
|
|
|
dm.Id, dm.MissionId, dm.CharacterId); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
mission.Status = DailyMissionStatus.Completed; |
|
|
|
await _db.Updateable(mission).ExecuteCommandAsync(); |
|
|
|
await _db.Deleteable<CharacterMissionProgress>() |
|
|
|
.Where(x => x.DailyMissionId == dm.Id) |
|
|
|
.ExecuteCommandAsync(); |
|
|
|
|
|
|
|
dm.Status = DailyMissionStatus.Pending; |
|
|
|
dm.StartTime = null; |
|
|
|
dm.EndTime = null; |
|
|
|
await _db.Updateable(dm).ExecuteCommandAsync(); |
|
|
|
|
|
|
|
var character = await _db.Queryable<Character>() |
|
|
|
.FirstAsync(x => x.Id == dm.CharacterId); |
|
|
|
|
|
|
|
var msg = $"【{mission.Title}】未在限时内完成目标,任务已重置为待接取。"; |
|
|
|
await _chatService.AddMessageAsync(dm.CharacterId, character?.Name ?? "玩家", msg, ChatMessageType.System); |
|
|
|
|
|
|
|
_logger.LogInformation("任务 {MissionId} 已自动完成,等待角色 {CharacterId} 领取", mission.MissionId, mission.CharacterId); |
|
|
|
_logger.LogInformation( |
|
|
|
"角色 {CharacterId} 的每日任务实例 {DailyMissionId} 超时未完成,已重置为待接取", |
|
|
|
dm.CharacterId, dm.Id); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|