工作台发起成绩修正后裁判端同步消息

This commit is contained in:
马梓彭 2026-09-22 09:11:48 +08:00
parent 87bce5806e
commit 9e0e1457ea

View File

@ -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;
}
/// <summary>
/// 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.
/// </summary>
private async Task<long?> 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;
}
/// <summary>
/// 同步成绩当前版本的状态,保证 EventResult 与 EventResultVersion 状态一致
/// </summary>