From 71096c1ee987529d1660090481c87ffa63126626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E6=B1=89?= <5725748+qin_and_han_dynasties@user.noreply.gitee.com> Date: Mon, 4 May 2026 19:35:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20AreDailyMissionObjectivesS?= =?UTF-8?q?atisfied=EF=BC=9A=E6=8C=89=E4=BB=BB=E5=8A=A1=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=87=8C=E6=AF=8F=E4=B8=80=E6=9D=A1=20MissionProgress=EF=BC=8C?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=AF=B9=E5=BA=94=20CharacterMissionProgress?= =?UTF-8?q?=20=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E4=B8=94=20CurrentCount?= =?UTF-8?q?=20>=3D=20TargetCount=EF=BC=88=E4=B8=8E=E6=88=98=E6=96=97?= =?UTF-8?q?=E7=BB=93=E7=AE=97=E3=80=81MissionProgressService=20=E7=9A=84?= =?UTF-8?q?=E8=A7=84=E5=88=99=E4=B8=80=E8=87=B4=EF=BC=89=E3=80=82=20CheckA?= =?UTF-8?q?ndCompleteExpiredMissions=EF=BC=9A=20=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E4=B8=94=E7=9B=AE=E6=A0=87=E5=85=A8=E9=83=A8=E8=BE=BE=E6=88=90?= =?UTF-8?q?=20=E2=86=92=20=E4=BB=8D=E4=B8=BA=20Completed=EF=BC=88=E5=8F=AF?= =?UTF-8?q?=E5=9C=A8=E6=97=B6=E9=99=90=E7=BB=93=E6=9D=9F=E5=89=8D=E6=89=93?= =?UTF-8?q?=E5=AE=8C=EF=BC=89=E3=80=82=20=E8=B6=85=E6=97=B6=E4=BD=86?= =?UTF-8?q?=E6=9C=AA=E8=BE=BE=E6=88=90=20=E2=86=92=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=AF=A5=E6=AF=8F=E6=97=A5=E5=AE=9E=E4=BE=8B=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=20CharacterMissionProgress=EF=BC=8C=E4=BB=BB=E5=8A=A1=E5=9B=9E?= =?UTF-8?q?=E5=88=B0=20Pending=EF=BC=8C=E6=B8=85=E7=A9=BA=20StartTime=20/?= =?UTF-8?q?=20EndTime=EF=BC=8C=E5=B9=B6=E5=8F=91=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=81=8A=E5=A4=A9=E8=AF=B4=E6=98=8E=E5=8F=AF?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=8E=A5=E5=8F=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DailyMissionService.cs | 63 +++++++++++++++++-- Build_God_Game/src/views/DailyMissionView.vue | 21 +++---- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs b/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs index 08552c0..5760e58 100644 --- a/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs +++ b/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs @@ -22,7 +22,8 @@ namespace Build_God_Api.Services Task ClaimReward(int characterId, int dailyMissionId); /// - /// 检查并完成所有到期任务 + /// 检查进行中任务的时限:仅在客观目标(击杀/收集等)已全部达成时标记为完成; + /// 超时且未达成的重置为待接取并清除进度记录。 /// Task CheckAndCompleteExpiredMissions(); @@ -316,6 +317,25 @@ namespace Build_God_Api.Services return true; } + private async Task AreDailyMissionObjectivesSatisfied(int dailyMissionId, Mission mission) + { + if (mission.Progresses == null || mission.Progresses.Count == 0) + return false; + + var characterProgressList = await _db.Queryable() + .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) { - mission.Status = DailyMissionStatus.Completed; - await _db.Updateable(mission).ExecuteCommandAsync(); + var mission = await _db.Queryable() + .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("任务 {MissionId} 已自动完成,等待角色 {CharacterId} 领取", mission.MissionId, mission.CharacterId); + _logger.LogInformation( + "每日任务实例 {DailyMissionId}(配置 {MissionId})已在时限内达成目标,角色 {CharacterId} 待领取", + dm.Id, dm.MissionId, dm.CharacterId); + } + else + { + await _db.Deleteable() + .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() + .FirstAsync(x => x.Id == dm.CharacterId); + + var msg = $"【{mission.Title}】未在限时内完成目标,任务已重置为待接取。"; + await _chatService.AddMessageAsync(dm.CharacterId, character?.Name ?? "玩家", msg, ChatMessageType.System); + + _logger.LogInformation( + "角色 {CharacterId} 的每日任务实例 {DailyMissionId} 超时未完成,已重置为待接取", + dm.CharacterId, dm.Id); + } } } diff --git a/Build_God_Game/src/views/DailyMissionView.vue b/Build_God_Game/src/views/DailyMissionView.vue index e306164..176a082 100644 --- a/Build_God_Game/src/views/DailyMissionView.vue +++ b/Build_God_Game/src/views/DailyMissionView.vue @@ -214,10 +214,10 @@ const MissionCardContent = defineComponent({ h('span', { class: ['card-status', getStatusClass(props.mission.status)] }, getStatusText(props.mission.status)), ]), h('div', { class: 'card-desc' }, props.mission.missionDescription), - //h('div', { class: 'card-meta-row' }, [ - //h('span', { class: ['difficulty-badge', getDifficultyClass(props.mission.difficulty)] }, getDifficultyLabel(props.mission.difficulty)), - //h('span', { class: 'time-badge' }, `预计 ${props.mission.spendTimeMinutes} 分钟`), - //]), + h('div', { class: 'card-meta-row' }, [ + //h('span', { class: ['difficulty-badge', getDifficultyClass(props.mission.difficulty)] }, getDifficultyLabel(props.mission.difficulty)), + h('span', { class: 'time-badge' }, `限时 ${props.mission.spendTimeMinutes} 分钟`), + ]), props.mission.progresses && props.mission.progresses.length > 0 ? h('div', { class: 'objective-panel' }, [ h('span', { class: 'objective-label' }, '任务目标'), @@ -599,14 +599,11 @@ const MissionCardContent = defineComponent({ font-weight: 700; } -.time-badge { - padding: 4px 10px; - border-radius: 999px; - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.08); - color: #9ca3af; - font-size: 0.72rem; - font-weight: 600; +:deep(.time-badge) { + color: #aaaaaa; + font-size: 0.84rem; + line-height: 1.55; + margin: 0; } .difficulty-normal {