1177 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			1177 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
| using IRaCIS.Core.Application.Contracts;
 | ||
| using IRaCIS.Core.Application.Filter;
 | ||
| using IRaCIS.Core.Application.Service.Reading.Dto;
 | ||
| using IRaCIS.Core.Application.ViewModel;
 | ||
| using IRaCIS.Core.Domain.Models;
 | ||
| using IRaCIS.Core.Domain.Share;
 | ||
| using IRaCIS.Core.Infrastructure;
 | ||
| using MassTransit;
 | ||
| using Microsoft.AspNetCore.Mvc;
 | ||
| using System.Linq.Dynamic.Core;
 | ||
| 
 | ||
| namespace IRaCIS.Core.Application.Service
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// 生成的阅片模块(在大列表上展示的) 阅片期
 | ||
|     /// </summary>
 | ||
|     [ApiExplorerSettings(GroupName = "Reading")]
 | ||
|     public class ReadModuleService(IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|         IRepository<Subject> _subjectRepository,
 | ||
|         IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<Trial> _trialRepository,
 | ||
|         IVisitTaskHelpeService _visitTaskHelpeService,
 | ||
|         IRepository<VisitTask> _visitTaskRepository,
 | ||
|         IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository,
 | ||
|         IRepository<ReadModuleView> _readModuleViewRepository,
 | ||
|         IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
 | ||
|         IRepository<DicomInstance> _dicomInstanceRepository,
 | ||
|         IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,
 | ||
|         IRepository<ReadingClinicalData> _readingClinicalDataRepository,
 | ||
|         IReadingImageTaskService _readingImageTaskService,
 | ||
|         IRepository<ReadingPeriodSet> _readingPeriodSetRepository,
 | ||
|         IRepository<ReadModule> _readModuleRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
 | ||
|     {
 | ||
| 
 | ||
| 
 | ||
|         #region 获取修改时可选择的阅片期截止访视
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 获取修改截止访视下拉
 | ||
|         /// </summary>
 | ||
|         /// <param name="inDto"></param>
 | ||
|         /// <returns></returns>
 | ||
|         [HttpPost]
 | ||
|         public async Task<List<GetSubjectReadVisitsOutDto>> GetCanChangeReadVisitList(GetCanChangeReadVisitListInDto inDto)
 | ||
|         {
 | ||
|             //增加标准
 | ||
|             var mixReadVisitNum = await _visitTaskRepository.Where(x =>
 | ||
|             x.TrialReadingCriterionId == inDto.TrialReadingCriterionId
 | ||
|             && x.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|             && x.ReadingCategory == ReadingCategory.Visit
 | ||
|             && x.SubjectId == inDto.SubjectId
 | ||
|             && x.TaskState == TaskState.Effect).OrderByDescending(x => x.VisitTaskNum).Select(x => x.VisitTaskNum).FirstOrDefaultAsync();
 | ||
| 
 | ||
| 
 | ||
|             decimal thisVisitNum = 0;
 | ||
|             var readModule = await _readModuleRepository.Where(x => x.Id == inDto.Id).Include(x => x.SubjectVisit).FirstOrDefaultAsync();
 | ||
|             if (readModule != null)
 | ||
|             {
 | ||
|                 thisVisitNum = readModule.SubjectVisit.VisitNum;
 | ||
|             }
 | ||
| 
 | ||
|             var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && x.LatestScanDate != null && !x.IsLostVisit);
 | ||
|             var finalVisitNum = await visitQuery.Where(x => x.IsFinalVisit).Select(x => x.VisitNum).FirstOrDefaultAsync();
 | ||
| 
 | ||
|             //增加标准
 | ||
|             var readModulequery = _readModuleRepository.AsQueryable().Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId);
 | ||
| 
 | ||
|             var resultlist = await visitQuery.WhereIf(finalVisitNum != null && finalVisitNum != 0, x => x.VisitNum <= finalVisitNum)
 | ||
|                  .Where(x => x.VisitNum > mixReadVisitNum || x.VisitNum == thisVisitNum)
 | ||
|                  //.Where(x => !x.IsBaseLine) // 排除基线
 | ||
|                  .WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0)
 | ||
|                  .WhereIf(inDto.ReadingSetType == ReadingSetType.ImageReading, x => readModulequery.Where(y => y.Id != inDto.Id && y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() == 0)
 | ||
|                  .Select(x => new GetSubjectReadVisitsOutDto()
 | ||
|                  {
 | ||
|                      SubjectVisitId = x.Id,
 | ||
|                      VisitName = x.VisitName,
 | ||
|                      VisitNum = x.VisitNum,
 | ||
|                  }).OrderBy(x => x.VisitNum).ToListAsync();
 | ||
| 
 | ||
|             return resultlist;
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 修改全局阅片截止访视
 | ||
|         /// </summary>
 | ||
|         /// <param name="inDto"></param>
 | ||
|         /// <returns></returns>
 | ||
|         [HttpPost]
 | ||
|         public async Task<bool> ChangeCutOffVisit(ChangeCutOffVisitInDto inDto)
 | ||
|         {
 | ||
| 
 | ||
|             if (await _readModuleRepository.AnyAsync(x => x.Id == inDto.Id && x.IsCRCConfirm))
 | ||
|             {
 | ||
|                 //---CRC已经确认临床数据 不允许编辑
 | ||
|                 throw new BusinessValidationFailedException(_localizer["ReadModule_CRCConfirmCanNtoEdit"]);
 | ||
|             }
 | ||
| 
 | ||
|             var readModule = await _readModuleRepository.Where(x => x.Id == inDto.Id).FirstNotNullAsync();
 | ||
| 
 | ||
|             var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModule.TrialReadingCriterionId).Select(x => new
 | ||
|             {
 | ||
|                 x.ReadingType,
 | ||
|                 x.IsArbitrationReading,
 | ||
|                 x.IsReadingPeriod,
 | ||
|                 x.ArbitrationRule,
 | ||
|                 x.IsGlobalReading,
 | ||
|                 x.IsOncologyReading,
 | ||
|             }).FirstNotNullAsync();
 | ||
| 
 | ||
|             // 如果生成了 访视级别的阅片期裁判 不让修改
 | ||
|             if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading)
 | ||
|             {
 | ||
|                 if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge))
 | ||
|                 {
 | ||
|                     //---当前阅片已生成裁判任务,操作失败。
 | ||
|                     throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
|             await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.Id, x => new ReadModule()
 | ||
|             {
 | ||
|                 SubjectVisitId = inDto.SubjectVisitIdId,
 | ||
|                 ModuleName = inDto.Name,
 | ||
|             });
 | ||
| 
 | ||
|             return await _readModuleRepository.SaveChangesAsync();
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 用ef 实现之前视图的功能
 | ||
|         /// </summary>
 | ||
|         /// <param name="inQuery"></param>
 | ||
|         /// <returns></returns>
 | ||
|         [HttpPost]
 | ||
|         public async Task<IResponseOutput<PageOutput<GetReadModuleDtoOut>>> GetReadModuleList(GetReadModuleDto inQuery)
 | ||
|         {
 | ||
| 
 | ||
|             var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(x => new
 | ||
|             {
 | ||
|                 x.CriterionName,
 | ||
|                 x.ReadingType,
 | ||
|                 x.IsReadingTaskViewInOrder,
 | ||
|                 x.IsOncologyReading,
 | ||
|                 x.IsGlobalReading,
 | ||
|                 x.IsReadingPeriod,
 | ||
|                 x.ReadingInfoSignTime,
 | ||
|             }).FirstNotNullAsync();
 | ||
| 
 | ||
|             var readingType = (int)criterionInfo.ReadingType;
 | ||
| 
 | ||
|             var isFilterModuleType = inQuery.ModuleType != null;
 | ||
|             var isFilterCompleteClinicalData = inQuery.CompleteClinicalData != null;
 | ||
|             var isFilterReadingStatus = inQuery.ReadingStatus != null;
 | ||
|             var isFilterName = !string.IsNullOrWhiteSpace(inQuery.Name);
 | ||
| 
 | ||
| 
 | ||
|             #region 方式一
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //var query = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId)
 | ||
|             //      .WhereIf(inQuery.SubjectId != null, x => x.Id == inQuery.SubjectId)
 | ||
|             //      .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), x => x.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode))
 | ||
|             //      .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), x => x.Code.Contains(inQuery.SubjectCode))
 | ||
| 
 | ||
|             //      .Select(t => new GetReadModuleDtoOut()
 | ||
|             //      {
 | ||
|             //          SubjectCode = t.Code,
 | ||
|             //          SubjectId = t.Id,
 | ||
|             //          TrialSiteCode = t.TrialSite.TrialSiteCode,
 | ||
|             //          TrialSiteId = t.TrialSiteId,
 | ||
| 
 | ||
|             //          #region 分开不用union  在属性里面union
 | ||
| 
 | ||
|             //          //访视要查询不失访的其次要查在 <= 截止访视的,截止访视没有就查这个受试者所有的
 | ||
|             //          VisitData = t.SubjectVisitList.Where(t => t.IsLostVisit == false)
 | ||
| 
 | ||
|             //          .Where(sv => t.FinalSubjectVisitId == null ? true : sv.VisitNum < t.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
 | ||
|             //          {
 | ||
|             //              Id = sv.Id,
 | ||
|             //              CreateTime = sv.CreateTime,
 | ||
|             //              PDState = sv.PDState,
 | ||
|             //              IsBaseLine = sv.IsBaseLine,
 | ||
|             //              SubjectCode = sv.Subject.Code,
 | ||
|             //              IsEnrollmentConfirm = sv.IsEnrollmentConfirm,
 | ||
|             //              IsFinalVisit = sv.IsFinalVisit,
 | ||
|             //              SubjectId = sv.SubjectId,
 | ||
|             //              SubjectVisitId = sv.Id,
 | ||
|             //              IsUrgent = sv.IsUrgent,
 | ||
|             //              SubjectVisitName = sv.VisitName,
 | ||
|             //              IsVisit = true,
 | ||
| 
 | ||
|             //              Name = sv.VisitName,
 | ||
|             //              TrialSiteId = sv.TrialSiteId,
 | ||
|             //              TrialSiteCode = sv.TrialSite.TrialSiteCode,
 | ||
| 
 | ||
|             //              TrialId = sv.TrialId,
 | ||
|             //              VisitNum = sv.VisitNum,
 | ||
|             //              TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | ||
| 
 | ||
|             //              OutPlanPreviousVisitId = sv.OutPlanPreviousVisitId,
 | ||
| 
 | ||
|             //              OutPlanPreviousVisitName = sv.OutPlanPreviousVisit.VisitName,
 | ||
| 
 | ||
|             //              ModuleType = sv.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit,
 | ||
| 
 | ||
|             //              //只有阅片期有
 | ||
|             //              CutOffVisitId = null,
 | ||
|             //              CutOffVisitName = null,
 | ||
|             //              ReadingSetType = null,
 | ||
|             //              ReadModuleId = null,
 | ||
|             //              ReadModuleName = "",
 | ||
| 
 | ||
| 
 | ||
|             //              ///阅片状态 0 1 2 保持访视的,任务全做完了就是5 没完成就是4  否则就是3
 | ||
|             //              ReadingStatus = sv.ReadingStatus < ReadingStatusEnum.TaskAllocate ? sv.ReadingStatus :
 | ||
|             //              (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|             //                 && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
 | ||
|             //                 (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
 | ||
|             //                 && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate)),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //              //是否是截止访视?
 | ||
|             //              IsCanChangeCutOffVisit = false,
 | ||
| 
 | ||
|             //              //需要签名数量计算  基线包含subject+访视级别的  
 | ||
|             //              NeedSignClinicalDataCount = sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true).
 | ||
|             //                                          Where(t => sv.IsBaseLine ? t.ClinicalDataLevel <= ClinicalLevel.SubjectVisit : t.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count()
 | ||
|             //                                        + (sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true)
 | ||
|             //                                          .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study) ? 1 : 0),
 | ||
| 
 | ||
|             //              //签名的数量
 | ||
| 
 | ||
|             //              SignClinicalDataCount = sv.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Study &&
 | ||
|             //                     t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
 | ||
|             //              +
 | ||
|             //               (sv.SubmitState == SubmitStateEnum.Submitted && sv.Trial.ClinicalDataTrialSetList
 | ||
|             //                        .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study && t.TrialClinicalDataSetCriteriaList.Any(u => u.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)) ? 1 : 0),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //              //标准名  应该是可以不查询的,只要保证逻辑正确
 | ||
|             //              CriterionName = criterionInfo.CriterionName
 | ||
| 
 | ||
| 
 | ||
|             //          })
 | ||
| 
 | ||
|             //          .Where(t => isFilterModuleType ? t.ModuleType == inQuery.ModuleType : true)
 | ||
|             //          .Where(t => isFilterName ? t.Name == inQuery.Name : true)
 | ||
|             //          .Where(t => isFilterReadingStatus ? t.ReadingStatus == inQuery.ReadingStatus : true)
 | ||
|             //          .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA ? t.NeedSignClinicalDataCount == 0 : true)
 | ||
|             //          .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete ? t.NeedSignClinicalDataCount != t.SignClinicalDataCount : true)
 | ||
|             //          .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete ? t.NeedSignClinicalDataCount == t.SignClinicalDataCount : true)
 | ||
| 
 | ||
|             //         //搜索条件报错
 | ||
|             //         //.WhereIf(inQuery.ModuleType != null, t => t.ModuleType == inQuery.ModuleType)
 | ||
|             //         //.WhereIf(inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA, x => x.NeedSignClinicalDataCount == 0)
 | ||
|             //         //.WhereIf(inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete, x => x.NeedSignClinicalDataCount != x.SignClinicalDataCount)
 | ||
|             //         //.WhereIf(inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete, x => x.NeedSignClinicalDataCount != 0 && x.NeedSignClinicalDataCount == x.SignClinicalDataCount)
 | ||
|             //         //.WhereIf(inQuery.ReadingStatus != null, x => x.ReadingStatus == inQuery.ReadingStatus)
 | ||
|             //         .ToList(),
 | ||
| 
 | ||
|             //          //阅片期
 | ||
|             //          ReadMouduleData = t.ReadModuleList.Select(rm => new ReadModuleView()
 | ||
|             //          {
 | ||
|             //              Id = rm.Id,
 | ||
|             //              CreateTime = rm.CreateTime,
 | ||
|             //              PDState = PDStateEnum.None,
 | ||
|             //              IsBaseLine = false,
 | ||
|             //              SubjectCode = rm.SubjectVisit.Subject.Code,
 | ||
|             //              IsEnrollmentConfirm = false,
 | ||
|             //              IsFinalVisit = false,
 | ||
|             //              SubjectId = rm.SubjectId,
 | ||
|             //              SubjectVisitId = rm.SubjectVisitId,
 | ||
|             //              IsUrgent = rm.SubjectVisit.IsUrgent,
 | ||
|             //              SubjectVisitName = rm.SubjectVisit.VisitName,
 | ||
|             //              IsVisit = false,
 | ||
| 
 | ||
|             //              Name = rm.ModuleName,
 | ||
|             //              TrialSiteId = rm.Subject.TrialSiteId,
 | ||
|             //              TrialSiteCode = rm.Subject.TrialSite.TrialSiteCode,
 | ||
| 
 | ||
|             //              TrialId = rm.TrialId,
 | ||
|             //              VisitNum = rm.SubjectVisit.VisitNum,
 | ||
|             //              TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | ||
| 
 | ||
|             //              OutPlanPreviousVisitId = null,
 | ||
| 
 | ||
|             //              OutPlanPreviousVisitName = null,
 | ||
| 
 | ||
|             //              ModuleType = rm.ModuleType,
 | ||
| 
 | ||
|             //              //只有阅片期有
 | ||
|             //              CutOffVisitId = rm.SubjectVisit.Id,
 | ||
|             //              CutOffVisitName = rm.SubjectVisit.VisitName,
 | ||
|             //              ReadingSetType = null,
 | ||
| 
 | ||
|             //              //之前视图返回的null 应该是没用的?
 | ||
|             //              ReadModuleId = rm.Id,
 | ||
|             //              ReadModuleName = rm.ModuleName,
 | ||
| 
 | ||
|             //              //是否是截止访视?
 | ||
|             //              IsCanChangeCutOffVisit = false,
 | ||
| 
 | ||
| 
 | ||
|             //              ///阅片状态 0 1 2 保持访视的,任务全做完了就是5 没完成就是4  否则就是3
 | ||
|             //              ReadingStatus = rm.ReadingStatus < ReadingStatusEnum.TaskAllocate ? rm.ReadingStatus :
 | ||
|             //              (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|             //                 && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
 | ||
| 
 | ||
|             //                 (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
 | ||
|             //                 && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate
 | ||
|             //                 )
 | ||
|             //              ),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //              ////需要签名数量计算  基线包含subject+访视级别的  
 | ||
|             //              NeedSignClinicalDataCount = rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
 | ||
|             //                        .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.PM && (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Count()
 | ||
|             //                                        +
 | ||
|             //                         (rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
 | ||
|             //                        .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.CRC &&
 | ||
|             //                        (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Any() ? 1 : 0)
 | ||
|             //                                     ,
 | ||
| 
 | ||
|             //              //签名的数量
 | ||
| 
 | ||
|             //              SignClinicalDataCount = rm.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM &&
 | ||
|             //              t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
 | ||
|             //              +
 | ||
|             //              (rm.IsPMConfirm ? 1 : 0),
 | ||
| 
 | ||
| 
 | ||
|             //              //标准名  应该是可以不查询的,只要保证逻辑正确
 | ||
|             //              CriterionName = criterionInfo.CriterionName
 | ||
| 
 | ||
|             //          })
 | ||
|             //          .Where(t => isFilterModuleType ? t.ModuleType == inQuery.ModuleType : true)
 | ||
|             //          .Where(t => isFilterName ? t.Name == inQuery.Name : true)
 | ||
|             //          .Where(t => isFilterReadingStatus ? t.ReadingStatus == inQuery.ReadingStatus : true)
 | ||
|             //          .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA ? t.NeedSignClinicalDataCount == 0 : true)
 | ||
|             //          .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete ? t.NeedSignClinicalDataCount != t.SignClinicalDataCount : true)
 | ||
|             //          .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete ? t.NeedSignClinicalDataCount == t.SignClinicalDataCount : true)
 | ||
|             //          .ToList()
 | ||
| 
 | ||
|             //          #endregion
 | ||
| 
 | ||
|             //          #region 用union 报错不行的
 | ||
| 
 | ||
|             //          ////访视要查询不失访的其次要查在 <= 截止访视的,截止访视没有就查这个受试者所有的
 | ||
|             //          //Data = t.SubjectVisitList.Where(t => t.IsLostVisit == false)
 | ||
|             //          //.Where(sv => t.FinalSubjectVisitId == null ? true : sv.VisitNum < t.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
 | ||
|             //          //{
 | ||
|             //          //    Id = sv.Id,
 | ||
|             //          //    CreateTime = sv.CreateTime,
 | ||
|             //          //    PDState = sv.PDState,
 | ||
|             //          //    IsBaseLine = sv.IsBaseLine,
 | ||
|             //          //    SubjectCode = sv.Subject.Code,
 | ||
|             //          //    IsEnrollmentConfirm = sv.IsEnrollmentConfirm,
 | ||
|             //          //    IsFinalVisit = sv.IsFinalVisit,
 | ||
|             //          //    SubjectId = sv.SubjectId,
 | ||
|             //          //    SubjectVisitId = sv.Id,
 | ||
|             //          //    IsUrgent = sv.IsUrgent,
 | ||
|             //          //    SubjectVisitName = sv.VisitName,
 | ||
|             //          //    IsVisit = true,
 | ||
| 
 | ||
|             //          //    Name = sv.VisitName,
 | ||
|             //          //    TrialSiteId = sv.TrialSiteId,
 | ||
|             //          //    TrialSiteCode = sv.TrialSite.TrialSiteCode,
 | ||
| 
 | ||
|             //          //    TrialId = sv.TrialId,
 | ||
|             //          //    VisitNum = sv.VisitNum,
 | ||
|             //          //    TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | ||
| 
 | ||
|             //          //    OutPlanPreviousVisitId = sv.OutPlanPreviousVisitId,
 | ||
| 
 | ||
|             //          //    OutPlanPreviousVisitName = sv.OutPlanPreviousVisit.VisitName,
 | ||
| 
 | ||
|             //          //    ModuleType = sv.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit,
 | ||
| 
 | ||
|             //          //    //只有阅片期有
 | ||
|             //          //    CutOffVisitId = null,
 | ||
|             //          //    CutOffVisitName = null,
 | ||
|             //          //    ReadingSetType = null,
 | ||
|             //          //    ReadModuleId = null,
 | ||
|             //          //    ReadModuleName = "",
 | ||
| 
 | ||
| 
 | ||
|             //          //    ///阅片状态 0 1 2 保持访视的,任务全做完了就是5 没完成就是4  否则就是3
 | ||
|             //          //    ReadingStatus = sv.ReadingStatus < ReadingStatusEnum.TaskAllocate ? sv.ReadingStatus :
 | ||
|             //          //    (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|             //          //       && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
 | ||
|             //          //       (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
 | ||
|             //          //       && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate)),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //          //    //是否是截止访视?
 | ||
|             //          //    IsCanChangeCutOffVisit = false,
 | ||
| 
 | ||
|             //          //    //需要签名数量计算  基线包含subject+访视级别的  
 | ||
|             //          //    NeedSignClinicalDataCount = sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList).Where(t => t.TrialClinicalDataSet.IsConfirm == true).
 | ||
|             //          //                                Where(t => sv.IsBaseLine ? t.TrialClinicalDataSet.ClinicalDataLevel <= ClinicalLevel.SubjectVisit : t.TrialClinicalDataSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count()
 | ||
|             //          //                              + (sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList).Where(t => t.TrialClinicalDataSet.IsConfirm == true)
 | ||
|             //          //                                .Any(t => t.TrialClinicalDataSet.ClinicalDataLevel == ClinicalLevel.Study) ? 1 : 0),
 | ||
| 
 | ||
|             //          //    //签名的数量
 | ||
| 
 | ||
|             //          //    SignClinicalDataCount = sv.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Study &&
 | ||
|             //          //           t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
 | ||
|             //          //    +
 | ||
|             //          //     (sv.SubmitState == SubmitStateEnum.Submitted && sv.Trial.ClinicalDataTrialSetList
 | ||
|             //          //              .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study && t.TrialClinicalDataSetCriteriaList.Any(u => u.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)) ? 1 : 0),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //          //    //标准名  应该是可以不查询的,只要保证逻辑正确
 | ||
|             //          //    CriterionName = criterionInfo.CriterionName
 | ||
| 
 | ||
| 
 | ||
|             //          //})
 | ||
|             //          //.Union(t.ReadModuleList.AsQueryable().Select(rm => new ReadModuleView()
 | ||
|             //          //{
 | ||
|             //          //    Id = rm.Id,
 | ||
|             //          //    CreateTime = rm.CreateTime,
 | ||
|             //          //    PDState = PDStateEnum.None,
 | ||
|             //          //    IsBaseLine = false,
 | ||
|             //          //    SubjectCode = rm.SubjectVisit.Subject.Code,
 | ||
|             //          //    IsEnrollmentConfirm = false,
 | ||
|             //          //    IsFinalVisit = false,
 | ||
|             //          //    SubjectId = rm.SubjectId,
 | ||
|             //          //    SubjectVisitId = rm.SubjectVisitId,
 | ||
|             //          //    IsUrgent = rm.SubjectVisit.IsUrgent,
 | ||
|             //          //    SubjectVisitName = rm.SubjectVisit.VisitName,
 | ||
|             //          //    IsVisit = false,
 | ||
| 
 | ||
|             //          //    Name = rm.ModuleName,
 | ||
|             //          //    TrialSiteId = rm.Subject.TrialSiteId,
 | ||
|             //          //    TrialSiteCode = rm.Subject.TrialSite.TrialSiteCode,
 | ||
| 
 | ||
|             //          //    TrialId = rm.TrialId,
 | ||
|             //          //    VisitNum = rm.SubjectVisit.VisitNum,
 | ||
|             //          //    TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | ||
| 
 | ||
|             //          //    OutPlanPreviousVisitId = null,
 | ||
| 
 | ||
|             //          //    OutPlanPreviousVisitName = null,
 | ||
| 
 | ||
|             //          //    ModuleType = rm.ModuleType,
 | ||
| 
 | ||
|             //          //    //只有阅片期有
 | ||
|             //          //    CutOffVisitId = rm.SubjectVisit.Id,
 | ||
|             //          //    CutOffVisitName = rm.SubjectVisit.VisitName,
 | ||
|             //          //    ReadingSetType = null,
 | ||
| 
 | ||
|             //          //    //之前视图返回的null 应该是没用的?
 | ||
|             //          //    ReadModuleId = rm.Id,
 | ||
|             //          //    ReadModuleName = rm.ModuleName,
 | ||
| 
 | ||
|             //          //    //是否是截止访视?
 | ||
|             //          //    IsCanChangeCutOffVisit = false,
 | ||
| 
 | ||
| 
 | ||
|             //          //    ///阅片状态 0 1 2 保持访视的,任务全做完了就是5 没完成就是4  否则就是3
 | ||
|             //          //    ReadingStatus = rm.ReadingStatus < ReadingStatusEnum.TaskAllocate ? rm.ReadingStatus :
 | ||
|             //          //    (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|             //          //       && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
 | ||
| 
 | ||
|             //          //       (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
 | ||
|             //          //       && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate
 | ||
|             //          //       )
 | ||
|             //          //    ),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //          //    //需要签名数量计算  基线包含subject+访视级别的  
 | ||
|             //          //    NeedSignClinicalDataCount = rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
 | ||
|             //          //              .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.PM && (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Count()
 | ||
|             //          //                              +
 | ||
|             //          //               (rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
 | ||
|             //          //              .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.CRC &&
 | ||
|             //          //              (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Any() ? 1 : 0)
 | ||
|             //          //                           ,
 | ||
| 
 | ||
|             //          //    //签名的数量
 | ||
| 
 | ||
|             //          //    SignClinicalDataCount = rm.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM &&
 | ||
|             //          //    t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
 | ||
|             //          //    +
 | ||
|             //          //    (rm.IsPMConfirm ? 1 : 0),
 | ||
| 
 | ||
| 
 | ||
|             //          //    //标准名  应该是可以不查询的,只要保证逻辑正确
 | ||
|             //          //    CriterionName = criterionInfo.CriterionName
 | ||
| 
 | ||
|             //          //})).ToList()
 | ||
| 
 | ||
|             //          #endregion
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             //      });
 | ||
| 
 | ||
| 
 | ||
|             //var pageList = await query/*.Where(t=> (t.VisitData.Count + t.ReadMouduleData.Count)>0)*//*.AsSplitQuery()*/
 | ||
|             //    .ToPagedListAsync(inQuery, nameof(GetReadModuleDtoOut.SubjectCode));
 | ||
| 
 | ||
|             #endregion
 | ||
| 
 | ||
|             #region 方式二
 | ||
| 
 | ||
|             var subjectVisitQuery = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)/*.Where(t => t.IsLostVisit == false)*/
 | ||
|             .Where(t => t.Subject.IsSubjectQuit == false || (t.Subject.IsSubjectQuit == true && t.SubmitState == SubmitStateEnum.Submitted))
 | ||
|             .Where(sv => sv.Subject.FinalSubjectVisitId == null ? true : sv.VisitNum <= sv.Subject.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
 | ||
|             {
 | ||
|                 Id = sv.Id,
 | ||
|                 CreateTime = sv.CreateTime,
 | ||
|                 PDState = sv.PDState,
 | ||
|                 IsBaseLine = sv.IsBaseLine,
 | ||
|                 SubjectCode = sv.Subject.Code,
 | ||
|                 IsSubjectQuit = sv.Subject.IsSubjectQuit,
 | ||
|                 IsEnrollmentConfirm = sv.IsEnrollmentConfirm,
 | ||
|                 IsFinalVisit = sv.IsFinalVisit,
 | ||
|                 SubjectId = sv.SubjectId,
 | ||
|                 SubjectVisitId = sv.Id,
 | ||
|                 IsUrgent = sv.IsUrgent,
 | ||
|                 SubjectVisitName = sv.VisitName,
 | ||
|                 IsVisit = true,
 | ||
| 
 | ||
|                 Name = sv.VisitName,
 | ||
|                 TrialSiteId = sv.TrialSiteId,
 | ||
|                 TrialSiteCode = sv.TrialSite.TrialSiteCode,
 | ||
| 
 | ||
|                 TrialId = sv.TrialId,
 | ||
|                 VisitNum = sv.VisitNum,
 | ||
|                 TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
 | ||
| 
 | ||
|                 OutPlanPreviousVisitId = sv.OutPlanPreviousVisitId,
 | ||
| 
 | ||
|                 OutPlanPreviousVisitName = sv.OutPlanPreviousVisit.VisitName,
 | ||
| 
 | ||
|                 ModuleType = sv.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit,
 | ||
| 
 | ||
|                 //只有阅片期有
 | ||
|                 CutOffVisitId = null,
 | ||
|                 CutOffVisitName = null,
 | ||
|                 ReadingSetType = null,
 | ||
|                 ReadModuleId = null,
 | ||
|                 ReadModuleName = "",
 | ||
| 
 | ||
| 
 | ||
|                 ///阅片状态 0 1 2 保持访视的,任务全做完了就是5 没完成就是4  否则就是3
 | ||
|                 ReadingStatus = sv.ReadingStatus < ReadingStatusEnum.TaskAllocate ? sv.ReadingStatus :
 | ||
|                           (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|                              && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
 | ||
|                              (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
 | ||
|                              && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate)),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|                 //是否是截止访视?
 | ||
|                 IsCanChangeCutOffVisit = false,
 | ||
| 
 | ||
|                 //需要签名数量计算  基线包含subject+访视级别的  
 | ||
|                 NeedSignClinicalDataCount = sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true).
 | ||
|                                                       Where(t => sv.IsBaseLine ? t.ClinicalDataLevel <= ClinicalLevel.SubjectVisit : t.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count()
 | ||
|                                                     + (sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true)
 | ||
|                                                       .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study) ? 1 : 0),
 | ||
| 
 | ||
|                 //签名的数量
 | ||
| 
 | ||
|                 SignClinicalDataCount = sv.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Study &&
 | ||
|                        t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
 | ||
|                           +
 | ||
|                            (sv.SubmitState == SubmitStateEnum.Submitted && sv.Trial.ClinicalDataTrialSetList
 | ||
|                                     .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study && t.TrialClinicalDataSetCriteriaList.Any(u => u.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)) ? 1 : 0),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|                 //标准名  应该是可以不查询的,只要保证逻辑正确
 | ||
|                 CriterionName = criterionInfo.CriterionName
 | ||
| 
 | ||
| 
 | ||
|             });
 | ||
| 
 | ||
|             var readMouduleQuery = _readModuleRepository.Where(t => t.TrialId == inQuery.TrialId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
 | ||
|                  .Where(t => t.Subject.IsSubjectQuit == false || (t.Subject.IsSubjectQuit == true && t.SubjectVisit.SubmitState == SubmitStateEnum.Submitted))
 | ||
|                 .Select(rm => new ReadModuleView()
 | ||
|                 {
 | ||
|                     Id = rm.Id,
 | ||
|                     CreateTime = rm.CreateTime,
 | ||
|                     PDState = PDStateEnum.None,
 | ||
|                     IsBaseLine = false,
 | ||
|                     SubjectCode = rm.SubjectVisit.Subject.Code,
 | ||
|                     IsSubjectQuit = rm.SubjectVisit.Subject.IsSubjectQuit,
 | ||
|                     IsEnrollmentConfirm = false,
 | ||
|                     IsFinalVisit = false,
 | ||
|                     SubjectId = rm.SubjectId,
 | ||
|                     SubjectVisitId = rm.SubjectVisitId,
 | ||
|                     IsUrgent = rm.SubjectVisit.IsUrgent,
 | ||
|                     SubjectVisitName = rm.SubjectVisit.VisitName,
 | ||
|                     IsVisit = false,
 | ||
| 
 | ||
|                     Name = rm.ModuleName,
 | ||
|                     TrialSiteId = rm.Subject.TrialSiteId,
 | ||
|                     TrialSiteCode = rm.Subject.TrialSite.TrialSiteCode,
 | ||
| 
 | ||
|                     TrialId = rm.TrialId,
 | ||
|                     VisitNum = rm.SubjectVisit.VisitNum,
 | ||
|                     TrialReadingCriterionId = rm.TrialReadingCriterionId,
 | ||
| 
 | ||
|                     OutPlanPreviousVisitId = null,
 | ||
| 
 | ||
|                     OutPlanPreviousVisitName = null,
 | ||
| 
 | ||
|                     ModuleType = rm.ModuleType,
 | ||
| 
 | ||
|                     //只有阅片期有
 | ||
|                     CutOffVisitId = rm.SubjectVisit.Id,
 | ||
|                     CutOffVisitName = rm.SubjectVisit.VisitName,
 | ||
|                     ReadingSetType = rm.ReadingSetType,
 | ||
| 
 | ||
|                     //之前视图返回的null 应该是没用的?
 | ||
|                     ReadModuleId = rm.Id,
 | ||
|                     ReadModuleName = rm.ModuleName,
 | ||
| 
 | ||
|                     //阅片期切换访视 限制(1、阅片期访视已完成了任务不能,如果本身是肿瘤学不能,或者本身是全局后续有肿瘤学)
 | ||
|                     IsCanChangeCutOffVisit = !(rm.ModuleTaskList.Any(t => t.TaskState == TaskState.Effect) && rm.ReadingSetType == ReadingSetType.TumorReading &&
 | ||
|                     rm.SubjectVisit.ReadModuleList.Any(t => t.ReadingSetType == ReadingSetType.TumorReading)),
 | ||
| 
 | ||
| 
 | ||
|                     ///阅片状态 0 1 2 保持访视的,任务全做完了就是5 没完成就是4  否则就是3
 | ||
|                     ReadingStatus = rm.ReadingStatus < ReadingStatusEnum.TaskAllocate ? rm.ReadingStatus :
 | ||
|                           (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|                              && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
 | ||
| 
 | ||
|                              (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
 | ||
|                              && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate
 | ||
|                              )
 | ||
|                           ),
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|                     ////需要签名数量计算  基线包含subject+访视级别的  
 | ||
|                     NeedSignClinicalDataCount = rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
 | ||
|                                     .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.PM && (rm.ReadingSetType == ReadingSetType.ImageReading ? t.ClinicalDataLevel == ClinicalLevel.ImageRead : t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Count()
 | ||
|                                                     +
 | ||
|                                      (rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
 | ||
|                                     .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.CRC &&
 | ||
|                                     (rm.ReadingSetType == ReadingSetType.ImageReading ? t.ClinicalDataLevel == ClinicalLevel.ImageRead : t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Any() ? 1 : 0)
 | ||
|                                                  ,
 | ||
| 
 | ||
|                     //签名的数量
 | ||
| 
 | ||
|                     SignClinicalDataCount = rm.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM &&
 | ||
|                     t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
 | ||
|                           +
 | ||
|                           (rm.IsPMConfirm ? 1 : 0),
 | ||
| 
 | ||
| 
 | ||
|                     //标准名  应该是可以不查询的,只要保证逻辑正确
 | ||
|                     CriterionName = criterionInfo.CriterionName
 | ||
| 
 | ||
|                 });
 | ||
| 
 | ||
| 
 | ||
|             var query = subjectVisitQuery.Union(readMouduleQuery)
 | ||
|                  .WhereIf(inQuery.SubjectId != null, x => x.SubjectId == inQuery.SubjectId)
 | ||
|                   .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), x => x.TrialSiteCode.Contains(inQuery.TrialSiteCode))
 | ||
|                   .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), x => x.SubjectCode.Contains(inQuery.SubjectCode))
 | ||
|                   .WhereIf(isFilterModuleType, t => t.ModuleType == inQuery.ModuleType)
 | ||
|                   .WhereIf(isFilterName, t => t.Name == inQuery.Name)
 | ||
|                   .WhereIf(isFilterReadingStatus, t => t.ReadingStatus == inQuery.ReadingStatus)
 | ||
|                   .WhereIf(isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA, t => t.NeedSignClinicalDataCount == 0)
 | ||
|                   .WhereIf(isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete, t => t.NeedSignClinicalDataCount != t.SignClinicalDataCount)
 | ||
|                   .WhereIf(isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete, t => t.NeedSignClinicalDataCount == t.SignClinicalDataCount);
 | ||
| 
 | ||
|             inQuery.SortField = string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(ReadModuleView.SubjectCode) : inQuery.SortField;
 | ||
| 
 | ||
|             var subjectIdQuery = query.OrderBy(inQuery.SortField).Select(x => x.SubjectId).Distinct();
 | ||
|             var subjectIds = await subjectIdQuery.Skip((inQuery.PageIndex - 1) * inQuery.PageSize).Take(inQuery.PageSize).ToListAsync();
 | ||
|             var subjectCount = subjectIdQuery.Count();
 | ||
| 
 | ||
|             var viewList = await query.Where(x => subjectIds.Contains(x.SubjectId)).SortToListAsync(inQuery);
 | ||
| 
 | ||
|             var list = viewList.GroupBy(x => new { x.SubjectId, x.TrialSiteId, x.TrialSiteCode, x.SubjectCode, x.IsSubjectQuit })
 | ||
|                 .Select(x => new GetReadModuleDtoOut()
 | ||
|                 {
 | ||
|                     TrialSiteCode = x.Key.TrialSiteCode,
 | ||
|                     TrialSiteId = x.Key.TrialSiteId,
 | ||
|                     SubjectCode = x.Key.SubjectCode,
 | ||
|                     SubjectId = x.Key.SubjectId,
 | ||
|                     IsSubjectQuit = x.Key.IsSubjectQuit,
 | ||
|                     Data = x.OrderBy(x => x.ModuleType).ThenBy(x => x.VisitNum).ToList(),
 | ||
|                 }).ToList();
 | ||
| 
 | ||
|             var pageOutput = new PageOutput<GetReadModuleDtoOut>()
 | ||
|             {
 | ||
|                 PageSize = inQuery.PageSize,
 | ||
|                 CurrentPageData = list,
 | ||
|                 PageIndex = inQuery.PageIndex,
 | ||
|                 TotalCount = subjectCount,
 | ||
|             };
 | ||
| 
 | ||
|             #endregion
 | ||
| 
 | ||
|             return ResponseOutput.Ok(pageOutput, new
 | ||
|             {
 | ||
|                 MaxLength = pageOutput.CurrentPageData.MaxOrDefault(t => t.Data.Count(), 0),
 | ||
|                 IsReadingTaskViewInOrder = criterionInfo.IsReadingTaskViewInOrder,
 | ||
|                 IsClinicalReading = criterionInfo.IsOncologyReading,
 | ||
|                 // OnlyExistsMedicalHistory = !(await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataSetName != "既往局部治疗史" && x.IsConfirm)),
 | ||
|                 IsExistsSubjectClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.Subject && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
 | ||
|                 IsExistsVisitClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
 | ||
|                 IsExistsStudyClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.Study && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
 | ||
|                 IsExistsReadingClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.ImageRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
 | ||
|                 IsExistsOncologyReadClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.OncologyRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
 | ||
|                 IsGlobalReading = criterionInfo.IsGlobalReading,
 | ||
|                 IsReadingPeriod = criterionInfo.IsReadingPeriod,
 | ||
|                 ReadingInfoSignTime = criterionInfo.ReadingInfoSignTime,
 | ||
|                 ExistClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         ///// <summary>
 | ||
|         ///// 获取读片模块  //加了标准参数
 | ||
|         ///// </summary>
 | ||
|         //[HttpPost]
 | ||
|         //public async Task<IResponseOutput<PageOutput<GetReadModuleDtoOut>>> GetReadModuleList(GetReadModuleDto dto)
 | ||
|         //{
 | ||
| 
 | ||
|         //    #region MyRegion
 | ||
| 
 | ||
|         //    if (dto.SortField.IsNullOrEmpty())
 | ||
|         //    {
 | ||
|         //        dto.SortField = nameof(ReadModuleView.SubjectCode);
 | ||
|         //        dto.Asc = true;
 | ||
|         //    }
 | ||
| 
 | ||
|         //    dto.SortField = dto.Asc ? dto.SortField : dto.SortField + " desc";
 | ||
|         //    var subjectQuery = _readModuleViewRepository.Where(x => x.TrialReadingCriterionId == dto.TrialReadingCriterionId)
 | ||
|         //     .WhereIf(dto.TrialId != null, x => x.TrialId == dto.TrialId)
 | ||
|         //     .WhereIf(dto.SubjectId != null, x => x.SubjectId == dto.SubjectId)
 | ||
|         //     .WhereIf(dto.TrialSiteCode != null && dto.TrialSiteCode != string.Empty, x => x.TrialSiteCode.Contains(dto.TrialSiteCode))
 | ||
|         //     .WhereIf(dto.SubjectCode != null && dto.SubjectCode != string.Empty, x => x.SubjectCode.Contains(dto.SubjectCode))
 | ||
|         //     .WhereIf(dto.ModuleType != null, x => x.ModuleType == dto.ModuleType)
 | ||
|         //     .WhereIf(dto.CompleteClinicalData == CompleteClinicalDataEnum.NA, x => x.NeedSignClinicalDataCount == 0)
 | ||
|         //      .WhereIf(dto.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete, x => x.NeedSignClinicalDataCount != x.SignClinicalDataCount)
 | ||
|         //       .WhereIf(dto.CompleteClinicalData == CompleteClinicalDataEnum.Complete, x => x.NeedSignClinicalDataCount != 0 && x.NeedSignClinicalDataCount == x.SignClinicalDataCount)
 | ||
|         //     .WhereIf(dto.ReadingStatus != null, x => x.ReadingStatus == dto.ReadingStatus);
 | ||
|         //    //.WhereIf(dto.Name != null, x => x.Name.Contains(dto.Name!)).OrderBy(x => x.SiteCode);
 | ||
| 
 | ||
|         //    var subjectIds = await subjectQuery.OrderBy(dto.SortField).Select(x => x.SubjectId).Distinct().Skip((dto.PageIndex - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync();
 | ||
| 
 | ||
|         //    List<ReadModuleView> ReadModuleViewList = await subjectQuery.Where(x => subjectIds.Contains(x.SubjectId)).OrderBy(dto.SortField).ToListAsync();
 | ||
|         //    List<GetReadModuleDtoOut> getReadList = ReadModuleViewList.GroupBy(x => new { x.SubjectId, x.TrialSiteId, x.TrialSiteCode, x.SubjectCode })
 | ||
|         //        .Select(x => new GetReadModuleDtoOut()
 | ||
|         //        {
 | ||
|         //            TrialSiteCode = x.Key.TrialSiteCode,
 | ||
|         //            TrialSiteId = x.Key.TrialSiteId,
 | ||
|         //            SubjectCode = x.Key.SubjectCode,
 | ||
|         //            SubjectId = x.Key.SubjectId,
 | ||
|         //            Data = x.OrderBy(x => x.ModuleType).ThenBy(x => x.VisitNum).ToList(),
 | ||
|         //        }).ToList();
 | ||
|         //    PageOutput<GetReadModuleDtoOut> pageOutput = new PageOutput<GetReadModuleDtoOut>()
 | ||
|         //    {
 | ||
|         //        PageSize = dto.PageSize,
 | ||
|         //        CurrentPageData = getReadList,
 | ||
|         //        PageIndex = dto.PageIndex,
 | ||
|         //        TotalCount = await subjectQuery.Select(x => x.SubjectId).Distinct().CountAsync(),
 | ||
|         //    };
 | ||
|         //    var maxcount = 0;
 | ||
|         //    pageOutput.CurrentPageData.ForEach(x =>
 | ||
|         //    {
 | ||
|         //        maxcount = maxcount < x.Data.Count ? x.Data.Count : maxcount;
 | ||
|         //    });
 | ||
| 
 | ||
| 
 | ||
|         //    var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == dto.TrialReadingCriterionId).Select(x => new
 | ||
|         //    {
 | ||
|         //        x.IsReadingTaskViewInOrder,
 | ||
|         //        x.IsOncologyReading,
 | ||
|         //        x.IsGlobalReading,
 | ||
|         //        x.IsReadingPeriod,
 | ||
|         //        x.ReadingInfoSignTime,
 | ||
|         //    }).FirstNotNullAsync();
 | ||
| 
 | ||
|         //    return ResponseOutput.Ok(pageOutput, new
 | ||
|         //    {
 | ||
|         //        MaxLength = maxcount,
 | ||
|         //        IsReadingTaskViewInOrder = criterionInfo.IsReadingTaskViewInOrder,
 | ||
|         //        IsClinicalReading = criterionInfo.IsOncologyReading,
 | ||
|         //        // OnlyExistsMedicalHistory = !(await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataSetName != "既往局部治疗史" && x.IsConfirm)),
 | ||
|         //        IsExistsSubjectClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.Subject && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
 | ||
|         //        IsExistsVisitClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
 | ||
|         //        IsExistsStudyClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.Study && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
 | ||
|         //        IsExistsReadingClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.ImageRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
 | ||
|         //        IsExistsOncologyReadClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.OncologyRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
 | ||
|         //        IsGlobalReading = criterionInfo.IsGlobalReading,
 | ||
|         //        IsReadingPeriod = criterionInfo.IsReadingPeriod,
 | ||
|         //        ReadingInfoSignTime = criterionInfo.ReadingInfoSignTime,
 | ||
|         //        ExistClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
 | ||
|         //    });
 | ||
| 
 | ||
|         //    #endregion
 | ||
|         //}
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 获取单条详情信息   
 | ||
|         /// </summary>
 | ||
|         /// <param name="dto"></param>
 | ||
|         /// <returns></returns>
 | ||
|         [HttpPost]
 | ||
|         public async Task<GetReadModuleSingleOutdto> GetReadModule(GetReadModuleSingleIndto dto)
 | ||
|         {
 | ||
|             var data = await GetReadModuleList(new GetReadModuleDto()
 | ||
|             {
 | ||
|                 SubjectId = dto.SubjectId,
 | ||
|                 TrialId = dto.TrialId,
 | ||
|                 TrialReadingCriterionId = dto.TrialReadingCriterionId,
 | ||
|             });
 | ||
| 
 | ||
|             GetReadModuleSingleOutdto? readModule = data.Data.CurrentPageData.FirstOrDefault().Data.Where(x => x.Id == dto.Id).Select(x => new GetReadModuleSingleOutdto()
 | ||
|             {
 | ||
|                 Id = x.Id,
 | ||
|                 ModuleType = x.ModuleType,
 | ||
|                 SubjectVisitId = x.SubjectVisitId,
 | ||
|                 SubjectVisitName = x.SubjectVisitName,
 | ||
| 
 | ||
|                 Status = x.ReadingStatus,
 | ||
|             }).FirstOrDefault();
 | ||
| 
 | ||
| 
 | ||
|             var stakeholderIds = new List<Guid>();
 | ||
| 
 | ||
|             var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(x => x.Id == readModule.SubjectVisitId);
 | ||
| 
 | ||
|             switch (readModule.Status)
 | ||
|             {
 | ||
|                 case ReadingStatusEnum.ImageNotSubmit:
 | ||
|                     stakeholderIds.AddRange(await _dicomInstanceRepository.Where(x => x.SubjectVisitId == readModule.SubjectVisitId).Select(x => x.CreateUserId).Distinct().ToListAsync());
 | ||
|                     stakeholderIds.AddRange(await _noneDicomStudyFileRepository.Where(x => x.NoneDicomStudy.SubjectVisitId == readModule.SubjectVisitId).Select(x => x.CreateUserId).Distinct().ToListAsync());
 | ||
|                     break;
 | ||
|                 case ReadingStatusEnum.ImageQuality:
 | ||
|                     if (subjectVisit.PreliminaryAuditUserId != null)
 | ||
|                     {
 | ||
|                         stakeholderIds.Add(subjectVisit.PreliminaryAuditUserId.Value);
 | ||
|                     }
 | ||
|                     if (subjectVisit.ReviewAuditUserId != null)
 | ||
|                     {
 | ||
|                         stakeholderIds.Add(subjectVisit.ReviewAuditUserId.Value);
 | ||
|                     }
 | ||
|                     break;
 | ||
|                 case ReadingStatusEnum.TaskAllocate:
 | ||
|                     if (subjectVisit.CheckUserId != null)
 | ||
|                     {
 | ||
|                         stakeholderIds.Add(subjectVisit.CheckUserId.Value);
 | ||
|                     }
 | ||
|                     break;
 | ||
|                 case ReadingStatusEnum.ImageReading:
 | ||
|                 case ReadingStatusEnum.ReadCompleted:
 | ||
| 
 | ||
|                     var doctorUserId = await _visitTaskRepository.Where(x => (x.SouceReadModuleId == dto.Id || x.SourceSubjectVisitId == dto.Id) && x.TaskState == TaskState.Effect)
 | ||
|                         .Where(x => x.DoctorUserId != null).Select(x => x.DoctorUserId.Value).ToListAsync();
 | ||
| 
 | ||
|                     stakeholderIds.AddRange(doctorUserId);
 | ||
| 
 | ||
|                     break;
 | ||
|             };
 | ||
| 
 | ||
|             readModule.StakeholderIds = stakeholderIds.Distinct().ToList();
 | ||
|             readModule.StakeholderNames = await _userRoleRepository.Where(x => readModule.StakeholderIds.Contains(x.Id)).Select(x => x.IdentityUser.FullName).ToListAsync();
 | ||
| 
 | ||
|             return readModule;
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 添加阅片的时候 获取访视  //标准参数必传
 | ||
|         /// </summary>
 | ||
|         /// <param name="inDto"></param>
 | ||
|         /// <returns></returns>
 | ||
|         public async Task<List<GetSubjectReadVisitsOutDto>> GetSubjectReadVisitList(GetSubjectReadVisitsInDto inDto)
 | ||
|         {
 | ||
|             //增加标准
 | ||
|             var maxReadVisit = await _readModuleRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ReadingSetType == inDto.ReadingSetType && x.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Include(x => x.SubjectVisit).OrderByDescending(x => x.SubjectVisit.VisitNum).FirstOrDefaultAsync();
 | ||
| 
 | ||
|             var maxReadVisitNum = maxReadVisit == null ? -1 : maxReadVisit.SubjectVisit.VisitNum;
 | ||
|             var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && x.LatestScanDate != null && !x.IsLostVisit);
 | ||
|             var finalVisitNum = await visitQuery.Where(x => x.IsFinalVisit).Select(x => x.VisitNum).FirstOrDefaultAsync();
 | ||
| 
 | ||
|             //增加标准
 | ||
|             var readModulequery = _readModuleRepository.AsQueryable().Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId);
 | ||
| 
 | ||
|             var resultlist = await visitQuery.WhereIf(finalVisitNum != 0, x => x.VisitNum <= finalVisitNum)
 | ||
|                  .WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0)
 | ||
|                  .Where(x => x.VisitNum > maxReadVisitNum)
 | ||
|                  //.Where(x => !x.IsBaseLine) // 排除基线
 | ||
|                  .Where(x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == inDto.ReadingSetType).Count() == 0).OrderBy(x => finalVisitNum)
 | ||
|                  .Select(x => new GetSubjectReadVisitsOutDto()
 | ||
|                  {
 | ||
|                      SubjectVisitId = x.Id,
 | ||
|                      VisitName = x.VisitName,
 | ||
|                      VisitNum = x.VisitNum,
 | ||
|                  }).OrderBy(x => x.VisitNum).ToListAsync();
 | ||
| 
 | ||
|             return resultlist;
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 添加阅片期
 | ||
|         /// </summary>
 | ||
|         /// <param name="dto"></param>
 | ||
|         /// <returns></returns>
 | ||
|         [HttpPost]
 | ||
|         [TrialGlobalLimit("AfterStopCannNotOpt")]
 | ||
|         public async Task<IResponseOutput> AddReadModule(ReadModuleAddDto dto)
 | ||
|         {
 | ||
| 
 | ||
| 
 | ||
|             var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == dto.SubjectId);
 | ||
| 
 | ||
|             visitQuery = visitQuery
 | ||
|                 //.WhereIf(dto.ExpirationDate != null, x => x.LatestScanDate <= dto.ExpirationDate.Value)
 | ||
|                 .WhereIf(dto.ExpirationVisitNum != null, x => x.VisitNum == dto.ExpirationVisitNum!);
 | ||
|             var visit = visitQuery.OrderByDescending(x => x.VisitNum).FirstOrDefault();
 | ||
| 
 | ||
|             var moduleType = dto.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Global : ModuleTypeEnum.Oncology;
 | ||
| 
 | ||
|             if (visit != null)
 | ||
|             {
 | ||
| 
 | ||
|                 if (await _readModuleRepository.AnyAsync(x => x.SubjectVisitId == visit.Id && x.ModuleType == moduleType && x.TrialReadingCriterionId == dto.TrialReadingCriterionId))
 | ||
|                 {
 | ||
|                     //---当前访视已经添加过阅片期
 | ||
|                     throw new BusinessValidationFailedException(_localizer["ReadModule_AlreadyAdded"]);
 | ||
|                 }
 | ||
|                 var readModuleData = new ReadModule()
 | ||
|                 {
 | ||
|                     Id = NewId.NextGuid(),
 | ||
|                     SubjectId = dto.SubjectId,
 | ||
|                     ModuleType = moduleType,
 | ||
|                     IsUrgent = visit.IsUrgent,
 | ||
|                     ModuleName = dto.Name,
 | ||
|                     SubjectVisitId = visit.Id,
 | ||
|                     ReadingSetType = dto.ReadingSetType,
 | ||
|                     TrialId = dto.TrialId,
 | ||
| 
 | ||
|                     ReadingStatus = ReadingStatusEnum.TaskAllocate,
 | ||
| 
 | ||
|                     //增加标准
 | ||
|                     TrialReadingCriterionId = dto.TrialReadingCriterionId,
 | ||
| 
 | ||
|                 };
 | ||
| 
 | ||
|                 await _readModuleRepository.AddAsync(readModuleData);
 | ||
| 
 | ||
|                 // 判断是否要添加肿瘤学或者全局阅片任务
 | ||
|                 switch (readModuleData.ModuleType)
 | ||
|                 {
 | ||
|                     case ModuleTypeEnum.Global:
 | ||
|                         //增加标准
 | ||
|                         var taskListInfo = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == readModuleData.SubjectVisitId && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned
 | ||
|                         && !x.IsAnalysisCreate && x.TrialReadingCriterionId == dto.TrialReadingCriterionId
 | ||
| 
 | ||
|                         ).ToListAsync();
 | ||
| 
 | ||
|                         // 生成全局阅片任务 具体是否需要生成在_visitTaskHelpeService里面有逻辑判断
 | ||
|                         foreach (var taskInfo in taskListInfo)
 | ||
|                         {
 | ||
|                             await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
 | ||
|                             {
 | ||
|                                 OriginalVisitId = taskInfo.Id,
 | ||
|                                 ReadingCategory = GenerateTaskCategory.Global,
 | ||
|                                 TrialId = dto.TrialId,
 | ||
|                                 ReadingGenerataTaskList = new List<ReadingGenerataTaskDTO>() {
 | ||
|                                 new ReadingGenerataTaskDTO()
 | ||
|                                  {
 | ||
|                                    IsUrgent = readModuleData.IsUrgent ?? false,
 | ||
|                                    SubjectId = readModuleData.SubjectId,
 | ||
| 
 | ||
|                                    ReadingName = readModuleData.ModuleName,
 | ||
|                                    ReadModuleId =readModuleData.Id,
 | ||
|                                    ReadingCategory = ReadingCategory.Global,
 | ||
|                                  }
 | ||
|                                 }
 | ||
|                             });
 | ||
|                         }
 | ||
| 
 | ||
|                         // 生成裁判任务 是否需要生成函数里面有逻辑判断
 | ||
|                         if (taskListInfo.Count() > 0)
 | ||
|                         {
 | ||
|                             await _readingImageTaskService.TriggerJudgeQuestion(taskListInfo[0].Id);
 | ||
|                         }
 | ||
| 
 | ||
|                         break;
 | ||
| 
 | ||
|                     case ModuleTypeEnum.Oncology:
 | ||
| 
 | ||
| 
 | ||
|                         var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == dto.TrialReadingCriterionId).Select(x => new
 | ||
|                         {
 | ||
|                             x.ReadingType,
 | ||
| 
 | ||
|                         }).FirstNotNullAsync();
 | ||
| 
 | ||
| 
 | ||
|                         //增加标准
 | ||
|                         var globalModule = await _readModuleRepository.Where(x => x.SubjectId == readModuleData.SubjectId && x.SubjectVisitId == readModuleData.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global && x.TrialReadingCriterionId == dto.TrialReadingCriterionId).FirstOrDefaultAsync();
 | ||
| 
 | ||
|                         if (globalModule != null)
 | ||
|                         {
 | ||
|                             var globalTaskInfoList = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalModule.Id
 | ||
|                             && x.TrialReadingCriterionId == dto.TrialReadingCriterionId
 | ||
|                             && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync();
 | ||
| 
 | ||
|                             if (globalTaskInfoList.Count() > 0 && globalTaskInfoList.Count == (int)criterionInfo.ReadingType)
 | ||
|                             {
 | ||
|                                 var isAdd = false;
 | ||
|                                 if (globalTaskInfoList[0].JudgeVisitTaskId == null)
 | ||
|                                 {
 | ||
|                                     isAdd = true;
 | ||
|                                 }
 | ||
|                                 else
 | ||
|                                 {
 | ||
|                                     isAdd = await _visitTaskRepository.AnyAsync(x => x.Id == globalTaskInfoList[0].JudgeVisitTaskId && x.ReadingTaskState == ReadingTaskState.HaveSigned);
 | ||
|                                 }
 | ||
|                                 if (isAdd)
 | ||
|                                 {
 | ||
|                                     await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
 | ||
|                                     {
 | ||
|                                         OriginalVisitId = globalTaskInfoList[0].Id,
 | ||
|                                         ReadingCategory = GenerateTaskCategory.Oncology,
 | ||
|                                         TrialId = dto.TrialId,
 | ||
|                                         ReadingGenerataTaskList = new List<ReadingGenerataTaskDTO>() {
 | ||
|                                 new ReadingGenerataTaskDTO()
 | ||
|                                  {
 | ||
|                                    IsUrgent = readModuleData.IsUrgent ?? false,
 | ||
|                                    SubjectId = readModuleData.SubjectId,
 | ||
|                                    VisitNum=visit.VisitNum,
 | ||
|                                    ReadingName = readModuleData.ModuleName,
 | ||
| 
 | ||
|                                    ReadModuleId =readModuleData.Id,
 | ||
|                                    ReadingCategory = ReadingCategory.Oncology,
 | ||
|                                  }
 | ||
|                                 }
 | ||
|                                     });
 | ||
|                                 }
 | ||
|                             }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|                         }
 | ||
|                         else
 | ||
|                         {
 | ||
|                             //---请先添加全局阅片
 | ||
|                             return ResponseOutput.NotOk(_localizer["ReadModule_AddGlobalFirst"]);
 | ||
|                         }
 | ||
|                         break;
 | ||
|                 }
 | ||
|                 var res = await _readModuleRepository.SaveChangesAsync();
 | ||
|                 return ResponseOutput.Ok(res);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 //---未找到符合要求的访视
 | ||
|                 return ResponseOutput.NotOk(_localizer["ReadModule_VisitNotFound"]);
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 删除
 | ||
|         /// </summary>
 | ||
|         /// <param name="readModuleId"></param>
 | ||
|         /// <returns></returns>
 | ||
|         [HttpDelete("{readModuleId:guid}")]
 | ||
|         [TrialGlobalLimit("AfterStopCannNotOpt")]
 | ||
|         public async Task<IResponseOutput> DeleteReadModule(Guid readModuleId)
 | ||
|         {
 | ||
| 
 | ||
|             var readModule = await _readModuleRepository.Where(x => x.Id == readModuleId).FirstNotNullAsync();
 | ||
| 
 | ||
|             var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModule.TrialReadingCriterionId).Select(x => new
 | ||
|             {
 | ||
|                 x.ReadingType,
 | ||
|                 x.IsArbitrationReading,
 | ||
|                 x.IsReadingPeriod,
 | ||
|                 x.ArbitrationRule,
 | ||
|                 x.IsGlobalReading,
 | ||
|                 x.IsOncologyReading,
 | ||
|             }).FirstNotNullAsync();
 | ||
| 
 | ||
|             if (await _readingClinicalDataRepository.Where(t => t.ReadingId == readModuleId).AnyAsync(t => t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned))
 | ||
|             {
 | ||
|                 //---临床资料已签名,不允许删除
 | ||
|                 return ResponseOutput.NotOk(_localizer["ReadModule_SignedDataCannotDelete"]);
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             if (await _readModuleRepository.AnyAsync(x => x.Id == readModuleId && x.IsCRCConfirm))
 | ||
|             {
 | ||
|                 //---CRC已经确认临床数据 不允许删除
 | ||
|                 return ResponseOutput.NotOk(_localizer["ReadModule_CRCConfirmClinicalData"]);
 | ||
|             }
 | ||
| 
 | ||
|             //增加标准
 | ||
|             if (readModule.ModuleType == ModuleTypeEnum.Global && (await _readModuleRepository.AnyAsync(x => x.ModuleType == ModuleTypeEnum.Oncology && x.SubjectVisitId == readModule.SubjectVisitId && x.TrialReadingCriterionId == readModule.TrialReadingCriterionId)))
 | ||
|             {
 | ||
|                 //---当前访视存在肿瘤学阅片,请先删除肿瘤学阅片
 | ||
|                 throw new BusinessValidationFailedException(_localizer["ReadModule_TumorExists"]);
 | ||
|             }
 | ||
| 
 | ||
|             if (await _visitTaskRepository.AnyAsync(x => readModuleId == x.SouceReadModuleId))
 | ||
|             {
 | ||
|                 //---当前阅片已生成任务,操作失败。
 | ||
|                 throw new BusinessValidationFailedException(_localizer["ReadModule_TaskGenerated"]);
 | ||
|             }
 | ||
| 
 | ||
|             // 如果生成了 访视级别的阅片期裁判 不让删除
 | ||
|             if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading)
 | ||
|             {
 | ||
|                 if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge))
 | ||
|                 {
 | ||
|                     //---当前阅片已生成裁判任务,操作失败。
 | ||
|                     throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => readModuleId == x.SouceReadModuleId, x => new VisitTask()
 | ||
|             {
 | ||
|                 TaskState = TaskState.Adbandon
 | ||
|             });
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             await _readModuleRepository.UpdatePartialFromQueryAsync(t => t.Id == readModuleId, x => new ReadModule()
 | ||
|             {
 | ||
| 
 | ||
|                 IsDeleted = true
 | ||
|             });
 | ||
|             await _readModuleRepository.SaveChangesAsync();
 | ||
|             return ResponseOutput.Result(true);
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|     }
 | ||
| }
 |