From 9e0e1457ea6f892bd79f61c64003113086863cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=A2=93=E5=BD=AD?= Date: Tue, 22 Sep 2026 09:11:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=E6=88=90=E7=BB=A9=E4=BF=AE=E6=AD=A3=E5=90=8E=E8=A3=81=E5=88=A4?= =?UTF-8?q?=E7=AB=AF=E5=90=8C=E6=AD=A5=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Workbench/WorkbenchController.cs | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/YD_Event.Application/Workbench/WorkbenchController.cs b/YD_Event.Application/Workbench/WorkbenchController.cs index 39e266c..d9200a4 100644 --- a/YD_Event.Application/Workbench/WorkbenchController.cs +++ b/YD_Event.Application/Workbench/WorkbenchController.cs @@ -1224,7 +1224,15 @@ public class WorkbenchController : IDynamicApiController var assignment = await _assignmentRepository.GetByIdAsync(correction.JudgeAssignmentId); if (assignment == null || assignment.DeleteMark) throw Oops.Bah("原裁判分配不存在,无法下发修正任务"); - + + var originalSheet = await _sheetRepository.GetByIdAsync(correction.OriginalScoreSheetId) + ?? throw Oops.Bah("原评分单不存在,无法下发修正任务"); + var originalTask = originalSheet.JudgeTaskId > 0 + ? await _taskRepository.GetByIdAsync(originalSheet.JudgeTaskId) + : null; + var session = await _sessionRepository.GetByIdAsync(correction.SessionId) + ?? throw Oops.Bah("比赛场次不存在,无法下发修正任务"); + var receiverUserId = await ResolveJudgeUserIdAsync(assignment, originalSheet); var task = new EventJudgeTask { Id = _idGenerator.NextId(), @@ -1234,12 +1242,17 @@ public class WorkbenchController : IDynamicApiController JudgeAssignmentId = correction.JudgeAssignmentId, EventRefereeId = assignment.EventRefereeId, RefereeId = assignment.RefereeId, - JudgeUserId = assignment.JudgeUserId, + JudgeUserId = receiverUserId, JudgeRole = assignment.JudgeRole, JudgeRoleType = assignment.JudgeRoleType, - TaskSnapshotJson = "{}", + ScoreRuleId = originalTask?.ScoreRuleId ?? session.ScoreRuleId, + RuleVersion = originalTask?.RuleVersion ?? originalSheet.RuleVersion, + TaskSnapshotJson = originalTask?.TaskSnapshotJson ?? "{}", TaskType = 1, - TaskStatus = 0, + TaskStatus = 10, + TaskVersion = (originalTask?.TaskVersion ?? 0) + 1, + OriginalTaskId = originalTask?.Id, + DispatchedTime = now, CreatedUserId = currentUserId, CreatedTime = now }; @@ -1249,18 +1262,18 @@ public class WorkbenchController : IDynamicApiController correction.CorrectionTaskId = task.Id; await _correctionRepository.UpdateAsync(correction); - if (assignment.JudgeUserId != null) + if (receiverUserId.HasValue) { var message = new EventJudgeMessage { Id = _idGenerator.NextId(), EventId = correction.EventId, - ReceiverUserId = assignment.JudgeUserId.Value, + ReceiverUserId = receiverUserId.Value, RefereeId = assignment.RefereeId, MessageType = 1, Title = "成绩修正任务通知", Content = $"您有一条成绩修正任务需要处理,申请原因:{correction.ApplyReason}", - RelationType = "ScoreCorrection", + RelationType = nameof(EventScoreCorrection), RelationId = correction.Id, IsRead = false, CreatedUserId = currentUserId, @@ -1289,6 +1302,8 @@ public class WorkbenchController : IDynamicApiController var entry = await _entryRepository.GetFirstAsync(e => e.Id == input.SessionEntryId && !e.DeleteMark) ?? throw Oops.Bah("出场记录不存在"); + var session = await _sessionRepository.GetByIdAsync(entry.SessionId) + ?? throw Oops.Bah("比赛场次不存在"); var sheetIds = input.ScoreSheetIds.Where(id => id > 0).Distinct().ToList(); if (sheetIds.Count == 0) throw Oops.Bah("请至少选择一名裁判"); @@ -1305,7 +1320,8 @@ public class WorkbenchController : IDynamicApiController throw Oops.Bah($"{notSubmitted.JudgeRole}号位评分单当前为“{GetSheetStatusName(notSubmitted.SheetStatus)}”,不能修正"); var pendingSheetIds = (await _correctionRepository.AsQueryable() - .Where(c => !c.DeleteMark && sheetIds.Contains(c.OriginalScoreSheetId) && c.CorrectionStatus < 20) + .Where(c => !c.DeleteMark && sheetIds.Contains(c.OriginalScoreSheetId) + && (c.CorrectionStatus == 0 || c.CorrectionStatus == 10 || c.CorrectionStatus == 30)) .Select(c => c.OriginalScoreSheetId).ToListAsync()).ToHashSet(); var pending = sheets.FirstOrDefault(s => pendingSheetIds.Contains(s.Id)); if (pending != null) @@ -1339,6 +1355,10 @@ public class WorkbenchController : IDynamicApiController }; await _correctionRepository.InsertAsync(correction); + var originalTask = sheet.JudgeTaskId > 0 + ? await _taskRepository.GetByIdAsync(sheet.JudgeTaskId) + : null; + var receiverUserId = await ResolveJudgeUserIdAsync(assignment, sheet); var task = new EventJudgeTask { Id = _idGenerator.NextId(), @@ -1348,12 +1368,17 @@ public class WorkbenchController : IDynamicApiController JudgeAssignmentId = correction.JudgeAssignmentId, EventRefereeId = assignment.EventRefereeId, RefereeId = assignment.RefereeId, - JudgeUserId = assignment.JudgeUserId, + JudgeUserId = receiverUserId, JudgeRole = assignment.JudgeRole, JudgeRoleType = assignment.JudgeRoleType, - TaskSnapshotJson = "{}", + ScoreRuleId = originalTask?.ScoreRuleId ?? session.ScoreRuleId, + RuleVersion = originalTask?.RuleVersion ?? sheet.RuleVersion, + TaskSnapshotJson = originalTask?.TaskSnapshotJson ?? "{}", TaskType = 1, - TaskStatus = 0, + TaskStatus = 10, + TaskVersion = (originalTask?.TaskVersion ?? 0) + 1, + OriginalTaskId = originalTask?.Id, + DispatchedTime = now, CreatedUserId = currentUserId, CreatedTime = now }; @@ -1363,18 +1388,18 @@ public class WorkbenchController : IDynamicApiController await _correctionRepository.UpdateAsync(correction); // 裁判未绑定小程序账号时消息无处投递,只保留修正记录,不阻断主流程 - if (assignment.JudgeUserId.HasValue) + if (receiverUserId.HasValue) { await _messageRepository.InsertAsync(new EventJudgeMessage { Id = _idGenerator.NextId(), EventId = correction.EventId, - ReceiverUserId = assignment.JudgeUserId.Value, + ReceiverUserId = receiverUserId.Value, RefereeId = assignment.RefereeId, MessageType = 1, Title = "成绩修正通知", Content = $"请对{assignment.JudgeRole}号位的评分重新提交,原因:{reason}", - RelationType = "ScoreCorrection", + RelationType = nameof(EventScoreCorrection), RelationId = correction.Id, IsRead = false, CreatedUserId = currentUserId, @@ -2003,6 +2028,20 @@ public class WorkbenchController : IDynamicApiController return reason; } + /// + /// Resolve the App user that currently owns a judge assignment. Older assignments may not + /// have JudgeUserId populated, while the referee profile or submitted sheet still has it. + /// + private async Task ResolveJudgeUserIdAsync(EventJudgeAssignment assignment, + EventJudgeScoreSheet? sheet = null) + { + var receiverUserId = sheet?.JudgeUserId ?? assignment.JudgeUserId; + if (receiverUserId.HasValue) return receiverUserId; + + var referee = await _refereeRepository.GetByIdAsync(assignment.RefereeId); + return referee?.AppUserId; + } + /// /// 同步成绩当前版本的状态,保证 EventResult 与 EventResultVersion 状态一致 ///