Test.EIImageViewer
he 2022-04-21 17:08:19 +08:00
parent da620303af
commit 943c44892a
9 changed files with 116 additions and 27 deletions

View File

@ -232,10 +232,10 @@ namespace IRaCIS.Core.API.Controllers
/// </summary> /// </summary>
[HttpPost, Route("Inspection/QCOperation/SetCheckPass")] [HttpPost, Route("Inspection/QCOperation/SetCheckPass")]
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> SetCheckPass(DataInspectionDto<IDDto> opt) public async Task<IResponseOutput> SetCheckPass(DataInspectionDto<SetCheckPassDt> opt)
{ {
var fun = _qCOperationService.SetCheckPass; 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);
} }
/// <summary> /// <summary>

View File

@ -106,7 +106,7 @@
<param name="opt"></param> <param name="opt"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.SetCheckPass(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Contracts.IDDto})"> <member name="M:IRaCIS.Core.API.Controllers.InspectionController.SetCheckPass(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Service.Inspection.DTO.SetCheckPassDt})">
<summary> <summary>
手动设置一致性核查通过 手动设置一致性核查通过
</summary> </summary>

View File

@ -1426,7 +1426,7 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.SetCheckPass(System.Guid)"> <member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.SetCheckPass(IRaCIS.Core.Application.Service.Inspection.DTO.SetCheckPassDt)">
<summary> <summary>
手动设置一致性核查通过 手动设置一致性核查通过
</summary> </summary>

View File

@ -169,7 +169,6 @@ namespace IRaCIS.Core.Application.Services
DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries); DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries);
List<DataInspection> datas = new List<DataInspection>();
var createtime=DateTime.Now; var createtime=DateTime.Now;
@ -198,32 +197,32 @@ namespace IRaCIS.Core.Application.Services
await _studyRepository.AddAsync(dicomStudy); await _studyRepository.AddAsync(dicomStudy);
} }
if (isSeriesNeedAdd) { if (isSeriesNeedAdd)
{
// 添加序列 // 添加序列
await _seriesRepository.AddAsync(dicomSeries);
dicomSeries.Id = NewId.NextGuid(); #region 稽查
List<DataInspection> datas = new List<DataInspection>();
datas.Add(new DataInspection() datas.Add(new DataInspection()
{ {
SiteId = dicomStudy.SiteId, SiteId = dicomStudy.SiteId,
SubjectId = dicomStudy.SubjectId, SubjectId = dicomStudy.SubjectId,
TrialId = dicomStudy.TrialId, TrialId = dicomStudy.TrialId,
GeneralId= dicomSeries.Id, GeneralId = dicomSeries.Id,
SubjectVisitId = dicomStudy.SubjectVisitId, SubjectVisitId = dicomStudy.SubjectVisitId,
CreateTime = createtime.AddMilliseconds(10), CreateTime = createtime.AddMilliseconds(10),
Identification = "Add|DICOM Series|Info|Visit-Image Upload", Identification = "Add|DICOM Series|Info|Visit-Image Upload",
JsonDetail = JsonConvert.SerializeObject(new JsonDetail = JsonConvert.SerializeObject(new
{ {
StudyCode=dicomStudy.StudyCode, StudyCode = dicomStudy.StudyCode,
Modalities = dicomStudy.Modalities, Modalities = dicomStudy.Modalities,
SeriesNumber= dicomSeries.SeriesNumber, SeriesNumber = dicomSeries.SeriesNumber,
InstanceCount=dicomSeries.InstanceCount, InstanceCount = dicomSeries.InstanceCount,
SeriesTime= dicomSeries.SeriesTime, SeriesTime = dicomSeries.SeriesTime,
}) })
}); });
datas.Add(new DataInspection() datas.Add(new DataInspection()
{ {
@ -241,17 +240,16 @@ namespace IRaCIS.Core.Application.Services
SeriesNumber = dicomSeries.SeriesNumber, SeriesNumber = dicomSeries.SeriesNumber,
InstanceCount = dicomSeries.InstanceCount, InstanceCount = dicomSeries.InstanceCount,
SeriesTime = dicomSeries.SeriesTime, SeriesTime = dicomSeries.SeriesTime,
IsReading= dicomSeries.IsReading, IsReading = dicomSeries.IsReading,
}) })
}); });
await _inspectionService.AddListInspectionRecordAsync(datas);
await _seriesRepository.AddAsync(dicomSeries); #endregion
} }
await _inspectionService.AddListInspectionRecordAsync(datas);
await _instanceRepository.AddAsync(dicomInstance); await _instanceRepository.AddAsync(dicomInstance);

View File

@ -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 public class ObtainOrCancelQCTaskDto
{ {

View File

@ -1,5 +1,6 @@
using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Application.Contracts.DTO;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using MediatR; using MediatR;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
@ -13,7 +14,7 @@ namespace IRaCIS.Core.Application.Image.QA
Task<IResponseOutput> CheckBack(Guid subjectVisitId); Task<IResponseOutput> CheckBack(Guid subjectVisitId);
Task<IResponseOutput> SetNeedReupload(Guid trialId, Guid qcChallengeId); Task<IResponseOutput> SetNeedReupload(Guid trialId, Guid qcChallengeId);
Task<IResponseOutput> QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState); Task<IResponseOutput> QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState);
Task<IResponseOutput> SetCheckPass(Guid subjectVisitId); Task<IResponseOutput> SetCheckPass(SetCheckPassDt data);

View File

@ -22,6 +22,7 @@ using Newtonsoft.Json;
using Magicodes.ExporterAndImporter.Csv; using Magicodes.ExporterAndImporter.Csv;
using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Application.Service.Inspection.Interface;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Application.Service.Inspection.DTO;
namespace IRaCIS.Core.Application.Image.QA namespace IRaCIS.Core.Application.Image.QA
{ {
@ -414,14 +415,14 @@ namespace IRaCIS.Core.Application.Image.QA
/// <returns></returns> /// <returns></returns>
[HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")] [HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))] [TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SetCheckPass(Guid subjectVisitId) public async Task<IResponseOutput> SetCheckPass(SetCheckPassDt data)
{ {
if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ProjectManager) if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ProjectManager)
{ {
ResponseOutput.NotOk("只允许PM 手动设置一致性核查通过"); 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); if (sv == null) return Null404NotFound(sv);
@ -438,7 +439,7 @@ namespace IRaCIS.Core.Application.Image.QA
sv.CheckState = CheckStateEnum.CVPassed; sv.CheckState = CheckStateEnum.CVPassed;
sv.ForwardState = ForwardStateEnum.ToForward; sv.ForwardState = ForwardStateEnum.ToForward;
sv.ManualPassReason = data.ManualPassReason;
sv.CheckPassedTime = DateTime.Now; sv.CheckPassedTime = DateTime.Now;
await _repository.SaveChangesAsync(); await _repository.SaveChangesAsync();
@ -1671,6 +1672,7 @@ namespace IRaCIS.Core.Application.Image.QA
var instanceIdList = await _repository.Where<DicomInstance>(t => t.DicomSerie.IsDeleted && t.SubjectVisitId == subjectVisitId) var instanceIdList = await _repository.Where<DicomInstance>(t => t.DicomSerie.IsDeleted && t.SubjectVisitId == subjectVisitId)
.Select(t => new { InstanceId = t.Id, t.SeriesId, t.StudyId, t.SubjectId, t.SiteId }).ToListAsync(); .Select(t => new { InstanceId = t.Id, t.SeriesId, t.StudyId, t.SubjectId, t.SiteId }).ToListAsync();
// 删除序列
List<DataInspection> datas = new List<DataInspection>(); List<DataInspection> datas = new List<DataInspection>();
var DicomSeriesdata = await _repository.GetQueryable<DicomSeries>().Where(x => x.SubjectVisitId == subjectVisitId).Select(x => new { var DicomSeriesdata = await _repository.GetQueryable<DicomSeries>().Where(x => x.SubjectVisitId == subjectVisitId).Select(x => new {
StudyCode = x.DicomStudy.StudyCode, StudyCode = x.DicomStudy.StudyCode,
@ -1714,6 +1716,8 @@ namespace IRaCIS.Core.Application.Image.QA
}); });
}); });
await _inspectionService.AddListInspectionRecordAsync(datas); await _inspectionService.AddListInspectionRecordAsync(datas);
instanceIdList.ForEach(t => instanceIdList.ForEach(t =>
{ {

View File

@ -4,6 +4,7 @@ using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using MediatR; using MediatR;
using Newtonsoft.Json;
using System.Linq.Expressions; using System.Linq.Expressions;
namespace IRaCIS.Core.Application.MediatR.Handlers 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 }) 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(); .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, g.Key.SubjectVisitId, StudyList = g.ToList() }).ToList();
List<DataInspection> datas = new List<DataInspection>();
var createtime = DateTime.Now;
foreach (var sv in svGroup) foreach (var sv in svGroup)
{ {
//找到etc 当前visit site 和subject 一致的检查列表 //找到etc 当前visit site 和subject 一致的检查列表
var etcVisitStudyList = etcList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); 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(); 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.CheckState = CheckStateEnum.CVPassed;
dbSV.CheckPassedTime = DateTime.Now; dbSV.CheckPassedTime = DateTime.Now;
dbSV.CheckResult = "核对EDC数据完全一致"; dbSV.CheckResult = "核对EDC数据完全一致";
dbSV.ManualPassReason = "自动核查通过";
dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = sv.SubjectVisitId, TalkContent = dbSV.CheckResult, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = sv.SubjectVisitId, TalkContent = dbSV.CheckResult, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt });
} }
else else
{ {
dbSV.CheckResult = "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | " 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.CheckState = CheckStateEnum.CVIng;
dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply;
@ -137,6 +190,27 @@ namespace IRaCIS.Core.Application.MediatR.Handlers
} }
dbSV.CheckTime = DateTime.Now; 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(); await _subjectVisitRepository.SaveChangesAsync();
} }

View File

@ -72,6 +72,11 @@ namespace IRaCIS.Core.Domain.Models
public DateTime? SubmitTime { get; set; } public DateTime? SubmitTime { get; set; }
public DateTime? CheckTime { get; set; } public DateTime? CheckTime { get; set; }
/// <summary>
/// 通过原因
/// </summary>
public string ManualPassReason { get; set; }
public bool IsUrgent { get; set; } public bool IsUrgent { get; set; }
public bool IsTake { get; set; } public bool IsTake { get; set; }