diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index defe64133..b9a7877bc 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -11,6 +11,7 @@ using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service.Inspection.DTO; using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Application.Service.Reading.Interface; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; @@ -36,6 +37,7 @@ namespace IRaCIS.Core.API.Controllers private readonly IHttpContextAccessor _httpContext; private readonly ITrialConfigService _trialConfigService; private readonly INoneDicomStudyService _noneDicomStudyService; + private readonly IClinicalAnswerService _clinicalAnswerService; private readonly ISubjectService _subjectService; private readonly IReadingClinicalDataService _readingClinicalDataService; private readonly ISubjectVisitService _subjectVisitService; @@ -62,6 +64,7 @@ namespace IRaCIS.Core.API.Controllers IReadingMedicineQuestionService readingMedicineQuestionService, ITrialConfigService _trialConfigService, INoneDicomStudyService noneDicomStudyService, + IClinicalAnswerService clinicalAnswerService, ISubjectService _subjectService, IReadingClinicalDataService _readingClinicalDataService, ISubjectVisitService subjectVisitService, @@ -82,6 +85,7 @@ namespace IRaCIS.Core.API.Controllers this._httpContext = httpContext; this._trialConfigService = _trialConfigService; this._noneDicomStudyService = noneDicomStudyService; + this._clinicalAnswerService = clinicalAnswerService; this._subjectService = _subjectService; this._readingClinicalDataService = _readingClinicalDataService; this._subjectVisitService = subjectVisitService; @@ -233,6 +237,94 @@ namespace IRaCIS.Core.API.Controllers } + /// + /// CRC签名临床数据 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/CRCSignClinicalData")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task CRCSignClinicalData(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.CRCSignClinicalData(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + + + /// + /// CRC确认临床数据 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/CRCConfirmClinical")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task CRCConfirmClinical(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.CRCConfirmClinical(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + + /// + /// CRC撤销临床数据 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/CRCCancelConfirmClinical")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task CRCCancelConfirmClinical(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.CRCCancelConfirmClinical(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + + + /// + /// PM确认临床数据 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/PMConfirmClinical")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task PMConfirmClinical(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.PMConfirmClinical(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + + + /// + /// 提交结构化录入并签名 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/SubmitClinicalFormAndSign")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task SubmitClinicalFormAndSign(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.SubmitClinicalForm(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + /// /// 提交阅片裁判问题 /// diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index 045a819ce..ed6960728 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -139,6 +139,41 @@ + + + CRC签名临床数据 + + + + + + + CRC确认临床数据 + + + + + + + CRC撤销临床数据 + + + + + + + PM确认临床数据 + + + + + + + 提交结构化录入并签名 + + + + 提交阅片裁判问题 diff --git a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs index 5ce0f00d7..2f2890712 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs @@ -37,6 +37,7 @@ namespace IRaCIS.Core.API triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); + triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); diff --git a/IRaCIS.Core.API/wwwroot/swagger/ui/abp.swagger.js b/IRaCIS.Core.API/wwwroot/swagger/ui/abp.swagger.js index eb708cbbd..30ec9c833 100644 --- a/IRaCIS.Core.API/wwwroot/swagger/ui/abp.swagger.js +++ b/IRaCIS.Core.API/wwwroot/swagger/ui/abp.swagger.js @@ -414,8 +414,8 @@ var abp = abp || {}; //Inputs createInput(modalUxContent, 'tenancyName', 'Tenancy Name (Leave empty for Host)'); - createInput(modalUxContent, 'userName', 'Username or email address','text','admin'); - createInput(modalUxContent, 'password', 'Password','password'); + createInput(modalUxContent, 'userName', 'Username or email address','text','cyldev'); + createInput(modalUxContent, 'password', 'Password','password','123456'); //Buttons var authBtnWrapper = document.createElement('div'); diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 7cd213420..e9489d018 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -85,6 +85,14 @@ + + + 替换表格Key + + + + + 分配规则 @@ -272,11 +280,74 @@ - + - 获取项目下 阅片人下拉 + Subject 任务类型 统计 +分配情况 + + + + + + 一次性分配所有医生 批量分配(添加),后端现在没限制 + + + + + + + 阅片人维度 Subject统计表 + + + + + + 获取Subject 分配医生情况 + + + + + + + + 取消Subject 分配的医生 + + + + + + + + 任务 手动分配 重新分配 确认 取消分配 + 分配 + + + + + + 获取手动分配 未分配的Subject列表(IsHaveAssigned 传递false) + + + + + + 批量为 多个Subject 分配医生 手动分配 IsReAssign 为true 批量删除 重新分配 + + + + + + + 批量取消Subject 分配的医生 + + 数量 + + + + 手动分配确认 绑定该Subject的已存在的任务给医生 + + @@ -287,25 +358,11 @@ - - - new- 首次审核 后续编辑审核 - - - - - - - new- 回复审核内容 - - - - - + - new- 获取审核对话列表 + 裁判任务 - + @@ -1091,6 +1148,11 @@ 获取登陆用户的系统通知列表 只是过滤了用户类型 和已经发布的 + + + UserLogService + + 验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 @@ -2437,6 +2499,13 @@ 临床答案 + + + CRC签名临床数据 + + + + 自动添加CRC临床数据 @@ -2472,6 +2541,21 @@ + + + 删除表单数据 + + + + + + + + 获取PM待确认列表 + + + + 获取CRC确认列表 @@ -2486,6 +2570,20 @@ + + + 获取临床数据表格信息 查看没有表格问题的列表 + + + + + + + 获取临床数据表格信息 查看有表格问题的列表 + + + + CRC 确认临床数据 @@ -2668,6 +2766,46 @@ + + + 上传角色 + + + + + 访视Id 或者模块Id + + + + + 临床级别 + + + + + 上传方式 + + + + + 模块名称 + + + + + 临床数据是否完整 + + + + + 临床数据是否盲化 + + + + + 受试者Id + + 临床级别 @@ -2678,16 +2816,21 @@ 受试者ID + + + 模块名称 + + + + + CRC是否正在申请撤回 + + 最晚拍片日期 - - - VisitId - - VisitId @@ -3033,6 +3176,11 @@ 最大长度 + + + 最大行数 + + 临床数据选项类型(无,自定义) @@ -3758,6 +3906,21 @@ 路径 + + + 临床数据类型Id + + + + + 1 PM上传的所有的 2CRC上传的所有已确认的 3 所有已经签名的 + + + + + 只获取CRC上传的阅片模块结构化录入 + + 只查询已经签名的临床数据 @@ -3768,6 +3931,16 @@ 获取访视列表 + + + 临床数据类型Id + + + + + 1 PM上传的所有的 2CRC上传的所有已确认的 3 所有已经签名的 + + 是否是访视 @@ -3833,6 +4006,11 @@ 访视Id 或者模块Id + + + CRC是否正在申请撤回 + + 项目配置临床类型Name @@ -3903,6 +4081,16 @@ 文件数量 + + + 表单Id + + + + + 检查日期 + + Id @@ -7885,6 +8073,16 @@ 完成阅片量 + + + 未完成裁判任务数量 + + + + + 完成裁判任务数量 + + 建议完成时间 @@ -8122,6 +8320,9 @@ UserLogQuery 列表查询参数模型 + + UserLogAddOrEdit 列表查询参数模型 + 靶病灶是否为IUPD或者ICPD @@ -10604,6 +10805,13 @@ vvv + + + 获取PM核对临床数据 + + + + SPM 阅片人筛选 @@ -10613,7 +10821,7 @@ vvv - + SPM 重阅审批 @@ -10630,6 +10838,14 @@ + + + 临床数据 --CRC 待确认 + + + + + CRC影像质疑待处理 --CRC 待办 @@ -10696,7 +10912,7 @@ - + MIM医学反馈 diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 75fdb7488..0a151eda4 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -459,6 +459,13 @@ namespace IRaCIS.Core.Application.Service var haveSignedCount = _readingClinicalDataRepository .Where(t => t.TrialId == trialId && t.IsSign && t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned && t.ReadingId == readingId && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM).Count(); + + var readModule = _readModuleRepository.Where(t => t.Id == readingId).FirstOrDefault(); + //CRC 阅片期自定义结构化录入是否签名 + bool crcReadModuleSign = true; + + + //访视 if (readingCategory == ReadingCategory.Visit) { @@ -478,16 +485,37 @@ namespace IRaCIS.Core.Application.Service { } + //阅片期 else if (readingCategory == ReadingCategory.Global) { needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && t.ClinicalDataLevel == ClinicalLevel.ImageRead && t.UploadRole == UploadRole.PM).Count(); + if (readModule != null) + { + // 不存在需要CRC上传的临床数据 或者 PM已确认 + crcReadModuleSign = + !trialClinicalDataSetList.Any(x => + x.UploadRole == UploadRole.CRC + && x.ClinicalDataLevel == ClinicalLevel.ImageRead + && x.ClinicalUploadType == ClinicalUploadType.Structuring + && x.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId)) || readModule.IsPMConfirm; + } } // 肿瘤学 else if (readingCategory == ReadingCategory.Oncology) { - return trialClinicalDataSetList.Any(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead); + needSignCount= trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead && t.UploadRole == UploadRole.PM).Count(); + if (readModule != null) + { + // 不存在需要CRC上传的临床数据 或者 PM已确认 + crcReadModuleSign = + !trialClinicalDataSetList.Any(x => + x.UploadRole == UploadRole.CRC + && x.ClinicalDataLevel == ClinicalLevel.OncologyRead + && x.ClinicalUploadType == ClinicalUploadType.Structuring + && x.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId)) || readModule.IsPMConfirm; + } } else { @@ -495,7 +523,7 @@ namespace IRaCIS.Core.Application.Service } //可能仅仅CRC 基线 没有PM - if (needSignCount == haveSignedCount /*&& needSignCount != 0*/) + if (needSignCount == haveSignedCount && crcReadModuleSign ) { isClinicalDataSign = true; diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 1a9e7f4e5..d25b4a08c 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1167,8 +1167,8 @@ namespace IRaCIS.Core.Application.Image.QA } //基线 且配置了临床数据 - if (trialConfig.ClinicalInformationTransmissionEnum != 0 /*&& dbSubjectVisit.IsBaseLine*//*&&dbSubjectVisit.ClinicalDataSignUserId==null*/) - { + //if (trialConfig.ClinicalInformationTransmissionEnum != 0 /*&& dbSubjectVisit.IsBaseLine*//*&&dbSubjectVisit.ClinicalDataSignUserId==null*/) + //{ ////找到需要确认的PDF 临床数据 如果没有CRC 没有上传 那么就添加一条没有文件的记录 @@ -1231,7 +1231,7 @@ namespace IRaCIS.Core.Application.Image.QA //} //return ResponseOutput.NotOk("没有签名临床数据,不允许提交"); - } + //} diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index b220da1c1..5a2f5022c 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -367,9 +367,10 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.CurrentActionUserName, u => u.MapFrom(s => s.CurrentActionUser.UserName)) .ForMember(d => d.PreliminaryAuditUserName, u => u.MapFrom(s => s.PreliminaryAuditUser.UserName)) .ForMember(d => d.ReviewAuditUserName, u => u.MapFrom(s => s.ReviewAuditUser.UserName)) - .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.IsBaseLine ? t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() - || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count() > 0) - || t.PreviousSurgeryList.Any() : false)) + .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() + || t.Subject.ClinicalFormList.Any(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == t.Id) + || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count() > 0) + || t.PreviousSurgeryList.Any())) .ForMember(d => d.DicomStudyCount, u => u.MapFrom(t => t.StudyList.Count())) .ForMember(d => d.NoneDicomStudyCount, u => u.MapFrom(t => t.NoneDicomStudyList.Count(t => t.NoneDicomFileList.Any()))); @@ -385,9 +386,10 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.MedicalNo, u => u.MapFrom(s => s.Subject.MedicalNo)) .ForMember(d => d.Sex, u => u.MapFrom(s => s.Subject.Sex)) .ForMember(d => d.Age, u => u.MapFrom(t => t.Subject.Age)) - .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.IsBaseLine ? t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() + .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() + || t.Subject.ClinicalFormList.Any(x=>x.ClinicalDataTrialSet.UploadRole==UploadRole.CRC&& x.ReadingId==t.Id) || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count() > 0) - || t.PreviousSurgeryList.Any() : false)) + || t.PreviousSurgeryList.Any())) //.ForMember(d => d.VisitName, u => u.MapFrom(t =>t.InPlan? t.VisitStage.VisitName : t.VisitName)) //.ForMember(d => d.VisitNum, u => u.MapFrom(t => t.InPlan ? t.VisitStage.VisitNum : t.VisitNum)) diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs index f806da039..dce0aae40 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs @@ -15,6 +15,7 @@ using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Application.Service.Reading.Interface; +using IRaCIS.Core.Application.Contracts; namespace IRaCIS.Core.Application.Service { @@ -51,6 +52,8 @@ namespace IRaCIS.Core.Application.Service private readonly IClinicalQuestionService _iClinicalQuestionService; + private readonly IReadingClinicalDataService _iReadingClinicalDataService; + public ClinicalAnswerService(IRepository trialClinicalQuestionRepository, IRepository systemClinicalTableQuestionRepository, @@ -58,7 +61,8 @@ namespace IRaCIS.Core.Application.Service IRepository readingClinicalDataRepository, IRepository clinicalFormRepository, IRepository subjectRepository, - IRepository readModuleCriterionFromRepository, + IReadingClinicalDataService iReadingClinicalDataService, + IRepository readModuleCriterionFromRepository, IRepository readModuleRepository, IRepository subjectVisitRepository, IRepository clinicalTableAnswerRepository, @@ -78,8 +82,8 @@ namespace IRaCIS.Core.Application.Service _trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository; _systemClinicalQuestionRepository = systemClinicalQuestionRepository; _clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; - - _clinicalFormRepository = clinicalFormRepository; + _iReadingClinicalDataService = iReadingClinicalDataService; + _clinicalFormRepository = clinicalFormRepository; this._subjectRepository = subjectRepository; this._readModuleCriterionFromRepository = readModuleCriterionFromRepository; this._readModuleRepository = readModuleRepository; @@ -87,6 +91,25 @@ namespace IRaCIS.Core.Application.Service _iClinicalQuestionService = iClinicalQuestionService; } + /// + /// CRC签名临床数据 + /// + /// + /// + [HttpPost] + public async Task CRCSignClinicalData(CRCSignClinicalDataInDto inDto) + { + + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x =>x.Id==inDto.ReadingClinicalDataId, x => new ReadingClinicalData() + { + IsSign = true, + ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned + }); + + await _readingClinicalDataRepository.SaveChangesAsync(); + return ResponseOutput.Ok(true); + } + /// /// 自动添加CRC临床数据 /// @@ -109,7 +132,14 @@ namespace IRaCIS.Core.Application.Service var clinicalDataList =await _readingClinicalDataRepository .WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId) - .Where(x =>x.TrialId==inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole== UploadRole.CRC).IgnoreAutoIncludes().ToListAsync(); + .Where(x =>x.TrialId==inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole== UploadRole.CRC) + .Select(x=>new + { + ClinicalDataTrialSetId=x.ClinicalDataTrialSetId, + SubjectId=x.SubjectId, + x.ReadingId, + + }).ToListAsync(); List readingClinicalDatas = new List(); @@ -165,12 +195,12 @@ namespace IRaCIS.Core.Application.Service }).ToList()); }); - await _readingClinicalDataRepository.AddRangeAsync(readingClinicalDatas); - - await _readingClinicalDataRepository.SaveChangesAsync(); + + await _readingClinicalDataRepository.AddRangeAsync(readingClinicalDatas); + await _readingClinicalDataRepository.SaveChangesAsync(); - } + } /// /// 获取CRC受试者临床数据 @@ -178,18 +208,14 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto) + public async Task> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto) { //await AutoAddCRCClinical(new AutoAddClinicalInDto() //{ - // TrialId = inDto.TrialId //}) ; - - - var subjects = await _subjectRepository.Where(x => x.TrialId == inDto.TrialId).Select(x => new GetCRCSubjectClinicalResultDto() { SubjectId = x.Id, @@ -197,33 +223,38 @@ namespace IRaCIS.Core.Application.Service }).ToListAsync(); - var clinicalData=await _readingClinicalDataRepository.Where(x=>x.TrialId == inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole==UploadRole.CRC&&x.ClinicalDataTrialSet.ClinicalDataLevel!= ClinicalLevel.SubjectVisit) + var clinicalData= _readingClinicalDataRepository.Where(x=>x.TrialId == inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole==UploadRole.CRC&&x.ClinicalDataTrialSet.ClinicalDataLevel!= ClinicalLevel.SubjectVisit) .Where(x=>!x.IsSign) + .WhereIf(inDto.SubjectId!=null,x=>x.SubjectId==inDto.SubjectId) + .WhereIf(inDto.SubjectCode != null, x => x.Subject.Code.Contains(inDto.SubjectCode??string.Empty)) + .Where(x=> x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Subject) .Include(x=>x.ClinicalDataTrialSet).Select(x=>new GetCRCSubjectClinicalOutDto() { SubjectId=x.SubjectId, SubjectCode=x.Subject.Code, TrialId=inDto.TrialId, - ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, + ReadingId= x.ReadingId, + ReadingClinicalDataId=x.Id, + UploadRole = x.ClinicalDataTrialSet.UploadRole, + ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, + ClinicalUploadType= x.ClinicalDataTrialSet.ClinicalUploadType, + BaseLineVisitId= x.Subject.SubjectVisitList.Where(x=>x.IsBaseLine).Select(x=>x.Id).FirstOrDefault(), + ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, ClinicalDataSetEnName= x.ClinicalDataTrialSet.ClinicalDataSetEnName, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName, - }).OrderBy(x=>x.SubjectCode).ToListAsync(); + }); - // 一次查询报错 分两次写 - clinicalData.ForEach(x => + var pageList = await clinicalData.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, string.IsNullOrWhiteSpace(inDto.SortField) ? nameof(GetCRCSubjectClinicalOutDto.SubjectCode) : inDto.SortField, inDto.Asc); + // 一次查询报错 分两次写 + pageList.CurrentPageData.ForEach(x => { x.ClinicalDataSetEnName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us); - }); - - var clinicalFormData = await _clinicalFormRepository.Where(x => x.TrialId == inDto.TrialId).ToListAsync(); - clinicalData.ForEach(n => + pageList.CurrentPageData.ForEach(n => { n.ClinicalCount = clinicalFormData.Where(y => y.ClinicalDataTrialSetId == n.ClinicalDataTrialSetId && y.SubjectId == n.SubjectId).Count(); }); - - - return clinicalData; + return pageList; } /// @@ -238,7 +269,7 @@ namespace IRaCIS.Core.Application.Service result.AnswerList = new List>(); result.QuestionList=await _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inDto.ClinicalDataTrialSetId &&x.ClinicalQuestionType!= ReadingQestionType.Group - && x.ClinicalQuestionType != ReadingQestionType.Table).OrderBy(x=>x.ShowOrder) + && x.ClinicalQuestionType != ReadingQestionType.Table).OrderByDescending(x=>x.IsCheckDate).ThenBy(x=>x.ShowOrder) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var answers = await _clinicalQuestionAnswerRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId) @@ -328,8 +359,24 @@ namespace IRaCIS.Core.Application.Service TrialId= inDto.TrialId, Id = inDto.ClinicalFormId ?? NewId.NextGuid(), ReadingId = inDto.ReadingId, - VisitId = inDto.VisitId, }; + + if (inDto.ClinicalFormId!=null&&(await _readModuleCriterionFromRepository.AnyAsync(x => x.ClinicalFormId == inDto.ClinicalFormId.Value))) + { + throw new BusinessValidationFailedException("当前表单已确认,无法修改!"); + } + + var existsClinical = await _clinicalFormRepository.Where(x => + x.SubjectId == inDto.SubjectId + && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId + ).WhereIf(inDto.ReadingId != null, x => x.ReadingId == inDto.ReadingId) + .Where(x => x.ClinicalDataTrialSet.UploadRole != UploadRole.CRC && !(x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.ImageRead + || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead)).AnyAsync(); + + if (existsClinical) + { + throw new BusinessValidationFailedException("已经添加过临床数据,不允许多次添加!"); + } try { var checkDateQuestionId = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId && x.IsCheckDate).Select(x => x.Id).FirstNotNullAsync(); @@ -343,7 +390,7 @@ namespace IRaCIS.Core.Application.Service if (clinicalForm.CheckDate != null) { - if (await _readModuleRepository.AnyAsync(x => x.SubjectVisit.LatestScanDate <= clinicalForm.CheckDate && x.IsCRCConfirm)) + if (await _readModuleRepository.AnyAsync(x =>x.SubjectId== inDto.SubjectId&& x.SubjectVisit.LatestScanDate <= clinicalForm.CheckDate && x.IsCRCConfirm)) { throw new BusinessValidationFailedException("无法添加和修改当前日期的临床数据,因为CRC已经确认!"); } @@ -404,7 +451,13 @@ namespace IRaCIS.Core.Application.Service await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); } - + //if(inDto.ReadingId!=null) + //{ + // await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.ReadingId == inDto.ReadingId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId, x => new ReadingClinicalData() + // { + // IsSign = true + // }); + //} await _clinicalFormRepository.AddAsync(clinicalForm); await _clinicalQuestionAnswerRepository.AddRangeAsync(clinicalQuestionAnswers); await _clinicalAnswerRowInfoRepository.AddRangeAsync(clinicalAnswerRowInfos); @@ -413,6 +466,49 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.Ok(true); } + /// + /// 删除表单数据 + /// + /// + /// + /// + [HttpPost] + public async Task DeleteClinicalForm(DeleteClinicalFormInDto inDto) + { + + if (await _readModuleCriterionFromRepository.AnyAsync(x => x.ClinicalFormId == inDto.ClinicalFormId)) + { + throw new BusinessValidationFailedException("当前表单已确认,无法删除!"); + } + + await _clinicalFormRepository.BatchDeleteNoTrackingAsync(x => x.Id == inDto.ClinicalFormId); + await _clinicalQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); + await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); + await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); + return ResponseOutput.Ok(true); + } + + /// + /// 获取PM待确认列表 + /// + /// + /// + [HttpPost] + public async Task> GetPMConfirmList(GetPMConfirmListInDto inDto) + { + return await GetCRCConfirmList(new GetCRCConfirmListInDto() + { + TrialId = inDto.TrialId, + IsCRCConfirm = true, + IsPMConfirm = false, + PageIndex = inDto.PageIndex, + PageSize = inDto.PageSize, + Asc = inDto.Asc, + SortField = inDto.SortField, + TrialReadingCriterionId = inDto.TrialReadingCriterionId + + }); + } /// /// 获取CRC确认列表 @@ -420,66 +516,112 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task> GetCRCConfirmList(GetCRCConfirmListInDto inDto) + public async Task> GetCRCConfirmList(GetCRCConfirmListInDto inDto) { - List result = await _readModuleRepository.Where(x => x.TrialId == inDto.TrialId) - .WhereIf(inDto.ReadModuleId!=null,x=>x.Id==inDto.ReadModuleId) - .Select(x => new GetCRCConfirmListOutDto() - { - SubjectId= x.SubjectId, - IsCRCConfirm = x.IsCRCConfirm, - LatestScanDate = x.SubjectVisit.LatestScanDate, - ReadingSetType = x.ReadingSetType, - IsPMConfirm = x.IsPMConfirm, - SubjectCode=x.Subject.Code, - ReadModuleId = x.Id, - }).OrderBy(x => x.LatestScanDate).ToListAsync(); + if (inDto.ReadModuleId != null) + { + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); + inDto.TrialReadingCriterionId = readModule.TrialReadingCriterionId; + } + var query = _readModuleRepository.Where(x => x.TrialId == inDto.TrialId) + .WhereIf(inDto.ReadModuleId != null, x => x.Id == inDto.ReadModuleId) + .WhereIf(inDto.IsCRCConfirm != null, x => x.IsCRCConfirm == inDto.IsCRCConfirm) + .WhereIf(inDto.IsPMConfirm != null, x => x.IsPMConfirm == inDto.IsPMConfirm) + .WhereIf(inDto.SubjectCode != null, x => x.Subject.Code.Contains(inDto.SubjectCode??string.Empty)) + .WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId) + .WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId) + .WhereIf(inDto.StartTime != null, x => x.SubjectVisit.LatestScanDate >= inDto.StartTime) + .WhereIf(inDto.EndTime != null, x => x.SubjectVisit.LatestScanDate <= inDto.EndTime) + .Select(x => new GetCRCConfirmListOutDto() + { + + SubjectId = x.SubjectId, + IsNotNeedPMConfirm=x.IsNotNeedPMConfirm, + IsCRCConfirm = x.IsCRCConfirm, + IsCRCApplicationRevoke=x.IsCRCApplicationRevoke, + VisitBlindName=x.SubjectVisit.BlindName, + LatestScanDate = x.SubjectVisit.LatestScanDate, + ReadingSetType = x.ReadingSetType, + IsPMConfirm = x.IsPMConfirm, + SubjectCode = x.Subject.Code, + ReadModuleId = x.Id, + ModuleName=x.ModuleName, + }); + + + var result = await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, new string[2] { "SubjectCode asc", "LatestScanDate asc" }); + var formList = await _clinicalFormRepository.Where(x => x.TrialId == inDto.TrialId) .Where(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) + .WhereIf(inDto.TrialReadingCriterionId!=null, x=>x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(y=>y.TrialReadingCriterionId== inDto.TrialReadingCriterionId)) .Where(x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead) .Include(x=>x.ClinicalDataTrialSet) .Select(x => new CRCClinicalForm { + SubjectId=x.SubjectId, CheckDate = x.CheckDate, ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, ClinicalFormId = x.Id, - ClinicalDataSetName=x.ClinicalDataTrialSet.ClinicalDataSetName, + ClinicalDataTrialSetId= x.ClinicalDataTrialSet.Id, + ClinicalDataSetName =x.ClinicalDataTrialSet.ClinicalDataSetName, ClinicalDataSetEnName=x.ClinicalDataTrialSet.ClinicalDataSetEnName, + IsHaveTableQuestion=x.ClinicalDataTrialSet.TrialClinicalQuestionList.Any(y=>y.ClinicalQuestionType== ReadingQestionType.Table), }).ToListAsync(); - var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId).Include(x=>x.ClinicalForm).Include(x=>x.ClinicalForm.ClinicalDataTrialSet).ToListAsync(); - result.ForEach(x => + var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId + &&x.ClinicalForm.ClinicalDataTrialSet.UploadRole== UploadRole.CRC + &&(x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataLevel==ClinicalLevel.ImageRead|| x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead)) + .Select(x => new GetCRCBeConfirm + { + CheckDate = x.ClinicalForm.CheckDate ?? default(DateTime), + ClinicalDataSetName = x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetName, + ClinicalDataSetEnName = x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetEnName, + ClinicalFormId = x.ClinicalFormId, + ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSet.Id, + ReadModuleId=x.ReadModuleId, + IsHaveTableQuestion=x.ClinicalForm.ClinicalDataTrialSet.TrialClinicalQuestionList.Any(y => y.ClinicalQuestionType == ReadingQestionType.Table) + }).ToListAsync(); + + + result.CurrentPageData.ForEach(x => { if (x.IsCRCConfirm) { - x.ClinicalFormIdList = confirmList.Where(y => y.ReadModuleId == x.ReadModuleId).Select(y=>new GetCRCBeConfirmListOutDto() { - CheckDate = y.ClinicalForm.CheckDate??default(DateTime), - ClinicalDataSetName= y.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetName, - ClinicalDataSetEnName= y.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetEnName, + x.ClinicalFormList = confirmList.Where(y => y.ReadModuleId == x.ReadModuleId).Select(y=>new GetCRCBeConfirmListOutDto() { + CheckDate = y.CheckDate, + ClinicalDataSetName= y.ClinicalDataSetName.LanguageName(y.ClinicalDataSetEnName, _userInfo.IsEn_Us), + ClinicalDataSetEnName= y.ClinicalDataSetEnName, ClinicalFormId=y.ClinicalFormId, + ClinicalDataTrialSetId=y.ClinicalDataTrialSetId, + IsHaveTableQuestion=y.IsHaveTableQuestion, }).ToList(); } else { if (x.ReadingSetType == ReadingSetType.ImageReading) { - x.ClinicalFormIdList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead&&y.CheckDate <= x.LatestScanDate) + x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead&&y.CheckDate <= x.LatestScanDate&&y.SubjectId==x.SubjectId) + .Select(y => new GetCRCBeConfirmListOutDto() { CheckDate = y.CheckDate ?? default(DateTime), - ClinicalDataSetName = y.ClinicalDataSetName, + ClinicalDataSetName = y.ClinicalDataSetName.LanguageName(y.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataSetEnName = y.ClinicalDataSetEnName, ClinicalFormId = y.ClinicalFormId, + ClinicalDataTrialSetId = y.ClinicalDataTrialSetId, + IsHaveTableQuestion = y.IsHaveTableQuestion, }).ToList(); } else { - x.ClinicalFormIdList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead&&y.CheckDate <= x.LatestScanDate) + x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead&&y.CheckDate <= x.LatestScanDate && y.SubjectId == x.SubjectId) .Select(y => new GetCRCBeConfirmListOutDto() { CheckDate = y.CheckDate ?? default(DateTime), - ClinicalDataSetName = y.ClinicalDataSetName, + ClinicalDataSetName = y.ClinicalDataSetName.LanguageName(y.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataSetEnName = y.ClinicalDataSetEnName, ClinicalFormId = y.ClinicalFormId, + ClinicalDataTrialSetId = y.ClinicalDataTrialSetId, + IsHaveTableQuestion = y.IsHaveTableQuestion, }).ToList(); } } @@ -498,20 +640,120 @@ namespace IRaCIS.Core.Application.Service var result = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() { ReadModuleId = inDto.ReadModuleId, - TrialId = inDto.TrialId - })).SelectMany(x => x.ClinicalFormIdList).ToList(); + TrialId = inDto.TrialId, + PageIndex=1, + PageSize=9999, + + })).CurrentPageData.SelectMany(x => x.ClinicalFormList).ToList(); + return result.OrderBy(x => x.ClinicalDataSetName).ThenBy(x => x.CheckDate).ToList(); + } - result.ForEach(x => { - x.ClinicalDataSetName = _userInfo.IsEn_Us ? x.ClinicalDataSetEnName : x.ClinicalDataSetName; + /// + /// 获取临床数据表格信息 查看没有表格问题的列表 + /// + /// + /// + [HttpPost] + public async Task<(List,object)> GetClinicalTableList(GetClinicalTableListInDto inDto) + { + + var readModule=await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); + + var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() + { + ReadModuleId = inDto.ReadModuleId, + TrialId = inDto.TrialId, + PageIndex = 1, + PageSize = 9999, + + })).CurrentPageData.SelectMany(x => x.ClinicalFormList).ToList(); + + var clinicalDataTrialSetIds = confirmList.Select(x => x.ClinicalDataTrialSetId).Distinct().ToList(); + var clinicalFormIds = confirmList.Select(x => x.ClinicalFormId).ToList(); + + var questionList = await _trialClinicalQuestionRepository.Where(x => clinicalDataTrialSetIds.Contains( x.TrialClinicalId) + && x.ClinicalQuestionType != ReadingQestionType.Group + && x.ClinicalQuestionType != ReadingQestionType.Table).OrderBy(x=>x.TrialClinicalId).ThenBy(x => x.ShowOrder) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var answers = await _clinicalQuestionAnswerRepository.Where(x => clinicalFormIds.Contains(x.ClinicalFormId)) + .Select(x => new + { + x.ClinicalDataTrialSetId, + x.ClinicalFormId, + x.ClinicalForm.CheckDate, + x.QuestionId, + x.Answer + }) + .ToListAsync(); + List result = new List(); + clinicalDataTrialSetIds.ForEach(x => { + GetClinicalTableListOutDto dto = new GetClinicalTableListOutDto(); + dto.ModuleName = readModule.ModuleName; + dto.ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First(); + dto.QuestionList = questionList.Where(y => y.TrialClinicalId == x).OrderBy(y => y.ShowOrder).ToList(); + dto.AnswerList = new List>(); + var ClinicalFormIds= answers.Where(y => y.ClinicalDataTrialSetId == x).OrderBy(x => x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList(); + ClinicalFormIds.ForEach(z => + { + var dic = answers.Where(y => y.ClinicalFormId == z).OrderBy(y => y.CheckDate).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer); + dic.Add("ClinicalFormId", z.ToString()); + dic.Add("TrialId", inDto.TrialId.ToString()); + dic.Add("SubjectId", readModule.SubjectId.ToString()); + dic.Add("ClinicalDataTrialSetId", x.ToString()); + + dto.AnswerList.Add(dic); + + }); + result.Add(dto); + }); + return (result, new + { + readModule.ModuleName, + }); + + } + + + /// + /// 获取临床数据表格信息 查看有表格问题的列表 + /// + /// + /// + [HttpPost] + public async Task<(List,object)> GetClinicalDateList(GetCRCBeConfirmListInDto inDto) + { + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); + var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() + { + ReadModuleId = inDto.ReadModuleId, + TrialId = inDto.TrialId, + PageIndex = 1, + PageSize = 9999, + + })).CurrentPageData.SelectMany(x => x.ClinicalFormList).ToList(); + + var clinicalDataTrialSetIds = confirmList.Select(x => x.ClinicalDataTrialSetId).Distinct().ToList(); + + List result = new List(); + + clinicalDataTrialSetIds.ForEach(x => + { + + result.Add(new GetClinicalDateListOutDto() + { + ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First(), + DateList = confirmList.Where(y => y.ClinicalDataTrialSetId == x).ToList() + + }); }); - return result.OrderBy(x => x.ClinicalDataSetName).ThenBy(x => x.CheckDate).ToList(); - + return (result,new { + readModule.ModuleName, + }); } - /// /// CRC 确认临床数据 /// @@ -520,22 +762,32 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task CRCConfirmClinical(CRCConfirmClinicalInDto inDto) { - var dataList =await this.GetCRCConfirmList(new GetCRCConfirmListInDto() + + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); + + var confirmlist = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() { - TrialId = inDto.TrialId - }); + TrialId = inDto.TrialId, + SubjectId= readModule.SubjectId, + IsCRCConfirm=false, + TrialReadingCriterionId = readModule.TrialReadingCriterionId, + //ReadModuleId = inDto.ReadModuleId, + PageIndex =1, + PageSize=9999, + })).CurrentPageData.ToList(); - var presentData = dataList.Where(x => x.ReadModuleId == inDto.ReadModuleId).First(); - var confirmlist= dataList.Where(x =>(x.LatestScanDate < presentData.LatestScanDate && x.ReadingSetType == presentData.ReadingSetType) - || x.ReadModuleId == presentData.ReadModuleId).Where(x => !x.IsCRCConfirm).ToList(); + var presentData = confirmlist.Where(x => x.ReadModuleId == inDto.ReadModuleId).First(); + confirmlist = confirmlist.Where(x => x.LatestScanDate <= presentData.LatestScanDate).ToList(); + + await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x=>x.ReadModuleId== inDto.ReadModuleId); List needAddList = new List() { }; confirmlist.ForEach(x => { - x.ClinicalFormIdList.ForEach(y => + x.ClinicalFormList.ForEach(y => { needAddList.Add(new ReadModuleCriterionFrom() { @@ -547,16 +799,21 @@ namespace IRaCIS.Core.Application.Service }); }); - var readModuleIds = confirmlist.Select(x => x.ReadModuleId).ToList(); + foreach (var item in confirmlist) + { + await _readModuleRepository.UpdatePartialFromQueryAsync(x =>x.Id==item.ReadModuleId , x => new ReadModule() + { + IsCRCConfirm = true, + IsPMConfirm=item.ClinicalFormList.Count()==0?true:false, + IsNotNeedPMConfirm= item.ClinicalFormList.Count() == 0 ? true : false, + }); + } - await _readModuleRepository.UpdatePartialFromQueryAsync(x => readModuleIds.Contains(x.Id),x=>new ReadModule() { - IsCRCConfirm=true - }); await _readModuleCriterionFromRepository.AddRangeAsync(needAddList); await _readModuleCriterionFromRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(true); + await _iReadingClinicalDataService.DealVisiTaskClinicalDataSignedAsync(inDto.TrialId, inDto.SubjectId, inDto.ReadModuleId, false, readModule.TrialReadingCriterionId); + return ResponseOutput.Ok(true); } /// @@ -567,14 +824,20 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task CRCCancelConfirmClinical(CRCCancelConfirmClinicalInDto inDto) { - var dataList = await this.GetCRCConfirmList(new GetCRCConfirmListInDto() + + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); + var dataList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() { - TrialId = inDto.TrialId - }); + TrialId = inDto.TrialId, + SubjectId = readModule.SubjectId, + TrialReadingCriterionId = readModule.TrialReadingCriterionId, + PageIndex = 1, + PageSize = 9999, + })).CurrentPageData; var presentData = dataList.Where(x => x.ReadModuleId == inDto.ReadModuleId).First(); - if (dataList.Any(x => x.IsPMConfirm && x.LatestScanDate > presentData.LatestScanDate && x.ReadingSetType == presentData.ReadingSetType)) + if (dataList.Any(x => x.IsCRCConfirm && x.LatestScanDate > presentData.LatestScanDate && x.ReadingSetType == presentData.ReadingSetType)) { throw new BusinessValidationFailedException("当前数据并非最后一条确认信息,无法取消!"); } @@ -584,17 +847,28 @@ namespace IRaCIS.Core.Application.Service throw new BusinessValidationFailedException("PM已确认,无法取消!"); } + if (presentData.IsNotNeedPMConfirm) + { + await _readModuleRepository.UpdatePartialFromQueryAsync(x => presentData.ReadModuleId == x.Id, x => new ReadModule() + { + IsPMConfirm = false, + IsCRCConfirm = false, + IsNotNeedPMConfirm = false, + }); + } + else + { + await _readModuleRepository.UpdatePartialFromQueryAsync(x => presentData.ReadModuleId == x.Id, x => new ReadModule() + { + IsCRCApplicationRevoke = true, + }); + } + - await _readModuleRepository.UpdatePartialFromQueryAsync(x => presentData.ReadModuleId==x.Id, x => new ReadModule() - { - IsCRCConfirm = false - }); - - await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x=>x.ReadModuleId== presentData.ReadModuleId); + //await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x=>x.ReadModuleId== presentData.ReadModuleId); await _readModuleCriterionFromRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(true); + return ResponseOutput.Ok(true); } /// @@ -609,15 +883,46 @@ namespace IRaCIS.Core.Application.Service var readModuleData = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); if (!readModuleData.IsCRCConfirm) { - throw new BusinessValidationFailedException("CRC还未确认数据,PM无法确认"); + throw new BusinessValidationFailedException("CRC还未确认数据,PM无法操作"); } - await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule() - { - IsPMConfirm = false - }); + if (readModuleData.IsCRCApplicationRevoke && inDto.IsConfirm) + { + throw new BusinessValidationFailedException("CRC正在申请退回,PM无法确认"); + } - await _readModuleRepository.SaveChangesAsync(); + if (!readModuleData.IsCRCApplicationRevoke && !inDto.IsConfirm) + { + throw new BusinessValidationFailedException("CRC未申请退回,PM无法撤销"); + } + + if (inDto.IsConfirm) + { + await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule() + { + IsPMConfirm = true, + IsClinicalDataBlind=inDto.IsClinicalDataBlind, + IsClinicalDataComplete=inDto.IsClinicalDataComplete, + }); + await _readModuleRepository.SaveChangesAsync(); + await _iReadingClinicalDataService.DealVisiTaskClinicalDataSignedAsync(inDto.TrialId, inDto.SubjectId, inDto.ReadModuleId, false, readModuleData.TrialReadingCriterionId); + } + else + { + await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule() + { + IsCRCConfirm = false, + IsCRCApplicationRevoke=false, + }); + await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x=>x.ReadModuleId== inDto.ReadModuleId); + + await _readModuleRepository.SaveChangesAsync(); + + + } + + + return ResponseOutput.Ok(true); } diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs index 75207345c..297083244 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs @@ -66,8 +66,11 @@ namespace IRaCIS.Application.Services && x.ClinicalUploadType == ClinicalUploadType.Structuring && x.UploadRole == UploadRole.CRC ); - - if (_systemClinicalQuestionRepository.Where(x => isNeedVerify&& x.SystemClinicalId == inDto.SystemClinicalId && x.IsCheckDate).Count() != 1) + if (_systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId).Count() == 0) + { + throw new BusinessValidationFailedException("当前临床数据未配置问题,请先配置问题之后再应用"); + } + if (isNeedVerify&&_systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && x.IsCheckDate).Count() != 1) { throw new BusinessValidationFailedException(_localizer["ClinicalDataSet_Apply"]); @@ -98,7 +101,12 @@ namespace IRaCIS.Application.Services && x.ClinicalUploadType == ClinicalUploadType.Structuring && x.UploadRole == UploadRole.CRC ); - if (_trialClinicalQuestionRepository.Where(x => isNeedVerify&& x.TrialClinicalId == inDto.TrialClinicalId && x.IsCheckDate).Count() != 1) + if (_trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId).Count() == 0) + { + throw new BusinessValidationFailedException("当前临床数据未配置问题,请先配置问题之后再应用"); + } + + if (isNeedVerify&&_trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && x.IsCheckDate).Count() != 1) { throw new BusinessValidationFailedException(_localizer["ClinicalDataSet_Apply"]); @@ -136,6 +144,8 @@ namespace IRaCIS.Application.Services .WhereIf(indto.Id != null, x => x.Id != indto.Id) .Where(x => x.ClinicalDataSetName == indto.ClinicalDataSetName||x.ClinicalDataSetEnName==indto.ClinicalDataSetEnName); + + if (await existsQuery.AnyAsync()) { //---存在同类型的临床数据,操作失败 @@ -219,6 +229,10 @@ namespace IRaCIS.Application.Services //---存在同类型的临床数据,操作失败 return ResponseOutput.NotOk(_localizer["ClinicalDataSet_DupTypeFail"]); } + if (indto.Id != null && indto.IsApply == null) + { + indto.IsApply = await _clinicalDataTrialSetRepository.Where(x => x.Id == indto.Id).Select(x => x.IsApply).FirstOrDefaultAsync(); + } //indto.CriterionEnumListStr = $"|{String.Join('|', indto.CriterionEnumList)}|"; diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs index 93b92894a..f833223d8 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs @@ -118,10 +118,10 @@ namespace IRaCIS.Core.Application.Service public async Task<(List, bool)> GetSystemClinicalQuestionPreview(GetSystemClinicalQuestionPreviewDto inDto) { var questions = await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId) - .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); var tableQuestions= await _systemClinicalTableQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId) - .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList(); @@ -144,13 +144,13 @@ namespace IRaCIS.Core.Application.Service public async Task<(List, bool)> GetTrialClinicalQuestionPreview(GetTrialClinicalQuestionPreviewDto inDto) { var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId) - .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x=>x.ShowOrder).ToListAsync(); var tableQuestions = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId) - .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); - var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList(); + var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).OrderBy(x => x.ShowOrder).ToList(); result.ForEach(x => { @@ -170,7 +170,7 @@ namespace IRaCIS.Core.Application.Service /// public void FindChildQuestion(ClinicalQuestionPreviewDto item, List questions, List tableQuestions,List answers, List tableAnswers) { - item.Childrens = questions.Where(x => (x.ParentId == item.Id)||(x.GroupId== item.Id&&x.ParentId==null)).ToList(); + item.Childrens = questions.Where(x => (x.ParentId == item.Id)||(x.GroupId== item.Id&&x.ParentId==null)).OrderBy(x => x.ShowOrder).ToList(); item.RelationQuestions = questions.Where(x => x.RelevanceId == item.Id).ToList(); @@ -188,7 +188,7 @@ namespace IRaCIS.Core.Application.Service }); - item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).OrderBy(x=>x.ShowOrder).ToList(); + item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).OrderBy(x=>x.ShowOrder).OrderBy(x => x.ShowOrder).ToList(); item.RelationQuestions.ForEach(x => { this.FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers); @@ -228,9 +228,24 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task AddOrUpdateTrialClinicalQuestion(TrialClinicalQuestionDto inDto) { - if (await _trialClinicalQuestionRepository.AnyAsync(x =>x.TrialClinicalId==inDto.TrialClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + if (inDto.IsVerify) { - return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]); + if (await _trialClinicalQuestionRepository.AnyAsync(x => x.TrialClinicalId == inDto.TrialClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + { + return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"],string.Empty,ApiResponseCodeEnum.NeedTips); + } + + } + + + if (await _trialClinicalQuestionRepository.AnyAsync(x => x.TrialClinicalId == inDto.TrialClinicalId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) + { + return ResponseOutput.NotOk("问题序号存在重复!"); + } + + if (await _trialClinicalQuestionRepository.AnyAsync(x => x.TrialClinicalId == inDto.TrialClinicalId && x.Id != inDto.Id && x.IsCheckDate == inDto.IsCheckDate&&inDto.IsCheckDate)) + { + return ResponseOutput.NotOk("已经添加过类型为检查日期的问题!"); } var entity = await _trialClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true); @@ -293,6 +308,7 @@ namespace IRaCIS.Core.Application.Service { var systemClinicalQuestionQueryable = _systemClinicalQuestionRepository + .Where(x=>x.SystemClinicalId==inQuery.SystemClinicalId) .WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName)) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await systemClinicalQuestionQueryable @@ -311,9 +327,22 @@ namespace IRaCIS.Core.Application.Service public async Task AddOrUpdateSystemClinicalQuestion(SystemClinicalQuestionDto inDto) { - if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + if (inDto.IsVerify) { - return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]); + if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + { + return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); + } + } + + + if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) + { + return ResponseOutput.NotOk("问题序号存在重复!"); + } + if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.IsCheckDate == inDto.IsCheckDate && inDto.IsCheckDate)) + { + return ResponseOutput.NotOk("已经添加过类型为检查日期的问题!"); } var entity = await _systemClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true); return ResponseOutput.Ok(entity.Id.ToString()); @@ -396,9 +425,17 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task AddOrUpdateSystemClinicalTableQuestion(SystemClinicalTableQuestionDto inDto) { - if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + if (inDto.IsVerify) { - return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]); + if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + { + return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); + } + } + + if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) + { + return ResponseOutput.NotOk("问题序号存在重复!"); } var entity = await _systemClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true); @@ -451,9 +488,17 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task AddOrUpdateTrialClinicalTableQuestion(TrialClinicalTableQuestionDto inDto) { - if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + if (inDto.IsVerify) { - return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]); + if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) + { + return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); + } + } + + if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) + { + return ResponseOutput.NotOk("问题序号存在重复!"); } var entity = await _trialClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true); diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 967d63a51..de0d9d0b3 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -8,6 +8,7 @@ using Panda.DynamicWebApi.Attributes; using Microsoft.Extensions.DependencyInjection; using System.Linq.Expressions; using IRaCIS.Core.Infrastructure; +using System.Linq.Dynamic.Core; namespace IRaCIS.Application.Services { @@ -24,6 +25,8 @@ namespace IRaCIS.Application.Services private readonly IRepository _subjectVisitRepository; private readonly IRepository _previousHistoryRepository; + private readonly IRepository _readModuleCriterionFromRepository; + private readonly IRepository _clinicalFormRepository; private readonly IRepository _previousOtherRepository; private readonly IRepository _previousSurgeryRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; @@ -37,7 +40,8 @@ namespace IRaCIS.Application.Services IRepository previousPDFRepository, IRepository subjectVisitRepository, IRepository previousHistoryRepository, - + IRepository readModuleCriterionFromRepository, + IRepository clinicalFormRepository, IRepository previousOtherRepository, IRepository previousSurgeryRepository, IRepository readingQuestionCriterionTrialRepository, @@ -53,6 +57,8 @@ namespace IRaCIS.Application.Services this._previousPDFRepository = previousPDFRepository; this._subjectVisitRepository = subjectVisitRepository; this._previousHistoryRepository = previousHistoryRepository; + this._readModuleCriterionFromRepository = readModuleCriterionFromRepository; + this._clinicalFormRepository = clinicalFormRepository; this._previousOtherRepository = previousOtherRepository; this._previousSurgeryRepository = previousSurgeryRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; @@ -179,12 +185,6 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task> GetCRCClinicalData(GetCRCClinicalDataInDto inDto) { - //if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) - //{ - // await this.AddCRCClinicalData(inDto); - //} - - List cRCClinicalDataList = await _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.SubjectVisitId) .WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit) .WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit) @@ -201,29 +201,26 @@ namespace IRaCIS.Application.Services Path = x.ClinicalDataTrialSet.Path, IsBlind = x.IsBlind, IsComplete = x.IsComplete, + ClinicalFromList=x.Subject.ClinicalFormList.Where(y=>y.ReadingId==x.ReadingId&&y.ClinicalDataTrialSetId==x.ClinicalDataTrialSetId).Select(y=> new ClinicalFromData() { + CheckDate=y.CheckDate, + ClinicalFormId=y.Id + }).ToList(), PDFFileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() { Id = y.Id, FileName = y.FileName, Path = y.Path, CreateTime = y.CreateTime, - }).ToList() + }).ToList(), + }).ToListAsync(); - List clinicalData = (await this.GetReadingClinicalDataList(new GetReadingClinicalDataListIndto() - { - SubjectId = inDto.SubjectId, - ReadingId = inDto.SubjectVisitId, - TrialId = inDto.TrialId, - })).Item1; - var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.SubjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.SubjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.SubjectVisitId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); foreach (var item in cRCClinicalDataList) { - //item.PDFFileList = clinicalData.Where(y => y.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).SelectMany(x => x.FileList).ToList(); item.ClinicalTableData = new ClinicalDataTable() { PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), @@ -310,7 +307,7 @@ namespace IRaCIS.Application.Services } //处理 任务 临床数据是否签名 - private async Task DealVisiTaskClinicalDataSignedAsync(Guid trialId, Guid subjectId, Guid readingId, bool isVisit, Guid trialReadingCritrialId) + public async Task DealVisiTaskClinicalDataSignedAsync(Guid trialId, Guid subjectId, Guid readingId, bool isVisit, Guid trialReadingCritrialId) { //获取确认的临床数据配置 var trialClinicalDataSetList = _clinicalDataTrialSetRepository.Where(t => t.TrialId == trialId && t.IsConfirm).Include(t => t.TrialClinicalDataSetCriteriaList).ToList(); @@ -328,6 +325,8 @@ namespace IRaCIS.Application.Services { var isBaseLine = await _subjectVisitRepository.Where(t => t.Id == readingId).Select(t => t.IsBaseLine).FirstOrDefaultAsync(); + + //判断是否基线 if (isBaseLine) { @@ -356,21 +355,43 @@ namespace IRaCIS.Application.Services else { //判断是影像学 还是肿瘤学阅片 - var readingSetType = await _readModuleRepository.Where(t => t.Id == readingId).Select(t => t.ReadingSetType).FirstOrDefaultAsync(); + var readModule = await _readModuleRepository.Where(t => t.Id == readingId).FirstNotNullAsync(); + + //CRC 阅片期自定义结构化录入是否签名 + bool crcReadModuleSign = true; //影像学 - if (readingSetType == ReadingSetType.ImageReading) + if (readModule.ReadingSetType == ReadingSetType.ImageReading) { needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId) && t.ClinicalDataLevel == ClinicalLevel.ImageRead).Count(); + + // 不存在需要CRC上传的临床数据 或者 PM已确认 + crcReadModuleSign = + !trialClinicalDataSetList.Any(x => + x.UploadRole == UploadRole.CRC + && x.ClinicalDataLevel == ClinicalLevel.ImageRead + && x.ClinicalUploadType == ClinicalUploadType.Structuring + && x.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId)) || readModule.IsPMConfirm; + + } //肿瘤学 else { needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead).Count(); + + // 不存在需要CRC上传的临床数据 或者 PM已确认 + crcReadModuleSign = + !trialClinicalDataSetList.Any(x => + x.UploadRole == UploadRole.CRC + && x.ClinicalDataLevel == ClinicalLevel.OncologyRead + && x.ClinicalUploadType == ClinicalUploadType.Structuring + && x.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId)) || readModule.IsPMConfirm; + } //可能仅仅CRC 基线 没有PM - if (needSignCount == haveSignedCount /*&& needSignCount != 0*/) + if (needSignCount == haveSignedCount && crcReadModuleSign/*&& needSignCount != 0*/) { //将该标准 该subject 该阅片期|肿瘤学 任务临床数据状态变更 await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SouceReadModuleId == readingId, u => new VisitTask() @@ -380,6 +401,13 @@ namespace IRaCIS.Application.Services } + else + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SouceReadModuleId == readingId, u => new VisitTask() + { + IsClinicalDataSign = false + }); + } } @@ -606,10 +634,6 @@ namespace IRaCIS.Application.Services var clinicalDataList = await this.GetTrialClinicalDataSelect(getTrialClinicalDataSelectIndto); - if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) - { - inDto.UploadRole = UploadRole.CRC; - } var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine); @@ -646,9 +670,9 @@ namespace IRaCIS.Application.Services inDto.ReadingId = visitTask.SouceReadModuleId ?? visitTask.SourceSubjectVisitId; } - var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId) .WhereIf(inDto.ReadingClinicalDataId != null, x => x.Id == inDto.ReadingClinicalDataId) + .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId) .WhereIf(inDto.SelectIsSign, x => x.IsSign == true) .Where(x => x.ReadingId == inDto.ReadingId || (x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject)) .Select(x => new GetReadingClinicalDataListOutDto() @@ -656,13 +680,13 @@ namespace IRaCIS.Application.Services ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, SubjectId = x.SubjectId, ReadingId = x.ReadingId, - ClinicalDataSetEnName=x.ClinicalDataTrialSet.ClinicalDataSetEnName, + ClinicalDataSetEnName = x.ClinicalDataTrialSet.ClinicalDataSetEnName, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us), ClinicalDataTrialSetId = x.ClinicalDataTrialSetId, IsSign = x.IsSign, ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType, CriterionEnumList = x.ClinicalDataTrialSet.CriterionEnumList, - TrialClinicalDataSetCriteriaList=x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList, + TrialClinicalDataSetCriteriaList = x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList, Id = x.Id, UploadRole = x.ClinicalDataTrialSet.UploadRole, IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC, @@ -672,33 +696,141 @@ namespace IRaCIS.Application.Services FileName = y.FileName, Path = y.Path, CreateTime = y.CreateTime, - }).ToList() + }).ToList(), + }); + var result = new List(); + if (!inDto.IsOnlyGetCRCReadModule) + { + result = await resultQuery.ToListAsync(); + } + + var readingIds = result.Select(x => x.ReadingId).ToList(); + var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId??default(Guid))).ToListAsync(); + result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x => { + + x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId&&y.ClinicalDataTrialSetId==x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData() + { + CheckDate = y.CheckDate, + ClinicalFormId = y.Id + }).ToList(); + x.FileCount = x.ClinicalFromList.Count(); + }); + + + // 这里处理CRC上传 阅片期的临床数据 + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId) + .WhereIf(inDto.SelectIsSign,x=>x.IsPMConfirm) + .WhereIf(!inDto.SelectIsSign, x => x.IsCRCConfirm) + .FirstOrDefaultAsync(); + if (readModule != null) + { + var moduleCriterionFromList = await _readModuleCriterionFromRepository + .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId) + .Where(x => x.ReadModuleId == readModule.Id).Select(x => new{ + ClinicalFormId= x.ClinicalFormId, + CheckDate= x.ClinicalForm.CheckDate, + ClinicalDataTrialSetId= x.ClinicalForm.ClinicalDataTrialSetId + + + }).ToListAsync(); + + + var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.Structuring) + .WhereIf(readModule.ReadingSetType == ReadingSetType.ImageReading, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead) + .WhereIf(readModule.ReadingSetType == ReadingSetType.TumorReading, x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead) + .Where(x=>x.TrialClinicalDataSetCriteriaList.Any(y=>y.TrialReadingCriterionId==readModule.TrialReadingCriterionId)) + .Select(x => new GetReadingClinicalDataListOutDto() + { + + ClinicalDataLevel = x.ClinicalDataLevel, + SubjectId = inDto.SubjectId, + ReadingId = default(Guid), + IsCRCApplicationRevoke=readModule.IsCRCApplicationRevoke, + IsCRCConfirm= readModule.IsCRCConfirm, + IsPMConfirm= readModule.IsPMConfirm, + ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), + ClinicalDataSetEnName = x.ClinicalDataSetEnName, + ClinicalDataTrialSetId = x.Id, + IsSign = readModule.IsPMConfirm, + ClinicalUploadType = x.ClinicalUploadType, + Id = default(Guid), + UploadRole = x.UploadRole, + IsCRCUpload = x.UploadRole == UploadRole.CRC, + IsNeedMerge = true, + ReadModuleId = readModule.Id, + //FileCount = x.FileCount, + + //ReadingClinicalDataState = x.ReadingClinicalDataState, + + //FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() + //{ + // Id = y.Id, + // FileName = y.FileName, + // Path = y.Path, + // CreateTime = y.CreateTime, + //}).ToList() + + }).ToListAsync(); + + clinicalresult.ForEach(x => + { + x.FileCount = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Count(); + x.ClinicalFromList = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).OrderBy(y => y.CheckDate).Select(x => new ClinicalFromData + { + CheckDate = x.CheckDate, + ClinicalFormId = x.ClinicalFormId + + }).ToList(); + x.IsSign = readModule.IsPMConfirm ? true : false; + x.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked; + + }); + + result.AddRange(clinicalresult); + } + + - var result = await resultQuery.ToListAsync(); // 根据标准 if (inDto.VisitTaskId != null) { var visitTaskInfo = await _visitTaskRepository.FirstOrDefaultAsync(x => x.Id == inDto.VisitTaskId); - - result = result.Where(x => x.TrialClinicalDataSetCriteriaList.Any(z=>z.TrialReadingCriterionId==visitTaskInfo.TrialReadingCriterionId)).ToList(); + + result = result.Where(x => x.TrialClinicalDataSetCriteriaList.Any(z => z.TrialReadingCriterionId == visitTaskInfo.TrialReadingCriterionId)).ToList(); } - result = result.Where(x => !(x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList(); - // 需要排除表格为空的数据 - - - var readingIds = result.Select(x => x.ReadingId).ToList(); - - var tablecount = (await _previousHistoryRepository.Where(x => readingIds.Contains(x.SubjectVisitId)).CountAsync()) + - (await _previousOtherRepository.Where(x => readingIds.Contains(x.SubjectVisitId)).CountAsync()) + - (await _previousSurgeryRepository.Where(x => readingIds.Contains(x.SubjectVisitId)).CountAsync()); - - if (tablecount == 0) + if (inDto.GetClinicalType != null) { - result = result.Where(x => x.ClinicalUploadType != ClinicalUploadType.Table).ToList(); + switch (inDto.GetClinicalType) + { + case GetClinicalType.PMUpload: + result = result.Where(x => x.UploadRole == UploadRole.PM).ToList(); + break; + case GetClinicalType.CRCConfirm: + result = result.Where(x => x.UploadRole == UploadRole.CRC&&x.IsCRCConfirm&&!x.IsPMConfirm).ToList(); + break; + case GetClinicalType.HasSign: + result = result.Where(x => x.IsSign).ToList(); + break; + } + } + + var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + foreach (var item in result) + { + item.ClinicalTableData = new ClinicalDataTable() + { + PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), + PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), + PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), + }; + } return result; @@ -712,14 +844,9 @@ namespace IRaCIS.Application.Services [NonDynamicMethod] public async Task> GetReadingClinicalList(GetReadingClinicalDataListIndto inDto) { - - //var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstNotNullAsync(); - - var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId) - .Where(x => x.ReadingId == inDto.ReadingId || (x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject)) - //.WhereIf(inDto.UploadRole == UploadRole.CRC, x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) - + .Where(x => x.ReadingId == inDto.ReadingId) + .WhereIf(inDto.ClinicalDataTrialSetId!=null, x=>x.ClinicalDataTrialSetId==inDto.TrialReadingCriterionId) .Where(x => x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t=>t.TrialReadingCriterionId==inDto.TrialReadingCriterionId)) .Select(x => new GetReadingClinicalDataListOutDto() { @@ -750,7 +877,111 @@ namespace IRaCIS.Application.Services }); var result = await resultQuery.ToListAsync(); - //result = result.Where(x => !(x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList(); + + + var readingIds = result.Select(x => x.ReadingId).ToList(); + var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync(); + result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x => { + + x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData() + { + CheckDate = y.CheckDate, + ClinicalFormId = y.Id + }).ToList(); + x.FileCount = x.ClinicalFromList.Count(); + }); + + // 这里处理CRC上传 阅片期的临床数据 + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId&&x.IsCRCConfirm) + .FirstOrDefaultAsync(); + if (readModule != null) + { + var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id) + + .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.TrialReadingCriterionId) + .Select(x => new { + ClinicalFormId = x.ClinicalFormId, + CheckDate = x.ClinicalForm.CheckDate, + ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId + + + }).ToListAsync(); + + + var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC&&x.ClinicalUploadType== ClinicalUploadType.Structuring) + .WhereIf(readModule.ReadingSetType == ReadingSetType.ImageReading,x=>x.ClinicalDataLevel== ClinicalLevel.ImageRead) + .WhereIf(readModule.ReadingSetType == ReadingSetType.TumorReading, x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead) + .Where(x => x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == readModule.TrialReadingCriterionId)) + .Select(x => new GetReadingClinicalDataListOutDto() + { + + ClinicalDataLevel = x.ClinicalDataLevel, + SubjectId = inDto.SubjectId, + ReadingId = default(Guid), + IsCRCApplicationRevoke= readModule.IsCRCApplicationRevoke, + IsCRCConfirm = readModule.IsCRCConfirm, + IsPMConfirm=readModule.IsPMConfirm, + + ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), + ClinicalDataSetEnName = x.ClinicalDataSetEnName, + ClinicalDataTrialSetId = x.Id, + IsSign = readModule.IsPMConfirm, + ClinicalUploadType = x.ClinicalUploadType, + Id = default(Guid), + UploadRole = x.UploadRole, + IsCRCUpload = x.UploadRole == UploadRole.CRC, + IsNeedMerge = true, + ReadModuleId = readModule.Id, + //FileCount = x.FileCount, + + //ReadingClinicalDataState = x.ReadingClinicalDataState, + + //FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() + //{ + // Id = y.Id, + // FileName = y.FileName, + // Path = y.Path, + // CreateTime = y.CreateTime, + //}).ToList() + + }).ToListAsync(); + + clinicalresult.ForEach(x => + { + x.FileCount = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Count(); + x.ClinicalFromList = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).OrderBy(y => y.CheckDate).Select(x => new ClinicalFromData + { + CheckDate = x.CheckDate, + ClinicalFormId = x.ClinicalFormId + + }).ToList(); + + x.IsSign = readModule.IsPMConfirm ?true : false; + x.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked; + + }); + + result.AddRange(clinicalresult); + } + + + if (inDto.GetClinicalType != null) + { + switch (inDto.GetClinicalType) + { + case GetClinicalType.PMUpload: + result = result.Where(x => x.UploadRole == UploadRole.PM).ToList(); + break; + case GetClinicalType.CRCConfirm: + result = result.Where(x => x.UploadRole == UploadRole.CRC&&x.IsCRCConfirm&&!x.IsPMConfirm).ToList(); + break; + case GetClinicalType.HasSign: + result = result.Where(x => x.IsSign).ToList(); + break; + } + } + + return result; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs index c0562e954..00d9647e9 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs @@ -8,6 +8,10 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Service.Reading.Dto { + public class CRCSignClinicalDataInDto + { + public Guid ReadingClinicalDataId { get; set; } + } public class AutoAddClinicalInDto { public Guid? SubjectId { get; set; } @@ -18,9 +22,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } - public class GetCRCSubjectClinicalInDto + public class GetCRCSubjectClinicalInDto:PageInput { public Guid TrialId { get; set; } + + public Guid? SubjectId { get; set; } + + public string? SubjectCode { get; set; } } @@ -28,9 +36,33 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public Guid SubjectId { get; set; } + public Guid ReadingClinicalDataId { get; set; } + + /// + /// 上传角色 + /// + public UploadRole UploadRole { get; set; } public Guid TrialId { get; set; } - public string SubjectCode { get; set; } + /// + /// 访视Id 或者模块Id + /// + public Guid ReadingId { get; set; } + + /// + /// 临床级别 + /// + public ClinicalLevel ClinicalDataLevel { get; set; } + + + public Guid? BaseLineVisitId { get; set; } + + /// + /// 上传方式 + /// + public ClinicalUploadType ClinicalUploadType { get; set; } + + public string SubjectCode { get; set; } public Guid ClinicalDataTrialSetId { get; set; } public string ClinicalDataSetName { get; set; } @@ -99,12 +131,33 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string Answer { get; set; } = string.Empty; } - public class GetCRCConfirmListInDto + public class GetPMConfirmListInDto: PageInput { - public Guid TrialId { get; set; } + public Guid TrialId { get; set; } + + public Guid TrialReadingCriterionId { get; set; } + } + + public class GetCRCConfirmListInDto:PageInput + { + + public bool? IsCRCConfirm { get; set; } + + public bool? IsPMConfirm { get; set; } + + public Guid? TrialReadingCriterionId { get; set; } + + public Guid? SubjectId { get; set; } + + public DateTime? StartTime { get; set; } + public DateTime? EndTime { get; set; } + + public Guid TrialId { get; set; } public Guid? ReadModuleId { get; set; } - } + + public string? SubjectCode { get; set; } + } public class CRCCancelConfirmClinicalInDto { @@ -113,7 +166,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid ReadModuleId { get; set; } } - public class GetCRCBeConfirmListInDto + public class GetClinicalDateListOutDto + { + public string ClinicalDataSetName { get; set; } + + + public List DateList { get; set; } + } + + + public class GetCRCBeConfirmListInDto { public Guid TrialId { get; set; } @@ -121,8 +183,35 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } - public class GetCRCBeConfirmListOutDto + public class GetClinicalTableListInDto + { + public Guid TrialId { get; set; } + + public Guid ReadModuleId { get; set; } + } + + + public class GetClinicalTableListOutDto: GetClinicalQuestionAnswerListOutDto + { + public string ClinicalDataSetName { get; set; } + + /// + /// 模块名称 + /// + public string ModuleName { get; set; } + } + + + public class GetCRCBeConfirm: GetCRCBeConfirmListOutDto + { + public Guid ReadModuleId { get; set; } + } + + + public class GetCRCBeConfirmListOutDto { + public Guid ClinicalDataTrialSetId { get; set; } + public Guid ClinicalFormId { get; set; } public string ClinicalDataSetName { get; set; } @@ -130,18 +219,39 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string ClinicalDataSetEnName { get; set; } public DateTime CheckDate { get; set; } + + public bool IsHaveTableQuestion { get; set; } } public class CRCConfirmClinicalInDto { public Guid TrialId { get; set; } + public Guid SubjectId { get; set; } + public Guid ReadModuleId { get; set; } - } + + /// + /// 临床数据是否完整 + /// + public bool? IsClinicalDataComplete { get; set; } + + /// + /// 临床数据是否盲化 + /// + public bool? IsClinicalDataBlind { get; set; } + + public bool IsConfirm { get; set; } + + } public class CRCClinicalForm { + /// + /// 受试者Id + /// + public Guid SubjectId { get; set; } public DateTime? CheckDate { get; set; } public Guid ClinicalFormId { get; set; } @@ -151,8 +261,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public ClinicalLevel ClinicalDataLevel { get; set; } + + public Guid ClinicalDataTrialSetId { get; set; } + public string ClinicalDataSetName { get; set; } + public bool IsHaveTableQuestion { get; set; } + public string ClinicalDataSetEnName { get; set; } } @@ -164,39 +279,69 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// 受试者ID /// public Guid SubjectId { get; set; } - public Guid ReadModuleId { get; set; } - public bool IsPMConfirm { get; set; } + public bool IsNotNeedPMConfirm { get; set; } = false; + public Guid ReadModuleId { get; set; } + + /// + /// 模块名称 + /// + public string ModuleName { get; set; } + + public string VisitBlindName { get; set; } + + public bool IsPMConfirm { get; set; } public ReadingSetType ReadingSetType { get; set; } public bool IsCRCConfirm { get; set; } = false; - public string SubjectCode { get; set; } + + /// + /// CRC是否正在申请撤回 + /// + public bool IsCRCApplicationRevoke { get; set; } = false; + + public string SubjectCode { get; set; } + + public bool IsHaveTableQuestion + { + get + { + return ClinicalFormList.Any(x => x.IsHaveTableQuestion); + } + } /// /// 最晚拍片日期 /// public DateTime? LatestScanDate { get; set; } + public List ClinicalNameList + { + get + { + return this.ClinicalFormList.Select(x => x.ClinicalDataSetName).Distinct().ToList(); + } + } - public List ClinicalFormIdList { get; set; } + + public List ClinicalFormList { get; set; } public int FormCount { get { - return this.ClinicalFormIdList.Count(); + return this.ClinicalFormList.Count(); } } } + public class DeleteClinicalFormInDto + { + public Guid ClinicalFormId { get; set; } + } public class SubmitClinicalFormInDto { - /// - /// VisitId - /// - public Guid? VisitId { get; set; } - /// /// VisitId /// diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs index 8e0dd533f..fd279e1a1 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs @@ -16,7 +16,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// 是否应用 /// - public bool IsApply { get; set; } = false; + public bool? IsApply { get; set; } /// /// 名称 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs index f38dd1bca..d5c21ac55 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs @@ -156,6 +156,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public Guid? Id { get; set; } + + public bool IsVerify { get; set; } = false; + /// /// 问题名称 /// @@ -181,6 +184,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public int? MaxAnswerLength { get; set; } + /// + /// 最大行数 + /// + public int? MaxQuestionCount { get; set; } + /// /// 临床数据选项类型(无,自定义) /// @@ -360,6 +368,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid? Id { get; set; } + public bool IsVerify { get; set; } = false; + /// /// 问题名称 /// diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs index 85a126ec2..cd3713b1f 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs @@ -10,8 +10,8 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Service.Reading.Dto { - public class AddOrUpdateReadingClinicalDataDto - { + public class AddOrUpdateReadingClinicalDataDto + { public Guid? Id { get; set; } @@ -113,9 +113,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public bool? IsComplete { get; set; } - //public List ReadingClinicalDataList { get; set; } + public List ClinicalFromList { get; set; } - public List PDFFileList { get; set; } = new List(); + //public List ReadingClinicalDataList { get; set; } + + public List PDFFileList { get; set; } = new List(); public ClinicalDataTable ClinicalTableData { get; set; } } @@ -127,9 +129,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public List PreviousOtherList { get; set; } - public List PreviousSurgeryList{ get; set; } + public List PreviousSurgeryList { get; set; } + - } @@ -137,7 +139,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class GetCRCClinicalDataInDto { [NotDefault] - public Guid SubjectVisitId { get; set; } + public Guid SubjectVisitId { get; set; } [NotDefault] public Guid TrialId { get; set; } @@ -163,7 +165,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// 文件名称 /// - public string FileName { get; set; } + public string FileName { get; set; } /// /// 路径 @@ -182,29 +184,52 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid? ReadingId { get; set; } - public Guid? VisitTaskId { get; set; } + /// + /// 临床数据类型Id + /// + public Guid? ClinicalDataTrialSetId { get; set; } - public Guid? ReadingClinicalDataId { get; set; } + public Guid? VisitTaskId { get; set; } + + /// + /// 1 PM上传的所有的 2CRC上传的所有已确认的 3 所有已经签名的 + /// + public GetClinicalType? GetClinicalType { get; set; } + + public Guid? ReadingClinicalDataId { get; set; } /// - /// 只查询已经签名的临床数据 + /// 只获取CRC上传的阅片模块结构化录入 /// - public bool SelectIsSign { get; set; } = true; + public bool IsOnlyGetCRCReadModule { get; set; } = false; + + /// + /// 只查询已经签名的临床数据 + /// + public bool SelectIsSign { get; set; } = true; } /// /// 获取访视列表 /// - public class GetReadingClinicalDataListIndto + public class GetReadingClinicalDataListIndto { - [NotDefault] + [NotDefault] public Guid SubjectId { get; set; } [NotDefault] public Guid ReadingId { get; set; } - public UploadRole? UploadRole { get; set; } + /// + /// 临床数据类型Id + /// + public Guid? ClinicalDataTrialSetId { get; set; } - [NotDefault] + /// + /// 1 PM上传的所有的 2CRC上传的所有已确认的 3 所有已经签名的 + /// + public GetClinicalType? GetClinicalType { get; set; } + + [NotDefault] public Guid TrialReadingCriterionId { get; set; } public Guid TrialId { get; set; } @@ -220,7 +245,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsBaseLine { get; set; } } - public class GetReadingClinicalDataPDFListIndto:PageInput + public class GetReadingClinicalDataPDFListIndto : PageInput { public Guid ReadingClinicalDataId { get; set; } } @@ -283,7 +308,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class PMClinicalDataConfirmCommand - { + { public Guid Id { get; set; } /// @@ -310,11 +335,18 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public Guid ReadingId { get; set; } + /// + /// CRC是否正在申请撤回 + /// + public bool IsCRCApplicationRevoke { get; set; } = false; + public bool IsCRCConfirm { get; set; } = false; - /// - /// 项目配置临床类型Name - /// - public string ClinicalDataSetName { get; set; } + public bool IsPMConfirm { get; set; } = false; + + /// + /// 项目配置临床类型Name + /// + public string ClinicalDataSetName { get; set; } /// /// 英文名称 @@ -363,11 +395,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public bool IsCRCUpload { get; set; } + public bool IsNeedMerge { get; set; } = false; + + public Guid ReadModuleId { get; set; } + /// /// 是否签名 /// - public bool IsSign { get; set; } + public bool IsSign { get; set; } /// @@ -395,6 +431,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto // } //} + public List ClinicalFromList { get; set; } + public List FileList { get; set; } = new List(); @@ -404,6 +442,19 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } + public class ClinicalFromData + { + /// + /// 表单Id + /// + public Guid ClinicalFormId { get; set; } + + /// + /// 检查日期 + /// + public DateTime? CheckDate { get; set; } + } + public class GetFileDto { diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs index 29775bb1f..a7b15aee6 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs @@ -9,6 +9,17 @@ namespace IRaCIS.Core.Application.Service.Reading.Interface { public interface IClinicalAnswerService { - Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); - } + Task CRCSignClinicalData(CRCSignClinicalDataInDto inDto); + + Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); + + Task PMConfirmClinical(CRCConfirmClinicalInDto inDto); + + Task SubmitClinicalForm(SubmitClinicalFormInDto inDto); + + Task CRCConfirmClinical(CRCConfirmClinicalInDto inDto); + + Task CRCCancelConfirmClinical(CRCCancelConfirmClinicalInDto inDto); + + } } diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs index 1d1f3f62d..94705f59a 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs @@ -23,5 +23,7 @@ namespace IRaCIS.Core.Application.Contracts // Task<(List, object)> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto); Task> GetReadingClinicalList(GetReadingClinicalDataListIndto inDto); + + Task DealVisiTaskClinicalDataSignedAsync(Guid trialId, Guid subjectId, Guid readingId, bool isVisit, Guid trialReadingCritrialId); } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 3eaac36bf..131ce3167 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -526,7 +526,7 @@ namespace IRaCIS.Application.Services x.VisitTaskNum < taskInfo.VisitTaskNum && x.ArmEnum == taskInfo.ArmEnum && x.Id != inDto.VisitTaskId && - x.DoctorUserId == taskInfo.DoctorUserId && + //x.DoctorUserId == taskInfo.DoctorUserId && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect && @@ -2165,6 +2165,7 @@ namespace IRaCIS.Application.Services SubjectId = taskInfo.SubjectId, TrialId = taskInfo.TrialId, VisitTaskId = taskInfo.Id, + }); var isBaseLine = false; @@ -2625,7 +2626,7 @@ namespace IRaCIS.Application.Services x.SubjectId == taskInfo.SubjectId && x.VisitTaskNum < taskInfo.VisitTaskNum && x.ArmEnum == taskInfo.ArmEnum && - x.DoctorUserId == taskInfo.DoctorUserId && + //x.DoctorUserId == taskInfo.DoctorUserId && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect && @@ -2641,7 +2642,7 @@ namespace IRaCIS.Application.Services x.SubjectId == taskInfo.SubjectId && x.VisitTaskNum <= taskInfo.VisitTaskNum && x.ArmEnum == taskInfo.ArmEnum && - x.DoctorUserId == taskInfo.DoctorUserId && + //x.DoctorUserId == taskInfo.DoctorUserId && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && x.ReadingTaskState == ReadingTaskState.HaveSigned && (x.TaskState == TaskState.Effect || x.TaskState == TaskState.Freeze) && @@ -2665,7 +2666,7 @@ namespace IRaCIS.Application.Services x.IsAnalysisCreate == taskInfo.IsAnalysisCreate && x.ArmEnum == taskInfo.ArmEnum && x.IsSelfAnalysis == taskInfo.IsSelfAnalysis && - x.DoctorUserId == taskInfo.DoctorUserId && + //x.DoctorUserId == taskInfo.DoctorUserId && x.TaskState == TaskState.Effect && x.VisitTaskNum <= taskInfo.VisitTaskNum).Select(x => x.Id).ToListAsync(); break; } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs index e5dff07f2..87908db6a 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs @@ -8,6 +8,7 @@ using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Domain.Models; namespace IRaCIS.Application.Services { @@ -25,6 +26,7 @@ namespace IRaCIS.Application.Services private readonly IRepository _trialRepository; private readonly IVisitTaskHelpeService _visitTaskHelpeService; private readonly IRepository _visitTaskRepository; + private readonly IRepository _readModuleCriterionFromRepository; private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _readModuleViewRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; @@ -41,6 +43,7 @@ namespace IRaCIS.Application.Services IRepository trialRepository, IVisitTaskHelpeService visitTaskHelpeService, IRepository visitTaskRepository, + IRepository readModuleCriterionFromRepository, IRepository clinicalDataTrialSetRepository, IRepository readModuleViewRepository, IRepository readingQuestionCriterionTrialRepository, @@ -57,6 +60,7 @@ namespace IRaCIS.Application.Services this._trialRepository = trialRepository; this._visitTaskHelpeService = visitTaskHelpeService; this._visitTaskRepository = visitTaskRepository; + this._readModuleCriterionFromRepository = readModuleCriterionFromRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; this._readModuleViewRepository = readModuleViewRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; @@ -115,6 +119,13 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task ChangeCutOffVisit(ChangeCutOffVisitInDto inDto) { + + if (await _readModuleRepository.AnyAsync(x => x.Id == inDto.Id && x.IsCRCConfirm)) + { + //---CRC已经确认临床数据 不允许编辑 + throw new BusinessValidationFailedException(_localizer["ReadModule_CRCConfirmCanNtoEdit"]); + } + await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.Id, x => new ReadModule() { SubjectVisitId=inDto.SubjectVisitIdId, ModuleName=inDto.Name, @@ -480,6 +491,14 @@ namespace IRaCIS.Application.Services 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))) { @@ -499,6 +518,7 @@ namespace IRaCIS.Application.Services TaskState = TaskState.Adbandon }); + await _readModuleRepository.UpdatePartialFromQueryAsync(t => t.Id == readModuleId, x => new ReadModule() { diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index dc3a51093..5a4f0b1a1 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -927,7 +927,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && x.IsAnalysisCreate == taskinfo.IsAnalysisCreate && - x.DoctorUserId == taskinfo.DoctorUserId && + //x.DoctorUserId == taskinfo.DoctorUserId && x.IsSelfAnalysis == taskinfo.IsSelfAnalysis && x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index f396c0497..051b12e33 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -381,7 +381,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && x.IsAnalysisCreate == taskinfo.IsAnalysisCreate && - x.DoctorUserId ==taskinfo.DoctorUserId && + //x.DoctorUserId ==taskinfo.DoctorUserId && x.IsSelfAnalysis == taskinfo.IsSelfAnalysis && x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum ).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index c44e8815c..d3a48d2b3 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -733,7 +733,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && x.IsAnalysisCreate== taskinfo.IsAnalysisCreate&& - x.DoctorUserId == taskinfo.DoctorUserId && + //x.DoctorUserId == taskinfo.DoctorUserId && x.IsSelfAnalysis== taskinfo.IsSelfAnalysis && x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum ).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs index bd528675f..430750be8 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs @@ -728,7 +728,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && x.IsAnalysisCreate== taskinfo.IsAnalysisCreate&& - x.DoctorUserId == taskinfo.DoctorUserId && + //x.DoctorUserId == taskinfo.DoctorUserId && x.IsSelfAnalysis== taskinfo.IsSelfAnalysis && x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum ).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs index e0b34c9fa..3e0bf3ea9 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs @@ -383,7 +383,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && x.IsAnalysisCreate == taskinfo.IsAnalysisCreate && - x.DoctorUserId == taskinfo.DoctorUserId && + //x.DoctorUserId == taskinfo.DoctorUserId && x.IsSelfAnalysis == taskinfo.IsSelfAnalysis && x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum ).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs index 5f446672e..f8d22c930 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs @@ -105,10 +105,13 @@ namespace IRaCIS.Core.Application.Contracts public int? ToBeApprovalCount { get; set; } } + public class GetPMClinicalDataToBeDoneListOutDto: TrialBaseInfoDto + { + public int? ToBeApprovalCount { get; set; } + } public class ReviewerSelectToBeDoneQuery : PageInput { - } public class ReviewerSelectToBeDoneDto : TrialBaseInfoDto @@ -253,6 +256,12 @@ namespace IRaCIS.Core.Application.Contracts public int? UrgentCount { get; set; } public int? ToBeDealedCount { get; set; } + + public int? ToAllCount { get; set; } + + public int? ToBeVisitCount { get; set; } + + public int? ReadModuleCount { get; set; } } public class TrialToBeDoneQuery : PageInput diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index f69071b47..91b06c204 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -20,15 +20,19 @@ namespace IRaCIS.Core.Application private readonly IRepository _trialUserRepository; private readonly IRepository _trialDocumentRepository; private readonly IRepository _systemDocumentRepository; + private readonly IRepository _readModuleRepository; private readonly IRepository _systemNoticeRepository; public PersonalWorkstation(IRepository trialRepository, IRepository trialUserRepository, IRepository trialDocumentRepository, - IRepository systemDocumentRepository, IRepository systemNoticeRepository) + IRepository systemDocumentRepository, + IRepository readModuleRepository, + IRepository systemNoticeRepository) { _trialRepository = trialRepository; _trialUserRepository = trialUserRepository; _trialDocumentRepository = trialDocumentRepository; _systemDocumentRepository = systemDocumentRepository; + this._readModuleRepository = readModuleRepository; _systemNoticeRepository = systemNoticeRepository; } @@ -200,7 +204,7 @@ namespace IRaCIS.Core.Application ToBeRepliedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeDialogList.OrderByDescending(t => t.CreateTime).First().UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(), - }); + }).Where(x => x.ToBeRepliedCount > 0); @@ -243,7 +247,7 @@ namespace IRaCIS.Core.Application UrgentCount = g.Where(u => u.OriginalReReadingTask.IsUrgent == true).Count(), ToBeApprovalCount = g.Count(), - }); + }).Where(x => x.ToBeApprovalCount > 0); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ReReadingApplyToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -281,7 +285,7 @@ namespace IRaCIS.Core.Application IsUrgent = t.IsUrgent || t.IsSubjectExpeditedView, ToBeApprovalCount = t.EnrollList.Where(u => u.EnrollStatus == EnrollStatus.InviteIntoGroup).Count() - }); + }).Where(x => x.ToBeApprovalCount > 0); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ReviewerSelectToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -293,6 +297,43 @@ namespace IRaCIS.Core.Application } + /// + /// 获取PM核对临床数据 + /// + /// + /// + [HttpPost] + public async Task>> GetPMClinicalDataToBeDoneList(ReviewerSelectToBeDoneQuery inQuery) + { + + var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Select(t => new GetPMClinicalDataToBeDoneListOutDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + + + ToBeApprovalCount = t.ReadModuleList.Where(u => u.IsCRCConfirm&&!u.IsPMConfirm).Count() + }).Where(x => x.ToBeApprovalCount > 0); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ReviewerSelectToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); + + + var all =await _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Select(t => new GetPMClinicalDataToBeDoneListOutDto() + { + + + ToBeApprovalCount = t.ReadModuleList.Where(u => u.IsCRCConfirm && !u.IsPMConfirm).Count() + }).ToListAsync(); + + return ResponseOutput.Ok(result, new { ToBeApprovalCount = all.Sum(x=>x.ToBeApprovalCount) }); ; + } + #endregion @@ -321,7 +362,7 @@ namespace IRaCIS.Core.Application IsUrgent = t.IsUrgent || t.IsSubjectExpeditedView, ToBeApprovalCount = t.EnrollList.Where(u => u.EnrollStatus == EnrollStatus.HasCommittedToCRO).Count() - }); + }).Where(x => x.ToBeApprovalCount > 0) ; var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ReviewerSelectToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -358,7 +399,7 @@ namespace IRaCIS.Core.Application UrgentCount = g.Where(u => u.OriginalReReadingTask.IsUrgent == true).Count(), ToBeApprovalCount = g.Count(), - }); + }).Where(x => x.ToBeApprovalCount > 0); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ReReadingApprovalToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -399,9 +440,50 @@ namespace IRaCIS.Core.Application ExperimentName = t.ExperimentName, TrialCode = t.TrialCode, UrgentCount = t.SubjectVisitList.Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted && u.IsUrgent).Count(), - ToBeDealedCount = t.SubjectVisitList.Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted).Count(), + ToBeDealedCount = t.ReadingClinicalDataList.Where(x=>!x.IsSign&& x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.SubjectVisit&& x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Subject).Count(), + ToBeVisitCount= t.ReadingClinicalDataList.Where(x => !x.IsSign && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count(), + ToAllCount= t.ReadingClinicalDataList.Where(x => !x.IsSign && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC ).Count(), + ReadModuleCount =t.ReadModuleList.Where(x=>!x.IsPMConfirm).Count(), + }).Where(x=>x.ToBeDealedCount > 0); - }); + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageClinicalDataToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); + + var toBeDealedCount = _subjectVisitRepository + //.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id) && t.Trial.clinicalDataTrialSets.Any(t => t.ClinicalDataLevel == ClinicalLevel.Subject && t.IsConfirm)) + .Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeDealedCount = toBeDealedCount }); + + } + + + /// + /// 临床数据 --CRC 待确认 + /// + /// + /// + /// + [HttpPost] + public async Task>> GetImageClinicalDataToBeConfirmList(ImageClinicalDataToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + //.Where(t => t.clinicalDataTrialSets.Any(t => t.ClinicalDataLevel == ClinicalLevel.Subject && t.IsConfirm)) + .Select(t => new ImageClinicalDataToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + UrgentCount = t.SubjectVisitList.Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted && u.IsUrgent).Count(), + ToBeDealedCount = t.ReadingClinicalDataList.Where(x => !x.IsSign && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.SubjectVisit && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Subject).Count(), + ToBeVisitCount = t.ReadingClinicalDataList.Where(x => !x.IsSign && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count(), + ToAllCount = t.ReadingClinicalDataList.Where(x => !x.IsSign && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC).Count(), + ReadModuleCount = t.ReadModuleList.Where(x => !x.IsPMConfirm).Count(), + }).Where(x => x.ReadModuleCount > 0); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageClinicalDataToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -448,7 +530,7 @@ namespace IRaCIS.Core.Application .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count(), - }); + }).Where(x => x.ToBeDealedCount > 0); ; var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageQuestionToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -489,7 +571,7 @@ namespace IRaCIS.Core.Application ToBeReplyedCount = t.SubjectVisitList.Where(c => c.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id)) .Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count() - }); + }).Where(x => x.ToBeReplyedCount > 0); @@ -535,7 +617,7 @@ namespace IRaCIS.Core.Application .Where(c => c.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id)) .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsPMBackOrReReading).Count(), - }); + }).Where(x => x.ToBeReUploadCount > 0); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageReUploadToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -579,7 +661,7 @@ namespace IRaCIS.Core.Application .Where(c => c.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id)) .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit).Count(), - }); + }).Where(x => x.ToBeDealedCount > 0); ; var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageSubmittedToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -632,7 +714,7 @@ namespace IRaCIS.Core.Application //待审核通过,统计从已领取到QC提交之间的 已领取 待审核 审核中 (审核完成 领取人就会清理 所以只用查询当前领取人是自己的就好了) ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == _userInfo.Id).Count() - }); + }).Where(x => x.UrgentCount > 0); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageQualityToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -677,7 +759,7 @@ namespace IRaCIS.Core.Application ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) .Where(u => u.CreateUserId == _userInfo.Id && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(), - }); + }).Where(x => x.ToBeDealedCount > 0); ; var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ImageQuestionToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); @@ -749,9 +831,9 @@ namespace IRaCIS.Core.Application HaveSignedCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), - }) + }).Where(x => x.UnReadCount > 0); - ; + ; #region 废弃 //var query = _trialRepository diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 3f3097efc..c449c05d5 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -203,6 +203,7 @@ namespace IRaCIS.Core.Application [HttpPost] public async Task AsyncTrialCriterionDictionary(AsyncTrialCriterionDictionaryInDto inDto) { + var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync(); if (trialCriterion.ReadingQuestionCriterionSystemId != null) @@ -1043,9 +1044,17 @@ namespace IRaCIS.Core.Application //}); ; + var result = await _repository.SaveChangesAsync(); - - return ResponseOutput.Ok(await _repository.SaveChangesAsync()); + var criterionTrialList = await _readingQuestionCriterionTrialRepository.Where(x =>x.IsConfirm&& x.TrialId == trialConfig.TrialId&&x.ReadingQuestionCriterionSystemId!=null&&x.SynchronizeOriginalTime==null).ToListAsync(); + foreach (var item in criterionTrialList) + { + await AsyncTrialCriterionDictionary(new AsyncTrialCriterionDictionaryInDto() + { + TrialReadingCriterionId = item.Id + }); + } + return ResponseOutput.Ok(result); } /// diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index 7155d8ed6..94463c240 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -98,36 +98,36 @@ namespace IRaCIS.Core.Application.Triggers } // 触发临床数据 - if (context.ChangeType == ChangeType.Added) - { - var cRCClinicalDatas = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == context.Entity.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm) + //if (context.ChangeType == ChangeType.Added) + //{ + // var cRCClinicalDatas = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == context.Entity.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm) - .Select(x => new - { - x.Id, - x.ClinicalDataLevel, - }).ToListAsync(); + // .Select(x => new + // { + // x.Id, + // x.ClinicalDataLevel, + // }).ToListAsync(); - List readingClinicals = new List(); - readingClinicals.AddRange( + // List readingClinicals = new List(); + // readingClinicals.AddRange( - cRCClinicalDatas.WhereIf(!context.Entity.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Select(x => new ReadingClinicalData() - { - ClinicalDataTrialSetId = x.Id, - IsVisit = true, - SubjectId = context.Entity.SubjectId, - ReadingId = context.Entity.Id, - TrialId = context.Entity.TrialId + // cRCClinicalDatas.WhereIf(!context.Entity.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Select(x => new ReadingClinicalData() + // { + // ClinicalDataTrialSetId = x.Id, + // IsVisit = true, + // SubjectId = context.Entity.SubjectId, + // ReadingId = context.Entity.Id, + // TrialId = context.Entity.TrialId - }).ToList() + // }).ToList() - ); + // ); - await _readingClinicalDataRepository.AddRangeAsync(readingClinicals); - await _readingClinicalDataRepository.SaveChangesAsync(); + // await _readingClinicalDataRepository.AddRangeAsync(readingClinicals); + // await _readingClinicalDataRepository.SaveChangesAsync(); - } + //} } diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index 3608eb7fa..99889d0b2 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -16,6 +16,29 @@ namespace IRaCIS.Core.Domain.Share public static readonly string Group = "group"; } + + /// + /// GetClinicalType + /// + public enum GetClinicalType + { + + /// + /// PM上传 + /// + PMUpload = 1, + + /// + /// CRC 上传 过确认 + /// + CRCConfirm = 2, + + /// + /// 已审核 + /// + HasSign = 3 + } + /// /// 临床表格问题标识 /// @@ -1924,6 +1947,9 @@ namespace IRaCIS.Core.Domain.Share HaveUploaded = 1, + /// + /// 待核查 + /// HaveChecked = 2, HaveSigned = 3 diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs index fef381af9..4eb814256 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs @@ -100,8 +100,11 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List TrialClinicalDataSetCriteriaList { get; set; } + [JsonIgnore] + public List TrialClinicalQuestionList { get; set; } - public string CriterionEnumListStr { get; set; } = String.Empty; + + public string CriterionEnumListStr { get; set; } = String.Empty; public List CriterionEnumList => CriterionEnumListStr.Split('|', StringSplitOptions.RemoveEmptyEntries).Where(t => !string.IsNullOrEmpty(t) && int.TryParse(t.Trim(), out var s)).Select(t => int.Parse(t.Trim())).ToList(); diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs index db9e8f70a..bdcb87f34 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs @@ -75,7 +75,14 @@ namespace IRaCIS.Core.Domain.Models public ClinicalDataTrialSet ClinicalDataTrialSet { get; set; } - [JsonIgnore] + + + [JsonIgnore] + [ForeignKey("TrialId")] + + public Trial Trial { get; set; } + + [JsonIgnore] [ForeignKey("ReadingId")] public SubjectVisit SubjectVisit { get; set; } @@ -96,8 +103,10 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List ReadingClinicalDataPDFList { get; set; } + - } + + } diff --git a/IRaCIS.Core.Domain/Reading/ClinicalQuestion/SystemClinicalQuestion.cs b/IRaCIS.Core.Domain/Reading/ClinicalQuestion/SystemClinicalQuestion.cs index 539c62c0d..0905c294e 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalQuestion/SystemClinicalQuestion.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalQuestion/SystemClinicalQuestion.cs @@ -48,6 +48,11 @@ namespace IRaCIS.Core.Domain.Models /// public int? MaxAnswerLength { get; set; } + /// + /// 最大行数 + /// + public int? MaxQuestionCount { get; set; } + /// /// 临床数据选项类型(无,自定义) /// diff --git a/IRaCIS.Core.Domain/Reading/ClinicalQuestion/TrialClinicalQuestion.cs b/IRaCIS.Core.Domain/Reading/ClinicalQuestion/TrialClinicalQuestion.cs index f741b2f93..931484b8c 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalQuestion/TrialClinicalQuestion.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalQuestion/TrialClinicalQuestion.cs @@ -47,6 +47,11 @@ namespace IRaCIS.Core.Domain.Models /// 最大长度 /// public int? MaxAnswerLength { get; set; } + + /// + /// 最大行数 + /// + public int? MaxQuestionCount { get; set; } /// /// 临床数据选项类型(无,自定义) @@ -162,7 +167,11 @@ namespace IRaCIS.Core.Domain.Models /// 单位 /// public string Unit { get; set; } = string.Empty; - } + + [JsonIgnore] + [ForeignKey("TrialClinicalId")] + public ClinicalDataTrialSet ClinicalDataTrialSet { get; set; } + } } diff --git a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs index f41eb924f..b59d1374d 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs @@ -44,11 +44,6 @@ namespace IRaCIS.Core.Domain.Models /// public Guid ClinicalDataTrialSetId { get; set; } - /// - /// VisitId - /// - public Guid? VisitId { get; set; } - /// /// VisitId /// @@ -59,6 +54,10 @@ namespace IRaCIS.Core.Domain.Models [ForeignKey("ClinicalDataTrialSetId")] public ClinicalDataTrialSet ClinicalDataTrialSet { get; set; } - } + [JsonIgnore] + [ForeignKey("SubjectId")] + public Subject Subject { get; set; } + + } } diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs index fba287340..e45d82b4b 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs @@ -79,25 +79,42 @@ namespace IRaCIS.Core.Domain.Models public bool IsCRCConfirm { get; set; } = false; public bool IsPMConfirm { get; set; } = false; - public bool IsDeleted { get; set; } + + public bool IsNotNeedPMConfirm { get; set; } = false; + + /// + /// CRC是否正在申请撤回 + /// + public bool IsCRCApplicationRevoke { get; set; } = false; + public bool IsDeleted { get; set; } public DateTime? DeletedTime { get; set; } public Guid? DeleteUserId { get; set; } - ///// - ///// - ///// - //public decimal VisitNum { get; set; } + /// + /// 临床数据是否完整 + /// + public bool? IsClinicalDataComplete { get; set; } - // [JsonIgnore] - ///// - ///// 对应 - ///// - //[ForeignKey("ReadModuleId")] - //public ReadModule ReadModuleModel { get; set; } + /// + /// 临床数据是否盲化 + /// + public bool? IsClinicalDataBlind { get; set; } - [JsonIgnore] + ///// + ///// + ///// + //public decimal VisitNum { get; set; } + + // [JsonIgnore] + ///// + ///// 对应 + ///// + //[ForeignKey("ReadModuleId")] + //public ReadModule ReadModuleModel { get; set; } + + [JsonIgnore] /// /// 受试者 /// @@ -119,11 +136,15 @@ namespace IRaCIS.Core.Domain.Models [ForeignKey("SubjectVisitId")] public SubjectVisit SubjectVisit { get; set; } + [JsonIgnore] + [ForeignKey("TrialId")] + public Trial Trial { get; set; } - /// - /// 阅片配置的类型 - /// - public ReadingSetType ReadingSetType { get; set; } + + /// + /// 阅片配置的类型 + /// + public ReadingSetType ReadingSetType { get; set; } diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index 82d213ea8..e173f31f1 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -53,6 +53,8 @@ namespace IRaCIS.Core.Domain.Models public List TrialSiteList { get; set; } = new List(); [JsonIgnore] public List TrialSiteUserList { get; set; } = new List(); + [JsonIgnore] + public List ReadModuleList { get; set; } = new List(); public Guid IndicationTypeId { get; set; } = Guid.Empty; @@ -83,8 +85,8 @@ namespace IRaCIS.Core.Domain.Models public virtual ICollection ClinicalTrialProjectDetails { get; set; } [JsonIgnore] public virtual ICollection TrialDicList { get; set; } - - + [JsonIgnore] + public List ReadingClinicalDataList { get; set; } [StringLength(100)] public string TrialCode { get; set; } = string.Empty; diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index d1a4e131f..82adee191 100644 --- a/IRaCIS.Core.Domain/Visit/Subject.cs +++ b/IRaCIS.Core.Domain/Visit/Subject.cs @@ -121,6 +121,8 @@ namespace IRaCIS.Core.Domain.Models public Guid? DeleteUserId { get; set; } public bool IsReReadingOrBackInfluenceAnalysis { get; set; } + [JsonIgnore] + public List ClinicalFormList { get; set; } public Guid? ClaimUserId { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/ClinicalFromConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/ClinicalFromConfigration.cs new file mode 100644 index 000000000..98b711e7a --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/ClinicalFromConfigration.cs @@ -0,0 +1,27 @@ +using IRaCIS.Core.Domain.Models; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Infra.EFCore.EntityConfigration +{ + //public class ClinicalFromConfigration : IEntityTypeConfiguration + //{ + + + // public void Configure(EntityTypeBuilder builder) + // { + // builder + // .HasOne(s => s.ReadingClinicalData) + // .WithMany(c => c.ClinicalFormList) + // .HasForeignKey(s => new { s.SubjectId, s.ReadingId }) + // .HasPrincipalKey(c => new { c.SubjectId, c.ReadingId }); + // } + + + //} +}