diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs
index defe64133..8018bc159 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,58 @@ 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;
+ }
+
+ ///
+ /// 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..7e6ee7ae3 100644
--- a/IRaCIS.Core.API/IRaCIS.Core.API.xml
+++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml
@@ -139,6 +139,27 @@
+
+
+ CRC签名临床数据
+
+
+
+
+
+
+ PM确认临床数据
+
+
+
+
+
+
+ 提交结构化录入并签名
+
+
+
+
提交阅片裁判问题
diff --git a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs
index 8e737a5a2..c1d2c31cc 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.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 8ec9ae1cf..36cf82d1c 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -2499,6 +2499,13 @@
临床答案
+
+
+ CRC签名临床数据
+
+
+
+
自动添加CRC临床数据
@@ -2542,6 +2549,13 @@
+
+
+ 获取PM待确认列表
+
+
+
+
获取CRC确认列表
@@ -2556,6 +2570,20 @@
+
+
+ 获取临床数据表格信息 查看没有表格问题的列表
+
+
+
+
+
+
+ 获取临床数据表格信息 查看有表格问题的列表
+
+
+
+
CRC 确认临床数据
@@ -2738,6 +2766,36 @@
+
+
+ 上传角色
+
+
+
+
+ 访视Id 或者模块Id
+
+
+
+
+ 临床级别
+
+
+
+
+ 上传方式
+
+
+
+
+ 模块名称
+
+
+
+
+ 受试者Id
+
+
临床级别
@@ -2748,16 +2806,16 @@
受试者ID
+
+
+ 模块名称
+
+
最晚拍片日期
-
-
- VisitId
-
-
VisitId
@@ -10687,6 +10745,13 @@
vvv
+
+
+ 获取PM核对临床数据
+
+
+
+
SPM 阅片人筛选
diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs
index 5ee443924..1c28eb9e4 100644
--- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs
@@ -87,6 +87,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临床数据
///
@@ -199,7 +218,13 @@ namespace IRaCIS.Core.Application.Service
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,
});
@@ -320,8 +345,20 @@ namespace IRaCIS.Core.Application.Service
TrialId= inDto.TrialId,
Id = inDto.ClinicalFormId ?? NewId.NextGuid(),
ReadingId = inDto.ReadingId,
- VisitId = inDto.VisitId,
};
+
+
+ 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();
@@ -335,7 +372,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已经确认!");
}
@@ -396,7 +433,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);
@@ -427,28 +470,54 @@ namespace IRaCIS.Core.Application.Service
return ResponseOutput.Ok(true);
}
- ///
- /// 获取CRC确认列表
- ///
- ///
- ///
- [HttpPost]
+ ///
+ /// 获取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确认列表
+ ///
+ ///
+ ///
+ [HttpPost]
public async Task> GetCRCConfirmList(GetCRCConfirmListInDto inDto)
{
var query = _readModuleRepository.Where(x => x.TrialId == inDto.TrialId)
.WhereIf(inDto.ReadModuleId != null, x => x.Id == inDto.ReadModuleId)
- .WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
+ .WhereIf(inDto.IsCRCConfirm != null, x => x.IsCRCConfirm == inDto.IsCRCConfirm)
+ .WhereIf(inDto.IsPMConfirm != null, x => x.IsPMConfirm == inDto.IsPMConfirm)
+ .WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
.WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId)
.Select(x => new GetCRCConfirmListOutDto()
{
SubjectId = x.SubjectId,
IsCRCConfirm = x.IsCRCConfirm,
+ VisitBlindName=x.SubjectVisit.BlindName,
LatestScanDate = x.SubjectVisit.LatestScanDate,
ReadingSetType = x.ReadingSetType,
IsPMConfirm = x.IsPMConfirm,
SubjectCode = x.Subject.Code,
ReadModuleId = x.Id,
+ ModuleName=x.ModuleName,
});
@@ -460,6 +529,7 @@ namespace IRaCIS.Core.Application.Service
.Include(x=>x.ClinicalDataTrialSet)
.Select(x => new CRCClinicalForm
{
+ SubjectId=x.SubjectId,
CheckDate = x.CheckDate,
ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel,
ClinicalFormId = x.Id,
@@ -468,7 +538,9 @@ namespace IRaCIS.Core.Application.Service
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)
+ 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),
@@ -498,7 +570,8 @@ namespace IRaCIS.Core.Application.Service
{
if (x.ReadingSetType == ReadingSetType.ImageReading)
{
- x.ClinicalFormList = 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),
@@ -511,7 +584,7 @@ namespace IRaCIS.Core.Application.Service
}
else
{
- x.ClinicalFormList = 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),
@@ -553,10 +626,10 @@ namespace IRaCIS.Core.Application.Service
///
///
[HttpPost]
- public async Task> GetClinicalTableList(GetClinicalTableListInDto inDto)
+ public async Task<(List,object)> GetClinicalTableList(GetClinicalTableListInDto inDto)
{
- var readModule=await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync():
+ var readModule=await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
@@ -585,13 +658,14 @@ namespace IRaCIS.Core.Application.Service
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.ClinicalDataTrialSetId == x).OrderBy(y => y.CheckDate).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer);
+ 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());
@@ -602,9 +676,12 @@ namespace IRaCIS.Core.Application.Service
});
result.Add(dto);
});
- return result;
+ return (result, new
+ {
+ readModule.ModuleName,
+ });
- }
+ }
///
@@ -613,9 +690,10 @@ namespace IRaCIS.Core.Application.Service
///
///
[HttpPost]
- public async Task> GetClinicalDateList(GetCRCBeConfirmListInDto inDto)
+ public async Task<(List,object)> GetClinicalDateList(GetCRCBeConfirmListInDto inDto)
{
- var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
+ var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
+ var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
ReadModuleId = inDto.ReadModuleId,
TrialId = inDto.TrialId,
@@ -633,7 +711,6 @@ namespace IRaCIS.Core.Application.Service
result.Add(new GetClinicalDateListOutDto()
{
-
ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First(),
DateList = confirmList.Where(y => y.ClinicalDataTrialSetId == x).ToList()
@@ -641,7 +718,9 @@ namespace IRaCIS.Core.Application.Service
});
- return result;
+ return (result,new {
+ readModule.ModuleName,
+ });
}
///
@@ -759,7 +838,7 @@ namespace IRaCIS.Core.Application.Service
await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule()
{
- IsPMConfirm = false
+ IsPMConfirm = true
});
await _readModuleRepository.SaveChangesAsync();
diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs
index 75207345c..110f6c134 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"]);
diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs
index 967d63a51..3a4bc14ae 100644
--- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs
@@ -24,6 +24,7 @@ namespace IRaCIS.Application.Services
private readonly IRepository _subjectVisitRepository;
private readonly IRepository _previousHistoryRepository;
+ private readonly IRepository _readModuleCriterionFromRepository;
private readonly IRepository _previousOtherRepository;
private readonly IRepository _previousSurgeryRepository;
private readonly IRepository _readingQuestionCriterionTrialRepository;
@@ -37,7 +38,7 @@ namespace IRaCIS.Application.Services
IRepository previousPDFRepository,
IRepository subjectVisitRepository,
IRepository previousHistoryRepository,
-
+ IRepository readModuleCriterionFromRepository,
IRepository previousOtherRepository,
IRepository previousSurgeryRepository,
IRepository readingQuestionCriterionTrialRepository,
@@ -53,6 +54,7 @@ namespace IRaCIS.Application.Services
this._previousPDFRepository = previousPDFRepository;
this._subjectVisitRepository = subjectVisitRepository;
this._previousHistoryRepository = previousHistoryRepository;
+ this._readModuleCriterionFromRepository = readModuleCriterionFromRepository;
this._previousOtherRepository = previousOtherRepository;
this._previousSurgeryRepository = previousSurgeryRepository;
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
@@ -676,9 +678,80 @@ namespace IRaCIS.Application.Services
});
+
var result = await resultQuery.ToListAsync();
- // 根据标准
- if (inDto.VisitTaskId != null)
+
+
+
+ // 这里处理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.Where(x => x.ReadModuleId == readModule.Id).Select(x => new{
+ ClinicalFormId= x.ClinicalFormId,
+ CheckDate= x.ClinicalForm.CheckDate,
+ ClinicalDataTrialSetId= x.ClinicalForm.ClinicalDataTrialSetId
+
+
+ }).ToListAsync();
+
+ var setIds = moduleCriterionFromList.Select(x=>x.ClinicalDataTrialSetId).Distinct().ToList();
+ var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && (x.ClinicalDataLevel == ClinicalLevel.OncologyRead || x.ClinicalDataLevel == ClinicalLevel.ImageRead))
+ .Where(x => setIds.Contains(x.Id))
+ .Select(x => new GetReadingClinicalDataListOutDto()
+ {
+
+ ClinicalDataLevel = x.ClinicalDataLevel,
+ SubjectId = inDto.SubjectId,
+ ReadingId = default(Guid),
+ 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.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked;
+
+ });
+
+ result.AddRange(clinicalresult);
+ }
+
+
+
+ // 根据标准
+ if (inDto.VisitTaskId != null)
{
var visitTaskInfo = await _visitTaskRepository.FirstOrDefaultAsync(x => x.Id == inDto.VisitTaskId);
@@ -750,6 +823,73 @@ namespace IRaCIS.Application.Services
});
var result = await resultQuery.ToListAsync();
+
+ // 这里处理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).Select(x => new {
+ ClinicalFormId = x.ClinicalFormId,
+ CheckDate = x.ClinicalForm.CheckDate,
+ ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId
+
+
+ }).ToListAsync();
+
+ var setIds = moduleCriterionFromList.Select(x => x.ClinicalDataTrialSetId).Distinct().ToList();
+ var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && (x.ClinicalDataLevel == ClinicalLevel.OncologyRead || x.ClinicalDataLevel == ClinicalLevel.ImageRead))
+ .Where(x => setIds.Contains(x.Id))
+ .Select(x => new GetReadingClinicalDataListOutDto()
+ {
+
+ ClinicalDataLevel = x.ClinicalDataLevel,
+ SubjectId = inDto.SubjectId,
+ ReadingId = default(Guid),
+ 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.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked;
+
+ });
+
+ result.AddRange(clinicalresult);
+ }
+
+
+
//result = result.Where(x => !(x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList();
return result;
}
diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs
index f94ede42a..8d3fff220 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; }
@@ -28,9 +32,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,10 +127,21 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string Answer { get; set; } = string.Empty;
}
+ public class GetPMConfirmListInDto: PageInput
+ {
+ public Guid TrialId { get; set; }
+
+ public Guid TrialReadingCriterionId { get; set; }
+ }
+
public class GetCRCConfirmListInDto:PageInput
{
- public Guid? TrialReadingCriterionId { get; set; }
+ public bool? IsCRCConfirm { get; set; }
+
+ public bool? IsPMConfirm { get; set; }
+
+ public Guid? TrialReadingCriterionId { get; set; }
public Guid? SubjectId { get; set; }
@@ -122,6 +161,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{
public string ClinicalDataSetName { get; set; }
+
public List DateList { get; set; }
}
@@ -145,7 +185,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public class GetClinicalTableListOutDto: GetClinicalQuestionAnswerListOutDto
{
public string ClinicalDataSetName { get; set; }
- }
+
+ ///
+ /// 模块名称
+ ///
+ public string ModuleName { get; set; }
+ }
public class GetCRCBeConfirm: GetCRCBeConfirmListOutDto
@@ -181,6 +226,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public class CRCClinicalForm
{
+ ///
+ /// 受试者Id
+ ///
+ public Guid SubjectId { get; set; }
public DateTime? CheckDate { get; set; }
public Guid ClinicalFormId { get; set; }
@@ -210,7 +259,14 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Guid SubjectId { get; set; }
public Guid ReadModuleId { get; set; }
- public bool IsPMConfirm { get; set; }
+ ///
+ /// 模块名称
+ ///
+ public string ModuleName { get; set; }
+
+ public string VisitBlindName { get; set; }
+
+ public bool IsPMConfirm { get; set; }
public ReadingSetType ReadingSetType { get; set; }
@@ -230,8 +286,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
///
public DateTime? LatestScanDate { get; set; }
+ public List ClinicalNameList
+ {
+ get
+ {
+ return this.ClinicalFormList.Select(x => x.ClinicalDataSetName).Distinct().ToList();
+ }
+ }
- public List ClinicalFormList { get; set; }
+
+ public List ClinicalFormList { get; set; }
public int FormCount
{
@@ -248,11 +312,6 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
}
public class SubmitClinicalFormInDto
{
- ///
- /// VisitId
- ///
- public Guid? VisitId { get; set; }
-
///
/// VisitId
///
diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs
index 85a126ec2..9cf83bbc3 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; }
@@ -127,9 +127,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 +137,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 +163,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
///
/// 文件名称
///
- public string FileName { get; set; }
+ public string FileName { get; set; }
///
/// 路径
@@ -195,9 +195,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
///
/// 获取访视列表
///
- public class GetReadingClinicalDataListIndto
+ public class GetReadingClinicalDataListIndto
{
- [NotDefault]
+ [NotDefault]
public Guid SubjectId { get; set; }
[NotDefault]
public Guid ReadingId { get; set; }
@@ -220,7 +220,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 +283,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public class PMClinicalDataConfirmCommand
- {
+ {
public Guid Id { get; set; }
///
@@ -363,11 +363,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 +399,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
// }
//}
+ public List ClinicalFromList { get; set; }
+
public List FileList { get; set; } = new List();
@@ -404,6 +410,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..f2f803ee9 100644
--- a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs
@@ -9,6 +9,13 @@ 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);
+
+ }
}
diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs
index 5f446672e..33ccd99e4 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
diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs
index a5e088ad0..e58ce76c2 100644
--- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs
+++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs
@@ -21,15 +21,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;
}
@@ -294,6 +298,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()
+ });
+
+ 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
diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs
index 3608eb7fa..243e765b6 100644
--- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs
+++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs
@@ -1924,6 +1924,9 @@ namespace IRaCIS.Core.Domain.Share
HaveUploaded = 1,
+ ///
+ /// 待核查
+ ///
HaveChecked = 2,
HaveSigned = 3
diff --git a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs
index f41eb924f..1d052b9f9 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
///
diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs
index fba287340..1be9cb363 100644
--- a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs
+++ b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs
@@ -119,11 +119,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 86afacb29..bc38a6392 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;