739 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			739 lines
		
	
	
		
			36 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="subjectId"></param>
 | 
						|
        /// <param name="trialId"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private async Task<GetReadingTaskDto> GetNextTask(Guid? subjectId,Guid trialId,Guid? visistTaskId)
 | 
						|
        {
 | 
						|
            GetReadingTaskDto? task = new GetReadingTaskDto();
 | 
						|
 | 
						|
            if (visistTaskId != null)
 | 
						|
            {
 | 
						|
                task = await _visitTaskRepository.Where(x => x.Id==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.SubjectVisit.VisitNum : x.ReadModule.VisitNum,
 | 
						|
 | 
						|
                }).FirstOrDefaultAsync();
 | 
						|
              
 | 
						|
            }
 | 
						|
            else if (subjectId != null)
 | 
						|
            {
 | 
						|
                var subjectList =await  _subjectRepository.Where(t => t.TrialId == 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 == 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 == 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.SubjectVisit.VisitNum : x.ReadModule.VisitNum,
 | 
						|
                }).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory);
 | 
						|
 | 
						|
                task =await taskquery.FirstOrDefaultAsync();
 | 
						|
                if (task == null)
 | 
						|
                {
 | 
						|
                    throw new BusinessValidationFailedException("任务都已经完成");
 | 
						|
                }
 | 
						|
                task.SubjectId = subjectId.Value;
 | 
						|
 | 
						|
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                task = await _visitTaskRepository.Where(x => x.TrialId == 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.SubjectVisit.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();
 | 
						|
            }
 | 
						|
            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(inDto.SubjectId, inDto.TrialId,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()
 | 
						|
                    {
 | 
						|
                        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 _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.UpdatePartialFromQueryAsync(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).FirstOrDefaultAsync();
 | 
						|
            List<ReadingGenerataTaskDTO> needReadList = new List<ReadingGenerataTaskDTO>();
 | 
						|
            if (!await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId&&x.SouceReadModuleId== taskInfo.SouceReadModuleId && x.ReadingTaskState != ReadingTaskState.HaveSigned))
 | 
						|
            {
 | 
						|
                // 任务类型
 | 
						|
                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 = ReadingCategory.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 = ReadingCategory.Oncology,
 | 
						|
                            TrialId = taskInfo.TrialId,
 | 
						|
                            ReadingGenerataTaskList = needReadList
 | 
						|
                        });
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
          
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 触发裁判任务(新)
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="visitTaskId"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        private async Task TriggerJudgeQuestion(Guid visitTaskId)
 | 
						|
        {
 | 
						|
 | 
						|
            //x.ReReadingApplyState!=ReReadingApplyState.Agree  排除重阅的
 | 
						|
            var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstOrDefaultAsync();
 | 
						|
            var 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)
 | 
						|
                {
 | 
						|
                    await this.SaveJudgeTask(new SaveJudgeTaskDto()
 | 
						|
                    {
 | 
						|
                        VisitTaskIds = visitTaskids,
 | 
						|
                    });
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <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= ReadingCategory.Judge,
 | 
						|
                TrialId= trialId
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |