using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.ViewModel;
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
{
    /// 
    /// 生成的阅片模块(在大列表上展示的) 阅片期
    /// 
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadModuleService(IRepository _subjectVisitRepository,
        IRepository _subjectRepository,
        IRepository _userRoleRepository,
        IRepository _trialRepository,
        IVisitTaskHelpeService _visitTaskHelpeService,
        IRepository _visitTaskRepository,
        IRepository _clinicalDataTrialSetRepository,
        IRepository _readModuleViewRepository,
        IRepository _readingQuestionCriterionTrialRepository,
        IRepository _dicomInstanceRepository,
        IRepository _noneDicomStudyFileRepository,
        IRepository _readingClinicalDataRepository,
        IRepository _readingPeriodSetRepository,
        IRepository _readModuleRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
    {
        #region 获取修改时可选择的阅片期截止访视
        /// 
        /// 获取修改截止访视下拉
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task> 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
        /// 
        /// 修改全局阅片截止访视
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task ChangeCutOffVisit(ChangeCutOffVisitInDto inDto)
        {
            if (await _readModuleRepository.AnyAsync(x => x.Id == inDto.Id && x.IsCRCConfirm))
            {
                //---CRC已经确认临床数据 不允许编辑
                throw new BusinessValidationFailedException(_localizer["ReadModule_CRCConfirmCanNtoEdit"]);
            }
            await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.Id, x => new ReadModule()
            {
                SubjectVisitId = inDto.SubjectVisitIdId,
                ModuleName = inDto.Name,
            });
            return await _readModuleRepository.SaveChangesAsync();
        }
        /// 
        /// 用ef 实现之前视图的功能
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task>> 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(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,
                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)
                .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 = 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 })
                .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();
            var pageOutput = new PageOutput()
            {
                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)),
            });
        }
        ///// 
        ///// 获取读片模块  //加了标准参数
        ///// 
        //[HttpPost]
        //public async Task>> 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 ReadModuleViewList = await subjectQuery.Where(x => subjectIds.Contains(x.SubjectId)).OrderBy(dto.SortField).ToListAsync();
        //    List 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 pageOutput = new PageOutput()
        //    {
        //        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
        //}
        /// 
        /// 获取单条详情信息   
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task 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();
            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;
        }
        /// 
        /// 添加阅片的时候 获取访视  //标准参数必传
        /// 
        /// 
        /// 
        public async Task> 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;
        }
        /// 
        /// 添加阅片期
        /// 
        /// 
        /// 
        [HttpPost]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        public async Task 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();
                        foreach (var taskInfo in taskListInfo)
                        {
                            await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
                            {
                                OriginalVisitId = taskInfo.Id,
                                ReadingCategory = GenerateTaskCategory.Global,
                                TrialId = dto.TrialId,
                                ReadingGenerataTaskList = new List() {
                                new ReadingGenerataTaskDTO()
                                 {
                                   IsUrgent = readModuleData.IsUrgent ?? false,
                                   SubjectId = readModuleData.SubjectId,
                                   ReadingName = readModuleData.ModuleName,
                                   ReadModuleId =readModuleData.Id,
                                   ReadingCategory = ReadingCategory.Global,
                                 }
                                }
                            });
                        }
                        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() {
                                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"]);
            }
        }
        /// 
        /// 删除
        /// 
        /// 
        /// 
        [HttpDelete("{readModuleId:guid}")]
        [TrialGlobalLimit( "AfterStopCannNotOpt" )]
        public async Task DeleteReadModule(Guid readModuleId)
        {
            var readModule = await _readModuleRepository.Where(x => x.Id == readModuleId).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"]);
            }
            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);
        }
    }
}