diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index dcc53f8e9..8b0bb2450 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -7820,9 +7820,39 @@ + + 全局阅片 + IR影像阅片 + + 裁判 + + + 肿瘤学 + + + + + 提交全局阅片结果 + + + + + + + 保存全局阅片结果 + + + + + + + 获取全局阅片信息 + + + @@ -7911,35 +7941,6 @@ - - - 获取肿瘤学任务信息 - - - - - - - - 修改肿瘤学阅片信息 - - - - - - - 保存全局阅片结果 - - - - - - - 获取全局阅片信息 - - - - 获取下一个阅片任务 @@ -7961,20 +7962,6 @@ - - - 获取项目标准的裁判问题 - - - - - - - 设置裁判问题的答案分组 - - - - 获取项目的阅片问题ECRF预览 @@ -8019,19 +8006,6 @@ - - - 获取裁判阅片任务信息 - - - - - - 保存裁判问题 - - - - 获取既往结果 @@ -8081,27 +8055,6 @@ - - - 提交裁判问题 - - - - - - - 提交肿瘤阅片结果 - - - - - - - 提交全局阅片结果 - - - - 签名提交任务修改状态 @@ -8109,22 +8062,58 @@ + + + 完成阅片修改状态 + + + 添加阅片期任务 - + - 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑 + 验证任务是否签名 + + + + + + + + 获取项目标准的裁判问题 + + + + + + + 设置裁判问题的答案分组 + + + + + + + 获取裁判阅片任务信息 - + - 添加裁判任务 + 保存裁判问题 + + + + + + 提交裁判问题 + + @@ -8149,10 +8138,31 @@ - + - 完成阅片修改状态 + 获取肿瘤学任务信息 + + + + + + 修改肿瘤学阅片信息 + + + + + + + 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑 + + + + + + 提交肿瘤阅片结果 + + @@ -8274,7 +8284,7 @@ - 设置标准字典 + 设置标准字典(系统用) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs new file mode 100644 index 000000000..3974caf38 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs @@ -0,0 +1,209 @@ +using IRaCIS.Core.Domain.Share; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Application.Service.Reading.Dto; +using MassTransit; +using IRaCIS.Core.Infra.EFCore.Common; +using Panda.DynamicWebApi.Attributes; +using AutoMapper; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Infrastructure; +using Newtonsoft.Json; +using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Application.ViewModel; + +namespace IRaCIS.Application.Services +{ + + /// + /// 全局阅片 + /// + public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService + { + /// + /// 提交全局阅片结果 + /// + /// + /// + //[NonDynamicMethod] + public async Task SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto) + { + //var result = await this.SaveGlobalReadingInfo(inDto); + await VerifyTaskIsSign(inDto.GlobalTaskId); + await this.SubmitTaskChangeState(inDto.GlobalTaskId); + + return ResponseOutput.Ok(true); + } + + #region 全局阅片相关 + /// + /// 保存全局阅片结果 + /// + /// + /// + [HttpPost] + public async Task SaveGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto) + { + var visitTaskId = inDto.QuestionList.Select(x => x.VisitTaskId).FirstOrDefault(); + + foreach (var item in inDto.QuestionList) + { + + await _readingGlobalTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.GlobalTaskId == inDto.GlobalTaskId && x.TaskId == visitTaskId && x.GlobalAnswerType == item.GlobalAnswerType && x.QuestionId == item.QuestionId); + + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == item.QuestionId, x => new ReadingTaskQuestionAnswer() + { + GlobalChangeAnswer = item.Answer + }); + } + + await _readingGlobalTaskInfoRepository.AddRangeAsync(inDto.QuestionList.Select(x => new ReadingGlobalTaskInfo() + { + Answer = x.Answer, + QuestionId = x.QuestionId, + SubjectId = inDto.SubjectId, + GlobalTaskId = inDto.GlobalTaskId, + GlobalAnswerType = x.GlobalAnswerType, + TaskId = x.VisitTaskId, + TrialId = inDto.TrialId, + }).ToList()); + + await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.GlobalTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading }); + + var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync(); + return ResponseOutput.Ok(result); + + } + + + /// + /// 获取全局阅片信息 + /// + /// + /// + [HttpPost] + public async Task GetGlobalReadingInfo(GetGlobalReadingInfoInDto inDto) + { + var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); + if (taskInfo.ReadingCategory != ReadingCategory.Global) + { + throw new BusinessValidationFailedException("当前任务不是全局阅片任务"); + } + GetGlobalReadingInfoOutDto result = new GetGlobalReadingInfoOutDto() + { + GlobalTaskId = inDto.VisitTaskId, + ReadingTaskState = taskInfo.ReadingTaskState, + GlobalUpdateType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).Select(x => x.GlobalUpdateType).FirstOrDefaultAsync(), + + }; + + // 一致性分析按照doctorId 其他按照分组 + + result.TaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && + x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && + x.SubjectId == taskInfo.SubjectId && x.IsAnalysisCreate == taskInfo.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < taskInfo.VisitTaskNum) + .Where(x => x.DoctorUserId == taskInfo.DoctorUserId) + .OrderBy(x => x.VisitTaskNum).Select(x => new GlobalVisitInfo() + { + VisitName = x.SourceSubjectVisit.VisitName, + BlindName = x.SourceSubjectVisit.BlindName, + VisitTaskId = x.Id, + ArmEnum = taskInfo.ArmEnum, + VisitNum = x.SourceSubjectVisit.VisitNum, + VisitId = x.SourceSubjectVisitId.Value, + BeforeQuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) + .Select(y => new GlobalQuestionInfo() + { + QuestionId = y.ReadingQuestionTrialId, + QuestionName = y.ReadingQuestionTrial.QuestionName, + AnswerGroup = y.ReadingQuestionTrial.AnswerGroup, + QuestionType = y.ReadingQuestionTrial.QuestionType, + QuestionGenre = y.ReadingQuestionTrial.QuestionGenre, + DictionaryCode = y.ReadingQuestionTrial.DictionaryCode, + + + AnswerCombination = y.ReadingQuestionTrial.AnswerCombination, + JudgeType = y.ReadingQuestionTrial.JudgeType, + Type = y.ReadingQuestionTrial.Type, + TypeValue = y.ReadingQuestionTrial.TypeValue, + Answer = y.Answer + }).ToList() + }).ToListAsync(); + + + var globalReadingQuestion = await _readingGlobalTaskInfoRepository.Where(x => x.GlobalTaskId == inDto.VisitTaskId).ToListAsync(); + + result.TaskList.ForEach(x => + { + x.AfterQuestionList = x.BeforeQuestionList.GroupJoin( + globalReadingQuestion + , l => new { a = l.QuestionId, b = x.VisitTaskId } + , r => new { a = r.QuestionId, b = r.TaskId } + , (l, r) => new { question = l, global = r }) + .SelectMany(lr => lr.global.DefaultIfEmpty(), (lr, r) => new GlobalQuestionInfo + { + Answer = lr.global == null || lr.global.Count() == 0 ? + (inDto.UsingOriginalData ? lr.question.Answer : string.Empty) : + + (lr.global.Select(x => x.Answer).FirstOrDefault().IsNullOrEmpty() && inDto.UsingOriginalData ? + lr.question.Answer : lr.global.Select(x => x.Answer).FirstOrDefault() + ), + IsHaveChange = lr.global == null ? false : lr.global.Any(), + QuestionId = lr.question.QuestionId, + QuestionName = lr.question.QuestionName, + QuestionType = lr.question.QuestionType, + QuestionGenre = lr.question.QuestionGenre, + DictionaryCode = lr.question.DictionaryCode, + Type = lr.question.Type, + GlobalAnswerType = GlobalAnswerType.Question, + AnswerGroup = lr.question.AnswerGroup, + AnswerCombination = lr.question.AnswerCombination, + JudgeType = lr.question.JudgeType, + TypeValue = lr.question.TypeValue, + + }).ToList(); + + x.AgreeOrNot = new List() + { + new GlobalQuestionInfo() + { + Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).Select(x => x.Answer).FirstOrDefault() ?? "1", + QuestionName = "是否同意访视整体评估", + Type = "input", + GlobalAnswerType=GlobalAnswerType.AgreeOrNot, + + } + + }; + + List questionTypes = new List() + { + new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.UpdateType,QuestionName="评估更新类型" }, + new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.Reason,QuestionName="全局阅片备注" }, + //new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.AgreeOrNot,QuestionName="是否同意访视结果" }, + + }; + + + foreach (var item in questionTypes) + { + x.AfterQuestionList.Add(new GlobalQuestionInfo() + { + Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == item.GlobalAnswerType).Select(x => x.Answer).FirstOrDefault() ?? string.Empty, + QuestionName = item.QuestionName, + Type = "input", + GlobalAnswerType = item.GlobalAnswerType, + + }); + } + + + + }); + + + + return result; + } + #endregion + } +} diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs similarity index 64% rename from IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs rename to IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 1d97f78fc..dd9b0aa4c 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -17,7 +17,7 @@ namespace IRaCIS.Application.Services /// IR影像阅片 /// [ApiExplorerSettings(GroupName = "Reading")] - public class ReadingImageTaskService : BaseService, IReadingImageTaskService + public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService { private readonly IRepository _noneDicomStudyRepository; @@ -810,328 +810,9 @@ namespace IRaCIS.Application.Services #endregion - #region 肿瘤学阅片相关 - - /// - /// 获取肿瘤学任务信息 - /// - /// - /// - /// - [HttpPost] - public async Task GetOncologyReadingInfo(GetOncologyReadingInfoInDto inDto) - { - var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); - - if (taskInfo.ReadingCategory != ReadingCategory.Oncology) - { - throw new BusinessValidationFailedException("当前任务不是肿瘤学任务"); - } - - var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id== taskInfo.TrialReadingCriterionId).FirstOrDefaultAsync(); - - - GetOncologyReadingInfoOutDto result = new GetOncologyReadingInfoOutDto() { - TrialEvaluationResult = trialCriterion.EvaluationResult, - IsShowDetail = trialCriterion.IsShowDetail, - TrialEvaluationReason = trialCriterion.EvaluationReason.IsNullOrEmpty() ? ReadingCommon.EvaluationReason : trialCriterion.EvaluationReason, - OncologyTaskId = inDto.VisitTaskId, - ReadingTaskState = taskInfo.ReadingTaskState, - }; - - // 先找到是R1还是R2的阅片 先找到全局阅片 - - var globalTaskInfo = await _visitTaskRepository - .Where(x => x.SubjectId == taskInfo.SubjectId && - x.TaskState == TaskState.Effect && - x.TrialReadingCriterionId==taskInfo.TrialReadingCriterionId && - x.ReadingCategory == ReadingCategory.Global && - x.VisitTaskNum < taskInfo.VisitTaskNum - ).OrderByDescending(x => x.VisitTaskNum) - .FirstNotNullAsync(); + - // 最后取哪组的数据 - VisitTask visitTask = new VisitTask(); - - // 判断是否产生裁判 - - if (globalTaskInfo.JudgeVisitTaskId == null) - { - visitTask = globalTaskInfo; - } - else - { - var judgeResultTaskId = await _visitTaskRepository.Where(x => x.Id == globalTaskInfo.JudgeVisitTaskId).Select(x => x.JudgeResultTaskId).FirstOrDefaultAsync(); - if (judgeResultTaskId == null) - { - throw new BusinessValidationFailedException("异常,裁判结果为null"); - } - visitTask = await _visitTaskRepository.Where(x => x.Id == judgeResultTaskId).FirstOrDefaultAsync(); - } - - result.GlobalTaskId = visitTask.Id; - result.SubjectId = visitTask.SubjectId; - - // 获取全局阅片信息 - var globalTaskReadingInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() - { - UsingOriginalData = true, - VisitTaskId = visitTask.Id - }); - - - // 找到对应的访视 - List oncologyVisits = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && - x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && - x.SubjectId == visitTask.SubjectId && x.IsAnalysisCreate == visitTask.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < visitTask.VisitTaskNum) - .Where(x => x.DoctorUserId == visitTask.DoctorUserId) - .OrderBy(x => x.VisitTaskNum).Select(x => new OncologyVisitTaskInfo() - { - VisitName = x.SourceSubjectVisit.VisitName, - VisitTaskId = x.Id, - // QuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) - //.Select(y => new OncologyQuestion() - //{ - // QuestionId = y.ReadingQuestionTrialId, - // QuestionName = y.ReadingQuestionTrial.QuestionName, - // Answer = y.GlobalChangeAnswer - //}).ToList() - }).ToListAsync(); - - var oncologyReadingQuestions = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == inDto.VisitTaskId).ToListAsync(); - - oncologyVisits.ForEach(x => - { - var oncologyData = oncologyReadingQuestions.Where(y => y.VisitTaskId == x.VisitTaskId).FirstOrDefault(); - - if (oncologyData != null) - { - x.EvaluationResult = oncologyData.EvaluationResult; - x.EvaluationReason = oncologyData.EvaluationReason; - } - x.QuestionList = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(x => x.QuestionId != null) - .Select(y => new OncologyQuestion - { - QuestionId = y.QuestionId ?? default(Guid), - QuestionName = y.QuestionName, - Answer = y.Answer - }).ToList(); - x.IsHaveChange = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Any(y => y.IsHaveChange); - x.VisitRemark = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(y => y.QuestionId == null).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; - - }); - - result.OncologyVisits = oncologyVisits; - return result; - - } - - /// - /// 修改肿瘤学阅片信息 - /// - /// - /// - [HttpPost] - public async Task SetOncologyReadingInfo(SetOncologyReadingInfoInDto inDto) - { - await _readingOncologyTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.OncologyTaskId == inDto.OncologyTaskId); - - var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.OncologyTaskId).FirstNotNullAsync(); - - List readingOncologies = inDto.OncologyQuestionList.Select(x => new ReadingOncologyTaskInfo() - { - EvaluationReason = x.EvaluationReason, - SubjectId = taskInfo.SubjectId, - EvaluationResult = x.EvaluationResult, - OncologyTaskId = inDto.OncologyTaskId, - TrialId = taskInfo.TrialId, - VisitTaskId = x.VisitTaskId - }).ToList(); - - await _readingOncologyTaskInfoRepository.AddRangeAsync(readingOncologies); - - await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading }); - - var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(result); - - - } - #endregion - - #region 全局阅片相关 - /// - /// 保存全局阅片结果 - /// - /// - /// - [HttpPost] - public async Task SaveGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto) - { - var visitTaskId = inDto.QuestionList.Select(x => x.VisitTaskId).FirstOrDefault(); - - foreach (var item in inDto.QuestionList) - { - - await _readingGlobalTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.GlobalTaskId == inDto.GlobalTaskId && x.TaskId == visitTaskId && x.GlobalAnswerType == item.GlobalAnswerType && x.QuestionId == item.QuestionId); - - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == item.QuestionId, x => new ReadingTaskQuestionAnswer() - { - GlobalChangeAnswer = item.Answer - }); - } - - await _readingGlobalTaskInfoRepository.AddRangeAsync(inDto.QuestionList.Select(x => new ReadingGlobalTaskInfo() - { - Answer = x.Answer, - QuestionId = x.QuestionId, - SubjectId = inDto.SubjectId, - GlobalTaskId = inDto.GlobalTaskId, - GlobalAnswerType=x.GlobalAnswerType, - TaskId = x.VisitTaskId, - TrialId = inDto.TrialId, - }).ToList()); - - await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.GlobalTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading }); - - var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync(); - return ResponseOutput.Ok(result); - - } - - - /// - /// 获取全局阅片信息 - /// - /// - /// - [HttpPost] - public async Task GetGlobalReadingInfo(GetGlobalReadingInfoInDto inDto) - { - var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); - if (taskInfo.ReadingCategory != ReadingCategory.Global) - { - throw new BusinessValidationFailedException("当前任务不是全局阅片任务"); - } - GetGlobalReadingInfoOutDto result = new GetGlobalReadingInfoOutDto() - { - GlobalTaskId = inDto.VisitTaskId, - ReadingTaskState = taskInfo.ReadingTaskState, - GlobalUpdateType=await _readingQuestionCriterionTrialRepository.Where(x=>x.Id==taskInfo.TrialReadingCriterionId).Select(x=>x.GlobalUpdateType).FirstOrDefaultAsync(), - - }; - - // 一致性分析按照doctorId 其他按照分组 - - result.TaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && - x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && - x.SubjectId == taskInfo.SubjectId && x.IsAnalysisCreate == taskInfo.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < taskInfo.VisitTaskNum) - .Where(x => x.DoctorUserId == taskInfo.DoctorUserId) - .OrderBy(x => x.VisitTaskNum).Select(x => new GlobalVisitInfo() - { - VisitName = x.SourceSubjectVisit.VisitName, - BlindName=x.SourceSubjectVisit.BlindName, - VisitTaskId = x.Id, - ArmEnum = taskInfo.ArmEnum, - VisitNum = x.SourceSubjectVisit.VisitNum, - VisitId = x.SourceSubjectVisitId.Value, - BeforeQuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) - .Select(y => new GlobalQuestionInfo() - { - QuestionId = y.ReadingQuestionTrialId, - QuestionName = y.ReadingQuestionTrial.QuestionName, - AnswerGroup = y.ReadingQuestionTrial.AnswerGroup, - QuestionType=y.ReadingQuestionTrial.QuestionType, - QuestionGenre=y.ReadingQuestionTrial.QuestionGenre, - DictionaryCode=y.ReadingQuestionTrial.DictionaryCode, - - - AnswerCombination = y.ReadingQuestionTrial.AnswerCombination, - JudgeType = y.ReadingQuestionTrial.JudgeType, - Type = y.ReadingQuestionTrial.Type, - TypeValue = y.ReadingQuestionTrial.TypeValue, - Answer = y.Answer - }).ToList() - }).ToListAsync(); - - - var globalReadingQuestion = await _readingGlobalTaskInfoRepository.Where(x => x.GlobalTaskId == inDto.VisitTaskId).ToListAsync(); - - result.TaskList.ForEach(x => - { - x.AfterQuestionList = x.BeforeQuestionList.GroupJoin( - globalReadingQuestion - , l => new { a = l.QuestionId, b = x.VisitTaskId } - , r => new { a = r.QuestionId, b = r.TaskId } - , (l, r) => new { question = l, global = r }) - .SelectMany(lr => lr.global.DefaultIfEmpty(), (lr, r) => new GlobalQuestionInfo - { - Answer = lr.global == null || lr.global.Count() == 0 ? - (inDto.UsingOriginalData ? lr.question.Answer : string.Empty) : - - (lr.global.Select(x => x.Answer).FirstOrDefault().IsNullOrEmpty() && inDto.UsingOriginalData ? - lr.question.Answer : lr.global.Select(x => x.Answer).FirstOrDefault() - ), - IsHaveChange = lr.global == null ? false : lr.global.Any(), - QuestionId = lr.question.QuestionId, - QuestionName = lr.question.QuestionName, - QuestionType = lr.question.QuestionType, - QuestionGenre = lr.question.QuestionGenre, - DictionaryCode = lr.question.DictionaryCode, - Type = lr.question.Type, - GlobalAnswerType=GlobalAnswerType.Question, - AnswerGroup = lr.question.AnswerGroup, - AnswerCombination = lr.question.AnswerCombination, - JudgeType = lr.question.JudgeType, - TypeValue = lr.question.TypeValue, - - }).ToList(); - - x.AgreeOrNot = new List() - { - new GlobalQuestionInfo() - { - Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).Select(x => x.Answer).FirstOrDefault() ?? "1", - QuestionName = "是否同意访视整体评估", - Type = "input", - GlobalAnswerType=GlobalAnswerType.AgreeOrNot, - - } - - }; - - List questionTypes = new List() - { - new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.UpdateType,QuestionName="评估更新类型" }, - new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.Reason,QuestionName="全局阅片备注" }, - //new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.AgreeOrNot,QuestionName="是否同意访视结果" }, - - }; - - - foreach (var item in questionTypes) - { - x.AfterQuestionList.Add(new GlobalQuestionInfo() - { - Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == item.GlobalAnswerType).Select(x => x.Answer).FirstOrDefault() ?? string.Empty, - QuestionName = item.QuestionName, - Type = "input", - GlobalAnswerType=item.GlobalAnswerType, - - }); - } - - - - }); - - - - return result; - } - #endregion #region 获取下一个阅片任务 /// @@ -1385,60 +1066,7 @@ namespace IRaCIS.Application.Services } #endregion - #region 配置裁判问题相关 - - /// - /// 获取项目标准的裁判问题 - /// - /// - /// - [HttpPost] - public async Task<(List, object)> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto) - { - var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id==inDto.TrialReadingCriterionId).FirstNotNullAsync(); - - var result = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion) - .WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null) - .WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null) - .Select(x => new GetTrialCriterionJudgeQuestionListOutDto() - { - AnswerGroup = JsonConvert.DeserializeObject>(x.AnswerGroup.IsNullOrEmpty() ? "[]" : x.AnswerGroup), - AnswerCombination = JsonConvert.DeserializeObject>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination), - QuestionName = x.QuestionName, - PageName = x.ReadingCriterionPage.PageName, - TypeValue = x.TypeValue, - JudgeType = x.JudgeType, - ReadingQuestionTrialId = x.Id - }).ToListAsync(); - - - return (result, new - { - IsSign = trialCriterion.ReadingInfoSignTime != null, - }); - - } - - /// - /// 设置裁判问题的答案分组 - /// - /// - /// - [HttpPost] - public async Task SetTrialCriterionJudgeQuestionAnswerGroup(SetTrialCriterionJudgeQuestionAnswerGroupInDto inDto) - { - await _readingQuestionTrialRepository.UpdatePartialFromQueryAsync(inDto.ReadingQuestionTrialId, x => new ReadingQuestionTrial() - { - AnswerGroup = JsonConvert.SerializeObject(inDto.AnswerGroup), - AnswerCombination = JsonConvert.SerializeObject(inDto.AnswerCombination), - JudgeType = inDto.JudgeType, - }); - - var result = await _readingQuestionTrialRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(result); - } - #endregion + @@ -1724,194 +1352,7 @@ namespace IRaCIS.Application.Services - #region 获取裁判阅片任务信息 - /// - /// 获取裁判阅片任务信息 - /// - /// - [HttpPost] - public async Task GetJudgeReadingInfo(GetJudgeReadingInfo inDto) - { - var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstOrDefaultAsync(); - GetJudgeReadingInfoOutDto judgeInfo = new GetJudgeReadingInfoOutDto() - { - ReadingTaskState = visitTask.ReadingTaskState, - JudgeResultTaskId = visitTask.JudgeResultTaskId, - JudgeResultRemark = visitTask.JudgeResultRemark, - JudgeResultImagePath = visitTask.JudgeResultImagePath, - VisitInfoList = new List() - }; - - var judgeDataInfo = await _readingJudgeInfoRepository.Where(x => x.JudgeTaskId == inDto.VisitTaskId).FirstNotNullAsync(); - - var taskids = new List(); - - taskids.Add(judgeDataInfo.TaskIdOne); - taskids.Add(judgeDataInfo.TaskIdTwo); - var taskList = await _visitTaskRepository.Where(x => taskids.Contains(x.Id)).OrderBy(x => x.ArmEnum).ToListAsync(); - judgeInfo.VisitTaskArmList = taskList.Select(x => new VisitTaskArm() - { - ArmEnum = x.ArmEnum, - VisitTaskId = x.Id - - }).ToList(); - var visitIds = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).Select(x => new - { - x.Id, - x.ArmEnum, - }).ToListAsync(); - - switch (taskList[0].ReadingCategory) - { - case ReadingCategory.Visit: - JudgeReadingInfoDto judgeReadingInfoDto = new JudgeReadingInfoDto() { - VisitId = taskList[0].SourceSubjectVisitId.Value, - VisitName = taskList[0].TaskBlindName, - VisitTaskInfoList = new List(), - }; - - foreach (var item in taskList) - { - judgeReadingInfoDto.VisitTaskInfoList.Add(new JudgeReadingQuestion() - { - ArmEnum = item.ArmEnum, - VisitTaskId = item.Id, - JudgeQuestionList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == item.Id && x.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(x => x.ReadingQuestionTrial.ShowOrder) - .Select(x => new JudgeQuestion() - { - Answer = x.Answer, - QuestionId = x.ReadingQuestionTrial.Id, - QuestionName = x.ReadingQuestionTrial.QuestionName - - }).ToListAsync(), - }); - } - judgeInfo.VisitInfoList.Add(judgeReadingInfoDto); - break; - - case ReadingCategory.Global: - var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() - { - UsingOriginalData = true, - VisitTaskId = taskList[0].Id - }); - - var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() - { - UsingOriginalData = true, - VisitTaskId = taskList[1].Id - }); - - - foreach (var item in taskOneInfo.TaskList) - { - GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault(); - - JudgeReadingInfoDto judgeReadingInfo = new JudgeReadingInfoDto() - { - VisitId = item.VisitId, - VisitName = item.VisitName, - VisitTaskInfoList = new List(), - }; - - var judgeReadingQuestion = new JudgeReadingQuestion() - { - ArmEnum = item.ArmEnum, - VisitTaskId = item.VisitTaskId, - GlobalVisitTaskId = taskList[0].Id, - JudgeQuestionList = item.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion() - { - - Answer = x.Answer, - QuestionId = x.QuestionId.Value, - QuestionName = x.QuestionName - }).ToList() - }; - - - - // 加全局是否更新 和访视点注释 - judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion() { - Answer = item.AfterQuestionList.Any(x => x.IsHaveChange), - QuestionType = JudgeReadingQuestionType.GlobalChange, - - }); - - judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion() - { - Answer = item.AfterQuestionList.Where(x => x.QuestionId == null).Select(x => x.Answer).FirstOrDefault(), - QuestionType = JudgeReadingQuestionType.VisitRemark, - - }); - - judgeReadingInfo.VisitTaskInfoList.Add(judgeReadingQuestion); - if (twoItem != null) - { - var rTwoJudge = new JudgeReadingQuestion() - { - ArmEnum = twoItem.ArmEnum, - VisitTaskId = twoItem.VisitTaskId, - GlobalVisitTaskId = taskList[1].Id, - JudgeQuestionList = twoItem.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion() - { - - Answer = x.Answer, - QuestionId = x.QuestionId.Value, - QuestionName = x.QuestionName - }).ToList() - }; - - // 加全局是否更新 和访视点注释 - rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() - { - Answer = twoItem.AfterQuestionList.Any(x => x.IsHaveChange), - QuestionType = JudgeReadingQuestionType.GlobalChange, - - }); - - rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() - { - Answer = twoItem.AfterQuestionList.Where(x => x.QuestionId == null).Select(x => x.Answer).FirstOrDefault(), - QuestionType = JudgeReadingQuestionType.VisitRemark, - - }); - - judgeReadingInfo.VisitTaskInfoList.Add(rTwoJudge); - } - - judgeInfo.VisitInfoList.Add(judgeReadingInfo); - - - } - - break; - } - - return judgeInfo; - - } - #endregion - - #region 保存裁判问题 - /// - /// 保存裁判问题 - /// - /// - /// - [HttpPost] - public async Task SaveJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto) - { - await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask() - { - JudgeResultTaskId = inDto.JudgeResultTaskId, - JudgeResultRemark = inDto.JudgeResultRemark, - JudgeResultImagePath = inDto.JudgeResultImagePath, - - }); - var result = await _visitTaskRepository.SaveChangesAsync(); - return ResponseOutput.Ok(result); - } - #endregion + @@ -2317,83 +1758,13 @@ namespace IRaCIS.Application.Services return ResponseOutput.Ok(true); } - /// - /// 提交裁判问题 - /// - /// - /// - [NonDynamicMethod] - public async Task SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto) - { - await VerifyTaskIsSign(inDto.VisitTaskId); - await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask() - { - JudgeResultTaskId = inDto.JudgeResultTaskId, - ReadingTaskState = ReadingTaskState.HaveSigned, - JudgeResultRemark = inDto.JudgeResultRemark, - SignTime = DateTime.Now, - JudgeResultImagePath = inDto.JudgeResultImagePath, - }); - - // 需要判断是否添加肿瘤学任务 - var taskInfo = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).FirstNotNullAsync(); - if (taskInfo.ReadingCategory == ReadingCategory.Global) - { - if (taskInfo.SouceReadModuleId == null) - { - throw new BusinessValidationFailedException($"当前裁判的全局任务的SouceId为null"); - } - - var visitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); - - var oncologModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == visitId && x.ModuleType == ModuleTypeEnum.Oncology).Select(x => x.Id).FirstOrDefaultAsync(); - - await AddOncologyTask(oncologModuleId); - - } + - var result = await _visitTaskRepository.SaveChangesAsync(); - return ResponseOutput.Ok(result); - } + - /// - /// 提交肿瘤阅片结果 - /// - /// - /// - [NonDynamicMethod] - public async Task SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto) - { - await VerifyTaskIsSign(inDto.OncologyTaskId); - //var result = await this.SaveGlobalReadingInfo(inDto); - - //await FinishReadUpdateState(inDto.OncologyTaskId); - await _visitTaskRepository.UpdatePartialFromQueryAsync( inDto.OncologyTaskId, x => new VisitTask() - { - ReadingTaskState = ReadingTaskState.HaveSigned, - SignTime = DateTime.Now, - }); - await _visitTaskRepository.SaveChangesAsync(); - return ResponseOutput.Ok(true); - } - - - /// - /// 提交全局阅片结果 - /// - /// - /// - //[NonDynamicMethod] - public async Task SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto) - { - //var result = await this.SaveGlobalReadingInfo(inDto); - await VerifyTaskIsSign(inDto.GlobalTaskId); - await this.SubmitTaskChangeState(inDto.GlobalTaskId); - - return ResponseOutput.Ok(true) ; - } + /// /// 签名提交任务修改状态 @@ -2492,413 +1863,10 @@ namespace IRaCIS.Application.Services } - /// - /// 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑 - /// - /// - [NonDynamicMethod] - public async Task AddOncologyTask(Guid oncologModuleId) - { + - // 判断是否读片完成 - var finishReading = false; - - - var readModuleInfo = await _readModuleRepository.Where(x => x.Id == oncologModuleId && x.ModuleType == ModuleTypeEnum.Oncology).FirstOrDefaultAsync(); - - - - // 如果当前是肿瘤学 - if (readModuleInfo != null) - { - // 先找到对应的全局阅片模块Id - var globalreadModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == readModuleInfo.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).FirstOrDefaultAsync(); - - // 找到一个全局阅片任务是否有裁判任务 - - var judgeVisitTaskId = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect - && x.ReadingCategory == ReadingCategory.Global - && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.JudgeVisitTaskId).FirstOrDefaultAsync(); - - // 获取系统配置 - var readingType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModuleInfo.TrialReadingCriterionId).Select(x => x.ReadingType).FirstOrDefaultAsync(); - - // 判断阅片是否完成 - if (judgeVisitTaskId == null && (await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Global - && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate && x.TrialReadingCriterionId == readModuleInfo.TrialReadingCriterionId - ).CountAsync() == (int)readingType)) - { - - finishReading = true; - } - else if (judgeVisitTaskId != null && (await _visitTaskRepository.AnyAsync(x => x.Id == judgeVisitTaskId.Value && x.ReadingTaskState == ReadingTaskState.HaveSigned))) - { - finishReading = true; - } - - if (finishReading) - { - // 获取临床数据 - var clinicalData = await _readingClinicalDataService.GetReadingClinicalList(new GetReadingClinicalDataListIndto() - { - SubjectId = readModuleInfo.SubjectId, - ReadingId = readModuleInfo.Id, - TrialId = readModuleInfo.TrialId, - - }); - - // 判断是否临床数据都已经签名 - if (!clinicalData.Any(x => !x.IsSign)) - { - - List needReadList = new List(); - - needReadList.Add(new ReadingGenerataTaskDTO() - { - IsUrgent = readModuleInfo.IsUrgent ?? false, - SubjectId = readModuleInfo.SubjectId, - ReadingName = readModuleInfo.ModuleName, - VisitNum = readModuleInfo.VisitNum, - ReadModuleId = readModuleInfo.Id, - ReadingCategory = ReadingCategory.Oncology, - }); - - await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() - { - - ReadingCategory = GenerateTaskCategory.Oncology, - TrialId = readModuleInfo.TrialId, - ReadingGenerataTaskList = needReadList - }); - } - } - - - - } - } - - #endregion - - - - #region 阅片任务 -裁判任务的生成和触发 - - - - - - /// - /// 添加裁判任务 - /// - /// - private async Task SaveJudgeTask(SaveJudgeTaskDto inDto) - { - var trialId = await _visitTaskRepository.Where(x => inDto.VisitTaskIds.Contains(x.Id)).Select(x => x.TrialId).FirstOrDefaultAsync(); - - await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() - { - JudgeVisitTaskIdList = inDto.VisitTaskIds, - ReadingCategory = GenerateTaskCategory.Judge, - TrialId = trialId - }); - } - - - - /// - /// 触发裁判任务(新) - /// - /// - /// - private async Task TriggerJudgeQuestion(Guid visitTaskId) - { - List visitTaskids = new List(); - - var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).AsNoTracking().FirstNotNullAsync(); - - // 判断是否是一致性核查产生 - if (visitTask.IsAnalysisCreate) - { - visitTaskids = await _visitTaskRepository.Where(x => x.ArmEnum == visitTask.ArmEnum && x.TaskState == TaskState.Effect && x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId - && x.SouceReadModuleId == visitTask.SouceReadModuleId && x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.Id).ToListAsync(); - - } - else - { - // 这里是非一致性分析产生的 - visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge - && x.TaskState == TaskState.Effect - && x.IsAnalysisCreate == false - && x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && x.SouceReadModuleId == visitTask.SouceReadModuleId).Select(x => x.Id).ToListAsync(); - } - - - var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == visitTask.TrialReadingCriterionId).Select(x => new - { - x.IsArbitrationReading, - x.ArbitrationRule - }).FirstNotNullAsync(); - - var noteEqual = false; - - // 判断项目是否设置了裁判 - if (criterionInfo.IsArbitrationReading) - { - // 判断数量是否为2 是否仲裁 - if (visitTaskids.Count == 2) - { - switch (visitTask.ReadingCategory) - { - // 访视 - 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() - { - 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 - { - 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.ReadingCategory == ReadingCategory.Global && visitTask.IsAnalysisCreate && (visitTask.IsSelfAnalysis ?? false)) - { - var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() - { - UsingOriginalData = true, - VisitTaskId = visitTask.Id - }); - - // 找到最后一个任务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 && criterionInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && criterionInfo.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; - } - - #endregion + #region 阅片任务 签名验证 diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs new file mode 100644 index 000000000..298817c40 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -0,0 +1,617 @@ +using IRaCIS.Core.Domain.Share; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Application.Service.Reading.Dto; +using MassTransit; +using IRaCIS.Core.Infra.EFCore.Common; +using Panda.DynamicWebApi.Attributes; +using AutoMapper; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Infrastructure; +using Newtonsoft.Json; +using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Application.ViewModel; + +namespace IRaCIS.Application.Services +{ + + /// + /// 裁判 + /// + public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService + { + #region 配置裁判问题相关 + + /// + /// 获取项目标准的裁判问题 + /// + /// + /// + [HttpPost] + public async Task<(List, object)> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto) + { + var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync(); + + var result = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion) + .WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null) + .WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null) + .Select(x => new GetTrialCriterionJudgeQuestionListOutDto() + { + AnswerGroup = JsonConvert.DeserializeObject>(x.AnswerGroup.IsNullOrEmpty() ? "[]" : x.AnswerGroup), + AnswerCombination = JsonConvert.DeserializeObject>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination), + QuestionName = x.QuestionName, + PageName = x.ReadingCriterionPage.PageName, + TypeValue = x.TypeValue, + JudgeType = x.JudgeType, + ReadingQuestionTrialId = x.Id + }).ToListAsync(); + + + return (result, new + { + IsSign = trialCriterion.ReadingInfoSignTime != null, + }); + + } + + /// + /// 设置裁判问题的答案分组 + /// + /// + /// + [HttpPost] + public async Task SetTrialCriterionJudgeQuestionAnswerGroup(SetTrialCriterionJudgeQuestionAnswerGroupInDto inDto) + { + await _readingQuestionTrialRepository.UpdatePartialFromQueryAsync(inDto.ReadingQuestionTrialId, x => new ReadingQuestionTrial() + { + AnswerGroup = JsonConvert.SerializeObject(inDto.AnswerGroup), + AnswerCombination = JsonConvert.SerializeObject(inDto.AnswerCombination), + JudgeType = inDto.JudgeType, + }); + + var result = await _readingQuestionTrialRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(result); + } + #endregion + + + #region 获取裁判阅片任务信息 + /// + /// 获取裁判阅片任务信息 + /// + /// + [HttpPost] + public async Task GetJudgeReadingInfo(GetJudgeReadingInfo inDto) + { + var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstOrDefaultAsync(); + GetJudgeReadingInfoOutDto judgeInfo = new GetJudgeReadingInfoOutDto() + { + ReadingTaskState = visitTask.ReadingTaskState, + JudgeResultTaskId = visitTask.JudgeResultTaskId, + JudgeResultRemark = visitTask.JudgeResultRemark, + JudgeResultImagePath = visitTask.JudgeResultImagePath, + VisitInfoList = new List() + }; + + var judgeDataInfo = await _readingJudgeInfoRepository.Where(x => x.JudgeTaskId == inDto.VisitTaskId).FirstNotNullAsync(); + + var taskids = new List(); + + taskids.Add(judgeDataInfo.TaskIdOne); + taskids.Add(judgeDataInfo.TaskIdTwo); + var taskList = await _visitTaskRepository.Where(x => taskids.Contains(x.Id)).OrderBy(x => x.ArmEnum).ToListAsync(); + judgeInfo.VisitTaskArmList = taskList.Select(x => new VisitTaskArm() + { + ArmEnum = x.ArmEnum, + VisitTaskId = x.Id + + }).ToList(); + var visitIds = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).Select(x => new + { + x.Id, + x.ArmEnum, + }).ToListAsync(); + + switch (taskList[0].ReadingCategory) + { + case ReadingCategory.Visit: + JudgeReadingInfoDto judgeReadingInfoDto = new JudgeReadingInfoDto() + { + VisitId = taskList[0].SourceSubjectVisitId.Value, + VisitName = taskList[0].TaskBlindName, + VisitTaskInfoList = new List(), + }; + + foreach (var item in taskList) + { + judgeReadingInfoDto.VisitTaskInfoList.Add(new JudgeReadingQuestion() + { + ArmEnum = item.ArmEnum, + VisitTaskId = item.Id, + JudgeQuestionList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == item.Id && x.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(x => x.ReadingQuestionTrial.ShowOrder) + .Select(x => new JudgeQuestion() + { + Answer = x.Answer, + QuestionId = x.ReadingQuestionTrial.Id, + QuestionName = x.ReadingQuestionTrial.QuestionName + + }).ToListAsync(), + }); + } + judgeInfo.VisitInfoList.Add(judgeReadingInfoDto); + break; + + case ReadingCategory.Global: + var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() + { + UsingOriginalData = true, + VisitTaskId = taskList[0].Id + }); + + var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() + { + UsingOriginalData = true, + VisitTaskId = taskList[1].Id + }); + + + foreach (var item in taskOneInfo.TaskList) + { + GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault(); + + JudgeReadingInfoDto judgeReadingInfo = new JudgeReadingInfoDto() + { + VisitId = item.VisitId, + VisitName = item.VisitName, + VisitTaskInfoList = new List(), + }; + + var judgeReadingQuestion = new JudgeReadingQuestion() + { + ArmEnum = item.ArmEnum, + VisitTaskId = item.VisitTaskId, + GlobalVisitTaskId = taskList[0].Id, + JudgeQuestionList = item.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion() + { + + Answer = x.Answer, + QuestionId = x.QuestionId.Value, + QuestionName = x.QuestionName + }).ToList() + }; + + + + // 加全局是否更新 和访视点注释 + judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion() + { + Answer = item.AfterQuestionList.Any(x => x.IsHaveChange), + QuestionType = JudgeReadingQuestionType.GlobalChange, + + }); + + judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion() + { + Answer = item.AfterQuestionList.Where(x => x.QuestionId == null).Select(x => x.Answer).FirstOrDefault(), + QuestionType = JudgeReadingQuestionType.VisitRemark, + + }); + + judgeReadingInfo.VisitTaskInfoList.Add(judgeReadingQuestion); + if (twoItem != null) + { + var rTwoJudge = new JudgeReadingQuestion() + { + ArmEnum = twoItem.ArmEnum, + VisitTaskId = twoItem.VisitTaskId, + GlobalVisitTaskId = taskList[1].Id, + JudgeQuestionList = twoItem.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion() + { + + Answer = x.Answer, + QuestionId = x.QuestionId.Value, + QuestionName = x.QuestionName + }).ToList() + }; + + // 加全局是否更新 和访视点注释 + rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() + { + Answer = twoItem.AfterQuestionList.Any(x => x.IsHaveChange), + QuestionType = JudgeReadingQuestionType.GlobalChange, + + }); + + rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() + { + Answer = twoItem.AfterQuestionList.Where(x => x.QuestionId == null).Select(x => x.Answer).FirstOrDefault(), + QuestionType = JudgeReadingQuestionType.VisitRemark, + + }); + + judgeReadingInfo.VisitTaskInfoList.Add(rTwoJudge); + } + + judgeInfo.VisitInfoList.Add(judgeReadingInfo); + + + } + + break; + } + + return judgeInfo; + + } + #endregion + + #region 保存裁判问题 + /// + /// 保存裁判问题 + /// + /// + /// + [HttpPost] + public async Task SaveJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto) + { + await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask() + { + JudgeResultTaskId = inDto.JudgeResultTaskId, + JudgeResultRemark = inDto.JudgeResultRemark, + JudgeResultImagePath = inDto.JudgeResultImagePath, + + }); + var result = await _visitTaskRepository.SaveChangesAsync(); + return ResponseOutput.Ok(result); + } + #endregion + + + /// + /// 提交裁判问题 + /// + /// + /// + [NonDynamicMethod] + public async Task SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto) + { + await VerifyTaskIsSign(inDto.VisitTaskId); + await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask() + { + JudgeResultTaskId = inDto.JudgeResultTaskId, + ReadingTaskState = ReadingTaskState.HaveSigned, + JudgeResultRemark = inDto.JudgeResultRemark, + SignTime = DateTime.Now, + JudgeResultImagePath = inDto.JudgeResultImagePath, + }); + + // 需要判断是否添加肿瘤学任务 + var taskInfo = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).FirstNotNullAsync(); + if (taskInfo.ReadingCategory == ReadingCategory.Global) + { + if (taskInfo.SouceReadModuleId == null) + { + throw new BusinessValidationFailedException($"当前裁判的全局任务的SouceId为null"); + } + + var visitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); + + var oncologModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == visitId && x.ModuleType == ModuleTypeEnum.Oncology).Select(x => x.Id).FirstOrDefaultAsync(); + + await AddOncologyTask(oncologModuleId); + + } + + + var result = await _visitTaskRepository.SaveChangesAsync(); + return ResponseOutput.Ok(result); + } + + /// + /// 触发裁判任务(新) + /// + /// + /// + private async Task TriggerJudgeQuestion(Guid visitTaskId) + { + List visitTaskids = new List(); + + var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).AsNoTracking().FirstNotNullAsync(); + + // 判断是否是一致性核查产生 + if (visitTask.IsAnalysisCreate) + { + visitTaskids = await _visitTaskRepository.Where(x => x.ArmEnum == visitTask.ArmEnum && x.TaskState == TaskState.Effect && x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId + && x.SouceReadModuleId == visitTask.SouceReadModuleId && x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.Id).ToListAsync(); + + } + else + { + // 这里是非一致性分析产生的 + visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge + && x.TaskState == TaskState.Effect + && x.IsAnalysisCreate == false + && x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && x.SouceReadModuleId == visitTask.SouceReadModuleId).Select(x => x.Id).ToListAsync(); + } + + + var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == visitTask.TrialReadingCriterionId).Select(x => new + { + x.IsArbitrationReading, + x.ArbitrationRule + }).FirstNotNullAsync(); + + var noteEqual = false; + + // 判断项目是否设置了裁判 + if (criterionInfo.IsArbitrationReading) + { + // 判断数量是否为2 是否仲裁 + if (visitTaskids.Count == 2) + { + switch (visitTask.ReadingCategory) + { + // 访视 + 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() + { + 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 + { + 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.ReadingCategory == ReadingCategory.Global && visitTask.IsAnalysisCreate && (visitTask.IsSelfAnalysis ?? false)) + { + var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() + { + UsingOriginalData = true, + VisitTaskId = visitTask.Id + }); + + // 找到最后一个任务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 && criterionInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && criterionInfo.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; + } + + /// + /// 添加裁判任务 + /// + /// + private async Task SaveJudgeTask(SaveJudgeTaskDto inDto) + { + var trialId = await _visitTaskRepository.Where(x => inDto.VisitTaskIds.Contains(x.Id)).Select(x => x.TrialId).FirstOrDefaultAsync(); + + await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() + { + JudgeVisitTaskIdList = inDto.VisitTaskIds, + ReadingCategory = GenerateTaskCategory.Judge, + TrialId = trialId + }); + } + } +} diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs new file mode 100644 index 000000000..61f91fe24 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs @@ -0,0 +1,283 @@ +using IRaCIS.Core.Domain.Share; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Application.Service.Reading.Dto; +using MassTransit; +using IRaCIS.Core.Infra.EFCore.Common; +using Panda.DynamicWebApi.Attributes; +using AutoMapper; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Infrastructure; +using Newtonsoft.Json; +using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Application.ViewModel; + +namespace IRaCIS.Application.Services +{ + + /// + /// 肿瘤学 + /// + public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService + { + #region 肿瘤学阅片相关 + + /// + /// 获取肿瘤学任务信息 + /// + /// + /// + /// + [HttpPost] + public async Task GetOncologyReadingInfo(GetOncologyReadingInfoInDto inDto) + { + var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); + + if (taskInfo.ReadingCategory != ReadingCategory.Oncology) + { + throw new BusinessValidationFailedException("当前任务不是肿瘤学任务"); + } + + var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).FirstOrDefaultAsync(); + + + GetOncologyReadingInfoOutDto result = new GetOncologyReadingInfoOutDto() + { + TrialEvaluationResult = trialCriterion.EvaluationResult, + IsShowDetail = trialCriterion.IsShowDetail, + TrialEvaluationReason = trialCriterion.EvaluationReason.IsNullOrEmpty() ? ReadingCommon.EvaluationReason : trialCriterion.EvaluationReason, + OncologyTaskId = inDto.VisitTaskId, + ReadingTaskState = taskInfo.ReadingTaskState, + }; + + // 先找到是R1还是R2的阅片 先找到全局阅片 + + var globalTaskInfo = await _visitTaskRepository + .Where(x => x.SubjectId == taskInfo.SubjectId && + x.TaskState == TaskState.Effect && + x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && + x.ReadingCategory == ReadingCategory.Global && + x.VisitTaskNum < taskInfo.VisitTaskNum + ).OrderByDescending(x => x.VisitTaskNum) + .FirstNotNullAsync(); + + + // 最后取哪组的数据 + VisitTask visitTask = new VisitTask(); + + // 判断是否产生裁判 + + if (globalTaskInfo.JudgeVisitTaskId == null) + { + visitTask = globalTaskInfo; + } + else + { + var judgeResultTaskId = await _visitTaskRepository.Where(x => x.Id == globalTaskInfo.JudgeVisitTaskId).Select(x => x.JudgeResultTaskId).FirstOrDefaultAsync(); + if (judgeResultTaskId == null) + { + throw new BusinessValidationFailedException("异常,裁判结果为null"); + } + visitTask = await _visitTaskRepository.Where(x => x.Id == judgeResultTaskId).FirstOrDefaultAsync(); + } + + result.GlobalTaskId = visitTask.Id; + result.SubjectId = visitTask.SubjectId; + + // 获取全局阅片信息 + var globalTaskReadingInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() + { + UsingOriginalData = true, + VisitTaskId = visitTask.Id + }); + + + // 找到对应的访视 + List oncologyVisits = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && + x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && + x.SubjectId == visitTask.SubjectId && x.IsAnalysisCreate == visitTask.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < visitTask.VisitTaskNum) + .Where(x => x.DoctorUserId == visitTask.DoctorUserId) + .OrderBy(x => x.VisitTaskNum).Select(x => new OncologyVisitTaskInfo() + { + VisitName = x.SourceSubjectVisit.VisitName, + VisitTaskId = x.Id, + // QuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) + //.Select(y => new OncologyQuestion() + //{ + // QuestionId = y.ReadingQuestionTrialId, + // QuestionName = y.ReadingQuestionTrial.QuestionName, + // Answer = y.GlobalChangeAnswer + //}).ToList() + }).ToListAsync(); + + var oncologyReadingQuestions = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == inDto.VisitTaskId).ToListAsync(); + + oncologyVisits.ForEach(x => + { + var oncologyData = oncologyReadingQuestions.Where(y => y.VisitTaskId == x.VisitTaskId).FirstOrDefault(); + + if (oncologyData != null) + { + x.EvaluationResult = oncologyData.EvaluationResult; + x.EvaluationReason = oncologyData.EvaluationReason; + } + x.QuestionList = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(x => x.QuestionId != null) + .Select(y => new OncologyQuestion + { + QuestionId = y.QuestionId ?? default(Guid), + QuestionName = y.QuestionName, + Answer = y.Answer + }).ToList(); + x.IsHaveChange = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Any(y => y.IsHaveChange); + x.VisitRemark = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(y => y.QuestionId == null).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; + + }); + + result.OncologyVisits = oncologyVisits; + return result; + + } + + /// + /// 修改肿瘤学阅片信息 + /// + /// + /// + [HttpPost] + public async Task SetOncologyReadingInfo(SetOncologyReadingInfoInDto inDto) + { + await _readingOncologyTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.OncologyTaskId == inDto.OncologyTaskId); + + var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.OncologyTaskId).FirstNotNullAsync(); + + List readingOncologies = inDto.OncologyQuestionList.Select(x => new ReadingOncologyTaskInfo() + { + EvaluationReason = x.EvaluationReason, + SubjectId = taskInfo.SubjectId, + EvaluationResult = x.EvaluationResult, + OncologyTaskId = inDto.OncologyTaskId, + TrialId = taskInfo.TrialId, + VisitTaskId = x.VisitTaskId + }).ToList(); + + await _readingOncologyTaskInfoRepository.AddRangeAsync(readingOncologies); + + await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading }); + + var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(result); + + + } + #endregion + + + /// + /// 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑 + /// + /// + [NonDynamicMethod] + public async Task AddOncologyTask(Guid oncologModuleId) + { + + // 判断是否读片完成 + var finishReading = false; + + + var readModuleInfo = await _readModuleRepository.Where(x => x.Id == oncologModuleId && x.ModuleType == ModuleTypeEnum.Oncology).FirstOrDefaultAsync(); + + + + // 如果当前是肿瘤学 + if (readModuleInfo != null) + { + // 先找到对应的全局阅片模块Id + var globalreadModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == readModuleInfo.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).FirstOrDefaultAsync(); + + // 找到一个全局阅片任务是否有裁判任务 + + var judgeVisitTaskId = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect + && x.ReadingCategory == ReadingCategory.Global + && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.JudgeVisitTaskId).FirstOrDefaultAsync(); + + // 获取系统配置 + var readingType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModuleInfo.TrialReadingCriterionId).Select(x => x.ReadingType).FirstOrDefaultAsync(); + + // 判断阅片是否完成 + if (judgeVisitTaskId == null && (await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Global + && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate && x.TrialReadingCriterionId == readModuleInfo.TrialReadingCriterionId + ).CountAsync() == (int)readingType)) + { + + finishReading = true; + } + else if (judgeVisitTaskId != null && (await _visitTaskRepository.AnyAsync(x => x.Id == judgeVisitTaskId.Value && x.ReadingTaskState == ReadingTaskState.HaveSigned))) + { + finishReading = true; + } + + if (finishReading) + { + // 获取临床数据 + var clinicalData = await _readingClinicalDataService.GetReadingClinicalList(new GetReadingClinicalDataListIndto() + { + SubjectId = readModuleInfo.SubjectId, + ReadingId = readModuleInfo.Id, + TrialId = readModuleInfo.TrialId, + + }); + + // 判断是否临床数据都已经签名 + if (!clinicalData.Any(x => !x.IsSign)) + { + + List needReadList = new List(); + + needReadList.Add(new ReadingGenerataTaskDTO() + { + IsUrgent = readModuleInfo.IsUrgent ?? false, + SubjectId = readModuleInfo.SubjectId, + ReadingName = readModuleInfo.ModuleName, + VisitNum = readModuleInfo.VisitNum, + ReadModuleId = readModuleInfo.Id, + ReadingCategory = ReadingCategory.Oncology, + }); + + await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() + { + + ReadingCategory = GenerateTaskCategory.Oncology, + TrialId = readModuleInfo.TrialId, + ReadingGenerataTaskList = needReadList + }); + } + } + + + + } + } + + + /// + /// 提交肿瘤阅片结果 + /// + /// + /// + [NonDynamicMethod] + public async Task SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto) + { + await VerifyTaskIsSign(inDto.OncologyTaskId); + //var result = await this.SaveGlobalReadingInfo(inDto); + + //await FinishReadUpdateState(inDto.OncologyTaskId); + await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.OncologyTaskId, x => new VisitTask() + { + ReadingTaskState = ReadingTaskState.HaveSigned, + SignTime = DateTime.Now, + }); + await _visitTaskRepository.SaveChangesAsync(); + return ResponseOutput.Ok(true); + } + } +}