diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index 9ef78f85c..caaebd0ef 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -106,6 +106,21 @@ namespace IRaCIS.Core.API.Controllers #endregion + /// + /// 提交全局阅片任务 + /// + /// + /// + [HttpPost, Route("Inspection/ReadingImageTask/SubmitGlobalReadingInfo")] + [UnitOfWork] + public async Task SubmitGlobalReadingInfo(DataInspectionDto opt) + { + + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _iReadingImageTaskService.SubmitGlobalReadingInfo(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } /// diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index 36a08849c..c66d54b68 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -48,6 +48,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class GetGlobalReadingInfoInDto { public Guid VisitTaskId { get; set; } + + /// + /// 当新答案为空的时候 是否是有原数据 + /// + public bool UsingOriginalData { get; set; } = false; } public class GetGlobalReadingInfoOutDto @@ -81,6 +86,21 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string Answer { get; set; } + /// + /// 答案分组 + /// + public string AnswerGroup { get; set; } = string.Empty; + + /// + /// 答案组合 + /// + public string AnswerCombination { get; set; } = string.Empty; + + /// + /// 裁判类型 + /// + public JudgeTypeEnum JudgeType { get; set; } + /// /// 类型值 /// @@ -355,7 +375,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public JudgeTypeEnum JudgeType { get; set; } - public List TaskAnswerList { get; set; } + public List TaskAnswerList { get; set; } + } + + public class TaskGroupAnswer + { + public string Answer { get; set; } } public class AnswerGroup diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs index d36a33105..0a37e8e0b 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs @@ -17,5 +17,7 @@ namespace IRaCIS.Core.Application.Contracts void FindChildQuestion(GetTrialReadingQuestionOutDto trialReadingQuestion, List questionlists); + + Task SubmitGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto); } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs index 08fe40b42..fc641ff9a 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs @@ -166,6 +166,9 @@ namespace IRaCIS.Application.Services { QuestionId = y.ReadingQuestionTrialId, QuestionName = y.ReadingQuestionTrial.QuestionName, + AnswerGroup=y.ReadingQuestionTrial.AnswerGroup, + AnswerCombination=y.ReadingQuestionTrial.AnswerCombination, + JudgeType=y.ReadingQuestionTrial.JudgeType, Type = y.ReadingQuestionTrial.Type, TypeValue = y.ReadingQuestionTrial.TypeValue, Answer = y.Answer @@ -184,10 +187,13 @@ namespace IRaCIS.Application.Services , (l, r) => new { question = l, global = r }) .SelectMany(lr => lr.global.DefaultIfEmpty(), (lr, r) => new GlobalQuestionInfo { - Answer = lr.global == null ? string.Empty : lr.global.Select(x => x.Answer).FirstOrDefault(), + Answer = lr.global == null ? (inDto.UsingOriginalData?lr.question.Answer: string.Empty) : lr.global.Select(x => x.Answer).FirstOrDefault(), QuestionId = lr.question.QuestionId, QuestionName = lr.question.QuestionName, Type = lr.question.Type, + AnswerGroup = lr.question.AnswerGroup, + AnswerCombination = lr.question.AnswerCombination, + JudgeType = lr.question.JudgeType, TypeValue = lr.question.TypeValue, }).ToList(); @@ -800,7 +806,11 @@ namespace IRaCIS.Application.Services return result; } - + /// + /// 签名提交任务修改状态 + /// + /// + /// private async Task SubmitTaskChangeState(Guid visitTaskId) { // 触裁判任务 @@ -861,7 +871,7 @@ namespace IRaCIS.Application.Services #endregion var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); List needReadList = new List(); - if (!await _visitTaskRepository.Where(x => x.Id== visitTaskId).Select(x=>x.IsAnalysisCreate).FirstOrDefaultAsync()) + if (!taskInfo.IsAnalysisCreate) { // 任务类型 switch (taskInfo.ReadingCategory) @@ -903,14 +913,19 @@ namespace IRaCIS.Application.Services ReadModuleId = x.Id, ReadingCategory = typeChangeDic[x.ModuleType], }).ToListAsync(); - //needReadList = needReadList.Where(x => _visitTaskRepository.Where(y => y.SouceReadModuleId == x.ReadModuleId).Count() == 0).ToList(); - await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() + if (taskInfo.JudgeVisitTaskId == null) { + // 有裁判要等裁判完成之后才进行添加 + await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() + { - ReadingCategory = GenerateTaskCategory.Oncology, - TrialId = taskInfo.TrialId, - ReadingGenerataTaskList = needReadList - }); + ReadingCategory = GenerateTaskCategory.Oncology, + TrialId = taskInfo.TrialId, + ReadingGenerataTaskList = needReadList + }); + } + //needReadList = needReadList.Where(x => _visitTaskRepository.Where(y => y.SouceReadModuleId == x.ReadModuleId).Count() == 0).ToList(); + break; } } @@ -919,6 +934,35 @@ namespace IRaCIS.Application.Services + } + + + + /// + /// 全局阅片裁判触发 + /// + /// + /// + private async Task GlobalTriggerJudgeQuestion(Guid visitTaskId) + { + List visitTaskids = new List(); + var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); + + // 判断是否是一致性分析产生的 + if (taskInfo.IsAnalysisCreate) + { + if (taskInfo.ConsistentAnalysisOriginalTaskId != null) + { + visitTaskids.Add(visitTaskId); + visitTaskids.Add(taskInfo.ConsistentAnalysisOriginalTaskId.Value); + } + } + else + { + visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge + + && x.ReReadingApplyState != ReReadingApplyState.Agree && x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && x.SouceReadModuleId == taskInfo.SouceReadModuleId).Select(x => x.Id).ToListAsync(); + } } /// @@ -929,154 +973,280 @@ namespace IRaCIS.Application.Services private async Task TriggerJudgeQuestion(Guid visitTaskId) { List visitTaskids = new List(); - //x.ReReadingApplyState!=ReReadingApplyState.Agree 排除重阅的 + var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).AsNoTracking().FirstNotNullAsync(); // 判断是否是一致性核查产生 if (visitTask.IsAnalysisCreate&& visitTask.ConsistentAnalysisOriginalTaskId!=null) { visitTaskids.Add(visitTask.Id); - if (visitTask.ConsistentAnalysisOriginalTaskId != null) - { - visitTaskids.Add(visitTask.ConsistentAnalysisOriginalTaskId.Value); - } - - // 这种情况是新产生的阅片期 - if (visitTask.SouceReadModuleId != null) - { - var visitNum = await _readModuleRepository.Where(x => x.Id == visitTask.SouceReadModuleId).Select(x => x.VisitNum).FirstOrDefaultAsync(); - var lastVisitId = await _visitTaskRepository.Where(x => !x.IsAnalysisCreate&&x.ArmEnum== visitTask.ArmEnum && x.SouceReadModuleId == visitTask.SouceReadModuleId && x.ReadModule.VisitNum <= visitNum).OrderByDescending(x => x.ReadModule.VisitNum).Select(x => x.Id).FirstOrDefaultAsync(); - visitTaskids.Add(lastVisitId); - } + visitTaskids.Add(visitTask.ConsistentAnalysisOriginalTaskId.Value); } else { + // 这里是非一致性分析产生的 visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge + &&x.IsAnalysisCreate==false && x.ReReadingApplyState != ReReadingApplyState.Agree && x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && x.SouceReadModuleId == visitTask.SouceReadModuleId).Select(x => x.Id).ToListAsync(); } var trialInfo = await _trialRepository.Where(x => x.Id == visitTask.TrialId).Select(x=> new { x.IsArbitrationReading, x.ArbitrationRule - }).FirstNotNullAsync(); - if (visitTaskids.Count == 2&& (trialInfo.IsArbitrationReading??false)) + var noteEqual = false; + + // 判断项目是否设置了裁判 + if (trialInfo.IsArbitrationReading ?? false) { - var query = from questionAnswet in _readingTaskQuestionAnswerRepository.Where(x => visitTaskids.Contains(x.VisitTaskId)) - join question in _readingQuestionTrialRepository.Where(x => x.IsJudgeQuestion) on new { ReadingQuestionTrialId = questionAnswet.ReadingQuestionTrialId } equals new { ReadingQuestionTrialId = question.Id } - select new TaskAnswerDto() - { - Answer = questionAnswet.Answer, - AnswerGroup = question.AnswerGroup, - AnswerCombination=question.AnswerCombination, - JudgeType=question.JudgeType, - QuestionId = question.Id, - VisitTaskId = questionAnswet.VisitTaskId, - }; - - var questionAnswerlist = await query.ToListAsync(); - List groupTasks = questionAnswerlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup,x.JudgeType,x.AnswerCombination }).Select(x => new GroupTaskAnswerDto + // 判断数量是否为2 是否仲裁 + if (visitTaskids.Count == 2) { - QuestionId = x.Key.QuestionId, - AnswerGroup = x.Key.AnswerGroup, - AnswerCombination=x.Key.AnswerCombination, - JudgeType=x.Key.JudgeType, - TaskAnswerList = x.ToList(), - }).ToList(); - - var noteEqual = false; - foreach (var item in groupTasks) - { - if (item.TaskAnswerList.Count() != 2) + switch (visitTask.ReadingCategory) { - noteEqual = true; - break; - } - else - { - var taskAnswer1 = item.TaskAnswerList[0]; - var taskAnswer2 = item.TaskAnswerList[1]; - if (taskAnswer1.Answer != taskAnswer2.Answer) - { - - switch (item.JudgeType) - { - case JudgeTypeEnum.AnswerDisaffinity: - noteEqual = true; - break; - case JudgeTypeEnum.AnswerGroup: - var answerGroupList = JsonConvert.DeserializeObject>(item.AnswerGroup).Select(x => new AnswerGroup() - { - GroupId = NewId.NextGuid(), - GroupValue = x - }).ToList(); - var itemAnswerGroupsitem1 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer1.Answer}|")); - var itemAnswerGroupsitem2 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer2.Answer}|")); - var unionList = itemAnswerGroupsitem1.Intersect(itemAnswerGroupsitem2).ToList(); - if (unionList.Count < 1) - { - noteEqual =true; - } - break; - case JudgeTypeEnum.AnswerCombination: - var answerCombinationList = JsonConvert.DeserializeObject>(item.AnswerCombination == string.Empty ? "[]" : item.AnswerCombination).ToList(); - answerCombinationList.ForEach(x => - { - if (x.AnswerGroupA.Contains(taskAnswer1.Answer) && x.AnswerGroupB.Contains(taskAnswer2.Answer)) + // 访视 + case ReadingCategory.Visit: + // 查找两个 访视的阅片答案 + var query = from questionAnswet in _readingTaskQuestionAnswerRepository.Where(x => visitTaskids.Contains(x.VisitTaskId)) + join question in _readingQuestionTrialRepository.Where(x => x.IsJudgeQuestion) on new { ReadingQuestionTrialId = questionAnswet.ReadingQuestionTrialId } equals new { ReadingQuestionTrialId = question.Id } + select new TaskAnswerDto() { - noteEqual = true; - } - if (x.AnswerGroupB.Contains(taskAnswer1.Answer) && x.AnswerGroupA.Contains(taskAnswer2.Answer)) - { - noteEqual = true; - } - }); - break; - } - } - } - } - if (noteEqual) - { - if (visitTask.IsAnalysisCreate) - { - await _visitTaskRepository.BatchUpdateNoTrackingAsync(x=>x.Id==visitTaskId, x => new VisitTask() - { - IsAnalysisDiffToOriginalData = true - }); - await _visitTaskRepository.SaveChangesAsync(); + Answer = questionAnswet.Answer, + AnswerGroup = question.AnswerGroup, + AnswerCombination = question.AnswerCombination, + JudgeType = question.JudgeType, + QuestionId = question.Id, + VisitTaskId = questionAnswet.VisitTaskId, + }; + var questionAnswerlist = await query.ToListAsync(); - } - else - { - - if ((visitTask.SourceSubjectVisitId != null && trialInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && trialInfo.ArbitrationRule == ArbitrationRule.Reading)) - { - await this.SaveJudgeTask(new SaveJudgeTaskDto() + // 将答案进行分组 + List groupTasks = questionAnswerlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto { - VisitTaskIds = visitTaskids, + QuestionId = x.Key.QuestionId, + AnswerGroup = x.Key.AnswerGroup, + AnswerCombination = x.Key.AnswerCombination, + JudgeType = x.Key.JudgeType, + TaskAnswerList = x.Select(y => y.Answer).ToList(), + }).ToList(); + noteEqual = ComputeJudgeResult(groupTasks); + break; + case ReadingCategory.Global: + var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() + { + UsingOriginalData = true, + VisitTaskId = visitTaskids[0] }); - } - + + var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() + { + UsingOriginalData = true, + VisitTaskId = visitTaskids[1] + }); + + // 判断两个任务是否 + if (taskOneInfo.TaskList.Count() != taskTwoInfo.TaskList.Count()) + { + noteEqual = true; + } + else + { + foreach (var item in taskOneInfo.TaskList) + { + GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault(); + + if (twoItem == null) + { + noteEqual = true; + break; + } + else + { + var newlist = item.AfterQuestionList.Where(x => x.QuestionId != null).ToList().Union( + twoItem.AfterQuestionList.Where(x => x.QuestionId != null).ToList() + ).ToList(); + + List globalGroupTasks = newlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto + { + QuestionId = x.Key.QuestionId.Value, + AnswerGroup = x.Key.AnswerGroup, + AnswerCombination = x.Key.AnswerCombination, + JudgeType = x.Key.JudgeType, + TaskAnswerList = x.Select(y => y.Answer).ToList(), + }).ToList(); + noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks); + } + + } + } + break; } } else { - - if (visitTask.IsAnalysisCreate) + // 这里判断一致性分析产生的全局阅片 + if (visitTask.ReadingCategory == ReadingCategory.Global && visitTask.IsAnalysisCreate) { - await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskId, x => new VisitTask() + var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { - IsAnalysisDiffToOriginalData = false + UsingOriginalData = true, + VisitTaskId = visitTask.Id }); - await _visitTaskRepository.SaveChangesAsync(); + + // 找到最后一个任务ID + var lastTask = taskOneInfo.TaskList.Last(); + + if (lastTask == null) + { + noteEqual = true; + } + else { + var query = from questionAnswet in _readingTaskQuestionAnswerRepository.Where(x => + x.VisitTask.IsAnalysisCreate==false&& + x.VisitTask.DoctorUserId==visitTask.DoctorUserId&& + x.VisitTask.TaskState== TaskState.Effect&& + (x.VisitTask.SourceSubjectVisitId??default(Guid))== lastTask.VisitId) + join question in _readingQuestionTrialRepository.Where(x => x.IsJudgeQuestion) on new { ReadingQuestionTrialId = questionAnswet.ReadingQuestionTrialId } equals new { ReadingQuestionTrialId = question.Id } + select new GlobalQuestionInfo() + { + Answer = questionAnswet.Answer, + AnswerGroup = question.AnswerGroup, + AnswerCombination = question.AnswerCombination, + JudgeType = question.JudgeType, + QuestionId = question.Id, + + }; + + var visitTaskQuestions =await query.ToListAsync(); + + var newlist = visitTaskQuestions.Where(x => x.QuestionId != null).ToList().Union( + lastTask.AfterQuestionList.Where(x => x.QuestionId != null).ToList() + ).ToList(); + + List globalGroupTasks = newlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto + { + QuestionId = x.Key.QuestionId.Value, + AnswerGroup = x.Key.AnswerGroup, + AnswerCombination = x.Key.AnswerCombination, + JudgeType = x.Key.JudgeType, + TaskAnswerList = x.Select(y => y.Answer).ToList(), + }).ToList(); + noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks); + } + + } } + + + } + + + + + if (noteEqual) + { + if (visitTask.IsAnalysisCreate) + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskId, x => new VisitTask() + { + IsAnalysisDiffToOriginalData = true + }); + await _visitTaskRepository.SaveChangesAsync(); + + } + else + { + + if ((visitTask.SourceSubjectVisitId != null && trialInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && trialInfo.ArbitrationRule == ArbitrationRule.Reading)) + { + await this.SaveJudgeTask(new SaveJudgeTaskDto() + { + VisitTaskIds = visitTaskids, + }); + } + + } + + } + else + { + + if (visitTask.IsAnalysisCreate) + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskId, x => new VisitTask() + { + IsAnalysisDiffToOriginalData = false + }); + await _visitTaskRepository.SaveChangesAsync(); + } } } + /// + /// 计算返回的结果 为True表示不相等 + /// + /// + /// + private bool ComputeJudgeResult(List groupTasks) + { + var noteEqual = false; + foreach (var item in groupTasks) + { + if (item.TaskAnswerList.Count() != 2) + { + noteEqual = true; + break; + } + else + { + var taskAnswer1 = item.TaskAnswerList[0]; + var taskAnswer2 = item.TaskAnswerList[1]; + if (taskAnswer1 != taskAnswer2) + { + + switch (item.JudgeType) + { + case JudgeTypeEnum.AnswerDisaffinity: + noteEqual = true; + break; + case JudgeTypeEnum.AnswerGroup: + var answerGroupList = JsonConvert.DeserializeObject>(item.AnswerGroup).Select(x => new AnswerGroup() + { + GroupId = NewId.NextGuid(), + GroupValue = x + }).ToList(); + var itemAnswerGroupsitem1 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer1}|")); + var itemAnswerGroupsitem2 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer2}|")); + var unionList = itemAnswerGroupsitem1.Intersect(itemAnswerGroupsitem2).ToList(); + if (unionList.Count < 1) + { + noteEqual = true; + } + break; + case JudgeTypeEnum.AnswerCombination: + var answerCombinationList = JsonConvert.DeserializeObject>(item.AnswerCombination == string.Empty ? "[]" : item.AnswerCombination).ToList(); + answerCombinationList.ForEach(x => + { + if (x.AnswerGroupA.Contains(taskAnswer1) && x.AnswerGroupB.Contains(taskAnswer2)) + { + noteEqual = true; + } + if (x.AnswerGroupB.Contains(taskAnswer1) && x.AnswerGroupA.Contains(taskAnswer2)) + { + noteEqual = true; + } + }); + break; + } + } + } + } + + return noteEqual; + } /// /// 添加裁判任务