接受合并
continuous-integration/drone/push Build is passing Details

Uat_IRC_Net8
he 2025-12-04 15:07:16 +08:00
commit d786b3bb61
36 changed files with 25279 additions and 905 deletions

View File

@ -273,6 +273,7 @@ namespace IRaCIS.Core.API.Controllers
public List<OSSFileDTO> UploadedFileList { get; set; } = new List<OSSFileDTO>(); public List<OSSFileDTO> UploadedFileList { get; set; } = new List<OSSFileDTO>();
public bool? IsImageSegmentLabel { get; set; }
public class OSSFileDTO public class OSSFileDTO
{ {
@ -518,6 +519,13 @@ namespace IRaCIS.Core.API.Controllers
{ {
await _noneDicomStudyFileRepository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, OriginNoneDicomStudyId = noneDicomStudyId.Value, VisitTaskId = incommand.VisitTaskId, FileType = item.FileType, FileSize = item.FileFize }); await _noneDicomStudyFileRepository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, OriginNoneDicomStudyId = noneDicomStudyId.Value, VisitTaskId = incommand.VisitTaskId, FileType = item.FileType, FileSize = item.FileFize });
}
else
{
if (incommand.IsImageSegmentLabel == true)
{
await _noneDicomStudyFileRepository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, ImageLabelNoneDicomStudyId = noneDicomStudyId.Value, FileType = item.FileType, FileSize = item.FileFize });
} }
else else
{ {
@ -527,6 +535,9 @@ namespace IRaCIS.Core.API.Controllers
} }
}
var uploadFinishedTime = DateTime.Now; var uploadFinishedTime = DateTime.Now;
var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId, true); var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId, true);

View File

@ -13,6 +13,8 @@ namespace IRaCIS.Core.Application.Helper
public class StudyDIRInfo public class StudyDIRInfo
{ {
public bool IsTaskStudy { get; set; }
public Guid SubjectVisitId { get; set; } public Guid SubjectVisitId { get; set; }
// Study // Study
public Guid DicomStudyId { get; set; } public Guid DicomStudyId { get; set; }

View File

@ -60,4 +60,16 @@ namespace IRaCIS.Core.Application.Helper
} }
} }
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class DateTimeTranaslateAttribute : Attribute
{
public string Formart { get; set; }
public DateTimeTranaslateAttribute(string formart)
{
Formart = formart;
}
}
} }

View File

@ -985,6 +985,398 @@
<returns></returns> <returns></returns>
<exception cref="T:System.Exception"></exception> <exception cref="T:System.Exception"></exception>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ResearchProgramNo">
<summary>
方案编号 STUDYID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.Domain">
<summary>
域 DOMAIN TU TR RS
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ValueType">
<summary>
取值类型 TUSPID TRSPID RSSPID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.SubjectCode">
<summary>
受试者编号 USUBJID 实际展示TrialSiteSubjectCode
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.Vendor">
<summary>
供应商 TUNAM (Extensive Imaging)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.UserName">
<summary>
阅片人 TUEVAL TREVAL RSEVAL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ArmEnum">
<summary>
阅片人标识 TUEVALID TREVALID RSEVALID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitNum">
<summary>
访视编号 VISITNUM
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitName">
<summary>
访视名称 VISIT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.LatestScanDate">
<summary>
拍片日期 TUDTC TRDTC RSDTC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitTaskId">
<summary>
eCRF标识 TUREFID TRREFID RSREFID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.CriterionName">
<summary>
RSCAT 阅片标准
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.IsJudgeSelect">
<summary>
RSACPTFL 裁定标记 TUACPTFL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.No">
<summary>
序号 TUSEQ (同一个访视,所有阅片人选择病灶给个顺序号)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.ARM_TumorNo">
<summary>
链接ID TULNKID (阅片人角色_病灶编号)不同访视可以重复
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationSimple">
<summary>
肿瘤识别简称 TUTESTCD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationFullName">
<summary>
肿瘤识别全称 TUTEST
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationResult">
<summary>
肿瘤鉴定结果 TUORRES
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationResultType">
<summary>
肿瘤识别结果类型 TUSTRESC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.BodyPart">
<summary>
部位 TULOC (对应病灶表的部位,需要国际化)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.IdentificationMethod">
<summary>
鉴定方法 TUMETHOD (Modality?)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.BodyPartDes">
<summary>
部位描述 LOCTEXT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TRSEQ">
<summary>
每个subject 按照顺序编号 TRSEQ
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TRGRPID">
<summary>
TRGRPID 组ID 对应TU表肿瘤鉴定结果 TumorIdentificationResult
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.ARM_TumorNo">
<summary>
TRLNKID 链接ID 对应TU表的链接ID TumorNo(阅片人角色_病灶编号)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.ARM_VisitName">
<summary>
TRLNKGRP 链接组 ARM-任务名(访视名) 对应RS的链接组
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TumorAssessmentSimpleName">
<summary>
肿瘤评估简称 TRTESTCD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TumorAssessmentFullName">
<summary>
肿瘤评估全称 TRTEST
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.OriginalMeasurements">
<summary>
原始测量 TRORRES
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.OriginalUnit">
<summary>
原始单位 TRORRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardResult_Character">
<summary>
标准结果(字符) TRSTRESC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardResult_Numeric">
<summary>
标准结果(数值) TRORRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardUnit">
<summary>
标准单位 TRSTRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.CompletionStatus">
<summary>
完成状态 TRSTAT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.IdentificationMethod">
<summary>
完成状态 TRMETHOD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.NotMeasuredReason">
<summary>
无法测量原因 TRREASND
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.RSSEQ">
<summary>
RSSEQ 按照subject 的数据顺序编号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.ARM_VisitName">
<summary>
RSLNKGRP 链接组 ARM_任务名(访视名)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.EfficacyEvaluationSimpleName">
<summary>
RSTESTCD 疗效评估简称
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.EfficacyEvaluationName">
<summary>
RSTEST 疗效评估全称
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.RespondEfficacyAssessment">
<summary>
RSORRES 响应评估原始结果
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.StandardEfficacyAssessment">
<summary>
RSSTRESC 标准疗效评估
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.CompletionStatus">
<summary>
RSSTAT 完成状态
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.NotAssessmentReason">
<summary>
RSREASND 无法评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.AssessmentReason">
<summary>
REASASM 评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.ReAssessmentReason">
<summary>
REASOVR 重新评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.UpdateAssessmentReason">
<summary>
REASUPD 更新评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.RDOMAIN">
<summary>
关联域 RS(访视点备注) 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.COSEQ">
<summary>
COSEQ 序号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.IdentificationVariable">
<summary>
IDVAR 标识变量 RSSEQ 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.Identification">
<summary>
标识 IDVARVAL RSSEQ具体的值 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.RemarksQuote">
<summary>
COREF 备注引用
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.Remarks">
<summary>
备注 COVAL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.CODTC">
<summary>
裁决日期 CODTC
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto">
<summary>
公共影像导表基类IVUS / OCT 通用)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.ResearchProgramNo">
<summary>研究标识符</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.TrialSiteCode">
<summary>中心编号</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.SubjectCode">
<summary>受试者标识符</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.USUBJID">
<summary>受试者唯一标识</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.VisitName">
<summary>访视名称</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.ArmEnum">
<summary>阅片人角色</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.LatestScanDate">
<summary>拍片日期</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.SignTime">
<summary>阅片完成时间</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.VisitNum">
<summary>
访视编号 VISITNUM
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto.VisitNote">
<summary>访视点备注</summary>
</member>
<member name="T:IRaCIS.Core.Application.Service.Common.IvusExportDto">
<summary>
IVUS 导表模型
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.TARGETV">
<summary>靶段</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.PLAQUE">
<summary>斑块编号</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.EEM">
<summary>外弹力膜面积</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.LUMEN">
<summary>管腔面积</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.PA">
<summary>外弹力膜与管腔面积差值</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.PFC">
<summary>回撤中的图像帧数</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.FC">
<summary>分析图像帧数</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.TOTALEEM">
<summary>总外弹力膜面积 (如无可不填)</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.TOTALPA">
<summary>总 PA (如无可不填)</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.IvusExportDto.PAV">
<summary>PAV (如无可不填)</summary>
</member>
<member name="T:IRaCIS.Core.Application.Service.Common.OctExportDto">
<summary>
OCT 导表模型
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.TARGETV">
<summary>靶段</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.PLAQUE">
<summary>斑块编号</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.TestID">
<summary>测量标识</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.TESTCD">
<summary>测量参数名称</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.ORRES">
<summary>测量参数值</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.ORRESU">
<summary>测量值单位</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.PLATYPE">
<summary>斑块类型</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.MINFCT">
<summary>最小纤维帽厚度</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.AVGMFCT">
<summary>平均纤维帽厚度</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.LAMEAN">
<summary>脂质角度平均值</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.LAMAX">
<summary>脂质角度最大值</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.MACRI">
<summary>巨噬细胞浸润</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.MIARC">
<summary>巨噬细胞浸润角度</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.MC">
<summary>微通道</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.OctExportDto.CCS">
<summary>胆固醇结晶</summary>
</member>
<member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService"> <member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService">
<summary> <summary>
ExploreRecommendService ExploreRecommendService
@ -1116,14 +1508,6 @@
<param name="trialId"></param> <param name="trialId"></param>
<returns></returns> <returns></returns>
</member> </member>
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.TrialImageDownloadService.TrialImageAddExtralField(System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries})" -->
<member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.DownloadDeleteTrialImage(System.Guid)">
<summary>
下载已经删除的影像
</summary>
<param name="trialId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.WriteTrialNeedDealData(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},System.Guid)"> <member name="M:IRaCIS.Core.Application.Service.TrialImageDownloadService.WriteTrialNeedDealData(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},System.Guid)">
<summary> <summary>
读取该项目的数据,进行维护 读取该项目的数据,进行维护
@ -1525,6 +1909,14 @@
<param name="inCommand"></param> <param name="inCommand"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.MoveSubtreeAsync(System.Guid,System.Nullable{System.Guid})">
<summary>
GPT 移动子树代码--适合一次提交事务
</summary>
<param name="subtreeRootId"></param>
<param name="newParentId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.AddClosureRelationsAsync(System.Guid,System.Nullable{System.Guid})"> <member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.AddClosureRelationsAsync(System.Guid,System.Nullable{System.Guid})">
<summary> <summary>
插入闭包表关系 插入闭包表关系
@ -2219,6 +2611,12 @@
<param name="inCommand"></param> <param name="inCommand"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.GetTrialSubjectVisitMarkList(IRaCIS.Core.Application.Contracts.SubjectVisitMarkQuery)">
<summary>
获取受试者级别 访视标注列表
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.GetSubejectOrVisitZipInfo(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Application.Contracts.SubejctZipInfoQuery)"> <member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.GetSubejectOrVisitZipInfo(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Application.Contracts.SubejctZipInfoQuery)">
<summary> <summary>
受试者级别所有的影像 受试者级别所有的影像
@ -13047,7 +13445,7 @@
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.ReadingQuestionService.AddOrUpdateReadingTableQuestionTrial(IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit)"> <member name="M:IRaCIS.Core.Application.Service.ReadingQuestionService.AddOrUpdateReadingTableQuestionTrial(IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit)">
<summary> <summary>
新增修改想想项目表格问题 新增修改项目表格问题
</summary> </summary>
<param name="indto"></param> <param name="indto"></param>
<returns></returns> <returns></returns>

View File

@ -490,6 +490,8 @@ namespace IRaCIS.Core.Application.ViewModel
public int? RandomOrder { get; set; } public int? RandomOrder { get; set; }
public bool? IsRandomOrderList { get; set; } public bool? IsRandomOrderList { get; set; }
public CriterionType? CriterionType { get; set; }
} }

View File

@ -1027,8 +1027,8 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
//满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang //满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang
//但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活 //但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活
//.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)) //.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum))
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.Subject.Code.Contains(inQuery.SubjectCode!) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inQuery.SubjectCode!) && t.IsAnalysisCreate)); .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.Subject.Code.Contains(inQuery.SubjectCode!) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inQuery.SubjectCode!) && t.IsAnalysisCreate))
;
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode }); var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode });
@ -1171,7 +1171,9 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
var visitQuery = _visitTaskRepository.Where(x => x.TrialId == trialId && x.DoctorUserId == _userInfo.UserRoleId && x.TaskState == TaskState.Effect) var visitQuery = _visitTaskRepository.Where(x => x.TrialId == trialId && x.DoctorUserId == _userInfo.UserRoleId && x.TaskState == TaskState.Effect)
.WhereIf(inQuery.SubjectId != null, x => x.SubjectId == inQuery.SubjectId) .WhereIf(inQuery.SubjectId != null, x => x.SubjectId == inQuery.SubjectId)
.WhereIf(!string.IsNullOrEmpty(subjectCode), t => (t.Subject.Code.Contains(subjectCode!) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(subjectCode!) && t.IsAnalysisCreate)); .WhereIf(!string.IsNullOrEmpty(subjectCode), t => (t.Subject.Code.Contains(subjectCode!) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(subjectCode!) && t.IsAnalysisCreate))
.WhereIf(critrion.CriterionType == CriterionType.OCT, t => t.ReadingCategory == ReadingCategory.Visit ? t.SourceSubjectVisit.NoneDicomStudyList.SelectMany(t => t.ImageLabelNoneDicomFileList).Any() : true)
.WhereIf(critrion.CriterionType == CriterionType.IVUS, t => t.ReadingCategory == ReadingCategory.Visit ? t.SourceSubjectVisit.TaskStudyList.Any() : true);
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode }); var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode });

View File

@ -2344,6 +2344,11 @@ namespace IRaCIS.Core.Application.Service.Common
if (criterion.CriterionType == CriterionType.OCT) if (criterion.CriterionType == CriterionType.OCT)
{ {
list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_ReadingLession_Export, ExportCatogory = ExportResult.OCT_ReadingLession_Export }); list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_ReadingLession_Export, ExportCatogory = ExportResult.OCT_ReadingLession_Export });
list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_CDISC_Export, ExportCatogory = ExportResult.OCT_CDISC_Export });
}
if (criterion.CriterionType == CriterionType.IVUS)
{
list.Add(new ExportDocumentDes() { Code = StaticData.Export.IVUS_CDISC_Export, ExportCatogory = ExportResult.IVUS_CDISC_Export });
} }
//else if (criterion.CriterionType == CriterionType.SelfDefine) //else if (criterion.CriterionType == CriterionType.SelfDefine)
{ {

View File

@ -0,0 +1,513 @@
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.Service.Common;
public class TumorCommonQustionInfo
{
//问题标识,肿瘤评估用于区分是什么问题
public QuestionType? QuestionType { get; set; }
public Guid QuestionId { get; set; }
public string QuestionName { get; set; }
public string QuestionValue { get; set; }
public string TranslateDicName { get; set; }
public ValueUnit? Unit { get; set; }
public ValueOfType? ValueType { get; set; }
}
public class TumorLessionInfo
{
public Guid Id { get; set; }
public Guid? OrganInfoId { get; set; }
//病灶编号
public string LessionCode { get; set; }
public LesionType? LessionType { get; set; }
public Guid? SplitRowId { get; set; }
public string? DicomModality { get; set; }
public string? NoneDicomModality { get; set; }
//病灶答案
public List<TumorLessionAnswerInfo> LessionAnswerList { get; set; }
}
public class TumorLessionAnswerInfo
{
public QuestionMark? QuestionMark { get; set; }
//病灶Id
public Guid RowId { get; set; }
//如果是4 就取CustomUnit 否则就是字典翻译
[Comment("单位")]
public ValueUnit? Unit { get; set; }
public int ShowOrder { get; set; }
public Guid TableQuesionId { get; set; }
public string QuestionName { get; set; }
public string QuestionValue { get; set; }
public string TranslateDicName { get; set; }
}
public class TumorGlobalQuestionAnserInfo
{
[Comment("原任务ID")]
public Guid TaskId { get; set; }
public GlobalAnswerType GlobalAnswerType { get; set; }
[Comment("问题答案")]
public string Answer { get; set; } = string.Empty;
}
public class TumorExportBaseModel : TU_TR_RSBaseModel
{
public List<TumorLessionInfo> LesionList { get; set; } = new List<TumorLessionInfo>();
public List<TumorCommonQustionInfo> QuestionAnswerList { get; set; }
public List<TumorGlobalQuestionAnserInfo> GlobalResultList { get; set; }
#region 后续处理额外添加字段
public DateTime? JudgeSignTime { get; set; }
public Guid? SourceSubjectVisitId { get; set; }
public List<decimal> SubjectCriterionReadingPeriodVisitNumList { get; set; }
public decimal VisitTaskNum { get; set; }
public ReadingTaskState ReadingTaskState { get; set; }
public ReadingCategory ReadingCategory { get; set; }
//裁判结果选择的访视或者全局任务Id
public Arm? JudgeArmEnum { get; set; }
//在当前访视触发裁判,或者在截止日期小于等于当前访视的阅片期触发裁判
[DictionaryTranslateAttribute("YesOrNoAudit")]
public bool? IsTrigerJudge { get; set; }
//(如果是访视点裁判,则仅在所选阅片人对应访视 显示;如果是阅片期裁判,则在所选阅片人 阅片期内的所有访视 显示此原因)
public string JudgeNote { get; set; } = string.Empty;
public string VisitNote { get; set; }
#endregion
}
public class TU_TR_RSBaseModel
{
/// <summary>
/// 方案编号 STUDYID
/// </summary>
public string ResearchProgramNo { get; set; }
/// <summary>
/// 域 DOMAIN TU TR RS
/// </summary>
public string Domain { get; set; }
/// <summary>
/// 取值类型 TUSPID TRSPID RSSPID
/// </summary>
public string ValueType { get; set; }
/// <summary>
/// 受试者编号 USUBJID 实际展示TrialSiteSubjectCode
/// </summary>
public string SubjectCode { get; set; }
/// <summary>
/// 供应商 TUNAM (Extensive Imaging)
/// </summary>
public string Vendor { get; set; } = "Extensive Imaging";
/// <summary>
/// 阅片人 TUEVAL TREVAL RSEVAL
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 阅片人标识 TUEVALID TREVALID RSEVALID
/// </summary>
public Arm ArmEnum { get; set; }
/// <summary>
/// 访视编号 VISITNUM
/// </summary>
public decimal? VisitNum { get; set; }
/// <summary>
/// 访视名称 VISIT
/// </summary>
public string? VisitName { get; set; }
/// <summary>
/// 拍片日期 TUDTC TRDTC RSDTC
/// </summary>
public DateTime? LatestScanDate { get; set; }
public DateTime? EarliestScanDate { get; set; }
/// <summary>
/// eCRF标识 TUREFID TRREFID RSREFID
/// </summary>
public Guid VisitTaskId { get; set; }
#region 移动位置
/// <summary>
/// RSCAT 阅片标准
/// </summary>
public string CriterionName { get; set; }
/// <summary>
/// RSACPTFL 裁定标记 TUACPTFL
/// </summary>
//裁判选择标记
//根据裁判的任务结果 设置访视任务的这个字段 该字段表示 裁判认同该任务的结果
public bool? IsJudgeSelect { get; set; }
#endregion
public DateTime? SignTime { get; set; }
public string TaskName { get; set; }
#region 额外翻译字段
public string IsJudgeSelectStr => IsJudgeSelect == true ? "Y" : "";
public bool IsTargetPD { get; set; } = false;
public bool IsOverallResponsePD { get; set; } = false;
//TR表 靶病灶PD了访视层级的都是最早拍片日期 RS表 整体肿瘤评估PD了那么疗效评估的拍片日期都给最早的
public bool IsPD => Domain == "TR" ? IsTargetPD : IsOverallResponsePD;
public string ArmEnumStr { get; set; }
public string LatestScanDateStr
{
get
{
var date = IsPD ? EarliestScanDate : LatestScanDate;
return date?.ToString("yyyy-MM-dd") ?? "";
}
}
public string TrialSiteSubjectCode => ResearchProgramNo + SubjectCode;
#endregion
}
public class TU_Export : TU_TR_RSBaseModel
{
///// <summary>
///// 取值类型 TUSPID
///// </summary>
//public string TUValueType { get; set; }
/// <summary>
/// 序号 TUSEQ (同一个访视,所有阅片人选择病灶给个顺序号)
/// </summary>
public int No { get; set; }
/// <summary>
/// 链接ID TULNKID (阅片人角色_病灶编号)不同访视可以重复
/// </summary>
public string ARM_TumorNo { get; set; }
/// <summary>
/// 肿瘤识别简称 TUTESTCD
/// </summary>
public string TumorIdentificationSimple { get; set; }
/// <summary>
/// 肿瘤识别全称 TUTEST
/// </summary>
public string TumorIdentificationFullName { get; set; }
/// <summary>
/// 肿瘤鉴定结果 TUORRES
/// </summary>
public string TumorIdentificationResult { get; set; }
/// <summary>
/// 肿瘤识别结果类型 TUSTRESC
/// </summary>
public string TumorIdentificationResultType { get; set; }
/// <summary>
/// 部位 TULOC (对应病灶表的部位,需要国际化)
/// </summary>
public string BodyPart { get; set; }
/// <summary>
/// 鉴定方法 TUMETHOD (Modality?)
/// </summary>
public string IdentificationMethod { get; set; }
///// <summary>
///// 裁定标记 TUACPTFL
///// </summary>
//public bool? IsJudgeSelect { get; set; }
/// <summary>
/// 部位描述 LOCTEXT
/// </summary>
public string BodyPartDes { get; set; }
}
public class TR_Export : TU_TR_RSBaseModel
{
///// <summary>
///// 取值类型 TRSPID
///// </summary>
//public string TRValueType { get; set; }
/// <summary>
/// 每个subject 按照顺序编号 TRSEQ
/// </summary>
public int TRSEQ { get; set; }
/// <summary>
///TRGRPID 组ID 对应TU表肿瘤鉴定结果 TumorIdentificationResult
/// </summary>
public string TRGRPID { get; set; }
/// <summary>
/// TRLNKID 链接ID 对应TU表的链接ID TumorNo(阅片人角色_病灶编号)
/// </summary>
public string ARM_TumorNo { get; set; }
/// <summary>
///TRLNKGRP 链接组 ARM-任务名(访视名) 对应RS的链接组
/// </summary>
public string ARM_VisitName { get; set; }
/// <summary>
/// 肿瘤评估简称 TRTESTCD
/// </summary>
public string TumorAssessmentSimpleName { get; set; }
/// <summary>
/// 肿瘤评估全称 TRTEST
/// </summary>
public string TumorAssessmentFullName { get; set; }
/// <summary>
/// 原始测量 TRORRES
/// </summary>
public string OriginalMeasurements { get; set; }
/// <summary>
/// 原始单位 TRORRESU
/// </summary>
public string OriginalUnit { get; set; }
/// <summary>
/// 标准结果(字符) TRSTRESC
/// </summary>
public string StandardResult_Character => OriginalMeasurements;
/// <summary>
/// 标准结果(数值) TRORRESU
/// </summary>
public string StandardResult_Numeric => double.TryParse(OriginalMeasurements, out _) ||
(OriginalMeasurements?.EndsWith("%") == true &&
double.TryParse(OriginalMeasurements.TrimEnd('%'), out _))
? OriginalMeasurements
: "";
/// <summary>
/// 标准单位 TRSTRESU
/// </summary>
public string StandardUnit => OriginalUnit;
/// <summary>
/// 完成状态 TRSTAT
/// </summary>
public string CompletionStatus { get; set; }
/// <summary>
/// 完成状态 TRMETHOD
/// </summary>
public string IdentificationMethod { get; set; }
/// <summary>
/// 无法测量原因 TRREASND
/// </summary>
public string NotMeasuredReason { get; set; }
}
public class RS_Export : TU_TR_RSBaseModel
{
/// <summary>
/// RSSEQ 按照subject 的数据顺序编号
/// </summary>
public int RSSEQ { get; set; }
/// <summary>
/// RSLNKGRP 链接组 ARM_任务名(访视名)
/// </summary>
public string ARM_VisitName { get; set; }
/// <summary>
/// RSTESTCD 疗效评估简称
/// </summary>
public string EfficacyEvaluationSimpleName { get; set; }
/// <summary>
/// RSTEST 疗效评估全称
/// </summary>
public string EfficacyEvaluationName { get; set; }
/// <summary>
/// RSORRES 响应评估原始结果
/// </summary>
public string RespondEfficacyAssessment { get; set; }
/// <summary>
/// RSSTRESC 标准疗效评估
/// </summary>
public string StandardEfficacyAssessment => RespondEfficacyAssessment;
/// <summary>
/// RSSTAT 完成状态
/// </summary>
public string CompletionStatus { get; set; }
/// <summary>
/// RSREASND 无法评估原因
/// </summary>
public string NotAssessmentReason { get; set; }
///// <summary>
///// 裁定标记 RSACPTFL
///// </summary>
//public bool? IsJudgeSelect { get; set; }
/// <summary>
/// REASASM 评估原因
/// </summary>
public string AssessmentReason { get; set; }
/// <summary>
/// REASOVR 重新评估原因
/// </summary>
public string ReAssessmentReason { get; set; }
/// <summary>
/// REASUPD 更新评估原因
/// </summary>
public string UpdateAssessmentReason { get; set; }
[JsonIgnore]
public bool? IsOveralResponse { get; set; }
}
public class CO_Export : TU_TR_RSBaseModel
{
/// <summary>
/// 关联域 RS(访视点备注) 空:裁判选择原因
/// </summary>
public string RDOMAIN { get; set; }
/// <summary>
/// COSEQ 序号
/// </summary>
public int COSEQ { get; set; }
/// <summary>
/// IDVAR 标识变量 RSSEQ 空:裁判选择原因
/// </summary>
public string IdentificationVariable { get; set; }
/// <summary>
/// 标识 IDVARVAL RSSEQ具体的值 空:裁判选择原因
/// </summary>
public string Identification { get; set; }
/// <summary>
/// COREF 备注引用
/// </summary>
public string RemarksQuote { get; set; }
/// <summary>
/// 备注 COVAL
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 裁决日期 CODTC
/// </summary>
public string CODTC { get; set; }
}

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,7 @@
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service.Common;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
@ -104,6 +105,14 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.Subject.TrialSite.TrialSiteCode)); .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.Subject.TrialSite.TrialSiteCode));
CreateMap<TumorExportBaseModel , TU_Export>();
CreateMap<TumorExportBaseModel, TR_Export>();
CreateMap<TumorExportBaseModel, RS_Export>();
CreateMap<TumorExportBaseModel, CO_Export>();
CreateMap<IVUS_OCTBaseDto, IvusExportDto>();
CreateMap<IVUS_OCTBaseDto, OctExportDto>();
} }
} }

View File

@ -1,4 +1,5 @@
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Newtonsoft.Json;
namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
{ {
@ -27,6 +28,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public List<StudyBasicInfo> UploadStudyList { get; set; } public List<StudyBasicInfo> UploadStudyList { get; set; }
[JsonIgnore]
public List<StudyBasicInfo> OriginalTaskStudyList { get; set; }
} }
@ -116,6 +120,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public int ReadingSeriesCount { get; set; } public int ReadingSeriesCount { get; set; }
public int ReadingInstanceCount { get; set; } public int ReadingInstanceCount { get; set; }
public Guid? SubjectVisitId { get; set; }
} }
public class NoneDicomStudyBasicInfo public class NoneDicomStudyBasicInfo
@ -140,5 +146,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public int ReadingFileCount { get; set; } public int ReadingFileCount { get; set; }
} }
public class ImageMarkNoneDicomStudyBasicInfo: NoneDicomStudyBasicInfo
{
public Guid SubjectVisitId { get; set; }
}
} }

View File

@ -188,6 +188,7 @@ namespace IRaCIS.Core.Application.Contracts
public Guid SubjectVisitId { get; set; } public Guid SubjectVisitId { get; set; }
public int FileCount { get; set; } public int FileCount { get; set; }
} }
public class PreArchiveDicomStudyCommand public class PreArchiveDicomStudyCommand
@ -237,6 +238,9 @@ namespace IRaCIS.Core.Application.Contracts
public Guid? VisitTaskId { get; set; } public Guid? VisitTaskId { get; set; }
public bool? IsImageSegmentLabel { get; set; }
} }
public class TaskStudyArchiveConfirmResult public class TaskStudyArchiveConfirmResult
@ -265,8 +269,9 @@ namespace IRaCIS.Core.Application.Contracts
public AddOrUpdateStudyDto Study { get; set; } public AddOrUpdateStudyDto Study { get; set; }
[NotDefault] public Guid? VisitTaskId { get; set; }
public Guid VisitTaskId { get; set; }
public bool? IsImageSegmentLabel { get; set; }
} }
public class NewArchiveStudyCommand public class NewArchiveStudyCommand
@ -440,12 +445,17 @@ namespace IRaCIS.Core.Application.Contracts
public string? SubjectCode { get; set; } public string? SubjectCode { get; set; }
public Guid? VisitTaskId { get; set; } public Guid? VisitTaskId { get; set; }
public bool? IsImageSegmentLabel { get; set; }
public Guid? SubjectVisitId { get; set; }
} }
public class IRTaskUploadedDicomStudyQuery public class IRTaskUploadedDicomStudyQuery
{ {
[NotDefault] public Guid? VisitTaskId { get; set; }
public Guid VisitTaskId { get; set; }
public Guid? SubjectVisitId { get; set; }
} }
public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo
@ -519,6 +529,8 @@ namespace IRaCIS.Core.Application.Contracts
public string TaskBlindName { get; set; } public string TaskBlindName { get; set; }
public string TaskName { get; set; } public string TaskName { get; set; }
public string VisitName { get; set; }
public Guid? SourceSubjectVisitId { get; set; } public Guid? SourceSubjectVisitId { get; set; }
public ReadingTaskState ReadingTaskState { get; set; } public ReadingTaskState ReadingTaskState { get; set; }
@ -540,6 +552,10 @@ namespace IRaCIS.Core.Application.Contracts
public Guid VisitId { get; set; } public Guid VisitId { get; set; }
public List<DownloadDicomStudyDto> StudyList { get; set; } public List<DownloadDicomStudyDto> StudyList { get; set; }
[JsonIgnore]
public List<DownloadDicomStudyDto> TaskStudyList { get; set; }
public List<DownloadNoneDicomStudyDto> NoneDicomStudyList { get; set; } public List<DownloadNoneDicomStudyDto> NoneDicomStudyList { get; set; }
} }
@ -609,6 +625,8 @@ namespace IRaCIS.Core.Application.Contracts
public string? SubjectCode { get; set; } public string? SubjectCode { get; set; }
public Guid? VisitTaskId { get; set; } public Guid? VisitTaskId { get; set; }
public bool? IsImageSegmentLabel { get; set; }
} }
@ -629,6 +647,8 @@ namespace IRaCIS.Core.Application.Contracts
public List<Guid> NoneDicomStudyIdList { get; set; } public List<Guid> NoneDicomStudyIdList { get; set; }
public bool? IsImageSegmentLabel { get; set; }
} }
public class TrialKeyImageExportDTO public class TrialKeyImageExportDTO
@ -878,4 +898,88 @@ namespace IRaCIS.Core.Application.Contracts
public Guid TaskId { get; set; } public Guid TaskId { get; set; }
} }
public class SubjectVisitMarkQuery:PageInput
{
public Guid TrialId { get; set; }
public Guid? SubjectId { get; set; }
public Guid? TrialReadingCriterionId { get; set; }
public string? SubjectCode { get; set; }
public bool? IsUrgent { get; set; }
}
public class SubjectVisitMarkDTO
{
public Guid TrialId { get; set; }
public Guid SubjectId { get; set; }
public bool IsUrgent { get; set; }
public string SubjectCode { get; set; }
public int? VisitCount { get; set; }
public int? MarkVisitCount { get; set; }
public int? DicomStudyCount { get; set; }
public int? MarkDicomStudyCount { get; set; }
public int? NoneDicomStudyCount { get; set; }
public int? MarkNoneDicomStudyCount { get; set; }
}
public class SubjectVisitMarkStudyDto
{
public bool IsDicom => DicomStudyList.Count() > 0;
public Guid VisitTaskId { get; set; }
public Guid SubjectId { get; set; }
public string SubjectCode { get; set; }
public string VisitName { get; set; }
public Guid SourceSubjectVisitId { get; set; }
public List<DicomStudyBasicInfo> DicomStudyList { get; set; } = new List<DicomStudyBasicInfo>();
public List<NoneDicomStudyBasicInfo> NoneDicomStudyList { get; set; }
}
public class SubjectVisitMarkUploadDto
{
public Guid SubjectVisitId { get; set; }
public Guid TrialSiteId { get; set; }
public Guid SubejctId { get; set; }
public string SubjectCode { get; set; }
public string VisitName { get; set; }
public Guid? SourceSubjectVisitId => SubjectVisitId;
//防止前端null 故意返回
public Guid VisitTaskId { get; set; }
public List<StudyBasicInfo> OrginalStudyList { get; set; }
public List<StudyBasicInfo> UploadStudyList { get; set; }
}
} }

View File

@ -13,6 +13,7 @@ using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using MassTransit; using MassTransit;
using MassTransit.Initializers; using MassTransit.Initializers;
using MathNet.Numerics;
using Medallion.Threading; using Medallion.Threading;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using NetTopologySuite.Mathematics; using NetTopologySuite.Mathematics;
@ -21,6 +22,7 @@ using NPOI.SS.Formula.Functions;
using System.Data; using System.Data;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq;
using System.Text; using System.Text;
using System.Web; using System.Web;
using ZiggyCreatures.Caching.Fusion; using ZiggyCreatures.Caching.Fusion;
@ -118,12 +120,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public async Task<IResponseOutput<List<SubjectImageUploadDTO>>> GetSubjectImageUploadList(IRUploadStudyQuery inQuery) public async Task<IResponseOutput> GetSubjectImageUploadList(IRUploadStudyQuery inQuery)
{ {
//要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的 //要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId) var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
.Select(t => new { t.IsReadingTaskViewInOrder, t.Trial.Modalitys }).FirstNotNullAsync(); .Select(t => new { t.IsReadingTaskViewInOrder, t.Trial.Modalitys, t.IsImageFilter, t.CriterionModalitys }).FirstNotNullAsync();
var subjectCode = string.Empty; var subjectCode = string.Empty;
var subjectId = inQuery.SubjectId; var subjectId = inQuery.SubjectId;
@ -154,6 +156,76 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
subjectCode = inQuery.SubjectCode; subjectCode = inQuery.SubjectCode;
} }
if (inQuery.IsImageSegmentLabel == true)
{
var querySV = _subjectVisitRepository.WhereIf(inQuery.SubjectVisitId != null, t => t.Id == inQuery.SubjectVisitId)
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
.Select(u => new SubjectVisitMarkUploadDto()
{
SubejctId = u.SubjectId,
TrialSiteId = u.TrialSiteId,
SubjectVisitId = u.Id,
SubjectCode = u.Subject.Code,
VisitName = u.VisitName,
OrginalStudyList = u.StudyList
.Select(t => new StudyBasicInfo()
{
Id = t.Id,
SubjectVisitId = t.SubjectVisitId,
StudyInstanceUid = t.StudyInstanceUid,
ModalityForEdit = t.ModalityForEdit,
BodyPartExamined = t.BodyPartExamined,
BodyPartForEdit = t.BodyPartForEdit,
BodyPartForEditOther = t.BodyPartForEditOther,
StudyCode = t.StudyCode,
StudyTime = t.StudyTime,
Description = t.Description,
InstanceCount = t.InstanceCount,
Modalities = t.Modalities,
SeriesCount = t.SeriesCount,
ReadingInstanceCount = t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading).Count(),
ReadingSeriesCount = t.SeriesList.Where(t => t.IsReading).Count(),
}).ToList(),
UploadStudyList = u.TaskStudyList.Select(t => new StudyBasicInfo()
{
Id = t.Id,
SubjectVisitId = t.SubjectVisitId,
StudyInstanceUid = t.StudyInstanceUid,
ModalityForEdit = t.ModalityForEdit,
BodyPartExamined = t.BodyPartExamined,
BodyPartForEdit = t.BodyPartForEdit,
BodyPartForEditOther = t.BodyPartForEditOther,
StudyCode = t.StudyCode,
StudyTime = t.StudyTime,
Description = t.Description,
InstanceCount = t.InstanceCount,
Modalities = t.Modalities,
SeriesCount = t.SeriesCount,
SopInstanceUidList = t.InstanceList.Select(t => t.SopInstanceUid).ToList(),
ReadingInstanceCount = t.InstanceCount,
ReadingSeriesCount = t.SeriesCount,
}).ToList()
})
;
var SVlist = await querySV.ToListAsync();
return ResponseOutput.Ok(SVlist, new { TrialModality = criterionInfo.Modalitys });
}
else
{
await SubejctRandomReadingTaskNameDeal((Guid)subjectId, inQuery.TrialReadingCriterionId); await SubejctRandomReadingTaskNameDeal((Guid)subjectId, inQuery.TrialReadingCriterionId);
@ -183,6 +255,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
OrginalStudyList = u.SourceSubjectVisit.StudyList OrginalStudyList = u.SourceSubjectVisit.StudyList
.Where(t => u.TrialReadingCriterion.IsImageFilter ? ("|" + u.TrialReadingCriterion.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true) .Where(t => u.TrialReadingCriterion.IsImageFilter ? ("|" + u.TrialReadingCriterion.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
.Where(t => inQuery.IsImageSegmentLabel == false ? t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT" : true)
.Select(t => new StudyBasicInfo() .Select(t => new StudyBasicInfo()
{ {
Id = t.Id, Id = t.Id,
@ -203,6 +276,26 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
ReadingSeriesCount = t.SeriesList.Where(t => t.IsReading).Count(), ReadingSeriesCount = t.SeriesList.Where(t => t.IsReading).Count(),
}).ToList(), }).ToList(),
OriginalTaskStudyList = inQuery.IsImageSegmentLabel == false ? u.SourceSubjectVisit.TaskStudyList.Select(t => new StudyBasicInfo()
{
Id = t.Id,
StudyInstanceUid = t.StudyInstanceUid,
ModalityForEdit = t.ModalityForEdit,
BodyPartExamined = t.BodyPartExamined,
BodyPartForEdit = t.BodyPartForEdit,
BodyPartForEditOther = t.BodyPartForEditOther,
StudyCode = t.StudyCode,
StudyTime = t.StudyTime,
Description = t.Description,
InstanceCount = t.InstanceCount,
Modalities = t.Modalities,
SeriesCount = t.SeriesCount,
ReadingInstanceCount = t.InstanceList.Count(),
ReadingSeriesCount = t.SeriesList.Count(),
}).ToList() : new List<StudyBasicInfo>(),
UploadStudyList = u.TaskStudyList.Select(t => new StudyBasicInfo() UploadStudyList = u.TaskStudyList.Select(t => new StudyBasicInfo()
{ {
Id = t.Id, Id = t.Id,
@ -227,14 +320,26 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}).ToList() }).ToList()
}) })
; ;
//var test = await query.ToListAsync();
var list = await query.Where(t => t.SubjectCode == subjectCode).ToListAsync(); var list = await query.Where(t => t.SubjectCode == subjectCode).ToListAsync();
//靶段标注阅片IR上传需要将原始DSA 和初次后处理的影像合并 作为原始检查影像
if (inQuery.IsImageSegmentLabel == false)
{
foreach (var item in list)
{
item.OrginalStudyList.AddRange(item.OriginalTaskStudyList.WhereIf(criterionInfo.IsImageFilter, t => ("|" + criterionInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|")));
}
}
return ResponseOutput.Ok(list, new { TrialModality = criterionInfo.Modalitys }); return ResponseOutput.Ok(list, new { TrialModality = criterionInfo.Modalitys });
} }
}
private void SpecialArchiveStudyDeal(TaskStudy study) private void SpecialArchiveStudyDeal(TaskStudy study)
{ {
#region 特殊逻辑 #region 特殊逻辑
@ -303,7 +408,44 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <returns></returns> /// <returns></returns>
public async Task<List<TaskStudyArchiveConfirmResult>> VerifyIRStudyAllowUpload(TaskStudyAchivePreConfirmCommand inCommand, [FromServices] IRepository<DicomStudy> _dicomStudyRepository) public async Task<List<TaskStudyArchiveConfirmResult>> VerifyIRStudyAllowUpload(TaskStudyAchivePreConfirmCommand inCommand, [FromServices] IRepository<DicomStudy> _dicomStudyRepository)
{ {
var result = new List<TaskStudyArchiveConfirmResult>();
if (inCommand.IsImageSegmentLabel == true)
{
var notAllowedUidList = _dicomStudyRepository.Where(t => t.TrialId == inCommand.TrialId && inCommand.StudyInstanceUidList.Contains(t.StudyInstanceUid)).Select(t => new
{
t.StudyInstanceUid,
t.SubjectId,
SubjectVisitId = (Guid?)t.SubjectVisitId,
SubejectCode = t.Subject.Code,
VisitTaskId = (Guid?)null
}).ToList();
foreach (var studyUid in inCommand.StudyInstanceUidList)
{
var findStudy = notAllowedUidList.Where(t => t.StudyInstanceUid == studyUid).FirstOrDefault();
if (findStudy != null)
{
//同一个subject 同一份影响
if (findStudy.SubejectCode == inCommand.SubjectCode && findStudy.SubjectId == inCommand.SubjectId)
{
result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowUpload = true, IsAllowReUpload = true });
}
else
{
result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowReUpload = false, IsAllowUpload = false });
}
}
else
{
result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowReUpload = false, IsAllowUpload = false });
}
}
}
else
{
var currentUploadSubjectVisitId = inCommand.VisitTaskId == null ? null : _visitTaskRepository.Where(t => t.Id == inCommand.VisitTaskId).Select(t => t.SourceSubjectVisitId).FirstOrDefault(); var currentUploadSubjectVisitId = inCommand.VisitTaskId == null ? null : _visitTaskRepository.Where(t => t.Id == inCommand.VisitTaskId).Select(t => t.SourceSubjectVisitId).FirstOrDefault();
//重阅任务排除 //重阅任务排除
@ -327,7 +469,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var notAllowedUidList = notAllowedUidList1.Union(notAllowedUidList2); var notAllowedUidList = notAllowedUidList1.Union(notAllowedUidList2);
var result = new List<TaskStudyArchiveConfirmResult>();
foreach (var studyUid in inCommand.StudyInstanceUidList) foreach (var studyUid in inCommand.StudyInstanceUidList)
{ {
@ -365,6 +507,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
} }
} }
}
return result; return result;
} }
@ -406,9 +551,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var @uploadLock = _distributedLockProvider.CreateLock($"UploadTaskDicom"); var @uploadLock = _distributedLockProvider.CreateLock($"UploadTaskDicom");
var visiTaskId = incommand.VisitTaskId ?? Guid.Empty;
using (await @uploadLock.AcquireAsync()) using (await @uploadLock.AcquireAsync())
{ {
if (_fusionCache.GetOrDefault<Guid>(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid)) != Guid.Empty) if (_fusionCache.GetOrDefault<Guid>(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, visiTaskId, incommand.Study.StudyInstanceUid)) != Guid.Empty)
{ {
//---当前已有人正在上传和归档该检查! //---当前已有人正在上传和归档该检查!
return ResponseOutput.NotOk(I18n.T("UploadDownLoad_ArchiveInProgress")); return ResponseOutput.NotOk(I18n.T("UploadDownLoad_ArchiveInProgress"));
@ -416,11 +563,18 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
else else
{ {
//在事务未完成前 防止前端重复提交 //在事务未完成前 防止前端重复提交
await _fusionCache.SetAsync(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid), _userInfo.UserRoleId, TimeSpan.FromMinutes(1)); await _fusionCache.SetAsync(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, visiTaskId, incommand.Study.StudyInstanceUid), _userInfo.UserRoleId, TimeSpan.FromMinutes(1));
} }
} }
var visiTaskId = incommand.VisitTaskId;
Guid? svId = null;
if (incommand.IsImageSegmentLabel == true)
{
svId = _dicomStudyRepository.Where(t => t.TrialId == incommand.TrialId && t.StudyInstanceUid == incommand.Study.StudyInstanceUid).Select(t => t.SubjectVisitId).FirstOrDefault();
}
var modalitys = string.Empty; var modalitys = string.Empty;
@ -477,6 +631,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
study.TrialId = incommand.TrialId; study.TrialId = incommand.TrialId;
study.SubjectId = incommand.SubjectId; study.SubjectId = incommand.SubjectId;
study.VisitTaskId = visiTaskId; study.VisitTaskId = visiTaskId;
study.SubjectVisitId = svId;
//study.SubjectVisitId = incommand.SubjectVisitId; //study.SubjectVisitId = incommand.SubjectVisitId;
@ -502,6 +657,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
series.SubjectId = incommand.SubjectId; series.SubjectId = incommand.SubjectId;
//series.SubjectVisitId = incommand.SubjectVisitId; //series.SubjectVisitId = incommand.SubjectVisitId;
series.VisitTaskId = visiTaskId; series.VisitTaskId = visiTaskId;
series.SubjectVisitId = svId;
//前端传递的数量不准,上传的时候,把失败的也加进来了,以实际数组的数字为准 //前端传递的数量不准,上传的时候,把失败的也加进来了,以实际数组的数字为准
series.InstanceCount = seriesItem.InstanceList.Count; series.InstanceCount = seriesItem.InstanceList.Count;
@ -522,6 +678,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
isntance.SubjectId = incommand.SubjectId; isntance.SubjectId = incommand.SubjectId;
//isntance.SubjectVisitId = incommand.SubjectVisitId; //isntance.SubjectVisitId = incommand.SubjectVisitId;
isntance.VisitTaskId = visiTaskId; isntance.VisitTaskId = visiTaskId;
isntance.SubjectVisitId = svId;
await _taskInstanceRepository.AddAsync(isntance); await _taskInstanceRepository.AddAsync(isntance);
} }
@ -652,8 +809,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
} }
finally finally
{ {
await _fusionCache.RemoveAsync(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid)); await _fusionCache.RemoveAsync(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, visiTaskId, incommand.Study.StudyInstanceUid));
await _fusionCache.RemoveAsync(CacheKeys.TrialTaskStudyUidUploading(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid)); await _fusionCache.RemoveAsync(CacheKeys.TrialTaskStudyUidUploading(incommand.TrialId, visiTaskId, incommand.Study.StudyInstanceUid));
} }
@ -667,9 +824,23 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
[HttpDelete] [HttpDelete]
public async Task<IResponseOutput> DeleteTaskStudy(Guid visitTaskId, bool isDicom, Guid? dicomStudyId, Guid? noneDicomStudyId) public async Task<IResponseOutput> DeleteTaskStudy(Guid visitTaskId, Guid? subjectVisitId, bool isDicom, Guid? dicomStudyId, Guid? noneDicomStudyId)
{ {
if (isDicom) if (isDicom)
{
//靶段标注删除访视影像
if (visitTaskId == Guid.Empty && subjectVisitId != null && subjectVisitId != Guid.Empty)
{
var fisrtPath = await _taskInstanceRepository.Where(t => t.SubjectVisitId == subjectVisitId).Select(t => t.Path).FirstOrDefaultAsync();
var prefix = fisrtPath.Substring(1, fisrtPath.LastIndexOf('/') - 1);
await _oSSService.DeleteFromPrefix(prefix, true);
await _taskStudyRepository.DeleteFromQueryAsync(t => t.SubjectVisitId == subjectVisitId);
await _taskSeriesRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == subjectVisitId);
await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == subjectVisitId);
}
if (visitTaskId != Guid.Empty)
{ {
if (dicomStudyId == null) if (dicomStudyId == null)
{ {
@ -697,9 +868,24 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId && t.Id == dicomStudyId); await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId && t.Id == dicomStudyId);
} }
} }
}
else else
{ {
if (visitTaskId == Guid.Empty)
{
//删除靶段标注非dicom
await _noneDicomStudyFileReposiotry.DeleteFromQueryAsync(t => t.ImageLabelNoneDicomStudyId == noneDicomStudyId);
}
else
{
//删除后处理非dicom
await _noneDicomStudyFileReposiotry.DeleteFromQueryAsync(t => t.VisitTaskId == visitTaskId && t.OriginNoneDicomStudyId == noneDicomStudyId); await _noneDicomStudyFileReposiotry.DeleteFromQueryAsync(t => t.VisitTaskId == visitTaskId && t.OriginNoneDicomStudyId == noneDicomStudyId);
}
} }
await _noneDicomStudyFileReposiotry.SaveChangesAsync(); await _noneDicomStudyFileReposiotry.SaveChangesAsync();
@ -715,7 +901,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="inQuery"></param> /// <param name="inQuery"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public async Task<List<TaskNoneDicomStudyDTO>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery) public async Task<IResponseOutput<List<TaskNoneDicomStudyDTO>>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery)
{ {
var subjectCode = inQuery.SubjectCode; var subjectCode = inQuery.SubjectCode;
var subjectId = inQuery.SubjectId; var subjectId = inQuery.SubjectId;
@ -742,6 +928,69 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId) var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
.Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.IsReadingTaskViewInOrder }).FirstNotNullAsync(); .Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
var config = await _subjectRepository.Where(t => t.Id == subjectId).Select(t => new { t.Trial.ImageFormatList, t.Trial.StudyNameList, t.Trial.IsShowStudyName }).FirstOrDefaultAsync();
//靶段标注上传,查看访视级别,上传绑定访视级别
if (inQuery.IsImageSegmentLabel == true)
{
var list = _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId)
.WhereIf(inQuery.SubjectVisitId != null, t => t.SubjectVisitId == inQuery.SubjectVisitId)
//.WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
.Select(u => new TaskNoneDicomStudyDTO()
{
SubjectId = u.SubjectId,
SubjectCode = u.Subject.Code,
VisitName = u.SubjectVisit.VisitName,
SourceSubjectVisitId = u.SubjectVisitId,
Id = u.Id,
Description = u.Description,
ImageDate = u.ImageDate,
BodyPart = u.BodyPart,
BodyPartForEditOther = u.BodyPartForEditOther,
FileCount = u.FileCount,
Modality = u.Modality,
StudyCode = u.StudyCode,
FileList = u.NoneDicomFileList.Select(t => new NoneDicomFileInfo()
{
FileType = t.FileType,
FileName = t.FileName,
FileSize = t.FileSize,
Path = t.Path
}).ToList(),
ReadingFileCount = u.NoneDicomFileList.Where(t => t.IsReading).Count(),
}).ToList();
var noneDicomStudyIdList = list.Select(t => t.Id).ToList();
var noneDicomStudyList = _noneDicomStudyFileReposiotry.Where(t => t.ImageLabelNoneDicomStudyId != null)
.Where(t => noneDicomStudyIdList.Contains((Guid)t.ImageLabelNoneDicomStudyId!))
.Select(u => new NoneDicomFileInfo
{
OriginNoneDicomStudyId = u.ImageLabelNoneDicomStudyId,
FileType = u.FileType,
FileName = u.FileName,
FileSize = u.FileSize,
Path = u.Path
})
.ToList();
foreach (var item in list)
{
item.UploadedFileCount = noneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).Count();
item.UploadedFileList = noneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).ToList();
}
return ResponseOutput.Ok(list, config);
}
else
{
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect) && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect)
//满足 有序或者随机只看到当前任务的dicom 非dicom检查 //满足 有序或者随机只看到当前任务的dicom 非dicom检查
@ -763,12 +1012,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
Description = ns.Description, Description = ns.Description,
ImageDate = ns.ImageDate, ImageDate = ns.ImageDate,
BodyPart = ns.BodyPart, BodyPart = ns.BodyPart,
BodyPartForEditOther=ns.BodyPartForEditOther, BodyPartForEditOther = ns.BodyPartForEditOther,
FileCount = ns.FileCount,
Modality = ns.Modality, Modality = ns.Modality,
StudyCode = ns.StudyCode, StudyCode = ns.StudyCode,
FileList = ns.NoneDicomFileList.Select(t => new NoneDicomFileInfo() //靶段标注 阅片IR 上传时IsImageSegmentLabel == false 正常后处理上传IsImageSegmentLabel 该字段为空
FileList = (inQuery.IsImageSegmentLabel == false ? ns.ImageLabelNoneDicomFileList : ns.NoneDicomFileList)
.Select(t => new NoneDicomFileInfo()
{ {
FileType = t.FileType, FileType = t.FileType,
FileName = t.FileName, FileName = t.FileName,
@ -776,7 +1027,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
Path = t.Path Path = t.Path
}).ToList(), }).ToList(),
ReadingFileCount = ns.FileCount, FileCount = (inQuery.IsImageSegmentLabel == false ? ns.ImageLabelNoneDicomFileList : ns.NoneDicomFileList).Count(),
ReadingFileCount = (inQuery.IsImageSegmentLabel == false ? ns.ImageLabelNoneDicomFileList : ns.NoneDicomFileList).Where(t => t.IsReading).Count(),
}; };
@ -804,7 +1056,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
item.UploadedFileList = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).ToList(); item.UploadedFileList = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).ToList();
} }
return list; return ResponseOutput.Ok(list, config);
}
} }
@ -984,7 +1239,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="inQuery"></param> /// <param name="inQuery"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public async Task<List<SubjectCRCImageUploadedStudyDto>> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery) public async Task<IResponseOutput> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery)
{ {
var doctorUserId = _userInfo.UserRoleId; var doctorUserId = _userInfo.UserRoleId;
@ -1016,6 +1271,53 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
subjectCode = inQuery.SubjectCode; subjectCode = inQuery.SubjectCode;
} }
if (inQuery.IsImageSegmentLabel == true)
{
var list = await _subjectVisitRepository
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
.ProjectTo<SubjectVisitMarkStudyDto>(_mapper.ConfigurationProvider).ToListAsync();
#region 将任务级别转为检查级别
var result = new List<SubjectVisitMarkStudyDto>();
var dicomStudyList = list.Where(item => item.DicomStudyList.Count > 0)
.Select(item => new SubjectVisitMarkStudyDto
{
SourceSubjectVisitId = item.SourceSubjectVisitId,
VisitTaskId = item.VisitTaskId,
SubjectId = item.SubjectId,
SubjectCode = item.SubjectCode,
VisitName = item.VisitName,
//取dicom
DicomStudyList = item.DicomStudyList,
}).ToList();
var noneStudyList = list.Where(item => item.NoneDicomStudyList.Count > 0)
.Select(item => new SubjectVisitMarkStudyDto
{
SourceSubjectVisitId = item.SourceSubjectVisitId,
VisitTaskId = item.VisitTaskId,
SubjectId = item.SubjectId,
SubjectCode = item.SubjectCode,
VisitName = item.VisitName,
//非dicom
NoneDicomStudyList = item.NoneDicomStudyList,
}).ToList();
result.AddRange(dicomStudyList);
result.AddRange(noneStudyList);
#endregion
return ResponseOutput.Ok(result);
}
else
{
//下载这里查看也需要维护编号,维护的时候不会处理一致性分析任务 //下载这里查看也需要维护编号,维护的时候不会处理一致性分析任务
if (inQuery.SubjectId != null && inQuery.TrialReadingCriterionId != null) if (inQuery.SubjectId != null && inQuery.TrialReadingCriterionId != null)
{ {
@ -1053,11 +1355,37 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId) .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
.WhereIf(taskState == TaskState.Effect || taskState == TaskState.Freeze, t => t.TaskState == TaskState.Effect)//subject 随机可能当前阅片人有退回任务此时传递了任务Id但是要看整个subject得要只留生效的 .WhereIf(taskState == TaskState.Effect || taskState == TaskState.Freeze, t => t.TaskState == TaskState.Effect)//subject 随机可能当前阅片人有退回任务此时传递了任务Id但是要看整个subject得要只留生效的
.WhereIf(taskState != null && taskState != TaskState.Effect && taskState != TaskState.Freeze, t => t.Id == inQuery.VisitTaskId) //非生效只查当前任务 .WhereIf(taskState != null && taskState != TaskState.Effect && taskState != TaskState.Freeze, t => t.Id == inQuery.VisitTaskId) //非生效只查当前任务
.ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider); .ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider/*, new { IsImageSegmentLabel = inQuery.IsImageSegmentLabel }*/);
//这里过滤是否是一致性分析的 //这里过滤是否是一致性分析的
var list = await query.Where(t => t.SubjectCode == subjectCode).ToListAsync(); var list = await query.Where(t => t.SubjectCode == subjectCode).ToListAsync();
if (inQuery.IsImageSegmentLabel == false)
{
var subjectVisitIdList = list.Select(t => t.SourceSubjectVisitId).Distinct().ToList();
var preDicomStudyList = _subjectVisitRepository.Where(t => subjectVisitIdList.Contains(t.Id)).SelectMany(t => t.TaskStudyList)
.ProjectTo<DicomStudyBasicInfo>(_mapper.ConfigurationProvider).ToList();
var preNoneDicomStudyList = _subjectVisitRepository.Where(t => subjectVisitIdList.Contains(t.Id))
.SelectMany(t => t.NoneDicomStudyList)
.ProjectTo<ImageMarkNoneDicomStudyBasicInfo>(_mapper.ConfigurationProvider).ToList();
foreach (var item in list)
{
var dicomList = item.DicomStudyList.Where(t => inQuery.IsImageSegmentLabel == false ? t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT" : true).ToList();
dicomList.AddRange(preDicomStudyList.Where(t => t.SubjectVisitId == item.SourceSubjectVisitId).ToList());
item.DicomStudyList = dicomList;
item.NoneDicomStudyList = _mapper.Map<List<NoneDicomStudyBasicInfo>>(preNoneDicomStudyList.Where(t => t.SubjectVisitId == item.SourceSubjectVisitId).ToList());
}
}
foreach (var item in list) foreach (var item in list)
{ {
if (item.IsImageFilter) if (item.IsImageFilter)
@ -1108,7 +1436,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
#endregion #endregion
return result; return ResponseOutput.Ok(result);
}
} }
@ -1129,13 +1460,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var imageType = (isQueryDicom && isQueryNoneDicom) ? ImageType.DicomAndNoneDicom : (isQueryDicom ? ImageType.Dicom : ImageType.NoneDicom); var imageType = (isQueryDicom && isQueryNoneDicom) ? ImageType.DicomAndNoneDicom : (isQueryDicom ? ImageType.Dicom : ImageType.NoneDicom);
var taskIdList = inQuery.SubjectVisitTaskList.Select(t => t.TaskId).ToList(); var taskIdList = inQuery.SubjectVisitTaskList.Select(t => t.TaskId).Distinct().ToList();
var subjectVisitIdList = inQuery.SubjectVisitTaskList.Select(t => t.SubjectVisitId).ToList(); var subjectVisitIdList = inQuery.SubjectVisitTaskList.Select(t => t.SubjectVisitId).Distinct().ToList();
var trialSiteCode = _visitTaskRepository.Where(t => t.Id == taskIdList.FirstOrDefault()).Select(t => t.IsAnalysisCreate ? t.BlindTrialSiteCode : t.Subject.TrialSite.TrialSiteCode).FirstOrDefault() ?? string.Empty; var trialSiteCode = _visitTaskRepository.Where(t => t.Id == taskIdList.FirstOrDefault()).Select(t => t.IsAnalysisCreate ? t.BlindTrialSiteCode : t.Subject.TrialSite.TrialSiteCode).FirstOrDefault() ?? string.Empty;
var dirDic = new Dictionary<string, string>(); var dirDic = new Dictionary<string, string>();
#region 在下载前先处理DIR文件 #region 在下载前先处理DIR文件
//有传输语法值的导出 才生成DIR //有传输语法值的导出 才生成DIR
@ -1144,6 +1476,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var dirInfolist = _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))).SelectMany(t => t.StudyList) var dirInfolist = _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))).SelectMany(t => t.StudyList)
.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false) .Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true) .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
.Where(t => inQuery.IsImageSegmentLabel == false ? t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT" : true)
.SelectMany(t => t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading)) .SelectMany(t => t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading))
.Select(t => new StudyDIRInfo() .Select(t => new StudyDIRInfo()
{ {
@ -1181,20 +1514,72 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}).ToList(); }).ToList();
if (inQuery.IsImageSegmentLabel == false)
{
var taskDirInfolist = _taskInstanceRepository.Where(t => t.SubjectVisitId != null)
.Where(t => subjectVisitIdList.Contains((Guid)t.SubjectVisitId)).Select(t => new StudyDIRInfo()
{
IsTaskStudy = true,
SubjectVisitId = (Guid)t.SubjectVisitId,
DicomStudyId = t.TaskStudy.Id,
PatientId = t.TaskStudy.PatientId,
PatientName = t.TaskStudy.PatientName,
PatientBirthDate = t.TaskStudy.PatientBirthDate,
PatientSex = t.TaskStudy.PatientSex,
StudyInstanceUid = t.StudyInstanceUid,
StudyId = t.TaskStudy.StudyId,
DicomStudyDate = t.TaskStudy.DicomStudyDate,
DicomStudyTime = t.TaskStudy.DicomStudyTime,
AccessionNumber = t.TaskStudy.AccessionNumber,
StudyDescription = t.TaskStudy.Description,
SeriesInstanceUid = t.TaskSeries.SeriesInstanceUid,
Modality = t.TaskSeries.Modality,
DicomSeriesDate = t.TaskSeries.DicomSeriesDate,
DicomSeriesTime = t.TaskSeries.DicomSeriesTime,
SeriesNumber = t.TaskSeries.SeriesNumber,
SeriesDescription = t.TaskSeries.Description,
InstanceId = t.Id,
SopInstanceUid = t.SopInstanceUid,
SOPClassUID = t.SOPClassUID,
InstanceNumber = t.InstanceNumber,
MediaStorageSOPClassUID = t.MediaStorageSOPClassUID,
MediaStorageSOPInstanceUID = t.MediaStorageSOPInstanceUID,
TransferSytaxUID = t.TransferSytaxUID,
}).ToList();
dirInfolist.AddRange(taskDirInfolist);
}
var pathInfo = await _subjectRepository.Where(t => t.Id == inQuery.SubjectId).Select(t => new { t.TrialId, SubjectId = t.Id }).FirstNotNullAsync(); var pathInfo = await _subjectRepository.Where(t => t.Id == inQuery.SubjectId).Select(t => new { t.TrialId, SubjectId = t.Id }).FirstNotNullAsync();
foreach (var item in dirInfolist.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId })) foreach (var item in dirInfolist.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId }))
{ {
var visitId = item.First().SubjectVisitId; var visitId = item.First().SubjectVisitId;
var isTaskStudy = item.First().IsTaskStudy;
var ossFolder = $"{pathInfo.TrialId}/Image/{pathInfo.SubjectId}/{visitId}/{item.Key.StudyInstanceUid}"; var ossFolder = $"{pathInfo.TrialId}/Image/{pathInfo.SubjectId}/{visitId}/{item.Key.StudyInstanceUid}";
var isSucess = await SafeBussinessHelper.RunAsync(async () => await DicomDIRHelper.GenerateStudyDIRAndUploadAsync(item.ToList(), dirDic, ossFolder, _oSSService)); var isSucess = await SafeBussinessHelper.RunAsync(async () => await DicomDIRHelper.GenerateStudyDIRAndUploadAsync(item.ToList(), dirDic, ossFolder, _oSSService));
if (isSucess) if (isSucess)
{
if (isTaskStudy)
{
await _taskStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Key.DicomStudyId, u => new TaskStudy() { StudyDIRPath = $"/{ossFolder}/DICOMDIR" });
}
else
{ {
await _dicomStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Key.DicomStudyId, u => new DicomStudy() { StudyDIRPath = $"/{ossFolder}/DICOMDIR" }); await _dicomStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Key.DicomStudyId, u => new DicomStudy() { StudyDIRPath = $"/{ossFolder}/DICOMDIR" });
}
} }
} }
@ -1204,16 +1589,21 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))) var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id)))
//一致性分析,导致查询出来两条数据 //一致性分析,导致查询出来两条数据
join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id)) join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id)) on sv.Id equals visitTask.SourceSubjectVisitId into cc
from leftVisitTask in cc.DefaultIfEmpty()
on sv.Id equals visitTask.SourceSubjectVisitId
select new ImageDownloadDto() select new ImageDownloadDto()
{ {
TrialId = sv.TrialId,
SubjectId = sv.SubjectId,
TrialSiteCode = sv.TrialSite.TrialSiteCode,
VisitId = sv.Id,
SubjectCode = inQuery.SubjectCode, SubjectCode = inQuery.SubjectCode,
VisitName = sv.VisitName, VisitName = sv.VisitName,
TaskBlindName = visitTask.TaskBlindName, TaskBlindName = leftVisitTask.TaskBlindName,
StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false) StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true) .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
.Where(t => inQuery.IsImageSegmentLabel == false ? t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT" : true)
.Select(u => new DownloadDicomStudyDto() .Select(u => new DownloadDicomStudyDto()
{ {
PatientId = u.PatientId, PatientId = u.PatientId,
@ -1237,7 +1627,34 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}).ToList() }).ToList()
}).ToList(), }).ToList(),
NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false) TaskStudyList =
sv.TaskStudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
//.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
.Select(u => new DownloadDicomStudyDto()
{
PatientId = u.PatientId,
StudyTime = u.StudyTime,
StudyCode = u.StudyCode,
StudyInstanceUid = u.StudyInstanceUid,
StudyDIRPath = u.StudyDIRPath,
SeriesList = u.SeriesList.Select(z => new DownloadDicomSeriesDto()
{
Modality = z.Modality,
InstanceList = z.InstanceList.Select(k => new DownloadDicomInstanceDto()
{
IsEncapsulated = k.IsEncapsulated,
InstanceId = k.Id,
FileName = string.Empty,
Path = k.Path,
FileSize = k.FileSize
}).ToList()
}).ToList()
}).ToList()
,
NoneDicomStudyList = inQuery.IsImageSegmentLabel != false ? sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true) .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true)
.Where(t => t.IsReading) .Where(t => t.IsReading)
.Select(nd => new DownloadNoneDicomStudyDto() .Select(nd => new DownloadNoneDicomStudyDto()
@ -1253,6 +1670,23 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
FileType = file.FileType, FileType = file.FileType,
FileSize = file.FileSize FileSize = file.FileSize
}).ToList() }).ToList()
}).ToList() :
sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
//.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true)
.Where(t => t.IsReading)
.Select(nd => new DownloadNoneDicomStudyDto()
{
Modality = nd.Modality,
StudyCode = nd.StudyCode,
ImageDate = nd.ImageDate,
FileList = nd.ImageLabelNoneDicomFileList.Where(t => t.IsReading).Select(file => new DownloadNoneDicomFileDto()
{
FileName = file.FileName,
Path = file.Path,
FileType = file.FileType,
FileSize = file.FileSize
}).ToList()
}).ToList() }).ToList()
}; };
@ -1262,6 +1696,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
foreach (var result in list) foreach (var result in list)
{ {
//靶段标注处理
if (inQuery.IsImageSegmentLabel == false)
{
result.StudyList.AddRange(result.TaskStudyList);
}
foreach (var item in result.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList)) foreach (var item in result.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList))
{ {
var key = item.InstanceId.ToString(); var key = item.InstanceId.ToString();
@ -1307,11 +1747,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
[HttpPost] [HttpPost]
public async Task<IResponseOutput> GetTaskUploadedDicomStudyList(IRTaskUploadedDicomStudyQuery inQuery) public async Task<IResponseOutput> GetTaskUploadedDicomStudyList(IRTaskUploadedDicomStudyQuery inQuery)
{ {
var info = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId) var info = await _visitTaskRepository
.WhereIf(inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)//正常后处理
.Select(t => new { t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync(); .Select(t => new { t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync();
var query = _taskStudyRepository.Where(t => t.VisitTaskId == inQuery.VisitTaskId) var query = _taskStudyRepository
.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true) .WhereIf(inQuery.VisitTaskId != null, t => t.VisitTaskId == inQuery.VisitTaskId)//正常后处理
.WhereIf(inQuery.VisitTaskId == null && inQuery.SubjectVisitId != null, t => t.SubjectVisitId == inQuery.SubjectVisitId)//靶段标注处理的影像
.WhereIf(info.IsImageFilter && inQuery.VisitTaskId != null, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.Select(t => new .Select(t => new
{ {
StudyId = t.Id, StudyId = t.Id,
@ -1804,6 +2247,40 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
#endregion #endregion
#region 第三人预处理影响上传下载
/// <summary>
/// 获取受试者级别 访视标注列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput<PageOutput<SubjectVisitMarkDTO>>> GetTrialSubjectVisitMarkList(SubjectVisitMarkQuery inQuery)
{
var list = await _subjectRepository.Where(t => t.TrialId == inQuery.TrialId && t.SubjectDoctorList.Any())
.WhereIf(inQuery.SubjectCode.IsNotNullOrEmpty(), t => t.Code.Contains(inQuery.SubjectCode))
.WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent)
.Select(t => new SubjectVisitMarkDTO()
{
TrialId = t.TrialId,
SubjectId = t.Id,
SubjectCode = t.Code,
IsUrgent = t.IsUrgent,
VisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(),
MarkVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(t => t.TaskStudyList.Any()),
DicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.StudyList).Count(),
MarkDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.TaskStudyList).Count(),
NoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Count(),
MarkNoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Where(t => t.ImageLabelNoneDicomFileList.Any()).Count(),
}).ToPagedListAsync(inQuery);
return ResponseOutput.Ok(list);
}
#endregion
#region 之前后端下载废弃 #region 之前后端下载废弃

View File

@ -4,6 +4,7 @@
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//-------------------------------------------------------------------- //--------------------------------------------------------------------
using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Medallion.Threading; using Medallion.Threading;
@ -34,7 +35,8 @@ namespace IRaCIS.Core.Application.Contracts
[FromQuery] Guid? nonedicomStudyId, [FromQuery] Guid? nonedicomStudyId,
[FromQuery] bool isFilterZip, [FromQuery] bool isFilterZip,
[FromQuery] Guid? visitTaskId, [FromQuery] Guid? visitTaskId,
[FromQuery] bool isReading) [FromQuery] bool isReading,
[FromQuery] bool? isImageSegmentLabel)
{ {
var qcAuditState = await _subjectVisitRepository.Where(s => s.Id == subjectVisitId).Select(t => t.AuditState).FirstOrDefaultAsync(); var qcAuditState = await _subjectVisitRepository.Where(s => s.Id == subjectVisitId).Select(t => t.AuditState).FirstOrDefaultAsync();
@ -45,21 +47,45 @@ namespace IRaCIS.Core.Application.Contracts
var isViewDelete = !isQCFinished; var isViewDelete = !isQCFinished;
IQueryable<NoneDicomStudyView> noneDicomStudyQueryable = default; IQueryable<NoneDicomStudyView> noneDicomStudyQueryable = default;
if (visitTaskId == null || visitTaskId == Guid.Empty)
{
if (visitTaskId == null) if (visitTaskId == null)
{ {
//质控过程中,需要忽略过滤质控设置删除的检查,以及设置删除的文件,质控通过后才 //质控过程中,需要忽略过滤质控设置删除的检查,以及设置删除的文件,质控通过后才
noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: isViewDelete) noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: isViewDelete)
.WhereIf(nonedicomStudyId != null, t => t.Id == nonedicomStudyId) .WhereIf(nonedicomStudyId != null, t => t.Id == nonedicomStudyId)
.WhereIf(isReading, t => t.IsReading && t.IsDeleted == false) .WhereIf(isReading, t => t.IsReading && t.IsDeleted == false)
.ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider, new { isFilterZip = isFilterZip, isReading = isReading }); .ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider, new { isFilterZip = isFilterZip, isReading = isReading });
} }
else else
{ {
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(t => new { t.BlindSubjectCode, t.TrialReadingCriterionId, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync(); //靶段标注上传后查看影像
noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: isViewDelete)
.WhereIf(isReading, t => t.IsReading && t.IsDeleted == false)
.WhereIf(nonedicomStudyId != null, t => t.Id == nonedicomStudyId)
.ProjectTo<ImageLabelNoneDicomStudyView>(_mapper.ConfigurationProvider, new { isFilterZip = isFilterZip, isReading = isReading });
}
}
else
{
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(t => new { t.BlindSubjectCode, t.TrialReadingCriterionId, t.TrialReadingCriterion.CriterionType, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync();
if ((taskinfo.CriterionType == CriterionType.IVUS || taskinfo.CriterionType == CriterionType.OCT) && isImageSegmentLabel == false)
{
//后处理原始影像预览
noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: isViewDelete)
.WhereIf(isReading, t => t.IsReading && t.IsDeleted == false)
.WhereIf(nonedicomStudyId != null, t => t.Id == nonedicomStudyId)
.Where(t => taskinfo.IsImageFilter ? ("|" + taskinfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true)
.ProjectTo<ImageLabelNoneDicomStudyView>(_mapper.ConfigurationProvider, new { isFilterZip = isFilterZip, visiTaskId = visitTaskId, isReading = isReading });
}
else
{
noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.TaskNoneDicomFileList.Any(t => t.VisitTaskId == visitTaskId), ignoreQueryFilters: isViewDelete) noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.TaskNoneDicomFileList.Any(t => t.VisitTaskId == visitTaskId), ignoreQueryFilters: isViewDelete)
.WhereIf(isReading, t => t.IsReading && t.IsDeleted == false) .WhereIf(isReading, t => t.IsReading && t.IsDeleted == false)
.Where(t => taskinfo.IsImageFilter ? ("|" + taskinfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true) .Where(t => taskinfo.IsImageFilter ? ("|" + taskinfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true)
@ -68,6 +94,9 @@ namespace IRaCIS.Core.Application.Contracts
} }
}
var list = await noneDicomStudyQueryable.OrderBy(x => x.ImageDate).ThenBy(x => x.CreateTime).ToListAsync(); var list = await noneDicomStudyQueryable.OrderBy(x => x.ImageDate).ThenBy(x => x.CreateTime).ToListAsync();
var config = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { t.Trial.ImageFormatList, t.Trial.StudyNameList, t.Trial.IsShowStudyName, AuditState = qcAuditState }).FirstOrDefaultAsync(); var config = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { t.Trial.ImageFormatList, t.Trial.StudyNameList, t.Trial.IsShowStudyName, AuditState = qcAuditState }).FirstOrDefaultAsync();

View File

@ -136,6 +136,11 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.ReadingSeriesCount, u => u.MapFrom(s => s.SeriesList.Where(t => t.IsReading).Count())) .ForMember(d => d.ReadingSeriesCount, u => u.MapFrom(s => s.SeriesList.Where(t => t.IsReading).Count()))
.ForMember(d => d.ReadingInstanceCount, u => u.MapFrom(s => s.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading).Count())); .ForMember(d => d.ReadingInstanceCount, u => u.MapFrom(s => s.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading).Count()));
CreateMap<TaskStudy, DicomStudyBasicInfo>()
//.ForMember(d => d.SubjectVisitId, u => u.MapFrom(s => s.SubjectVisitId))
.ForMember(d => d.ReadingSeriesCount, u => u.MapFrom(s => s.SeriesCount))
.ForMember(d => d.ReadingInstanceCount, u => u.MapFrom(s => s.InstanceCount));
CreateMap<NoneDicomStudy, NoneDicomStudyBasicInfo>() CreateMap<NoneDicomStudy, NoneDicomStudyBasicInfo>()
.ForMember(d => d.ReadingFileCount, u => u.MapFrom(s => s.NoneDicomFileList.Where(t => t.IsReading).Count())); .ForMember(d => d.ReadingFileCount, u => u.MapFrom(s => s.NoneDicomFileList.Where(t => t.IsReading).Count()));
@ -159,6 +164,24 @@ namespace IRaCIS.Core.Application.Service
CreateMap<NoneDicomEdit, NoneDicomStudy>(); CreateMap<NoneDicomEdit, NoneDicomStudy>();
CreateMap<SubjectVisit, SubjectVisitMarkStudyDto>()
.ForMember(d => d.SourceSubjectVisitId, u => u.MapFrom(u => u.Id))
.ForMember(d => d.SubjectCode, u => u.MapFrom(u => u.Subject.Code))
.ForMember(d => d.DicomStudyList, u => u.MapFrom(s => s.StudyList))
.ForMember(d => d.NoneDicomStudyList, u => u.MapFrom(s => s.NoneDicomStudyList.Where(t => t.IsReading)));
CreateMap<NoneDicomStudy, ImageMarkNoneDicomStudyBasicInfo>()
.ForMember(d => d.SubjectVisitId, u => u.MapFrom(s => s.SubjectVisitId))
.ForMember(d => d.FileCount, u => u.MapFrom(s => s.ImageLabelNoneDicomFileList.Count()))
.ForMember(d => d.ReadingFileCount, u => u.MapFrom(s => s.ImageLabelNoneDicomFileList.Count()));
CreateMap<ImageMarkNoneDicomStudyBasicInfo, NoneDicomStudyBasicInfo>();
} }
} }

View File

@ -31,6 +31,11 @@ namespace IRaCIS.Core.Application.Contracts
{ {
} }
public class ImageLabelNoneDicomStudyView : NoneDicomStudyView
{
}
///<summary>NoneDicomStudyQuery 列表查询参数模型</summary> ///<summary>NoneDicomStudyQuery 列表查询参数模型</summary>
public class NoneDicomStudyQuery public class NoneDicomStudyQuery
{ {
@ -55,6 +60,8 @@ namespace IRaCIS.Core.Application.Contracts
public string Modality { get; set; } = string.Empty; public string Modality { get; set; } = string.Empty;
public DateTime ImageDate { get; set; } public DateTime ImageDate { get; set; }
public string ModifyReason { get; set; } public string ModifyReason { get; set; }
public string BodyPartForEditOther { get; set; }
} }
///<summary> NoneDicomStudyAddOrEdit 列表查询参数模型</summary> ///<summary> NoneDicomStudyAddOrEdit 列表查询参数模型</summary>

View File

@ -21,6 +21,8 @@ namespace IRaCIS.Core.Application.Contracts.DTO
public string BodyPart { get; set; } = String.Empty; public string BodyPart { get; set; } = String.Empty;
public string ModifyReason { get; set; } public string ModifyReason { get; set; }
public string BodyPartForEditOther { get; set; }
} }

View File

@ -755,6 +755,13 @@ namespace IRaCIS.Core.Application.Service
.OrderBy(t => t.CreateTime).ThenBy(t => t.FileName))) .OrderBy(t => t.CreateTime).ThenBy(t => t.FileName)))
.ForMember(d => d.CodeView, u => u.MapFrom(s => s.StudyCode)); .ForMember(d => d.CodeView, u => u.MapFrom(s => s.StudyCode));
CreateMap<NoneDicomStudy, ImageLabelNoneDicomStudyView>()
.ForMember(d => d.NoneDicomStudyFileList, u => u.MapFrom(s =>
s.ImageLabelNoneDicomFileList.Where(t => isFilterZip ? !t.FileType.Contains(StaticData.FileType.Zip) : true)
.Where(t => isReading ? t.IsReading && t.IsDeleted == false : true)
.OrderBy(t => t.CreateTime).ThenBy(t => t.FileName)))
.ForMember(d => d.CodeView, u => u.MapFrom(s => s.StudyCode));
CreateMap<SubjectVisitImageBackRecord, ImageBackViewModel>() CreateMap<SubjectVisitImageBackRecord, ImageBackViewModel>()
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code)) .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code))

View File

@ -6,9 +6,11 @@ using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Org.BouncyCastle.Asn1.Tsp;
namespace IRaCIS.Core.Application.Services namespace IRaCIS.Core.Application.Services
{ {
@ -222,12 +224,25 @@ namespace IRaCIS.Core.Application.Services
var isImageFilter = false; var isImageFilter = false;
var criterionModalitys = ""; var criterionModalitys = "";
if (visitTaskId != null) var criterionType = CriterionType.NoCriterion;
var isVisitTask = false;
bool? isImageSegmentLabel = null;
if (visitTaskId != null && visitTaskId != Guid.Empty)
{ {
isVisitTask = true;
var info = await _visitTaskRepository.Where(t => t.Id == visitTaskId) var info = await _visitTaskRepository.Where(t => t.Id == visitTaskId)
.Select(t => new { t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync(); .Select(t => new { t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys, t.TrialReadingCriterion.CriterionType }).FirstNotNullAsync();
isImageFilter = info.IsImageFilter; isImageFilter = info.IsImageFilter;
criterionModalitys = info.CriterionModalitys; criterionModalitys = info.CriterionModalitys;
criterionType = info.CriterionType;
if (criterionType == CriterionType.OCT || criterionType == CriterionType.IVUS)
{
isImageSegmentLabel = true;
}
} }
@ -235,6 +250,8 @@ namespace IRaCIS.Core.Application.Services
var studyList = await _dicomStudyRepository.Where(t => t.TrialId == trialId && t.SubjectVisitId == sujectVisitId).IgnoreQueryFilters() var studyList = await _dicomStudyRepository.Where(t => t.TrialId == trialId && t.SubjectVisitId == sujectVisitId).IgnoreQueryFilters()
.Where(t => isImageFilter ? ("|" + criterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true) .Where(t => isImageFilter ? ("|" + criterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
.WhereIf(isReading == 1 || isQCFinished, s => s.IsDeleted == false) .WhereIf(isReading == 1 || isQCFinished, s => s.IsDeleted == false)
//预览靶段标注上传的影像 影像后处理 上传了新的影像 还要原始dsa
.WhereIf(isImageSegmentLabel == true && isVisitTask && (criterionType == CriterionType.OCT || criterionType == CriterionType.IVUS), t => t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT")
.Select(k => new VisitStudyDTO() .Select(k => new VisitStudyDTO()
{ {
InstanceCount = k.InstanceCount, InstanceCount = k.InstanceCount,
@ -285,12 +302,29 @@ namespace IRaCIS.Core.Application.Services
t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
} }
//预览靶段标注上传的影像
if (isImageSegmentLabel == true && isVisitTask)
{
var taskStudyList = await _taskStudyRepository.Where(t => t.SubjectVisitId == sujectVisitId)
.WhereIf(isImageFilter, t => ("|" + criterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.ProjectTo<VisitStudyDTO>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var study in taskStudyList)
{
study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
}
studyList.AddRange(taskStudyList);
}
return studyList.Where(x=>x.SeriesList.Count()>0).ToList(); return studyList.Where(x => x.SeriesList.Count() > 0).ToList();
//return ResponseOutput.Ok(studyList.Where(t => t.SeriesList.Count > 0).ToList());
} }
@ -468,35 +502,27 @@ namespace IRaCIS.Core.Application.Services
var studyList = new List<VisitStudyDTO>(); var studyList = new List<VisitStudyDTO>();
var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).Select(t => new { t.TrialReadingCriterionId, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys, t.ReadingTaskState, TaskStudyCount = t.TaskStudyList.Count }).FirstNotNullAsync(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).Select(t => new
//影像后处理 上传了新的影像
if (taskInfo.TaskStudyCount > 0)
{ {
t.TrialReadingCriterionId,
t.TrialReadingCriterion.CriterionType,
t.TrialReadingCriterion.IsImageFilter,
t.TrialReadingCriterion.CriterionModalitys,
t.ReadingTaskState,
var taskStudyList = await _taskStudyRepository.Where(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId) //是否有了后处理的dicom检查
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|")) IsHaveTaskStudy = t.TaskStudyList.Any(),
.ProjectTo<VisitStudyDTO>(_mapper.ConfigurationProvider).ToListAsync(); //是否有了后处理的NoneDicom检查
IsHaveTaskNoneDicomStudyFile = t.SourceSubjectVisit.NoneDicomStudyList.SelectMany(c => c.TaskNoneDicomFileList.Where(t => t.VisitTaskId == indto.VisitTaskId)).Any(),
//是否有了标注的dicom检查
IsMarkDicomStudy = t.SourceSubjectVisit.TaskStudyList.Any(),
//是否有了标注的NoneDicom检查
IsMarkNoneDicomStudy = t.SourceSubjectVisit.NoneDicomStudyList.SelectMany(c => c.ImageLabelNoneDicomFileList).Any()
foreach (var study in taskStudyList) }).FirstNotNullAsync();
{
study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
//foreach (var series in study.SeriesList)
//{
// series.WindowCenter = series.InstanceInfoList.FirstOrDefault()!.WindowCenter;
// series.WindowWidth = series.InstanceInfoList.FirstOrDefault()!.WindowWidth;
//}
//study.SeriesCount = study.SeriesList.Count;
study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
}
studyList.AddRange(taskStudyList);
}
else
{
#region dicom 检查查询 #region dicom 检查查询
//如果是手动生成的标准,需要过滤检查和序列数据 //如果是手动生成的标准,需要过滤检查和序列数据
@ -506,6 +532,23 @@ namespace IRaCIS.Core.Application.Services
var dicomStudyList = await _dicomStudyRepository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) var dicomStudyList = await _dicomStudyRepository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|")) .WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
//影像后处理 上传了新的影像 还要原始dsa
.WhereIf(taskInfo.IsHaveTaskStudy
&& (taskInfo.CriterionType == CriterionType.OCT || taskInfo.CriterionType == CriterionType.IVUS),
t => t.ModalityForEdit == "XA")
.WhereIf(taskInfo.IsHaveTaskStudy == false && taskInfo.IsMarkDicomStudy && taskInfo.CriterionType == CriterionType.IVUS,
t => t.ModalityForEdit == "XA" )
.WhereIf(taskInfo.IsHaveTaskStudy == false && taskInfo.IsMarkDicomStudy && taskInfo.CriterionType == CriterionType.OCT,
t => t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT")
.WhereIf(taskInfo.IsHaveTaskStudy == false && taskInfo.IsMarkDicomStudy == false
&& (taskInfo.CriterionType == CriterionType.OCT || taskInfo.CriterionType == CriterionType.IVUS),
t => t.ModalityForEdit == "XA" || t.ModalityForEdit == "OCT" || t.ModalityForEdit == "IVUS")
//其他 不应该看原始影像
.WhereIf(taskInfo.IsHaveTaskStudy && (taskInfo.CriterionType != CriterionType.OCT && taskInfo.CriterionType != CriterionType.IVUS), t => false)
.Select(k => new VisitStudyDTO() .Select(k => new VisitStudyDTO()
{ {
InstanceCount = k.InstanceCount, InstanceCount = k.InstanceCount,
@ -515,13 +558,17 @@ namespace IRaCIS.Core.Application.Services
StudyCode = k.StudyCode, StudyCode = k.StudyCode,
StudyId = k.Id, StudyId = k.Id,
BodyPartForEdit=k.BodyPartForEdit, BodyPartForEdit = k.BodyPartForEdit,
BodyPartForEditOther=k.BodyPartForEditOther BodyPartForEditOther = k.BodyPartForEditOther
}).ToListAsync(); }).ToListAsync();
var studyIds = dicomStudyList.Select(t => t.StudyId).ToList(); var studyIds = dicomStudyList.Select(t => t.StudyId).ToList();
if (studyIds.Count > 0)
{
var instanceList = await _dicomInstanceRepository.Where(t => studyIds.Contains(t.StudyId) && t.IsReading) var instanceList = await _dicomInstanceRepository.Where(t => studyIds.Contains(t.StudyId) && t.IsReading)
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath, t.IsReading, t.FileSize }).ToListAsync(); .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath, t.IsReading, t.FileSize }).ToListAsync();
@ -561,6 +608,27 @@ namespace IRaCIS.Core.Application.Services
} }
studyList.AddRange(dicomStudyList); studyList.AddRange(dicomStudyList);
}
//影像后处理 上传了新的影像
if (taskInfo.IsHaveTaskStudy || taskInfo.IsMarkDicomStudy || taskInfo.IsMarkNoneDicomStudy)
{
var taskStudyList = await _taskStudyRepository.Where(t => t.TrialId == indto.TrialId)
.WhereIf(taskInfo.IsHaveTaskStudy, t => t.VisitTaskId == indto.VisitTaskId)
.WhereIf(taskInfo.IsHaveTaskStudy == false && (taskInfo.IsMarkDicomStudy || taskInfo.IsMarkNoneDicomStudy), t => t.SubjectVisitId == indto.SujectVisitId)
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.ProjectTo<VisitStudyDTO>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var study in taskStudyList)
{
study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
}
studyList.AddRange(taskStudyList);
}
#endregion #endregion
@ -577,7 +645,7 @@ namespace IRaCIS.Core.Application.Services
StudyId = x.StudyId, StudyId = x.StudyId,
InstanceId = x.InstanceId, InstanceId = x.InstanceId,
NumberOfFrames = x.NumberOfFrames, NumberOfFrames = x.NumberOfFrames,
CreateTime=x.CreateTime, CreateTime = x.CreateTime,
}).ToListAsync(); }).ToListAsync();
@ -597,7 +665,7 @@ namespace IRaCIS.Core.Application.Services
var questionMarkList = await _readingTaskQuestionMark.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new StudyInstanceInfo() var questionMarkList = await _readingTaskQuestionMark.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new StudyInstanceInfo()
{ {
ShowOrder = x.ReadingQuestionTrial==null?0: x.ReadingQuestionTrial.ShowOrder, ShowOrder = x.ReadingQuestionTrial == null ? 0 : x.ReadingQuestionTrial.ShowOrder,
RowIndex = 0m, RowIndex = 0m,
SeriesId = x.SeriesId, SeriesId = x.SeriesId,
StudyId = x.StudyId, StudyId = x.StudyId,
@ -667,7 +735,7 @@ namespace IRaCIS.Core.Application.Services
}); });
item.InstanceInfoList = item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x=>x.RowIndex).ThenBy(x=>x.RowDate).ToList(); item.InstanceInfoList = item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).ThenBy(x => x.RowDate).ToList();
item.InstanceCount = item.InstanceInfoList.Count; item.InstanceCount = item.InstanceInfoList.Count;
@ -702,14 +770,14 @@ namespace IRaCIS.Core.Application.Services
#endregion #endregion
}
#region 非Dicom 检查查询 #region 非Dicom 检查查询
var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId && x.NoneDicomFileList.Any(t => !t.FileType.Contains(StaticData.FileType.Zip))) var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId && x.NoneDicomFileList.Any(t => !t.FileType.Contains(StaticData.FileType.Zip)))
.Where(t => t.IsReading) .Where(t => t.IsReading)
.WhereIf(taskInfo.IsImageFilter == true, t => taskInfo.CriterionModalitys.Contains(t.Modality)).ToListAsync(); .WhereIf(taskInfo.IsImageFilter, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
.ToListAsync();
List<VisitStudyDTO> noDicomStudyList = noDicomList.Select(x => new VisitStudyDTO() List<VisitStudyDTO> noDicomStudyList = noDicomList.Select(x => new VisitStudyDTO()
@ -722,20 +790,22 @@ namespace IRaCIS.Core.Application.Services
StudyCode = x.StudyCode, StudyCode = x.StudyCode,
IsDicom = false, IsDicom = false,
BodyPartForEdit=x.BodyPart, BodyPartForEdit = x.BodyPart,
BodyPartForEditOther=x.BodyPartForEditOther BodyPartForEditOther = x.BodyPartForEditOther
}).ToList(); }).ToList();
var isExistTaskNoneDicomFile = _noneDicomStudyFileRepository.Any(t => t.VisitTaskId == indto.VisitTaskId); //var isExistTaskNoneDicomFile = _noneDicomStudyFileRepository.Any(t => t.VisitTaskId == indto.VisitTaskId);
foreach (var item in noDicomStudyList) foreach (var item in noDicomStudyList)
{ {
var nodicom = noDicomList.Where(x => x.Id == item.StudyId).First(); var nodicom = noDicomList.Where(x => x.Id == item.StudyId).First();
var instanceCount = await _noneDicomStudyFileRepository.Where(t => t.IsReading) var instanceCount = await _noneDicomStudyFileRepository.Where(t => t.IsReading)
.WhereIf(isExistTaskNoneDicomFile, x => x.OriginNoneDicomStudyId == item.StudyId) .WhereIf(taskInfo.IsHaveTaskNoneDicomStudyFile == false && taskInfo.IsMarkNoneDicomStudy == true, x => x.ImageLabelNoneDicomStudyId == item.StudyId)
.WhereIf(isExistTaskNoneDicomFile == false, x => x.NoneDicomStudyId == item.StudyId).CountAsync(); .WhereIf(taskInfo.IsHaveTaskNoneDicomStudyFile && taskInfo.IsMarkNoneDicomStudy, x => x.OriginNoneDicomStudyId == item.StudyId)
.WhereIf(taskInfo.IsHaveTaskNoneDicomStudyFile == false && taskInfo.IsMarkNoneDicomStudy == false, x => x.NoneDicomStudyId == item.StudyId)
.CountAsync();
if (instanceCount == 0) if (instanceCount == 0)
{ {
@ -756,8 +826,10 @@ namespace IRaCIS.Core.Application.Services
SubjectVisitId=nodicom.SubjectVisitId, SubjectVisitId=nodicom.SubjectVisitId,
SubjectId=nodicom.SubjectId, SubjectId=nodicom.SubjectId,
SeriesNumber=1, SeriesNumber=1,
NoneDicomFileFirstFile=await _noneDicomStudyFileRepository.WhereIf(isExistTaskNoneDicomFile,x=>x.OriginNoneDicomStudyId== item.StudyId) NoneDicomFileFirstFile=await _noneDicomStudyFileRepository
.WhereIf(isExistTaskNoneDicomFile==false, x=>x.NoneDicomStudyId == item.StudyId) .WhereIf(taskInfo.IsHaveTaskNoneDicomStudyFile == false && taskInfo.IsMarkNoneDicomStudy == true, x => x.ImageLabelNoneDicomStudyId == item.StudyId)
.WhereIf(taskInfo.IsHaveTaskNoneDicomStudyFile && taskInfo.IsMarkNoneDicomStudy, x => x.OriginNoneDicomStudyId == item.StudyId)
.WhereIf(taskInfo.IsHaveTaskNoneDicomStudyFile == false && taskInfo.IsMarkNoneDicomStudy == false, x => x.NoneDicomStudyId == item.StudyId)
.Where(x=> !x.FileType.Contains(StaticData.FileType.Zip)).Select(x=>x.Path).FirstOrDefaultAsync(), .Where(x=> !x.FileType.Contains(StaticData.FileType.Zip)).Select(x=>x.Path).FirstOrDefaultAsync(),
} }

View File

@ -125,7 +125,9 @@ namespace IRaCIS.Core.Application.Service
CreateMap<SCPSeries, DicomSeries>(); CreateMap<SCPSeries, DicomSeries>();
CreateMap<SCPInstance, DicomInstance>(); CreateMap<SCPInstance, DicomInstance>();
CreateMap<DicomStudy, VisitStudyDTO>()
.ForMember(d => d.StudyId, u => u.MapFrom(s => s.Id))
.ForMember(d => d.SeriesList, u => u.MapFrom(s => s.SeriesList));
} }
} }

View File

@ -142,7 +142,7 @@ namespace IRaCIS.Core.Domain.Share
/// </summary> /// </summary>
public enum ClinicalTableQuestionMark public enum ClinicalTableQuestionMark
{ {
Test=1, Test = 1,
} }
/// <summary> /// <summary>
@ -525,6 +525,12 @@ namespace IRaCIS.Core.Domain.Share
//阅片期一致率 //阅片期一致率
ReadingPeriodJudgeRatio_Export = 18, ReadingPeriodJudgeRatio_Export = 18,
TumorCDISC_Export = 20,
IVUS_CDISC_Export = 21,
OCT_CDISC_Export = 22,
} }
@ -668,7 +674,7 @@ namespace IRaCIS.Core.Domain.Share
/// <summary> /// <summary>
/// 分组 /// 分组
/// </summary> /// </summary>
Group=0, Group = 0,
/// <summary> /// <summary>
/// 问题 /// 问题
@ -901,7 +907,7 @@ namespace IRaCIS.Core.Domain.Share
/// <summary> /// <summary>
/// 融合过 再之前任务融合了 /// 融合过 再之前任务融合了
/// </summary> /// </summary>
Merged=3, Merged = 3,
/// <summary> /// <summary>
/// 融合主病灶 /// 融合主病灶
@ -1032,17 +1038,17 @@ namespace IRaCIS.Core.Domain.Share
/// <summary> /// <summary>
/// 存在 /// 存在
/// </summary> /// </summary>
Exist=1, Exist = 1,
/// <summary> /// <summary>
/// 疑似 /// 疑似
/// </summary> /// </summary>
Equivocal=2, Equivocal = 2,
/// <summary> /// <summary>
/// 消失 /// 消失
/// </summary> /// </summary>
Loss =3, Loss = 3,
/// <summary> /// <summary>
/// 无法评估 /// 无法评估
@ -1280,45 +1286,45 @@ namespace IRaCIS.Core.Domain.Share
/// <summary> /// <summary>
/// NA /// NA
/// </summary> /// </summary>
NA=-1, NA = -1,
/// <summary> /// <summary>
/// CMR /// CMR
/// </summary> /// </summary>
CMR=1, CMR = 1,
/// <summary> /// <summary>
/// PMR /// PMR
/// </summary> /// </summary>
PMR=2, PMR = 2,
/// <summary> /// <summary>
/// NMR /// NMR
/// </summary> /// </summary>
NMR=3, NMR = 3,
/// <summary> /// <summary>
/// PMD /// PMD
/// </summary> /// </summary>
PMD=4, PMD = 4,
/// <summary> /// <summary>
/// NE /// NE
/// </summary> /// </summary>
NE=5, NE = 5,
/// <summary> /// <summary>
/// ND /// ND
/// </summary> /// </summary>
ND=6, ND = 6,
} }
/// <summary> /// <summary>
/// 与基线相比摄取值变化 /// 与基线相比摄取值变化
/// </summary> /// </summary>
public enum SUVChangeVSBaseline public enum SUVChangeVSBaseline
{ {
/// <summary> /// <summary>
/// 增大 /// 增大
@ -1340,7 +1346,7 @@ public enum SUVChangeVSBaseline
/// </summary> /// </summary>
NotEvaluable = 4, NotEvaluable = 4,
NA=5, NA = 5,
} }
/// <summary> /// <summary>
@ -1599,15 +1605,15 @@ public enum SUVChangeVSBaseline
/// </summary> /// </summary>
ND = 5, ND = 5,
iCR=6, iCR = 6,
iPR=7, iPR = 7,
iSD=8, iSD = 8,
iUPD=9, iUPD = 9,
iCPD=10, iCPD = 10,
} }
@ -1822,7 +1828,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 不显示 /// 不显示
/// </summary> /// </summary>
NotShow =3, NotShow = 3,
} }
@ -1934,7 +1940,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 基线病灶 /// 基线病灶
/// </summary> /// </summary>
BaselineLesions=4, BaselineLesions = 4,
/// <summary> /// <summary>
/// 新靶病灶 /// 新靶病灶
@ -1974,7 +1980,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 脂质角度 /// 脂质角度
/// </summary> /// </summary>
LipidAngle =111, LipidAngle = 111,
/// <summary> /// <summary>
/// FCT /// FCT
@ -2045,7 +2051,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 检查 /// 检查
/// </summary> /// </summary>
Study=4, Study = 4,
} }
/// <summary> /// <summary>
@ -2083,22 +2089,22 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 存在 /// 存在
/// </summary> /// </summary>
Exist=1, Exist = 1,
/// <summary> /// <summary>
/// 消失 /// 消失
/// </summary> /// </summary>
Loss=2, Loss = 2,
/// <summary> /// <summary>
/// 无法评估 /// 无法评估
/// </summary> /// </summary>
NotEvaluable=3, NotEvaluable = 3,
/// <summary> /// <summary>
/// 太小 /// 太小
/// </summary> /// </summary>
TooSmall=4, TooSmall = 4,
} }
/// <summary> /// <summary>
@ -2198,7 +2204,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 病灶数量 /// 病灶数量
/// </summary> /// </summary>
LesionNumber =11, LesionNumber = 11,
/// <summary> /// <summary>
/// PPD /// PPD
@ -2324,7 +2330,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 平均最小FCT /// 平均最小FCT
/// </summary> /// </summary>
AvgMinFCT=1018, AvgMinFCT = 1018,
/// <summary> /// <summary>
/// 脂质角度平均值 /// 脂质角度平均值
@ -2337,7 +2343,7 @@ public enum SUVChangeVSBaseline
MaxAvgLipidAngle = 1020, MaxAvgLipidAngle = 1020,
/// <summary> /// <summary>
/// 待定指标 /// 斑块类型
/// </summary> /// </summary>
Undetermined = 1021, Undetermined = 1021,
@ -2450,22 +2456,22 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 0级 /// 0级
/// </summary> /// </summary>
Level0=1, Level0 = 1,
/// <summary> /// <summary>
/// 1级 /// 1级
/// </summary> /// </summary>
Level1=2, Level1 = 2,
/// <summary> /// <summary>
/// 2级 /// 2级
/// </summary> /// </summary>
Level2=3, Level2 = 3,
/// <summary> /// <summary>
/// 3级 /// 3级
/// </summary> /// </summary>
Level3=4, Level3 = 4,
} }
@ -2483,7 +2489,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 扫描断层丢失 /// 扫描断层丢失
/// </summary> /// </summary>
MissingScanSlice=2, MissingScanSlice = 2,
/// <summary> /// <summary>
/// 存在运动伪影 /// 存在运动伪影
@ -2498,7 +2504,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 其它(需要备注) /// 其它(需要备注)
/// </summary> /// </summary>
OtherIssuesCommentsRequired=5, OtherIssuesCommentsRequired = 5,
/// <summary> /// <summary>
/// PET-CT影像无法融合 /// PET-CT影像无法融合
@ -2616,7 +2622,7 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 疗效评估分组 /// 疗效评估分组
/// </summary> /// </summary>
TherapeuticEffectEvaluationGroup=20, TherapeuticEffectEvaluationGroup = 20,
/// <summary> /// <summary>
/// 访视点肿瘤评估 /// 访视点肿瘤评估
@ -2731,12 +2737,12 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// 是否脑转移 /// 是否脑转移
/// </summary> /// </summary>
IsBrainMetastasis =43, IsBrainMetastasis = 43,
/// <summary> /// <summary>
/// 影像质量评估 /// 影像质量评估
/// </summary> /// </summary>
ImageQualityAssessment=44, ImageQualityAssessment = 44,
/// <summary> /// <summary>
/// Forrest出血部位 /// Forrest出血部位
@ -2858,6 +2864,26 @@ public enum SUVChangeVSBaseline
/// </summary> /// </summary>
Plaque3MinFCT = 1008, Plaque3MinFCT = 1008,
/// <summary>
/// 靶段
/// </summary>
TargetSegment = 1009,
/// <summary>
/// 回撤中的图像帧数
/// </summary>
PullbackFrameCount = 1010,
/// <summary>
/// 分析图像帧数
/// </summary>
AnalysisFrameCount = 1011,
/// <summary>
/// 靶段 备注
/// </summary>
TargetSegmentRemarks = 1012,
/// <summary> /// <summary>
/// 脂肪分数总平均值 /// 脂肪分数总平均值
/// </summary> /// </summary>
@ -2871,10 +2897,10 @@ public enum SUVChangeVSBaseline
/// <summary> /// <summary>
/// PET 5PS 评分 /// PET 5PS 评分
/// </summary> /// </summary>
public enum PET5PSScore public enum PET5PSScore
{ {
/// <summary> /// <summary>
/// 5分 /// 5分
@ -2991,7 +3017,7 @@ public enum PET5PSScore
/// <summary> /// <summary>
/// 测量值 /// 测量值
/// </summary> /// </summary>
MeasuredValue =8, MeasuredValue = 8,
/// <summary> /// <summary>
/// 斑块数据统计 /// 斑块数据统计
@ -3011,7 +3037,7 @@ public enum PET5PSScore
/// <summary> /// <summary>
/// 保存eCRF /// 保存eCRF
/// </summary> /// </summary>
SaveEICRFQuestions=12, SaveEICRFQuestions = 12,
} }
/// <summary> /// <summary>

View File

@ -11,6 +11,11 @@ public class NoneDicomStudy : BaseFullDeleteAuditEntity
[JsonIgnore] [JsonIgnore]
public List<NoneDicomStudyFile> TaskNoneDicomFileList { get; set; } public List<NoneDicomStudyFile> TaskNoneDicomFileList { get; set; }
[JsonIgnore]
public List<NoneDicomStudyFile> ImageLabelNoneDicomFileList { get; set; }
[JsonIgnore] [JsonIgnore]
public SubjectVisit SubjectVisit { get; set; } public SubjectVisit SubjectVisit { get; set; }
[JsonIgnore] [JsonIgnore]

View File

@ -14,6 +14,16 @@ public class NoneDicomStudyFile : BaseAddDeleteAuditEntity
[ForeignKey("OriginNoneDicomStudyId")] [ForeignKey("OriginNoneDicomStudyId")]
[JsonIgnore] [JsonIgnore]
public NoneDicomStudy OriginNoneDicomStudy { get; set; } public NoneDicomStudy OriginNoneDicomStudy { get; set; }
[ForeignKey("ImageLabelNoneDicomStudyId")]
[JsonIgnore]
public NoneDicomStudy ImageMarkNoneDicomStudy { get; set; }
//[ForeignKey("ImageMarkSubjectVisitId")]
//[JsonIgnore]
//public SubjectVisit ImageMarkSubjectVisit { get; set; }
#endregion #endregion
public Guid NoneDicomStudyId { get; set; } public Guid NoneDicomStudyId { get; set; }
@ -33,5 +43,13 @@ public class NoneDicomStudyFile : BaseAddDeleteAuditEntity
[Comment("为了不影响原始检查,跟任务绑定的 NoneDicomStudyId 为guid空 这个字段记录跟原始检查绑")] [Comment("为了不影响原始检查,跟任务绑定的 NoneDicomStudyId 为guid空 这个字段记录跟原始检查绑")]
public Guid? OriginNoneDicomStudyId { get; set; } public Guid? OriginNoneDicomStudyId { get; set; }
#endregion #endregion
#region 影像预处理访视Id NoneDicomStudyId 为guid空
//public Guid? ImageMarkSubjectVisitId { get; set; }
public Guid? ImageLabelNoneDicomStudyId { get; set; }
#endregion
} }

View File

@ -12,6 +12,11 @@ public class TaskInstance : BaseFullAuditEntity, IEntitySeqId
[JsonIgnore] [JsonIgnore]
[ForeignKey("StudyId")] [ForeignKey("StudyId")]
public TaskStudy TaskStudy { get; set; } public TaskStudy TaskStudy { get; set; }
[JsonIgnore]
[ForeignKey("SubjectVisitId")]
public SubjectVisit SubjectVisit { get; set; }
#endregion #endregion
public Guid SeqId { get; set; } public Guid SeqId { get; set; }
@ -37,6 +42,8 @@ public class TaskInstance : BaseFullAuditEntity, IEntitySeqId
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
public Guid? SubjectVisitId { get; set; }
public Guid VisitTaskId { get; set; } public Guid VisitTaskId { get; set; }
public bool Anonymize { get; set; } public bool Anonymize { get; set; }
public string Path { get; set; } = string.Empty; public string Path { get; set; } = string.Empty;

View File

@ -11,9 +11,16 @@ public class TaskSeries : BaseFullDeleteAuditEntity, IEntitySeqId
[JsonIgnore] [JsonIgnore]
public List<TaskInstance> InstanceList { get; set; } public List<TaskInstance> InstanceList { get; set; }
[JsonIgnore]
[ForeignKey("SubjectVisitId")]
public SubjectVisit SubjectVisit { get; set; }
#endregion #endregion
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
public Guid? SubjectVisitId { get; set; }
public Guid VisitTaskId { get; set; } public Guid VisitTaskId { get; set; }
public Guid SeqId { get; set; } public Guid SeqId { get; set; }
public Guid StudyId { get; set; } public Guid StudyId { get; set; }

View File

@ -19,11 +19,18 @@ public class TaskStudy : BaseFullDeleteAuditEntity, IEntitySeqId
[JsonIgnore] [JsonIgnore]
[ForeignKey("SubjectId")] [ForeignKey("SubjectId")]
public Subject Subject { get; set; } public Subject Subject { get; set; }
[JsonIgnore]
[ForeignKey("SubjectVisitId")]
public SubjectVisit SubjectVisit { get; set; }
#endregion #endregion
public Guid SeqId { get; set; } public Guid SeqId { get; set; }
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
public Guid? SubjectVisitId { get; set; }
public Guid VisitTaskId { get; set; } public Guid VisitTaskId { get; set; }
public int Code { get; set; } = 0; public int Code { get; set; } = 0;

View File

@ -11,6 +11,18 @@ public class ReadingTableAnswerRowInfo : BaseFullDeleteAuditEntity
[ForeignKey("InstanceId")] [ForeignKey("InstanceId")]
public DicomInstance Instance { get; set; } public DicomInstance Instance { get; set; }
[JsonIgnore]
[ForeignKey("SeriesId")]
public DicomSeries DicomSeries { get; set; }
/// <summary>
/// studyId 关联 dicom 和非dicom 这里为了查询方便默认查询非dicom dicom 通过序列查询
/// </summary>
[JsonIgnore]
[ForeignKey("StudyId")]
public NoneDicomStudy NoneDicomStudy { get; set; }
[JsonIgnore] [JsonIgnore]
[ForeignKey("OrganInfoId")] [ForeignKey("OrganInfoId")]
public OrganInfo OrganInfo { get; set; } public OrganInfo OrganInfo { get; set; }

View File

@ -6,6 +6,10 @@ namespace IRaCIS.Core.Domain.Models;
public class SubjectVisit : BaseFullDeleteAuditEntity public class SubjectVisit : BaseFullDeleteAuditEntity
{ {
#region 导航属性 #region 导航属性
[JsonIgnore]
public List<TaskStudy> TaskStudyList { get; set; }
[JsonIgnore] [JsonIgnore]
public List<TrialQCQuestionAnswer> TrialQCQuestionAnswerList { get; set; } public List<TrialQCQuestionAnswer> TrialQCQuestionAnswerList { get; set; }

View File

@ -262,7 +262,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
var entity = item.Entity as ReadingImportFile; var entity = item.Entity as ReadingImportFile;
var visitTaskInfo = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Include(x=>x.DoctorUser).FirstOrDefaultAsync(); var visitTaskInfo = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Include(x => x.DoctorUser).FirstOrDefaultAsync();
await InsertInspection<ReadingImportFile>(entity, type, x => new InspectionConvertDTO() await InsertInspection<ReadingImportFile>(entity, type, x => new InspectionConvertDTO()
{ {
@ -2533,20 +2533,35 @@ namespace IRaCIS.Core.Infra.EFCore.Common
var extraIdentification = string.Empty; var extraIdentification = string.Empty;
Arm armEnum = Arm.SingleReadingArm;
Guid? subjectVisitId = null;
Arm? armEnum = Arm.SingleReadingArm;
if (entity.VisitTaskId != null) if (entity.VisitTaskId != null)
{ {
extraIdentification = "/VisitTask"; extraIdentification = "/VisitTask";
armEnum = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Select(x => x.ArmEnum).FirstOrDefaultAsync(); var obj = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Select(x => new { x.ArmEnum, x.SourceSubjectVisitId }).FirstOrDefaultAsync();
armEnum = obj?.ArmEnum;
subjectVisitId = obj.SourceSubjectVisitId;
} }
else if (entity.ImageLabelNoneDicomStudyId != null)
{
//默认R0
extraIdentification = "/VisitTask";
//var noneDicomStudy = await _dbContext.NoneDicomStudy.FindAsync(entity.NoneDicomStudyId); subjectVisitId = await _dbContext.NoneDicomStudy.Where(x => x.Id == entity.ImageLabelNoneDicomStudyId).Select(t => t.SubjectVisitId).FirstOrDefaultAsync();
}
else
{
subjectVisitId = (await _dbContext.NoneDicomStudy.FindAsync(entity.NoneDicomStudyId))?.SubjectVisitId;
}
await InsertInspection<NoneDicomStudyFile>(item.Entity as NoneDicomStudyFile, type, x => new InspectionConvertDTO() await InsertInspection<NoneDicomStudyFile>(item.Entity as NoneDicomStudyFile, type, x => new InspectionConvertDTO()
{ {
//SubjectVisitId = noneDicomStudy.SubjectVisitId, SubjectVisitId = subjectVisitId,
//SubjectId = noneDicomStudy.SubjectId, //SubjectId = noneDicomStudy.SubjectId,
ObjectRelationParentId = x.VisitTaskId, VisitTaskId= x.VisitTaskId,
ObjectRelationParentId = subjectVisitId,
ObjectRelationParentId2 = x.NoneDicomStudyId, ObjectRelationParentId2 = x.NoneDicomStudyId,
ObjectRelationParentId3 = x.OriginNoneDicomStudyId, ObjectRelationParentId3 = x.OriginNoneDicomStudyId,
ExtraIndentification = extraIdentification ExtraIndentification = extraIdentification
@ -3696,7 +3711,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
string questionName = string.Empty; string questionName = string.Empty;
string questionAnswer = string.Empty; string questionAnswer = string.Empty;
if (thisQuestinonAnswer != null&& question!=null) if (thisQuestinonAnswer != null && question != null)
{ {
questionName = _userInfo.IsEn_Us ? question.QuestionEnName : question.QuestionName; questionName = _userInfo.IsEn_Us ? question.QuestionEnName : question.QuestionName;
questionAnswer = Translationunit(question.Type, question.Unit, question.CustomUnit, unitDataList, thisQuestinonAnswer.Answer); questionAnswer = Translationunit(question.Type, question.Unit, question.CustomUnit, unitDataList, thisQuestinonAnswer.Answer);
@ -3857,7 +3872,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
entity.OrderMark = await _dbContext.ReadingQuestionTrial.Where(x => x.Id == entity.QuestionId).Select(x => x.OrderMark).FirstOrDefaultAsync(); entity.OrderMark = await _dbContext.ReadingQuestionTrial.Where(x => x.Id == entity.QuestionId).Select(x => x.OrderMark).FirstOrDefaultAsync();
entity.RowMark = entity.OrderMark+ entity.RowIndex.GetLesionMark(); entity.RowMark = entity.OrderMark + entity.RowIndex.GetLesionMark();
string extraIdentification = string.Empty; string extraIdentification = string.Empty;

View File

@ -42,7 +42,7 @@ public class DicomInstanceConfigration : IEntityTypeConfiguration<DicomInstance>
{ {
builder.HasKey(e => e.SeqId); builder.HasKey(e => e.SeqId);
builder.HasOne(e => e.DicomStudy).WithMany(c=>c.InstanceList).HasForeignKey(t=>t.StudyId).HasPrincipalKey(st => st.Id); builder.HasOne(e => e.DicomStudy).WithMany(c => c.InstanceList).HasForeignKey(t => t.StudyId).HasPrincipalKey(st => st.Id);
builder.HasMany(s => s.ReadingTableAnswerRowInfoList).WithOne(di => di.Instance).HasForeignKey(t => t.InstanceId).HasPrincipalKey(se => se.Id); builder.HasMany(s => s.ReadingTableAnswerRowInfoList).WithOne(di => di.Instance).HasForeignKey(t => t.InstanceId).HasPrincipalKey(se => se.Id);
@ -76,7 +76,7 @@ public class TaskInstanceConfigration : IEntityTypeConfiguration<TaskInstance>
{ {
builder.HasKey(e => e.SeqId); builder.HasKey(e => e.SeqId);
builder.HasOne(e => e.TaskStudy).WithMany(t=>t.InstanceList).HasForeignKey(t => t.StudyId).HasPrincipalKey(st => st.Id); builder.HasOne(e => e.TaskStudy).WithMany(t => t.InstanceList).HasForeignKey(t => t.StudyId).HasPrincipalKey(st => st.Id);
} }
} }
@ -112,6 +112,18 @@ public class SCPInstanceConfigration : IEntityTypeConfiguration<SCPInstance>
} }
public class ReadingTableAnswerRowInfoConfigration : IEntityTypeConfiguration<ReadingTableAnswerRowInfo>
{
public void Configure(EntityTypeBuilder<ReadingTableAnswerRowInfo> builder)
{
builder.HasOne(e => e.DicomSeries).WithMany().HasForeignKey(t => t.SeriesId).HasPrincipalKey(st => st.Id);
//builder.HasOne(e => e.Instance).WithMany().HasForeignKey(t => t.InstanceId).HasPrincipalKey(st => st.Id);
}
}

View File

@ -31,6 +31,10 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
//同样一个实体 有两个相同的类型的导航属性,需要手动配置 //同样一个实体 有两个相同的类型的导航属性,需要手动配置
builder.HasMany(t => t.NoneDicomFileList).WithOne(s => s.NoneDicomStudy).HasForeignKey(t => t.NoneDicomStudyId); builder.HasMany(t => t.NoneDicomFileList).WithOne(s => s.NoneDicomStudy).HasForeignKey(t => t.NoneDicomStudyId);
builder.HasMany(t => t.TaskNoneDicomFileList).WithOne(s => s.OriginNoneDicomStudy).HasForeignKey(t => t.OriginNoneDicomStudyId); builder.HasMany(t => t.TaskNoneDicomFileList).WithOne(s => s.OriginNoneDicomStudy).HasForeignKey(t => t.OriginNoneDicomStudyId);
builder.HasMany(t => t.ImageLabelNoneDicomFileList).WithOne(s => s.ImageMarkNoneDicomStudy).HasForeignKey(t => t.ImageLabelNoneDicomStudyId);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,160 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class octadd : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<Guid>(
name: "SubjectVisitId",
table: "TaskStudy",
type: "uniqueidentifier",
nullable: true);
migrationBuilder.AddColumn<Guid>(
name: "SubjectVisitId",
table: "TaskSeries",
type: "uniqueidentifier",
nullable: true);
migrationBuilder.AddColumn<Guid>(
name: "SubjectVisitId",
table: "TaskInstance",
type: "uniqueidentifier",
nullable: true);
migrationBuilder.AddColumn<Guid>(
name: "ImageLabelNoneDicomStudyId",
table: "NoneDicomStudyFile",
type: "uniqueidentifier",
nullable: true);
//migrationBuilder.CreateIndex(
// name: "IX_TrialCriterionKeyFile_TrialCriterionId",
// table: "TrialCriterionKeyFile",
// column: "TrialCriterionId");
//migrationBuilder.CreateIndex(
// name: "IX_TaskStudy_SubjectVisitId",
// table: "TaskStudy",
// column: "SubjectVisitId");
//migrationBuilder.CreateIndex(
// name: "IX_TaskSeries_SubjectVisitId",
// table: "TaskSeries",
// column: "SubjectVisitId");
//migrationBuilder.CreateIndex(
// name: "IX_TaskInstance_SubjectVisitId",
// table: "TaskInstance",
// column: "SubjectVisitId");
//migrationBuilder.CreateIndex(
// name: "IX_NoneDicomStudyFile_ImageLabelNoneDicomStudyId",
// table: "NoneDicomStudyFile",
// column: "ImageLabelNoneDicomStudyId");
//migrationBuilder.AddForeignKey(
// name: "FK_NoneDicomStudyFile_NoneDicomStudy_ImageLabelNoneDicomStudyId",
// table: "NoneDicomStudyFile",
// column: "ImageLabelNoneDicomStudyId",
// principalTable: "NoneDicomStudy",
// principalColumn: "Id");
//migrationBuilder.AddForeignKey(
// name: "FK_TaskInstance_SubjectVisit_SubjectVisitId",
// table: "TaskInstance",
// column: "SubjectVisitId",
// principalTable: "SubjectVisit",
// principalColumn: "Id");
//migrationBuilder.AddForeignKey(
// name: "FK_TaskSeries_SubjectVisit_SubjectVisitId",
// table: "TaskSeries",
// column: "SubjectVisitId",
// principalTable: "SubjectVisit",
// principalColumn: "Id");
//migrationBuilder.AddForeignKey(
// name: "FK_TaskStudy_SubjectVisit_SubjectVisitId",
// table: "TaskStudy",
// column: "SubjectVisitId",
// principalTable: "SubjectVisit",
// principalColumn: "Id");
//migrationBuilder.AddForeignKey(
// name: "FK_TrialCriterionKeyFile_ReadingQuestionCriterionTrial_TrialCriterionId",
// table: "TrialCriterionKeyFile",
// column: "TrialCriterionId",
// principalTable: "ReadingQuestionCriterionTrial",
// principalColumn: "Id",
// onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
//migrationBuilder.DropForeignKey(
// name: "FK_NoneDicomStudyFile_NoneDicomStudy_ImageLabelNoneDicomStudyId",
// table: "NoneDicomStudyFile");
//migrationBuilder.DropForeignKey(
// name: "FK_TaskInstance_SubjectVisit_SubjectVisitId",
// table: "TaskInstance");
//migrationBuilder.DropForeignKey(
// name: "FK_TaskSeries_SubjectVisit_SubjectVisitId",
// table: "TaskSeries");
//migrationBuilder.DropForeignKey(
// name: "FK_TaskStudy_SubjectVisit_SubjectVisitId",
// table: "TaskStudy");
//migrationBuilder.DropForeignKey(
// name: "FK_TrialCriterionKeyFile_ReadingQuestionCriterionTrial_TrialCriterionId",
// table: "TrialCriterionKeyFile");
//migrationBuilder.DropIndex(
// name: "IX_TrialCriterionKeyFile_TrialCriterionId",
// table: "TrialCriterionKeyFile");
//migrationBuilder.DropIndex(
// name: "IX_TaskStudy_SubjectVisitId",
// table: "TaskStudy");
//migrationBuilder.DropIndex(
// name: "IX_TaskSeries_SubjectVisitId",
// table: "TaskSeries");
//migrationBuilder.DropIndex(
// name: "IX_TaskInstance_SubjectVisitId",
// table: "TaskInstance");
//migrationBuilder.DropIndex(
// name: "IX_NoneDicomStudyFile_ImageLabelNoneDicomStudyId",
// table: "NoneDicomStudyFile");
migrationBuilder.DropColumn(
name: "SubjectVisitId",
table: "TaskStudy");
migrationBuilder.DropColumn(
name: "SubjectVisitId",
table: "TaskSeries");
migrationBuilder.DropColumn(
name: "SubjectVisitId",
table: "TaskInstance");
migrationBuilder.DropColumn(
name: "ImageLabelNoneDicomStudyId",
table: "NoneDicomStudyFile");
}
}
}

View File

@ -3538,6 +3538,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasMaxLength(400) .HasMaxLength(400)
.HasColumnType("nvarchar(400)"); .HasColumnType("nvarchar(400)");
b.Property<Guid?>("ImageLabelNoneDicomStudyId")
.HasColumnType("uniqueidentifier");
b.Property<bool>("IsDeleted") b.Property<bool>("IsDeleted")
.HasColumnType("bit"); .HasColumnType("bit");
@ -3563,6 +3566,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("CreateUserId"); b.HasIndex("CreateUserId");
b.HasIndex("ImageLabelNoneDicomStudyId");
b.HasIndex("NoneDicomStudyId"); b.HasIndex("NoneDicomStudyId");
b.HasIndex("OriginNoneDicomStudyId"); b.HasIndex("OriginNoneDicomStudyId");
@ -10570,6 +10575,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<Guid>("SubjectId") b.Property<Guid>("SubjectId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid?>("SubjectVisitId")
.HasColumnType("uniqueidentifier");
b.Property<string>("TransferSytaxUID") b.Property<string>("TransferSytaxUID")
.IsRequired() .IsRequired()
.HasMaxLength(400) .HasMaxLength(400)
@ -10605,6 +10613,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("StudyId"); b.HasIndex("StudyId");
b.HasIndex("SubjectVisitId");
b.ToTable("TaskInstance", t => b.ToTable("TaskInstance", t =>
{ {
t.HasComment("项目阅片 - 任务后处理Instance"); t.HasComment("项目阅片 - 任务后处理Instance");
@ -10927,6 +10937,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<Guid>("SubjectId") b.Property<Guid>("SubjectId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid?>("SubjectVisitId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("TrialId") b.Property<Guid>("TrialId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -10950,6 +10963,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("StudyId"); b.HasIndex("StudyId");
b.HasIndex("SubjectVisitId");
b.ToTable("TaskSeries", t => b.ToTable("TaskSeries", t =>
{ {
t.HasComment("项目阅片 - 任务后上传序列"); t.HasComment("项目阅片 - 任务后上传序列");
@ -11100,6 +11115,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<Guid>("SubjectId") b.Property<Guid>("SubjectId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid?>("SubjectVisitId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("TrialId") b.Property<Guid>("TrialId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
@ -11123,6 +11141,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("SubjectId"); b.HasIndex("SubjectId");
b.HasIndex("SubjectVisitId");
b.HasIndex("VisitTaskId"); b.HasIndex("VisitTaskId");
b.ToTable("TaskStudy", t => b.ToTable("TaskStudy", t =>
@ -11980,6 +12000,42 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.ToTable("TrialCriterionDictionaryCode"); b.ToTable("TrialCriterionDictionaryCode");
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialCriterionKeyFile", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime2");
b.Property<Guid>("CreateUserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("FileName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("FilePath")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<Guid>("TrialCriterionId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("CreateUserId");
b.HasIndex("TrialCriterionId");
b.ToTable("TrialCriterionKeyFile", t =>
{
t.HasComment("项目标准阅片关键点文件");
});
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialDicomAE", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialDicomAE", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@ -16221,6 +16277,10 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.NoneDicomStudy", "ImageMarkNoneDicomStudy")
.WithMany("ImageLabelNoneDicomFileList")
.HasForeignKey("ImageLabelNoneDicomStudyId");
b.HasOne("IRaCIS.Core.Domain.Models.NoneDicomStudy", "NoneDicomStudy") b.HasOne("IRaCIS.Core.Domain.Models.NoneDicomStudy", "NoneDicomStudy")
.WithMany("NoneDicomFileList") .WithMany("NoneDicomFileList")
.HasForeignKey("NoneDicomStudyId") .HasForeignKey("NoneDicomStudyId")
@ -16237,6 +16297,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("CreateUserRole"); b.Navigation("CreateUserRole");
b.Navigation("ImageMarkNoneDicomStudy");
b.Navigation("NoneDicomStudy"); b.Navigation("NoneDicomStudy");
b.Navigation("OriginNoneDicomStudy"); b.Navigation("OriginNoneDicomStudy");
@ -18315,8 +18377,14 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.SubjectVisit", "SubjectVisit")
.WithMany()
.HasForeignKey("SubjectVisitId");
b.Navigation("CreateUserRole"); b.Navigation("CreateUserRole");
b.Navigation("SubjectVisit");
b.Navigation("TaskSeries"); b.Navigation("TaskSeries");
b.Navigation("TaskStudy"); b.Navigation("TaskStudy");
@ -18395,8 +18463,14 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.SubjectVisit", "SubjectVisit")
.WithMany()
.HasForeignKey("SubjectVisitId");
b.Navigation("CreateUserRole"); b.Navigation("CreateUserRole");
b.Navigation("SubjectVisit");
b.Navigation("TaskStudy"); b.Navigation("TaskStudy");
}); });
@ -18414,6 +18488,10 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.SubjectVisit", "SubjectVisit")
.WithMany("TaskStudyList")
.HasForeignKey("SubjectVisitId");
b.HasOne("IRaCIS.Core.Domain.Models.VisitTask", "VisitTask") b.HasOne("IRaCIS.Core.Domain.Models.VisitTask", "VisitTask")
.WithMany("TaskStudyList") .WithMany("TaskStudyList")
.HasForeignKey("VisitTaskId") .HasForeignKey("VisitTaskId")
@ -18424,6 +18502,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("Subject"); b.Navigation("Subject");
b.Navigation("SubjectVisit");
b.Navigation("VisitTask"); b.Navigation("VisitTask");
}); });
@ -18675,6 +18755,25 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("TrialReadingCriterion"); b.Navigation("TrialReadingCriterion");
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialCriterionKeyFile", b =>
{
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
.WithMany()
.HasForeignKey("CreateUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial", "TrialReadingCriterion")
.WithMany("KeyFileList")
.HasForeignKey("TrialCriterionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("CreateUserRole");
b.Navigation("TrialReadingCriterion");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialDicomAE", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialDicomAE", b =>
{ {
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole") b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
@ -19973,6 +20072,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
modelBuilder.Entity("IRaCIS.Core.Domain.Models.NoneDicomStudy", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.NoneDicomStudy", b =>
{ {
b.Navigation("ImageLabelNoneDicomFileList");
b.Navigation("NoneDicomFileList"); b.Navigation("NoneDicomFileList");
b.Navigation("TaskNoneDicomFileList"); b.Navigation("TaskNoneDicomFileList");
@ -20021,6 +20122,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
modelBuilder.Entity("IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial", b =>
{ {
b.Navigation("KeyFileList");
b.Navigation("TrialClinicalDataSetCriterionList"); b.Navigation("TrialClinicalDataSetCriterionList");
b.Navigation("TrialCriterionAdditionalAssessmentTypeList"); b.Navigation("TrialCriterionAdditionalAssessmentTypeList");
@ -20129,6 +20232,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("SubjectVisitImageBackRecordList"); b.Navigation("SubjectVisitImageBackRecordList");
b.Navigation("TaskStudyList");
b.Navigation("TrialQCQuestionAnswerList"); b.Navigation("TrialQCQuestionAnswerList");
b.Navigation("VisitTaskList"); b.Navigation("VisitTaskList");

View File

@ -1,6 +1,7 @@
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson; using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
@ -75,6 +76,13 @@ namespace IRaCIS.Core.Infrastructure.Extention
foreach (PropertyInfo property in properties) foreach (PropertyInfo property in properties)
{ {
//质控导出需要集合
// if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType)
//&& property.PropertyType != typeof(string))
// {
// continue;
// }
string propertyName = property.Name; string propertyName = property.Name;
object propertyValue = property.GetValue(obj); object propertyValue = property.GetValue(obj);
// 如果属性的类型是枚举,将其值保留为整数 // 如果属性的类型是枚举,将其值保留为整数

View File

@ -306,6 +306,15 @@ public static class StaticData
public const string SystenMedicalQCQuestionsList_Export = "SystenMedicalQCQuestionsList_Export"; public const string SystenMedicalQCQuestionsList_Export = "SystenMedicalQCQuestionsList_Export";
//一致性全量核查导出
public const string TrialConsistentFUllCheckList_Export = "TrialConsistentFUllCheckList_Export";
public const string TumorCDISC_Export = "TumorCDISC_Export";
public const string IVUS_CDISC_Export = "IVUS_CDISC_Export";
public const string OCT_CDISC_Export = "OCT_CDISC_Export";
} }