using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.Application.Triggers { public class JudgeVisitTaskTrigger( IRepository _visitTaskRepository, IRepository _readingJudgeInfoRepository) : IAfterSaveTrigger,IBeforeSaveTrigger { /// /// 因为维护状态先后顺序导致 裁判任务关联的 任务上的JudgeVisitTaskId==nulll 在这里需要重新设置下 /// /// 比如 两个任务产生了裁判,然后其中一个人申请了重阅,影响了裁判,需要清理之前任务的上裁判id (申请重阅,退回,里面分有序,无序,情况太多,所以不在那块逻辑修改,不然得加多个地方处理,在这里统一处理) /// 比如: 申请裁判任务重阅,事务里面本来设置了任务上的裁判id,但是因为下面的逻辑,导致设置的值又被清理了,只能重新设置下 /// /// /// /// public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var visitTask = context.Entity; //裁判任务维护,当裁判任务受到影响的时候,需要清理任务上关联的裁判任务id if (context.ChangeType == ChangeType.Added) { if (visitTask.ReadingCategory == ReadingCategory.Judge && visitTask.TaskState == TaskState.Effect) { var find = _readingJudgeInfoRepository.Where(t => t.JudgeTaskId == visitTask.Id).FirstOrDefault(); if (find != null) { var ids = new Guid[] { find.TaskIdOne, find.TaskIdTwo }; await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => ids.Contains(t.Id), u => new VisitTask() { JudgeVisitTaskId = visitTask.Id }); } } } } //这里提交事务 多次 会进入多次 导致新生成的裁判任务设置了后,再次进入,又设置为null了 //这个放在save 之前,不然可能先执行添加的修改为正确的,再执行修改的,又重置为空了 所以这里需要调整下 (裁判重阅,会修改裁判需要充值, 同时也会新增裁判任务) public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { var visitTask = context.Entity; if (context.ChangeType == ChangeType.Modified) { if (visitTask.ReadingCategory == ReadingCategory.Judge && (visitTask.TaskState == TaskState.Adbandon || visitTask.TaskState == TaskState.HaveReturned)) { var find = _readingJudgeInfoRepository.Where(t => t.JudgeTaskId == visitTask.Id).FirstOrDefault(); if (find != null) { var ids = new Guid[] { find.TaskIdOne, find.TaskIdTwo }; if(!_readingJudgeInfoRepository.Any(t=> ids.Contains(t.TaskIdOne) && t.CreateTime > find.CreateTime)) { await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => ids.Contains(t.Id), u => new VisitTask() { JudgeVisitTaskId = null }); } } } } } } }