790 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			790 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C#
		
	
	
| using IRaCIS.Application.Interfaces;
 | |
| using IRaCIS.Core.Infra.EFCore;
 | |
| using IRaCIS.Core.Domain.Share;
 | |
| using IRaCIS.Core.Application.Filter;
 | |
| using Microsoft.AspNetCore.Mvc;
 | |
| using IRaCIS.Core.Application.Service.WorkLoad.DTO;
 | |
| using Microsoft.AspNetCore.Authorization;
 | |
| using IRaCIS.Core.Application.Auth;
 | |
| using IRaCIS.Core.Application.Service.Reading.Dto;
 | |
| using MassTransit;
 | |
| using IRaCIS.Core.Application.Service.Reading;
 | |
| 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
 | |
| {
 | |
|     /// <summary>
 | |
|     /// IR影像阅片
 | |
|     /// </summary>
 | |
|     [ApiExplorerSettings(GroupName = "Reading")]
 | |
|     public class ReadingImageTaskService : BaseService, IReadingImageTaskService
 | |
|     {
 | |
|       
 | |
|         private readonly IRepository<NoneDicomStudy> _noneDicomStudyRepository;
 | |
|         private readonly IRepository<VisitTask> _visitTaskRepository;
 | |
|         private readonly IRepository<Trial> _trialRepository;
 | |
|         private readonly IVisitTaskHelpeService _visitTaskHelpeService;
 | |
|         private readonly IReadingClinicalDataService _readingClinicalDataService;
 | |
|         private readonly IRepository<SubjectVisit> _subjectVisitRepository;
 | |
|         private readonly IRepository<Subject> _subjectRepository;
 | |
|         private readonly IRepository<ReadingJudgeInfo> _readingJudgeInfoRepository;
 | |
|         private readonly IRepository<ReadModule> _readModuleRepository;
 | |
|         private readonly IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository;
 | |
|         private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository;
 | |
|         private readonly IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository;
 | |
| 
 | |
| 
 | |
|         public ReadingImageTaskService(
 | |
|                   IMapper mapper,
 | |
|                   IRepository<NoneDicomStudy> noneDicomStudyRepository,
 | |
|                   IRepository<VisitTask> visitTaskRepository,
 | |
|                   IRepository<Trial> TrialRepository,
 | |
|                   IVisitTaskHelpeService visitTaskHelpeService,
 | |
|                   IReadingClinicalDataService readingClinicalDataService,
 | |
|                   IRepository<SubjectVisit> subjectVisitRepository,
 | |
|                   IRepository<Subject> subjectRepository,
 | |
|                   IRepository<ReadingJudgeInfo> readingJudgeInfoRepository,
 | |
|                   IRepository<ReadModule> readModuleRepository,
 | |
|                   IRepository<ReadingTaskQuestionAnswer> readingTaskQuestionAnswerRepository,
 | |
|                   IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository,
 | |
|                   IRepository<ReadingQuestionTrial> readingQuestionTrialRepository
 | |
|           )
 | |
|         {
 | |
|             base._mapper = mapper;
 | |
|             this._noneDicomStudyRepository = noneDicomStudyRepository;
 | |
|             this._visitTaskRepository = visitTaskRepository;
 | |
|             this._trialRepository = TrialRepository;
 | |
|             this._visitTaskHelpeService = visitTaskHelpeService;
 | |
|             this._readingClinicalDataService = readingClinicalDataService;
 | |
|             this._subjectVisitRepository = subjectVisitRepository;
 | |
|             this._subjectRepository = subjectRepository;
 | |
|             this._readingJudgeInfoRepository = readingJudgeInfoRepository;
 | |
|             this._readModuleRepository = readModuleRepository;
 | |
|             this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
 | |
|             this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
 | |
|             this._readingQuestionTrialRepository = readingQuestionTrialRepository;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取下一个阅片任务
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<GetReadingTaskDto> GetNextTask(GetNextTaskInDto inDto)
 | |
|         {
 | |
|             GetReadingTaskDto? task = new GetReadingTaskDto();
 | |
| 
 | |
|             if (inDto.VisistTaskId != null)
 | |
|             {
 | |
|                 task = await _visitTaskRepository.Where(x => x.Id== inDto.VisistTaskId).Select(x => new GetReadingTaskDto()
 | |
|                 {
 | |
|                     VisitTaskId = x.Id,
 | |
|                     TaskBlindName = x.TaskBlindName,
 | |
|                     SubjectId=x.SubjectId,
 | |
|                     ReadingCategory = x.ReadingCategory,
 | |
|                     VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId,
 | |
|                     VisitNum = x.SourceSubjectVisitId != null ? x.SourceSubjectVisit.VisitNum : x.ReadModule.VisitNum,
 | |
| 
 | |
|                 }).FirstOrDefaultAsync();
 | |
|               
 | |
|             }
 | |
|             else if (inDto.SubjectId != null)
 | |
|             {
 | |
|                 var subjectList =await  _subjectRepository.Where(t => t.TrialId == inDto.TrialId)
 | |
|                  .Where(t => t.SubjectDoctorList.Any(t => t.DoctorUserId == _userInfo.Id))
 | |
|                  .Select(s => new SubjectTask()
 | |
|                  {
 | |
|                      SubjectId = s.Id,
 | |
|                      UnReadTaskCount = s.SubjectVisitTaskList.Count(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.DoctorUserId == _userInfo.Id),
 | |
|                  }).ToListAsync();
 | |
|                 subjectList = subjectList.Select((x, index) => new SubjectTask()
 | |
|                 {
 | |
|                     Index = index,
 | |
|                     SubjectId = x.SubjectId,
 | |
|                     UnReadTaskCount = x.UnReadTaskCount,
 | |
|                 }).ToList();
 | |
| 
 | |
| 
 | |
|                var subjectIndex = subjectList.Where(x => x.SubjectId == inDto.SubjectId).Select(x=>x.Index).FirstOrDefault();
 | |
|                 var newSubjectId = subjectList.Where(x => x.Index >= subjectIndex && x.UnReadTaskCount != 0).Select(x=>x.SubjectId).FirstOrDefault();
 | |
| 
 | |
|                 var taskquery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.SubjectId == newSubjectId && x.DoctorUserId == _userInfo.Id).Select(x => new GetReadingTaskDto()
 | |
|                 {
 | |
|                     VisitTaskId = x.Id,
 | |
|                     TaskBlindName=x.TaskBlindName,
 | |
|                     ReadingCategory = x.ReadingCategory,
 | |
|                     VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId,
 | |
|                     VisitNum = x.SourceSubjectVisitId != null ? x.SourceSubjectVisit.VisitNum : x.ReadModule.VisitNum,
 | |
|                 }).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory);
 | |
| 
 | |
|                 task =await taskquery.FirstOrDefaultAsync();
 | |
|                 if (task == null)
 | |
|                 {
 | |
|                     throw new BusinessValidationFailedException("任务都已经完成");
 | |
|                 }
 | |
|                 task.SubjectId = inDto.SubjectId.Value;
 | |
| 
 | |
| 
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 task = await _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.DoctorUserId == _userInfo.Id).Select(x => new GetReadingTaskDto()
 | |
|                 {
 | |
|                     VisitTaskId = x.Id,
 | |
|                     TaskBlindName = x.TaskBlindName,
 | |
|                     ReadingCategory = x.ReadingCategory,
 | |
|                     VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId,
 | |
|                     VisitNum = x.SourceSubjectVisitId != null ? x.SourceSubjectVisit.VisitNum : x.ReadModule.VisitNum,
 | |
|                     SubjectId=x.SubjectId,
 | |
|                     SubjectCode=x.Subject.Code,
 | |
|                 }).FirstOrDefaultAsync();
 | |
|                 if (task == null)
 | |
|                 {
 | |
|                     throw new BusinessValidationFailedException("任务都已经完成");
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (task.SubjectCode.IsNullOrEmpty())
 | |
|             {
 | |
|                 task.SubjectCode = await _subjectRepository.Where(x => x.Id == task.SubjectId).Select(x => x.Code).FirstOrDefaultAsync();
 | |
|             }
 | |
| 
 | |
|             await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == task.VisitTaskId && x.FirstReadingTime == null, x => new VisitTask()
 | |
|             {
 | |
|                 FirstReadingTime = DateTime.Now,
 | |
|             });
 | |
|             await _visitTaskRepository.SaveChangesAsync();
 | |
|             return task;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取阅片非Dicom文件
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<(List<NoneDicomStudyView>,object)> GetReadingImageFile(GetReadingImgInDto inDto)
 | |
|         {
 | |
|             var task=await GetNextTask( new GetNextTaskInDto() { 
 | |
|              TrialId=inDto.TrialId,
 | |
|              SubjectId=inDto.SubjectId,
 | |
|              VisistTaskId=inDto.VisistTaskId,
 | |
|             });
 | |
|             List<Guid> visitIds = new List<Guid>();
 | |
|             if (task.ReadingCategory == ReadingCategory.Visit)
 | |
|             {
 | |
|                 visitIds.Add(task.VisistId);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 // 阅片期取前面所有的图像
 | |
|                 visitIds.AddRange(await _subjectVisitRepository.Where(x => x.VisitNum <= task.VisitNum && x.SubjectId == task.SubjectId).Select(x => x.Id).ToListAsync());
 | |
|             }
 | |
|             List<NoneDicomStudyView> result=await _noneDicomStudyRepository.Where(t => visitIds.Contains(t.SubjectVisitId))
 | |
|                 .ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync();
 | |
| 
 | |
|             var trialInfo = await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new
 | |
|             {
 | |
|                 x.IsReadingShowPreviousResults,
 | |
|                 x.IsReadingShowSubjectInfo,
 | |
|                 x.ClinicalInformationTransmissionEnum,
 | |
|             }).FirstOrDefaultAsync();
 | |
| 
 | |
|             #region 临床数据
 | |
| 
 | |
|             #endregion
 | |
|             bool isExistsClinicalData = false;
 | |
|             if (trialInfo.ClinicalInformationTransmissionEnum == 1)
 | |
|             {
 | |
|                 isExistsClinicalData = (await _readingClinicalDataService.GetClinicalDataList(new GetReadingOrTaskClinicalDataListInDto()
 | |
|                 {
 | |
| 
 | |
|                     SubjectId = task.SubjectId,
 | |
|                     TrialId = inDto.TrialId,
 | |
|                     VisitTaskId = task.VisitTaskId,
 | |
|                 })).Count() > 0;
 | |
|             }
 | |
|       
 | |
| 
 | |
|           
 | |
| 
 | |
|             return (result, new  { 
 | |
|             VisitTaskId= task.VisitTaskId,
 | |
|             SubjectId=task.SubjectId,
 | |
|             SubjectCode=task.SubjectCode,
 | |
|             ReadingCategory= task.ReadingCategory,
 | |
|             TaskBlindName=task.TaskBlindName,
 | |
|             IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults,
 | |
|             IsReadingShowSubjectInfo=trialInfo.IsReadingShowSubjectInfo,
 | |
|             IsExistsClinicalData= isExistsClinicalData,
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取项目已确认的标准
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<List<GetTrialConfirmCriterionListOutDto>> GetTrialConfirmCriterionList(GetConfirmCriterionInDto inDto)
 | |
|         {
 | |
|             var result= await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId&&x.IsConfirm&&x.IsCompleteConfig)
 | |
|                .Select(x => new GetTrialConfirmCriterionListOutDto()
 | |
|                {
 | |
|                    ReadingQuestionCriterionTrialId = x.Id,
 | |
|                    ReadingQuestionCriterionTrialName = x.CriterionName
 | |
|                }).ToListAsync();
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取项目标准的裁判问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<List<GetTrialCriterionJudgeQuestionListOutDto>> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto)
 | |
|         {
 | |
|             var result = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId && x.IsJudgeQuestion)
 | |
|                 .Select(x => new GetTrialCriterionJudgeQuestionListOutDto()
 | |
|                 {
 | |
|                     AnswerGroup = JsonConvert.DeserializeObject<List<string>>(x.AnswerGroup.IsNullOrEmpty()?"[]": x.AnswerGroup),
 | |
|                     AnswerCombination = JsonConvert.DeserializeObject<List<AnswerCombinationDto>>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination),
 | |
|                     QuestionName = x.QuestionName,
 | |
|                     TypeValue =x.TypeValue,
 | |
|                     JudgeType=x.JudgeType,
 | |
|                     ReadingQuestionTrialId = x.Id
 | |
|                 }).ToListAsync();
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 设置裁判问题的答案分组
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<IResponseOutput> 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);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取项目的阅片问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<(List<GetTrialReadingQuestionOutDto>, object)> GetTrialReadingQuestion(GetTrialReadingQuestionInDto inDto)
 | |
|         {
 | |
| 
 | |
|          var readingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync();
 | |
|          var query=  from data in _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId==inDto.ReadingQuestionCriterionTrialId)
 | |
|                      join questionAnswer in _readingTaskQuestionAnswerRepository.Where(x=>x.VisitTaskId==inDto.VisitTaskId) on data.Id equals questionAnswer.ReadingQuestionTrialId into questionAnswerTemp
 | |
|                      from leftquestionAnswer in questionAnswerTemp.DefaultIfEmpty()
 | |
|                      select new GetTrialReadingQuestionOutDto()
 | |
|                      {
 | |
|                         ReadingQuestionTrialId=data.Id,
 | |
|                        ReadingQuestionCriterionTrialId=data.ReadingQuestionCriterionTrialId,
 | |
|                        TrialId=data.TrialId,
 | |
|                        Type=data.Type,
 | |
|                        ParentTriggerValue=data.ParentTriggerValue,
 | |
|                        GroupName=data.GroupName,
 | |
|                        QuestionName=data.QuestionName,
 | |
|                        IsRequired=data.IsRequired,
 | |
|                        ShowOrder=data.ShowOrder,
 | |
|                        ParentId=data.ParentId,
 | |
|                        TypeValue=data.TypeValue,
 | |
|                        Answer= leftquestionAnswer.Answer
 | |
|                      };
 | |
| 
 | |
|             var qusetionList =await query.OrderBy(x=>x.ShowOrder).ToListAsync();
 | |
|             List<GetTrialReadingQuestionOutDto> groupList = qusetionList.Where(x => x.ParentId == null).ToList();
 | |
|             groupList.ForEach(x =>
 | |
|             {
 | |
|                 this.FindChildQuestion(x, qusetionList);
 | |
|             });
 | |
|             return (groupList, new
 | |
|             {
 | |
|                 readingTaskState = readingTaskState
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取阅片任务和答案
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         private async Task<List<GetTrialReadingQuestionOutDto>> GetTaskAndAnswer(Guid visitTaskId)
 | |
|         {
 | |
|             var taskQuery=from questionAnswer in _readingTaskQuestionAnswerRepository.Where(x=>x.VisitTaskId== visitTaskId)
 | |
|                           join trialQuestion in _readingQuestionTrialRepository.AsQueryable() on questionAnswer.ReadingQuestionTrialId equals trialQuestion.Id 
 | |
|                           select new GetTrialReadingQuestionOutDto()
 | |
|                           {
 | |
|                               ReadingQuestionTrialId = trialQuestion.Id,
 | |
|                               ReadingQuestionCriterionTrialId = trialQuestion.ReadingQuestionCriterionTrialId,
 | |
|                               TrialId = trialQuestion.TrialId,
 | |
|                               Type = trialQuestion.Type,
 | |
|                               ParentTriggerValue = trialQuestion.ParentTriggerValue,
 | |
|                               GroupName = trialQuestion.GroupName,
 | |
|                               QuestionName = trialQuestion.QuestionName,
 | |
|                               IsRequired = trialQuestion.IsRequired,
 | |
|                               ShowOrder = trialQuestion.ShowOrder,
 | |
|                               ParentId = trialQuestion.ParentId,
 | |
|                               TypeValue = trialQuestion.TypeValue,
 | |
|                               Answer = questionAnswer.Answer
 | |
|                           };
 | |
|             var qusetionList = await taskQuery.OrderBy(x => x.ShowOrder).ToListAsync();
 | |
|             List<GetTrialReadingQuestionOutDto> groupList = qusetionList.Where(x => x.ParentId == null).ToList();
 | |
|             groupList.ForEach(x =>
 | |
|             {
 | |
|                 this.FindChildQuestion(x, qusetionList);
 | |
|             });
 | |
| 
 | |
|             return groupList;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取裁判阅片任务信息
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<GetJudgeReadingInfoOutDto> GetJudgeReadingInfo(GetJudgeReadingInfo inDto)
 | |
|         {
 | |
|             var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => new
 | |
|             {
 | |
|                 x.ReadingTaskState,
 | |
|                 x.JudgeResultTaskId,
 | |
|                 x.JudgeResultRemark,
 | |
|             }).FirstOrDefaultAsync();
 | |
|             GetJudgeReadingInfoOutDto judgeInfo = new GetJudgeReadingInfoOutDto()
 | |
|             {
 | |
|                 ReadingTaskState = visitTask.ReadingTaskState,
 | |
|                 JudgeResultTaskId = visitTask.JudgeResultTaskId,
 | |
|                 JudgeResultRemark=visitTask.JudgeResultRemark,
 | |
|                 VisitTaskInfoList = new List<JudgeReadingInfoDto>()
 | |
|             };
 | |
|             var visitIds = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).Select(x => new 
 | |
|             { 
 | |
|               x.Id,
 | |
|               x.ArmEnum,
 | |
|             }).ToListAsync();
 | |
|             foreach (var item in visitIds)
 | |
|             {
 | |
|                 var taskReadingQuestionList = await this.GetTaskAndAnswer(item.Id);
 | |
|                 judgeInfo.VisitTaskInfoList.Add(
 | |
|                     new JudgeReadingInfoDto()
 | |
|                     {
 | |
|                         JudgeQuestionAnswerInfoList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == item.Id).Select(x => new JudgeQuestionAnswerInfo {
 | |
|                             Answer = x.Answer,
 | |
|                             QuestionName = x.ReadingQuestionTrial.QuestionName,
 | |
|                         }).ToListAsync(),
 | |
|                         VisitTaskId = item.Id,
 | |
|                         ArmEnum = item.ArmEnum,
 | |
|                         TaskReadingQuestionList = taskReadingQuestionList,
 | |
|                     }); 
 | |
|             }
 | |
|             return judgeInfo;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 保存裁判问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<IResponseOutput> SaveJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto)
 | |
|         {
 | |
|             await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask()
 | |
|             {
 | |
|                 JudgeResultTaskId = inDto.JudgeResultTaskId,
 | |
|                 JudgeResultRemark = inDto.JudgeResultRemark,
 | |
|             });
 | |
|             var result=await _visitTaskRepository.SaveChangesAsync();
 | |
|             return ResponseOutput.Ok(result);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 提交裁判问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [NonDynamicMethod]
 | |
|         public async Task<IResponseOutput> SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto)
 | |
|         {
 | |
|             await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask()
 | |
|             {
 | |
|                 JudgeResultTaskId = inDto.JudgeResultTaskId,
 | |
|                 ReadingTaskState = ReadingTaskState.HaveSigned,
 | |
|                 JudgeResultRemark = inDto.JudgeResultRemark,
 | |
|                 SignTime = DateTime.Now,
 | |
|             });
 | |
|             var result = await _visitTaskRepository.SaveChangesAsync();
 | |
|             return ResponseOutput.Ok(result);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取既往结果
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<List<GetReadingPastResultListOutDto>> GetReadingPastResultList(GetReadingPastResultListInDto inDto)
 | |
|         {
 | |
|             var readingPastResultList =await _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId&&x.SubjectId==inDto.SubjectId && x.DoctorUserId == _userInfo.Id
 | |
|             &&x.Id!=inDto.VisitTaskId&&x.ReadingTaskState== ReadingTaskState.HaveSigned).ProjectTo<GetReadingPastResultListOutDto>(_mapper.ConfigurationProvider).ToListAsync();
 | |
|                 return readingPastResultList;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 找子问题
 | |
|         /// </summary>
 | |
|         /// <param name="trialReadingQuestion"></param>
 | |
|         /// <param name="questionlists"></param>
 | |
|         [NonDynamicMethod]
 | |
|         public void FindChildQuestion(GetTrialReadingQuestionOutDto trialReadingQuestion, List<GetTrialReadingQuestionOutDto> questionlists)
 | |
|         {
 | |
|             trialReadingQuestion.Childrens = questionlists.Where(x => x.ParentId == trialReadingQuestion.ReadingQuestionTrialId).ToList();
 | |
|             if (trialReadingQuestion.Childrens != null && trialReadingQuestion.Childrens.Count != 0)
 | |
|             {
 | |
|                 trialReadingQuestion.Childrens.ForEach(x =>
 | |
|                 {
 | |
|                     this.FindChildQuestion(x, questionlists);
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 保存任务问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<IResponseOutput> SaveVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
 | |
|         {
 | |
|             var subjectId = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.SubjectId).FirstOrDefaultAsync();
 | |
|             await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId);
 | |
|             List<ReadingTaskQuestionAnswer> readingTaskAnswerList = inDto.AnswerList.Select(x => new ReadingTaskQuestionAnswer()
 | |
|             {
 | |
|                 Id = NewId.NextGuid(),
 | |
|                 SubjectId = subjectId,
 | |
|                 Answer = x.Answer,
 | |
|                 ReadingQuestionCriterionTrialId = inDto.ReadingQuestionCriterionTrialId,
 | |
|                 ReadingQuestionTrialId = x.ReadingQuestionTrialId,
 | |
|                 VisitTaskId = inDto.VisitTaskId,
 | |
|                 TrialId = inDto.TrialId
 | |
|             }).ToList();
 | |
| 
 | |
|             await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
 | |
|             {
 | |
|                 ReadingTaskState = ReadingTaskState.Reading,
 | |
|                 
 | |
|             });
 | |
|             await _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskAnswerList);
 | |
|             var result = await _visitTaskRepository.SaveChangesAsync();
 | |
|             return ResponseOutput.Ok(result);
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 提交问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [NonDynamicMethod]
 | |
|         public async Task<IResponseOutput> SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
 | |
|         {
 | |
|             await this.SaveVisitTaskQuestions(inDto);
 | |
|             await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
 | |
|             {
 | |
|                 ReadingTaskState = ReadingTaskState.HaveSigned,
 | |
|                 SignTime=DateTime.Now,
 | |
|             });
 | |
|             var result = await _visitTaskRepository.SaveChangesAsync();
 | |
|             // 触裁判任务
 | |
|             await this.TriggerJudgeQuestion(inDto.VisitTaskId);
 | |
|             // 添加阅片期任务
 | |
|             await this.AddReadingTask(inDto.VisitTaskId);
 | |
|             // 完成阅片修改状态
 | |
|             await this.FinishReadUpdateState(inDto.VisitTaskId);
 | |
|             return ResponseOutput.Ok(result);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 完成阅片修改状态
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         private async Task FinishReadUpdateState(Guid visitTaskId)
 | |
|         {
 | |
|             var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstOrDefaultAsync();
 | |
|             if (!await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && x.SouceReadModuleId == taskInfo.SouceReadModuleId && x.ReadingTaskState != ReadingTaskState.HaveSigned))
 | |
|             {
 | |
|                 if (taskInfo.SouceReadModuleId != null)
 | |
|                 {
 | |
|                     await _readModuleRepository.UpdatePartialFromQueryAsync(taskInfo.SouceReadModuleId.Value, x => new ReadModule
 | |
|                     {
 | |
|                         ReadingStatus = ReadingStatusEnum.ReadCompleted
 | |
|                     });
 | |
|                 }
 | |
|                 else if (taskInfo.SourceSubjectVisitId != null)
 | |
|                 {
 | |
|                     await _subjectVisitRepository.UpdatePartialFromQueryAsync(taskInfo.SourceSubjectVisitId.Value, x => new SubjectVisit
 | |
|                     {
 | |
|                         ReadingStatus = ReadingStatusEnum.ReadCompleted
 | |
|                     });
 | |
|                 }
 | |
|                 await _subjectVisitRepository.SaveChangesAsync();
 | |
|             }
 | |
|          }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 添加阅片期任务
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         private async Task AddReadingTask(Guid visitTaskId)
 | |
|         {
 | |
|             // ****** 先生成阅片期  阅片期任务阅片完成之后生成肿瘤学的  如果没有阅片期 直接生成肿瘤学 *********////
 | |
|             #region 建立关系
 | |
|             Dictionary<ModuleTypeEnum, ReadingCategory> typeChangeDic = new Dictionary<ModuleTypeEnum, ReadingCategory>();
 | |
|             typeChangeDic.Add(ModuleTypeEnum.InPlanSubjectVisit, ReadingCategory.Visit);
 | |
|             typeChangeDic.Add(ModuleTypeEnum.OutPlanSubjectVisit, ReadingCategory.Visit);
 | |
|             //typeChange.Add(ModuleTypeEnum.Read, ReadingCategory.ReadingPeriod);
 | |
|             typeChangeDic.Add(ModuleTypeEnum.Global, ReadingCategory.Global);
 | |
|             typeChangeDic.Add(ModuleTypeEnum.Referee, ReadingCategory.Judge);
 | |
|             typeChangeDic.Add(ModuleTypeEnum.Oncology, ReadingCategory.Oncology);
 | |
|             #endregion
 | |
|             var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
 | |
|             List<ReadingGenerataTaskDTO> needReadList = new List<ReadingGenerataTaskDTO>();
 | |
|             if ((!await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId&&x.SouceReadModuleId== taskInfo.SouceReadModuleId && x.ReadingTaskState != ReadingTaskState.HaveSigned))
 | |
|                 &&!taskInfo.IsAnalysisCreate
 | |
|                 )
 | |
|             {
 | |
|                 // 任务类型
 | |
|                 switch (taskInfo.ReadingCategory)
 | |
|                 {
 | |
|                     case ReadingCategory.Visit:
 | |
|                             needReadList = await _readModuleRepository.Where(x => x.SubjectVisitId == taskInfo.SourceSubjectVisitId)
 | |
|                              .Select(x => new ReadingGenerataTaskDTO
 | |
|                              {
 | |
|                                  IsUrgent = x.IsUrgent ?? false,
 | |
|                                  SubjectId = x.SubjectId,
 | |
|                                  VisitNum=x.VisitNum,
 | |
|                                  ReadingName = x.ModuleName,
 | |
|                                  ReadModuleId = x.Id,
 | |
|                                  ReadingCategory = typeChangeDic[x.ModuleType],
 | |
|                              }).ToListAsync();
 | |
|                             if (needReadList.Any(x => x.ReadingCategory == ReadingCategory.Global))
 | |
|                             {
 | |
|                                 needReadList = needReadList.Where(x => x.ReadingCategory != ReadingCategory.Oncology).ToList();
 | |
|                             }
 | |
|                         needReadList = needReadList.Where(x => _visitTaskRepository.Where(y => y.SouceReadModuleId == x.ReadModuleId).Count() == 0).ToList();
 | |
|                         await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
 | |
|                         {
 | |
| 
 | |
|                             ReadingCategory = GenerateTaskCategory.Global,
 | |
|                             TrialId = taskInfo.TrialId,
 | |
|                             ReadingGenerataTaskList = needReadList
 | |
|                         }) ;
 | |
|                         break;
 | |
|                         // 肿瘤学
 | |
|                     case ReadingCategory.Global:
 | |
|                         var subjectId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync();
 | |
|                         needReadList=await _readModuleRepository.Where(x => x.SubjectVisitId == subjectId&&x.ModuleType==ModuleTypeEnum.Oncology)
 | |
|                               .Select(x => new ReadingGenerataTaskDTO
 | |
|                               {
 | |
|                                   IsUrgent = x.IsUrgent ?? false,
 | |
|                                   SubjectId = x.SubjectId,
 | |
|                                   ReadingName = x.ModuleName,
 | |
|                                   VisitNum = x.VisitNum,
 | |
|                                   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()
 | |
|                         {
 | |
| 
 | |
|                             ReadingCategory = GenerateTaskCategory.Oncology,
 | |
|                             TrialId = taskInfo.TrialId,
 | |
|                             ReadingGenerataTaskList = needReadList
 | |
|                         });
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|           
 | |
| 
 | |
| 
 | |
| 
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 触发裁判任务(新)
 | |
|         /// </summary>
 | |
|         /// <param name="visitTaskId"></param>
 | |
|         /// <returns></returns>
 | |
|         private async Task TriggerJudgeQuestion(Guid visitTaskId)
 | |
|         {
 | |
|             List<Guid> visitTaskids = new List<Guid>();
 | |
|             //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);
 | |
|                 visitTaskids.Add(visitTask.ConsistentAnalysisOriginalTaskId.Value);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge && x.ReReadingApplyState != ReReadingApplyState.Agree && x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && x.SouceReadModuleId == visitTask.SouceReadModuleId).Select(x => x.Id).ToListAsync();
 | |
|             }
 | |
| 
 | |
| 
 | |
|             if (visitTaskids.Count == 2)
 | |
|             {
 | |
|                 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<GroupTaskAnswerDto> 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.ToList(),
 | |
|                 }).ToList();
 | |
| 
 | |
|                 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.Answer != taskAnswer2.Answer)
 | |
|                         {
 | |
| 
 | |
|                             switch (item.JudgeType)
 | |
|                             {
 | |
|                                 case JudgeTypeEnum.AnswerDisaffinity:
 | |
|                                     noteEqual = true;
 | |
|                                     break;
 | |
|                                 case JudgeTypeEnum.AnswerGroup:
 | |
|                                     var answerGroupList = JsonConvert.DeserializeObject<List<string>>(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<List<AnswerCombinationDto>>(item.AnswerCombination == string.Empty ? "[]" : item.AnswerCombination).ToList();
 | |
|                                     answerCombinationList.ForEach(x =>
 | |
|                                     {
 | |
|                                         if (x.AnswerGroupA.Contains(taskAnswer1.Answer) && x.AnswerGroupB.Contains(taskAnswer2.Answer))
 | |
|                                         {
 | |
|                                             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();
 | |
| 
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         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();
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 添加裁判任务
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         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
 | |
|             });
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 |