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
{
    /// <summary>
    /// 生成的阅片模块(在大列表上展示的) 阅片期
    /// </summary>
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadModuleService(IRepository<SubjectVisit> _subjectVisitRepository,
        IRepository<Subject> _subjectRepository,
        IRepository<User> _userRepository,
        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,
        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();


            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)
                 .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"]);
            }

            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(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<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 _userRepository.Where(x => readModule.StakeholderIds.Contains(x.Id)).Select(x => x.FirstName + "/" + x.LastName).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();
                        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,
                                 }
                                }
                            });
                        }
                        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();


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


    }
}