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);
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
    }
 | 
						||
}
 |