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 状态一致
///