diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index 65397046..10caab8d 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -232,10 +232,10 @@ namespace IRaCIS.Core.API.Controllers /// [HttpPost, Route("Inspection/QCOperation/SetCheckPass")] [UnitOfWork] - public async Task SetCheckPass(DataInspectionDto opt) + public async Task SetCheckPass(DataInspectionDto opt) { var fun = _qCOperationService.SetCheckPass; - return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); + return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index e84f9ad8..afa22273 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -106,7 +106,7 @@ - + 手动设置一致性核查通过 diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 0ee4a225..cb5abad5 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1426,7 +1426,7 @@ - + 手动设置一致性核查通过 diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index 38a0f47f..d3e4ed69 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -169,8 +169,7 @@ namespace IRaCIS.Core.Application.Services DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries); - List datas = new List(); - + var createtime=DateTime.Now; @@ -198,32 +197,32 @@ namespace IRaCIS.Core.Application.Services await _studyRepository.AddAsync(dicomStudy); } - if (isSeriesNeedAdd) { + if (isSeriesNeedAdd) + { // 添加序列 - - dicomSeries.Id = NewId.NextGuid(); + await _seriesRepository.AddAsync(dicomSeries); + #region 稽查 + List datas = new List(); datas.Add(new DataInspection() { SiteId = dicomStudy.SiteId, SubjectId = dicomStudy.SubjectId, TrialId = dicomStudy.TrialId, - GeneralId= dicomSeries.Id, + GeneralId = dicomSeries.Id, SubjectVisitId = dicomStudy.SubjectVisitId, CreateTime = createtime.AddMilliseconds(10), Identification = "Add|DICOM Series|Info|Visit-Image Upload", JsonDetail = JsonConvert.SerializeObject(new { - StudyCode=dicomStudy.StudyCode, + StudyCode = dicomStudy.StudyCode, Modalities = dicomStudy.Modalities, - SeriesNumber= dicomSeries.SeriesNumber, - InstanceCount=dicomSeries.InstanceCount, - SeriesTime= dicomSeries.SeriesTime, - + SeriesNumber = dicomSeries.SeriesNumber, + InstanceCount = dicomSeries.InstanceCount, + SeriesTime = dicomSeries.SeriesTime, + }) }); - - datas.Add(new DataInspection() { @@ -241,17 +240,16 @@ namespace IRaCIS.Core.Application.Services SeriesNumber = dicomSeries.SeriesNumber, InstanceCount = dicomSeries.InstanceCount, SeriesTime = dicomSeries.SeriesTime, - IsReading= dicomSeries.IsReading, + IsReading = dicomSeries.IsReading, }) }); - - await _seriesRepository.AddAsync(dicomSeries); - + await _inspectionService.AddListInspectionRecordAsync(datas); + #endregion } - await _inspectionService.AddListInspectionRecordAsync(datas); + await _instanceRepository.AddAsync(dicomInstance); diff --git a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs index 83cb383a..d32a7728 100644 --- a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs +++ b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs @@ -235,6 +235,13 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO } + public class SetCheckPassDt + { + public string ManualPassReason { get; set; } = string.Empty; + + public Guid Id { get; set; } + } + public class ObtainOrCancelQCTaskDto { diff --git a/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs b/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs index 9e67a0c6..16a34f74 100644 --- a/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs @@ -1,5 +1,6 @@ using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts.DTO; +using IRaCIS.Core.Application.Service.Inspection.DTO; using IRaCIS.Core.Domain.Share; using MediatR; using Microsoft.AspNetCore.Hosting; @@ -13,7 +14,7 @@ namespace IRaCIS.Core.Application.Image.QA Task CheckBack(Guid subjectVisitId); Task SetNeedReupload(Guid trialId, Guid qcChallengeId); Task QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState); - Task SetCheckPass(Guid subjectVisitId); + Task SetCheckPass(SetCheckPassDt data); diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index dcf98bef..ebe4c6e0 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -22,6 +22,7 @@ using Newtonsoft.Json; using Magicodes.ExporterAndImporter.Csv; using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Infrastructure; +using IRaCIS.Core.Application.Service.Inspection.DTO; namespace IRaCIS.Core.Application.Image.QA { @@ -414,14 +415,14 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] - public async Task SetCheckPass(Guid subjectVisitId) + public async Task SetCheckPass(SetCheckPassDt data) { if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ProjectManager) { ResponseOutput.NotOk("只允许PM 手动设置一致性核查通过"); } - var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); + var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == data.Id); if (sv == null) return Null404NotFound(sv); @@ -438,7 +439,7 @@ namespace IRaCIS.Core.Application.Image.QA sv.CheckState = CheckStateEnum.CVPassed; sv.ForwardState = ForwardStateEnum.ToForward; - + sv.ManualPassReason = data.ManualPassReason; sv.CheckPassedTime = DateTime.Now; await _repository.SaveChangesAsync(); @@ -1671,6 +1672,7 @@ namespace IRaCIS.Core.Application.Image.QA var instanceIdList = await _repository.Where(t => t.DicomSerie.IsDeleted && t.SubjectVisitId == subjectVisitId) .Select(t => new { InstanceId = t.Id, t.SeriesId, t.StudyId, t.SubjectId, t.SiteId }).ToListAsync(); + // 删除序列 List datas = new List(); var DicomSeriesdata = await _repository.GetQueryable().Where(x => x.SubjectVisitId == subjectVisitId).Select(x => new { StudyCode = x.DicomStudy.StudyCode, @@ -1714,6 +1716,8 @@ namespace IRaCIS.Core.Application.Image.QA }); }); + + await _inspectionService.AddListInspectionRecordAsync(datas); instanceIdList.ForEach(t => { diff --git a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs index 3596fd22..e134c1b8 100644 --- a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs +++ b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs @@ -4,6 +4,7 @@ using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore; using MediatR; +using Newtonsoft.Json; using System.Linq.Expressions; namespace IRaCIS.Core.Application.MediatR.Handlers @@ -92,8 +93,11 @@ namespace IRaCIS.Core.Application.MediatR.Handlers var svGroup = dbList.GroupBy(t => new { t.SubjectVisitId, t.SiteCode, t.SubjectCode, t.VisitName }) .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, g.Key.SubjectVisitId, StudyList = g.ToList() }).ToList(); + List datas = new List(); + var createtime = DateTime.Now; foreach (var sv in svGroup) { + //找到etc 当前visit site 和subject 一致的检查列表 var etcVisitStudyList = etcList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); var dbVisitStudyList = dbCheckList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); @@ -122,12 +126,61 @@ namespace IRaCIS.Core.Application.MediatR.Handlers dbSV.CheckState = CheckStateEnum.CVPassed; dbSV.CheckPassedTime = DateTime.Now; dbSV.CheckResult = "核对EDC数据,完全一致"; + dbSV.ManualPassReason = "自动核查通过"; dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = sv.SubjectVisitId, TalkContent = dbSV.CheckResult, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); } else { dbSV.CheckResult = "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | " - + String.Join(" | ", excelExceptDB.Select(t => $"IRC 缺少:{t.StudyDate} {t.Modality}")); + + String.Join(" | ", excelExceptDB.Select(t => $"IRC 缺少:{t.StudyDate} {t.Modality}")); + //新增一致性核查质疑记录 + datas.Add(new DataInspection() + { + + SiteId = dbSV.SiteId, + SubjectId = dbSV.SubjectId, + TrialId = dbSV.TrialId, + SubjectVisitId = dbSV.Id, + CreateTime = createtime.AddMilliseconds(200), + Identification = "Add|Consistency Check Query|Data|Visit-Consistency Check", + JsonDetail = JsonConvert.SerializeObject(new + { + SubmitState = "已提交", + AuditState = "通过", + CheckState = dbSV.CheckState == CheckStateEnum.CVIng ? "核查中" : "未核查", + CheckResult= dbSV.CheckResult, + TalkContent= dbSV.CheckResult, + RequestBackState=dbSV.RequestBackState==RequestBackStateEnum.PM_AgressBack?"已回退":"未回退", + CheckChallengeState = dbSV.CheckChallengeState == CheckChanllengeTypeEnum.Closed?"已关闭":"已回复", + + }) + }); + + + + datas.Add(new DataInspection() + { + + SiteId = dbSV.SiteId, + SubjectId = dbSV.SubjectId, + TrialId = dbSV.TrialId, + SubjectVisitId = dbSV.Id, + CreateTime = createtime.AddMilliseconds(500), + Identification = "Edit|Consistency Check Query|Data|Visit-Consistency Check|Send", + JsonDetail = JsonConvert.SerializeObject(new + { + SubmitState = "已提交", + AuditState = "通过", + CheckState = dbSV.CheckState == CheckStateEnum.CVIng ? "核查中" : "未核查", + CheckResult = dbSV.CheckResult, + TalkContent = dbSV.CheckResult, + RequestBackState = dbSV.RequestBackState == RequestBackStateEnum.PM_AgressBack ? "已回退" : "未回退", + CheckChallengeState = dbSV.CheckChallengeState == CheckChanllengeTypeEnum.Closed ? "已关闭" : "已回复", + + }) + }); + + dbSV.CheckState = CheckStateEnum.CVIng; dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; @@ -137,6 +190,27 @@ namespace IRaCIS.Core.Application.MediatR.Handlers } dbSV.CheckTime = DateTime.Now; + + // 在线一致性核查 + datas.Add(new DataInspection() + { + + SiteId = dbSV.SiteId, + SubjectId = dbSV.SubjectId, + TrialId = dbSV.TrialId, + SubjectVisitId = dbSV.Id, + CreateTime= createtime, + Reason= dbSV.ManualPassReason, + Identification = "Add|Visit|Status|Visit-Consistency Check", + JsonDetail = JsonConvert.SerializeObject(new + { + SubmitState = "已提交", + AuditState= "通过", + CheckState = dbSV.CheckState== CheckStateEnum.CVIng? "核查中": "核查通过", + + }) + }); + await _subjectVisitRepository.SaveChangesAsync(); } diff --git a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs index 0963d092..c897fce1 100644 --- a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs +++ b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs @@ -72,6 +72,11 @@ namespace IRaCIS.Core.Domain.Models public DateTime? SubmitTime { get; set; } public DateTime? CheckTime { get; set; } + /// + /// 通过原因 + /// + public string ManualPassReason { get; set; } + public bool IsUrgent { get; set; } public bool IsTake { get; set; }