using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.AspNetCore.Mvc; using System.Linq.Dynamic.Core; namespace IRaCIS.Core.Application.Service { /// /// 生成的阅片模块(在大列表上展示的) 阅片期 /// [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, IReadingImageTaskService _readingImageTaskService, 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"]); } var readModule = await _readModuleRepository.Where(x => x.Id == inDto.Id).FirstNotNullAsync(); var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModule.TrialReadingCriterionId).Select(x => new { x.ReadingType, x.IsArbitrationReading, x.IsReadingPeriod, x.ArbitrationRule, x.IsGlobalReading, x.IsOncologyReading, }).FirstNotNullAsync(); // 如果生成了 访视级别的阅片期裁判 不让修改 if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading) { if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge)) { //---当前阅片已生成裁判任务,操作失败。 throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]); } } await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.Id, x => new ReadModule() { SubjectVisitId = inDto.SubjectVisitIdId, ModuleName = inDto.Name, }); return await _readModuleRepository.SaveChangesAsync(); } /// /// 用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(); // 生成全局阅片任务 具体是否需要生成在_visitTaskHelpeService里面有逻辑判断 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, } } }); } // 生成裁判任务 是否需要生成函数里面有逻辑判断 if (taskListInfo.Count() > 0) { await _readingImageTaskService.TriggerJudgeQuestion(taskListInfo[0].Id); } break; case ModuleTypeEnum.Oncology: var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == dto.TrialReadingCriterionId).Select(x => new { x.ReadingType, }).FirstNotNullAsync(); //增加标准 var globalModule = await _readModuleRepository.Where(x => x.SubjectId == readModuleData.SubjectId && x.SubjectVisitId == readModuleData.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global && x.TrialReadingCriterionId == dto.TrialReadingCriterionId).FirstOrDefaultAsync(); if (globalModule != null) { var globalTaskInfoList = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalModule.Id && x.TrialReadingCriterionId == dto.TrialReadingCriterionId && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync(); if (globalTaskInfoList.Count() > 0 && globalTaskInfoList.Count == (int)criterionInfo.ReadingType) { var isAdd = false; if (globalTaskInfoList[0].JudgeVisitTaskId == null) { isAdd = true; } else { isAdd = await _visitTaskRepository.AnyAsync(x => x.Id == globalTaskInfoList[0].JudgeVisitTaskId && x.ReadingTaskState == ReadingTaskState.HaveSigned); } if (isAdd) { await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() { OriginalVisitId = globalTaskInfoList[0].Id, ReadingCategory = GenerateTaskCategory.Oncology, TrialId = dto.TrialId, ReadingGenerataTaskList = new List() { 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(); var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModule.TrialReadingCriterionId).Select(x => new { x.ReadingType, x.IsArbitrationReading, x.IsReadingPeriod, x.ArbitrationRule, x.IsGlobalReading, x.IsOncologyReading, }).FirstNotNullAsync(); if (await _readingClinicalDataRepository.Where(t => t.ReadingId == readModuleId).AnyAsync(t => t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned)) { //---临床资料已签名,不允许删除 return ResponseOutput.NotOk(_localizer["ReadModule_SignedDataCannotDelete"]); } if (await _readModuleRepository.AnyAsync(x => x.Id == readModuleId && x.IsCRCConfirm)) { //---CRC已经确认临床数据 不允许删除 return ResponseOutput.NotOk(_localizer["ReadModule_CRCConfirmClinicalData"]); } //增加标准 if (readModule.ModuleType == ModuleTypeEnum.Global && (await _readModuleRepository.AnyAsync(x => x.ModuleType == ModuleTypeEnum.Oncology && x.SubjectVisitId == readModule.SubjectVisitId && x.TrialReadingCriterionId == readModule.TrialReadingCriterionId))) { //---当前访视存在肿瘤学阅片,请先删除肿瘤学阅片 throw new BusinessValidationFailedException(_localizer["ReadModule_TumorExists"]); } if (await _visitTaskRepository.AnyAsync(x => readModuleId == x.SouceReadModuleId)) { //---当前阅片已生成任务,操作失败。 throw new BusinessValidationFailedException(_localizer["ReadModule_TaskGenerated"]); } // 如果生成了 访视级别的阅片期裁判 不让删除 if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading) { if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge)) { //---当前阅片已生成裁判任务,操作失败。 throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]); } } await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => readModuleId == x.SouceReadModuleId, x => new VisitTask() { TaskState = TaskState.Adbandon }); await _readModuleRepository.UpdatePartialFromQueryAsync(t => t.Id == readModuleId, x => new ReadModule() { IsDeleted = true }); await _readModuleRepository.SaveChangesAsync(); return ResponseOutput.Result(true); } } }