Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC

IRC_NewDev
hang 2023-10-26 10:04:52 +08:00
commit 551eb3851b
28 changed files with 1411 additions and 193 deletions

View File

@ -208,7 +208,7 @@ namespace IRaCIS.Api.Controllers
[HttpGet("user/GenerateSTS")]
public IResponseOutput GenerateSTS(IOptionsMonitor<AliyunOssOptions> options )
public IResponseOutput GenerateSTS([FromServices]IOptionsMonitor<AliyunOssOptions> options )
{
var ossOptions = options.CurrentValue;

View File

@ -709,6 +709,38 @@ namespace IRaCIS.Core.API.Controllers
#region 医生文件上传下载
#region DTO
public class DoctorDownloadInfo
{
public Guid Id { get; set; }
public string Name { get; set; }
public string ReviewerCode { get; set; }
public List<DownloadFileInfo> FileList { get; set; }
}
public class DownloadFileInfo
{
public string FileName { get; set; }
public string Path { get; set; }
}
public class GetDoctorPathCommand
{
public int Language { get; set; }
public List<Guid> DoctorIdList { get; set; }
}
public class GetDoctoreAttachPathCommand
{
public Guid DoctorId { get; set; }
public List<Guid> AttachmentIdList { get; set; }
}
#endregion
/// <summary>医生文件上传下载</summary>
[ApiExplorerSettings(GroupName = "Common")]
[ApiController]
@ -723,55 +755,98 @@ namespace IRaCIS.Core.API.Controllers
private readonly IFileService _fileService;
public FileController(IMapper mapper, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IFileService fileService)
{
_fileService = fileService;
_hostEnvironment = hostEnvironment;
_mapper = mapper;
_userInfo = userInfo;
}
/// <summary>
/// 上传文件[FileUpload]
/// New 医生首页 多选 获取多个医生信息+文件路径列表 医生压缩包名称 doctorCode + "_" + doctorName _(时间戳或者随机的Guid)
/// </summary>
/// <param name="attachmentType">附件类型</param>
/// <param name="doctorId">医生Id</param>
/// <returns>返回文件信息</returns>
[HttpPost, Route("file/UploadFile/{attachmentType}/{doctorId}")]
[DisableFormValueModelBinding]
[DisableRequestSizeLimit]
public async Task<IResponseOutput> UploadOrdinaryFile(string attachmentType, Guid doctorId)
/// <returns></returns>
[HttpPost, Route("file/GetOfficialResume")]
public async Task<IResponseOutput<List<DoctorDownloadInfo>>> GetOfficialResume(GetDoctorPathCommand command,
[FromServices] IRepository<Attachment> _attachmentrepository)
{
return await SingleFileUploadAsync((fileName) => FileStoreHelper.GetDoctorOrdinaryFilePath(_hostEnvironment, fileName, doctorId, attachmentType));
var list = await _attachmentrepository.Where(t => command.DoctorIdList.Contains(t.DoctorId) && command.Language==t.Language).GroupBy(t => new { Name = t.Doctor.FirstName + "_" + t.Doctor.LastName, ReviewerCode = t.Doctor.ReviewerCode, t.DoctorId })
.Select(g => new DoctorDownloadInfo()
{
Id = g.Key.DoctorId,
Name = g.Key.Name,
ReviewerCode = g.Key.ReviewerCode,
FileList = g.Select(t => new DownloadFileInfo() { FileName = t.FileName, Path = t.Path }).ToList()
}).ToListAsync();
return ResponseOutput.Ok(list);
}
/// <summary>
/// 上传文件( 不是医生个人的文件)[FileUpload]
/// 例如:阅片章程等
/// New 项目入组 获取医生简历
/// </summary>
/// <param name="type">文件类型</param>
/// <param name="command"></param>
/// <param name="_doctorService"></param>
/// <param name="_attachmentrepository"></param>
/// <returns></returns>
[HttpPost, Route("file/UploadNonDoctorFile/{type}")]
[DisableFormValueModelBinding]
[DisableRequestSizeLimit]
public async Task<IResponseOutput> UploadNonDoctorFile(string type)
[HttpPost,Route("file/GetTrialDoctorOfficialResume")]
public async Task<IResponseOutput<List<DoctorDownloadInfo>>> GetTrialDoctorOfficialResume(GetDoctorPathCommand command,
[FromServices] IDoctorService _doctorService,
[FromServices] IRepository<Attachment> _attachmentrepository)
{
return await SingleFileUploadAsync((fileName) => FileStoreHelper.GetNonDoctorFilePath(_hostEnvironment, fileName, type));
var list = await _attachmentrepository.Where(t => command.DoctorIdList.Contains(t.DoctorId) && command.Language == t.Language && t.IsOfficial && t.Type.Equals("Resume")).GroupBy(t => new { Name = t.Doctor.FirstName + "_" + t.Doctor.LastName, ReviewerCode = t.Doctor.ReviewerCode, t.DoctorId })
.Select(g => new DoctorDownloadInfo()
{
Id = g.Key.DoctorId,
Name = g.Key.Name,
ReviewerCode = g.Key.ReviewerCode,
FileList = g.Select(t => new DownloadFileInfo() { FileName = t.FileName, Path = t.Path }).ToList()
}).ToListAsync();
return ResponseOutput.Ok(list);
}
/// <summary>
/// new 医生详情 下载指定简历
/// </summary>
/// <param name="command"></param>
/// <param name="_doctorService"></param>
/// <param name="_attachmentrepository"></param>
/// <returns></returns>
[HttpPost, Route("file/GetDoctorAttachment")]
public async Task<IResponseOutput<DoctorDownloadInfo>> GetDoctorAttachment(GetDoctoreAttachPathCommand command,
[FromServices] IDoctorService _doctorService,
[FromServices] IRepository<Attachment> _attachmentrepository)
{
var find = await _attachmentrepository.Where(t => command.DoctorId==t.DoctorId && command.AttachmentIdList.Contains(t.Id)).GroupBy(t => new { Name = t.Doctor.FirstName + "_" + t.Doctor.LastName, ReviewerCode = t.Doctor.ReviewerCode, t.DoctorId })
.Select(g => new DoctorDownloadInfo()
{
Id = g.Key.DoctorId,
Name = g.Key.Name,
ReviewerCode = g.Key.ReviewerCode,
FileList = g.Select(t => new DownloadFileInfo() { FileName = t.FileName, Path = t.Path }).ToList()
}).FirstOrDefaultAsync();
return ResponseOutput.Ok(find);
}
#region 废弃
/// <summary>
/// 下载多个医生的所有附件
/// </summary>
/// <param name="doctorIds"></param>
/// <returns></returns>
[Obsolete]
[HttpPost, Route("file/downloadDoctorAttachments")]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadAttachment(Guid[] doctorIds)
{
@ -786,24 +861,6 @@ namespace IRaCIS.Core.API.Controllers
});
}
/// <summary>
/// 下载医生官方简历
/// </summary>
/// <param name="language"></param>
/// <param name="doctorIds"></param>
/// <returns></returns>
[HttpPost, Route("file/downloadOfficialCV/{language}")]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadOfficialResume(int language, Guid[] doctorIds)
{
var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
return ResponseOutput.Ok(new UploadFileInfoDTO
{
FilePath = await _fileService.CreateOfficialResumeZip(language, doctorIds),
FullFilePath = path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
});
}
/// <summary>
/// 下载指定医生的指定附件
/// </summary>
@ -811,6 +868,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="attachmentIds">要下载的附件Id</param>
/// <returns></returns>
[HttpPost, Route("file/downloadByAttachmentId/{doctorId}")]
[Obsolete]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadAttachmentById(Guid doctorId, Guid[] attachmentIds)
{
var path = await _fileService.CreateZipPackageByAttachment(doctorId, attachmentIds);
@ -822,15 +880,47 @@ namespace IRaCIS.Core.API.Controllers
}
/// <summary>
/// 下载医生官方简历 首页 区分 中文和英文
/// </summary>
/// <param name="language"></param>
/// <param name="doctorIds"></param>
/// <returns></returns>
[HttpPost, Route("file/downloadOfficialCV/{language}")]
[Obsolete]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadOfficialResume(int language, Guid[] doctorIds)
{
var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
return ResponseOutput.Ok(new UploadFileInfoDTO
{
FilePath = await _fileService.CreateOfficialResumeZip(language, doctorIds),
FullFilePath = path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
});
}
/// <summary>
/// 入组 项目下载简历
/// </summary>
/// <param name="language"></param>
/// <param name="trialId"></param>
/// <param name="doctorIdArray"></param>
/// <returns></returns>
[HttpPost, Route("enroll/downloadResume/{trialId:guid}/{language}")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[AllowAnonymous]
[Obsolete]
public async Task<IResponseOutput<string>> DownloadResume(int language, Guid trialId, Guid[] doctorIdArray)
{
var zipPath = await _fileService.CreateOfficialResumeZip(language, doctorIdArray);
return ResponseOutput.Ok(zipPath);
}
#endregion
}
#endregion
@ -856,7 +946,18 @@ namespace IRaCIS.Core.API.Controllers
_userInfo = userInfo;
}
/// <summary> 通用文件下载 </summary>
[AllowAnonymous]
[HttpGet("CommonDocument/DownloadCommonDoc")]
public async Task<IActionResult> DownloadCommonFile(string code, [FromServices] IRepository<CommonDocument> _commonDocumentRepository)
{
var (filePath, fileName) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code);
new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(filePath), out var contentType);
return File(System.IO.File.OpenRead(filePath), contentType ?? "application/octet-stream", fileName);
}
/// <summary>
/// 上传通用文档 比如一致性核查的 比如导出的excel 模板

View File

@ -285,20 +285,28 @@
<member name="T:IRaCIS.Core.API.Controllers.FileController">
<summary>医生文件上传下载</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.UploadOrdinaryFile(System.String,System.Guid)">
<member name="M:IRaCIS.Core.API.Controllers.FileController.GetOfficialResume(IRaCIS.Core.API.Controllers.GetDoctorPathCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Attachment})">
<summary>
上传文件[FileUpload]
New 医生首页 多选 获取多个医生信息+文件路径列表 医生压缩包名称 doctorCode + "_" + doctorName _(时间戳或者随机的Guid)
</summary>
<param name="attachmentType">附件类型</param>
<param name="doctorId">医生Id</param>
<returns>返回文件信息</returns>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.UploadNonDoctorFile(System.String)">
<member name="M:IRaCIS.Core.API.Controllers.FileController.GetTrialDoctorOfficialResume(IRaCIS.Core.API.Controllers.GetDoctorPathCommand,IRaCIS.Application.Interfaces.IDoctorService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Attachment})">
<summary>
上传文件( 不是医生个人的文件)[FileUpload]
例如:阅片章程等
New 项目入组 获取医生简历
</summary>
<param name="type">文件类型</param>
<param name="command"></param>
<param name="_doctorService"></param>
<param name="_attachmentrepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.GetDoctorAttachment(IRaCIS.Core.API.Controllers.GetDoctoreAttachPathCommand,IRaCIS.Application.Interfaces.IDoctorService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Attachment})">
<summary>
new 医生详情 下载指定简历
</summary>
<param name="command"></param>
<param name="_doctorService"></param>
<param name="_attachmentrepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadAttachment(System.Guid[])">
@ -308,14 +316,6 @@
<param name="doctorIds"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadOfficialResume(System.Int32,System.Guid[])">
<summary>
下载医生官方简历
</summary>
<param name="language"></param>
<param name="doctorIds"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadAttachmentById(System.Guid,System.Guid[])">
<summary>
下载指定医生的指定附件
@ -324,6 +324,26 @@
<param name="attachmentIds">要下载的附件Id</param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadOfficialResume(System.Int32,System.Guid[])">
<summary>
下载医生官方简历 首页 区分 中文和英文
</summary>
<param name="language"></param>
<param name="doctorIds"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadResume(System.Int32,System.Guid,System.Guid[])">
<summary>
入组 项目下载简历
</summary>
<param name="language"></param>
<param name="trialId"></param>
<param name="doctorIdArray"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.UploadDownLoadController.DownloadCommonFile(System.String,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument})">
<summary> 通用文件下载 </summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.UploadDownLoadController.UploadCommonDoc">
<summary>
上传通用文档 比如一致性核查的 比如导出的excel 模板

View File

@ -51,17 +51,19 @@ namespace IRaCIS.Core.Application.Helper
{
var ossOptions = options.CurrentValue;
_OSSConfig = new AliyunOssOptions()
{
RegionId = ossOptions.RegionId,
AccessKeyId = ossOptions.AccessKeyId,
AccessKeySecret = ossOptions.AccessKeySecret,
EndPoint = ossOptions.EndPoint,
BucketName = ossOptions.BucketName,
RoleArn = ossOptions.RoleArn,
Region = ossOptions.Region,
ViewEndpoint = ossOptions.ViewEndpoint
};
_OSSConfig= ossOptions;
//_OSSConfig = new AliyunOssOptions()
//{
// RegionId = ossOptions.RegionId,
// AccessKeyId = ossOptions.AccessKeyId,
// AccessKeySecret = ossOptions.AccessKeySecret,
// EndPoint = ossOptions.EndPoint,
// BucketName = ossOptions.BucketName,
// RoleArn = ossOptions.RoleArn,
// Region = ossOptions.Region,
// ViewEndpoint = ossOptions.ViewEndpoint
//};
_ossClient = new OssClient(_OSSConfig.EndPoint, _OSSConfig.AccessKeyId, _OSSConfig.AccessKeySecret);

View File

@ -1918,6 +1918,14 @@
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.GetSplenicState(System.Guid,System.Decimal)">
<summary>
获取脾脏状态
</summary>
<param name="visitTaskId"></param>
<param name="spleenLength"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.GetSplenicEvaluation(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
<summary>
获取脾脏评估
@ -1946,6 +1954,20 @@
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.GetEvidenceFocalFDG(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
<summary>
骨髓中是否存在局灶性 FDG亲和病灶的证据
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.GetLiverAssessment(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
<summary>
获取肝脏评估
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.GetSuvMaxFocus(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto)">
<summary>
SuvMax所在病灶
@ -4791,6 +4813,11 @@
Path
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetDicomReadingQuestionAnswerInDto.GroupClassifyList">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetDicomReadingQuestionAnswerInDto.QuestionClassify">
<summary>
问题分类
@ -6576,6 +6603,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.GroupClassify">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.Unit">
<summary>
单位
@ -6654,6 +6686,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.GroupClassify">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.DataSource">
<summary>
数据来源
@ -7002,6 +7039,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.GroupClassify">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.Unit">
<summary>
单位
@ -7062,6 +7104,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.GroupClassify">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.Remark">
<summary>
备注
@ -7417,6 +7464,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.GroupClassify">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.LimitEdit">
<summary>
限制编辑
@ -7747,6 +7799,11 @@
问题分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.GroupClassify">
<summary>
分组分类
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.DataSource">
<summary>
数据来源
@ -8571,6 +8628,59 @@
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetTrialList(IRaCIS.Core.Application.Contracts.TrialToBeDoneQuery)">
<summary>
项目列表
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetVisitTaskList(IRaCIS.Core.Application.Service.Third_partyProject.DTO.VisitTaskQuery_UltrasonicDicom)">
<summary>
任务列表 第一层级
</summary>
<param name="queryVisitTask"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetDicomAndNoneDicomStudyList(System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask})">
<summary>
检查列表 第二层级
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.UpdateTaskImageState(IRaCIS.Core.Application.Service.Third_partyProject.DTO.UpdateTaskImageStateCommand)">
<summary>
修改任务上的 影像上传状态
</summary>
<param name="command"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetStudyModalityList(System.Guid)">
<summary>
通过任务Id 获取检查模态下拉框
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetStudyModalityOSSPath(System.Collections.Generic.List{System.Guid},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries})">
<summary>
通过选择的序列Id 数组获取下面的Instance 路径
</summary>
<param name="seriesIdList"></param>
<param name="_dicomSeriesRepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.AddOrUpdateArchiveStudy(IRaCIS.Core.Application.Contracts.NewArchiveStudyCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor},Medallion.Threading.IDistributedLockProvider,EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance})">
<summary>
归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列两个人公用的影像不应该绑定
</summary>
<param name="incommand"></param>
<param name="_studyMonitorRepository"></param>
<param name="_distributedLockProvider"></param>
<param name="_provider"></param>
<param name="_dicomSeriesRepository"></param>
<param name="_dicomInstanceRepository"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Service.TrialExternalUserService">
<summary>
项目外部人员 录入流程相关
@ -13108,7 +13218,7 @@
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetReadingQuestion(System.Guid,System.Nullable{System.Guid},System.Nullable{IRaCIS.Core.Domain.Share.QuestionClassify})">
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetReadingQuestion(System.Guid,System.Nullable{System.Guid},System.Nullable{IRaCIS.Core.Domain.Share.QuestionClassify},System.Collections.Generic.List{IRaCIS.Core.Domain.Share.GroupClassify})">
<summary>
获取阅片外层问题
</summary>

View File

@ -98,6 +98,7 @@ namespace IRaCIS.Application.Services
/// <returns></returns>
public async Task<string> CreateDoctorsAllAttachmentZip(Guid[] doctorIds)
{
#region 老版本 存储在服务器
//准备下载文件的临时路径
var guidStr = Guid.NewGuid().ToString();
//string uploadFolderPath = HostingEnvironment.MapPath("/UploadFile/");
@ -134,6 +135,8 @@ namespace IRaCIS.Application.Services
string targetPath = Path.Combine(uploadFolderPath, target + ".zip");
ZipHelper.CreateZip(tempSavePath, targetPath);
return Path.Combine("/IRaCISData/UploadFile/", target + ".zip");
#endregion
}

View File

@ -52,6 +52,8 @@ namespace IRaCIS.Core.Application.Service
CreateMap<TrialUser, TrialDocumentUserConfirmView>();
CreateMap<BatchAddTrialEmailNoticeConfig, TrialEmailNoticeConfig>();

View File

@ -41,7 +41,7 @@
public string WindowCenter { get; set; } = string.Empty;
public string WindowWidth { get; set; } = string.Empty;
public string IamgeResizePath { get; set; }
public string ImageResizePath { get; set; }
}
public class DicomSeriesWithLabelDTO : DicomSeriesDTO

View File

@ -173,6 +173,8 @@ namespace IRaCIS.Core.Application.Contracts
public string[]? VisitPlanArray { get; set; }
public Guid? VisitTaskId { get; set; }
}
@ -280,10 +282,10 @@ namespace IRaCIS.Core.Application.Contracts
public string AcquisitionNumber { get; set; } = string.Empty;
public string TriggerTime { get; set; } = string.Empty;
public string IamgeResizePath { get; set; }=string.Empty;
public string ImageResizePath { get; set; }=string.Empty;
public List<AddInstanceDto> InstanceList { get; set; }
public Guid? VisitTaskId { get; set; }
}

View File

@ -50,6 +50,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public bool IsChangeOtherTask { get; set; }
public ComputationTrigger ComputationTrigger { get; set; }
}
public class TargetLesionCalculateDto
@ -220,6 +222,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Arm ArmEnum { get; set; }
public ComputationTrigger ComputationTrigger { get; set; } = ComputationTrigger.Lesion;
/// <summary>
/// 是否修改其他任务
/// </summary>
@ -348,6 +352,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{
public QuestionType QuestionType { get; set; }
public ComputationTrigger? ComputationTrigger { get; set; }
public Func<ReadingCalculateDto, Task<decimal>> GetDecimalFun { get; set; }
public Func<ReadingCalculateDto, Task<int>> GetIntFun { get; set; }

View File

@ -507,6 +507,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Guid TrialId { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public List<GroupClassify>? GroupClassifyList { get; set; }
/// <summary>
/// 问题分类
/// </summary>
@ -1275,6 +1280,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string SubjectCode { get; set; }
public bool IsExistsClinicalData { get; set; }
public ReadingTaskState ReadingTaskState { get; set; }
public decimal VisitTaskNum { get; set; }

View File

@ -341,6 +341,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 单位
/// </summary>
@ -450,6 +455,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 数据来源
/// </summary>
@ -999,6 +1009,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 单位
/// </summary>
@ -1068,6 +1083,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
public List<string> ParentTriggerValueList { get; set; } = new List<string>();
public List<string> RelevanceValueList { get; set; } = new List<string>();
@ -1593,6 +1613,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 限制编辑
/// </summary>
@ -1957,6 +1982,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 数据来源
/// </summary>

View File

@ -23,7 +23,7 @@ namespace IRaCIS.Core.Application.Contracts
Task<GetGlobalReadingInfoOutDto> GetGlobalReadingInfo(GetGlobalReadingInfoInDto inDto);
Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId,QuestionClassify? questionClassify);
Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId,QuestionClassify? questionClassify, List<GroupClassify>? groupClassifyList);
Task<GetReadingTableQuestionOutDto> GetReadingTableQuestion(GetReadingTableQuestionOrAnswerInDto inDto);

View File

@ -549,6 +549,22 @@ namespace IRaCIS.Application.Services
result = result.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToList();
}
foreach (var item in result)
{
var clinicalDataList = await _readingClinicalDataService.GetClinicalDataList(new GetReadingOrTaskClinicalDataListInDto()
{
SubjectId = taskInfo.SubjectId,
TrialId = taskInfo.TrialId,
VisitTaskId = item.VisitTaskId,
});
item.IsExistsClinicalData = clinicalDataList.Count() > 0;
}
return (result, new
{
ReadingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync()
@ -704,7 +720,7 @@ namespace IRaCIS.Application.Services
{
//await AddDefaultValueToTask(inDto.VisitTaskId);
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
var result = await GetReadingQuestion(taskInfo.TrialReadingCriterionId, taskInfo.Id, inDto.QuestionClassify);
var result = await GetReadingQuestion(taskInfo.TrialReadingCriterionId, taskInfo.Id, inDto.QuestionClassify,inDto.GroupClassifyList);
@ -722,7 +738,7 @@ namespace IRaCIS.Application.Services
/// <param name="visitTaskId"></param>
/// <returns></returns>
[NonDynamicMethod]
public async Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId, QuestionClassify? questionClassify)
public async Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId, QuestionClassify? questionClassify, List<GroupClassify>? groupClassifyList)
{
@ -776,7 +792,9 @@ namespace IRaCIS.Application.Services
//排除表格问题 同时排除组问题
var groupids = questions.Where(x => x.Type != ReadingQestionType.Group).Select(x => x.GroupId).ToList();
var result = questions.Where(x => x.Type == ReadingQestionType.Group && groupids.Contains(x.Id)).ToList();
var result = questions.Where(x => x.Type == ReadingQestionType.Group && groupids.Contains(x.Id))
.WhereIf(groupClassifyList!=null,x=>x.GroupClassify!=null&& groupClassifyList.Contains(x.GroupClassify.Value))
.ToList();
foreach (var item in result)
{
@ -1562,7 +1580,9 @@ namespace IRaCIS.Application.Services
x.FirstAddTaskId,
}).ToListAsync();
await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId);
var markquestionId = inDto.Answers.Select(y => y.Id).ToList();
await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId&& markquestionId.Contains(x.QuestionId));
var datetime = DateTime.Now;
var markList = _mapper.Map<List<QuestionMarkInfo>, List<ReadingTaskQuestionMark>>(inDto.QuestionMarkInfoList);
@ -1741,6 +1761,7 @@ namespace IRaCIS.Application.Services
{
IsChangeOtherTask = false,
VisitTaskId = inDto.VisitTaskId,
ComputationTrigger=ComputationTrigger.Lesion,
});
return ResponseOutput.Ok(true);
}
@ -1767,7 +1788,7 @@ namespace IRaCIS.Application.Services
}
}
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
inDto.BlindName = taskinfo.TaskBlindName;
switch (taskinfo.TrialReadingCriterion.CriterionType)
{
// 对于非靶病灶,如果状态选择为显著增大,请验证:
@ -2071,7 +2092,11 @@ namespace IRaCIS.Application.Services
rowInfo.FristAddTaskId = inDto.RowId == null ? inDto.VisitTaskId : rowInfo.FristAddTaskId;
if (inDto.RowId == null)
{
rowInfo.FromMark = inDto.FromMark ?? string.Empty;
rowInfo.ReportMark = inDto.ReportMark ?? string.Empty;
rowInfo.MarkTool = inDto.MarkTool ?? string.Empty;
rowInfo.PicturePath = inDto.PicturePath ?? string.Empty;
rowInfo.MeasureData = inDto.MeasureData ?? string.Empty;
//await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == inDto.RowIndex && x.QuestionId == inDto.QuestionId);
List<ReadingTableQuestionAnswer> answerList = inDto.AnswerList.Select(x => new ReadingTableQuestionAnswer()
@ -2137,6 +2162,7 @@ namespace IRaCIS.Application.Services
{
IsChangeOtherTask = false,
VisitTaskId = inDto.VisitTaskId,
ComputationTrigger = ComputationTrigger.Lesion,
});

View File

@ -196,7 +196,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
{
await service.CalculateTask(new CalculateTaskInDto()
{
ComputationTrigger= ComputationTrigger.Report,
VisitTaskId = inDto.VisitTaskId
});
}

View File

@ -400,7 +400,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
if (lowPddTaskid != null && lowPddTaskid != default(Guid))
{
var lowPPDAnswerList = await _readingTableQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)
var lowPPDAnswerList = await _readingTableQuestionAnswerRepository.Where(x =>x.VisitTaskId== lowPddTaskid
&& x.QuestionId == inDto.QuestionId
&& x.RowIndex == inDto.RowIndex).Include(x => x.ReadingTableQuestionTrial)
.Select(x => new
@ -429,6 +429,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
{
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
readingData.IsChangeOtherTask = inDto.IsChangeOtherTask;
readingData.ComputationTrigger = inDto.ComputationTrigger;
await ReadingCalculate(readingData);
}
@ -493,16 +494,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate},
//新病灶评估
new ReadingCalculateData (){QuestionType=QuestionType.NewLesions,GetStringFun=GetNewLesionEvaluate},
new ReadingCalculateData (){QuestionType=QuestionType.NewLesionEvaluation,GetStringFun=GetNewLesionEvaluate},
//获取肝脏评估
new ReadingCalculateData (){QuestionType=QuestionType.LiverAssessment,GetStringFun=GetLiverAssessment},
// 骨髓中是否存在局灶性 FDG亲和病灶的证据
new ReadingCalculateData (){QuestionType=QuestionType.EvidenceFocalFDG,GetStringFun=GetEvidenceFocalFDG,ComputationTrigger=ComputationTrigger.Lesion},
//CT/MRI
new ReadingCalculateData (){QuestionType=QuestionType.CTandMRI,GetStringFun=CTMRIEvaluation},
// PET 5PS评分
new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS},
new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS,ComputationTrigger=ComputationTrigger.Lesion},
//与基线相比摄取值变化
new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange},
new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange,ComputationTrigger=ComputationTrigger.Lesion},
// FDG-PET 评估结果
new ReadingCalculateData (){QuestionType=QuestionType.FDGPET,GetStringFun=GetFDGPETOverallAssessment},
@ -517,6 +524,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// SUVmax所在病灶
new ReadingCalculateData (){QuestionType=QuestionType.SUVmaxLesion,GetStringFun=GetSuvMaxFocus},
////靶病灶径线之和SOD
//new ReadingCalculateData (){QuestionType=QuestionType.SOD,GetDecimalNullFun=GetSODData},
@ -599,6 +610,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
calculateList = calculateList.Where(x => calculateType.Contains(x.QuestionType)).ToList();
}
calculateList = calculateList.Where(x => x.ComputationTrigger == null || x.ComputationTrigger == inDto.ComputationTrigger).ToList();
var typeNAList = new List<QuestionType>
{
QuestionType.SODChange,
@ -1619,7 +1632,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SPD).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
if (baseLineSpd != 0)
{
return (presentSpd - baseLineSpd) / baseLineSpd;
return (presentSpd - baseLineSpd)*100 / baseLineSpd;
}
else
{
@ -1704,24 +1717,69 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}
#endregion
#region 获取脾脏评估
#region 获取脾脏状态
/// <summary>
/// 获取脾脏评估
/// 获取脾脏状态
/// </summary>
/// <param name="inDto"></param>
/// <param name="visitTaskId"></param>
/// <param name="spleenLength"></param>
/// <returns></returns>
public async Task<string> GetSplenicEvaluation(ReadingCalculateDto inDto)
[HttpPost]
public async Task<string> GetSplenicState(Guid visitTaskId,decimal spleenLength)
{
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
ReadingCalculateDto inDto = await _generalCalculateService.GetReadingCalculateDto(visitTaskId);
if (inDto.IsBaseLine)
{
return SpleenAssessment.Stabilization.GetEnumInt();
if (spleenLength <= 130)
{
return SpleenAssessment.Normal.GetEnumInt();
}
else
{
return SpleenAssessment.Swelling.GetEnumInt();
}
}
if (spleenLength == 0)
{
return SpleenAssessment.NotEvaluable.GetEnumInt();
}
#region 最低
var visitTaskIds = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
x.DoctorUserId == taskinfo.DoctorUserId &&
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum
&& x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect
).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).ToListAsync();
var questionId = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId && x.QuestionType == QuestionType.SpleenLength).Select(x => x.Id).FirstNotNullAsync();
var answerList = await _readingTaskQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)
&& x.ReadingQuestionTrialId == questionId )
.Select(x => new
{
x.Answer,
x.VisitTaskId,
}).ToListAsync();
var lowSpleenLength = answerList.Select(x => new
{
Answer = x.Answer.IsNullOrEmptyReturn0(),
x.VisitTaskId
}).OrderBy(x => x.Answer).Select(x=>x.Answer).FirstOrDefault();
#endregion
var result = SpleenAssessment.Stabilization;
var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
var presentSpd = spleenLength;
var baseLineSpleenLength = await GetBaseLineSpleenLength(inDto);
var baseLineTaskId = await GetBaseLineTaskId(inDto);
@ -1729,10 +1787,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
var differenceValue = presentSpd - baseLineSpleenLength;
var differenceLowValue = presentSpd - lowSpleenLength;
decimal percentage = 0;
if (baseLineSpleenLength != 0)
{
percentage = differenceValue*100 / baseLineSpleenLength;
percentage = differenceValue * 100 / (baseLineSpleenLength-130);
}
// 1、基线 垂直径> 130 mm
@ -1753,7 +1813,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
//2、当前访视的前面访视中 存在垂直径≤130mm
//3、与最低点相比脾脏垂直径的增加值≥20 mm
//4、当前垂直径 > 130 mm
else if (baseLineSpleenLength > 130 && presentSpd <= 130 && differenceValue >= 20 && presentSpd > 130)
else if (baseLineSpleenLength > 130 && lowSpleenLength <= 130 && differenceLowValue >= 20 && presentSpd > 130)
{
result = SpleenAssessment.Increase;
}
@ -1764,18 +1824,96 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}
//1、基线期 状态为“肿大”
//与基线相比脾肿大增加的百分比 > 50
else if (baseLineState.EqEnum(SpleenState.Swelling) && percentage > 50)
else if (baseLineState.EqEnum(SpleenAssessment.Swelling) && percentage > 50)
{
result = SpleenAssessment.Remission;
}
else
{
result = SpleenAssessment.Remission;
result = SpleenAssessment.Stabilization;
}
return result.GetEnumInt();
}
#endregion
#region 获取脾脏评估
/// <summary>
/// 获取脾脏评估
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<string> GetSplenicEvaluation(ReadingCalculateDto inDto)
{
return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicStatus).Select(x => x.Answer).FirstIsNullReturnEmpty();
//if (inDto.IsBaseLine)
//{
// return SpleenAssessment.Stabilization.GetEnumInt();
//}
//var result = SpleenAssessment.Stabilization;
//var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
//var baseLineSpleenLength = await GetBaseLineSpleenLength(inDto);
//var baseLineTaskId = await GetBaseLineTaskId(inDto);
//var baseLineState = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SplenicStatus).Select(x => x.Answer).FirstOrDefaultAsync();
//var differenceValue = presentSpd - baseLineSpleenLength;
//decimal percentage = 0;
//if (baseLineSpleenLength != 0)
//{
// percentage = differenceValue * 100 / baseLineSpleenLength;
//}
//// 1、基线 垂直径> 130 mm
////2、与基线相比脾垂直径变化值≥10 mm
////与基线相比脾肿大增加的百分比 > 50
//if (baseLineSpleenLength > 130 && differenceValue >= 10 && percentage > 50)
//{
// result = SpleenAssessment.Increase;
//}
////1、基线垂直径≤130mm
////2、与基线相比脾垂直径变化值≥20 mm
////当前垂直径 > 130 mm
//else if (baseLineSpleenLength <= 130 && differenceValue >= 20 && presentSpd > 130)
//{
// result = SpleenAssessment.Increase;
//}
////1、基线 垂直径> 130 mm
////2、当前访视的前面访视中 存在垂直径≤130mm
////3、与最低点相比脾脏垂直径的增加值≥20 mm
////4、当前垂直径 > 130 mm
//else if (baseLineSpleenLength > 130 && presentSpd <= 130 && differenceValue >= 20 && presentSpd > 130)
//{
// result = SpleenAssessment.Increase;
//}
//// 基线垂直径≤130mm
//else if (baseLineSpleenLength <= 130)
//{
// result = SpleenAssessment.Normal;
//}
////1、基线期 状态为“肿大”
////与基线相比脾肿大增加的百分比 > 50
//else if (baseLineState.EqEnum(SpleenState.Swelling) && percentage > 50)
//{
// result = SpleenAssessment.Remission;
//}
//else
//{
// result = SpleenAssessment.Remission;
//}
//return result.GetEnumInt();
}
#endregion
#region PET 5PS
/// <summary>
@ -1785,10 +1923,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task<string> GetPET5PS(ReadingCalculateDto inDto)
{
if (inDto.IsBaseLine)
//if (inDto.IsBaseLine)
//{
// return SpleenAssessment.Stabilization.GetEnumInt();
//}
if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt()))
{
return SpleenAssessment.Stabilization.GetEnumInt();
return PET5PSScore.NE.GetEnumInt();
}
PET5PSScore result = PET5PSScore.X;
// 最大Suvmax
@ -1850,6 +1996,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
return SUVChangeVSBaseline.NotEvaluable.GetEnumInt();
}
if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt()))
{
return SUVChangeVSBaseline.NotEvaluable.GetEnumInt();
}
var result = SUVChangeVSBaseline.NotEvaluable;
var baseLineTaskId = await GetBaseLineTaskId(inDto);
@ -1929,7 +2080,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four, }),
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.Increase }),
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.NE, FDGAffinityFociInBM.YesHaveNew, FDGAffinityFociInBM.YesHaveNew, FDGAffinityFociInBM.No}),
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.NE, FDGAffinityFociInBM.YesHaveNew, FDGAffinityFociInBM.YesSustain, FDGAffinityFociInBM.No}),
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD }),
},
@ -1953,7 +2104,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four }),
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.Decrease }),
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.YesSustain}),
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}),
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR }),
},
@ -1961,7 +2112,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four }),
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.DidNotChange }),
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.YesSustain}),
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}),
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NMR }),
},
};
@ -1976,6 +2127,37 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
return resultdata ?? string.Empty;
}
#endregion
#region 骨髓中是否存在局灶性 FDG亲和病灶的证据
/// <summary>
/// 骨髓中是否存在局灶性 FDG亲和病灶的证据
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<string> GetEvidenceFocalFDG(ReadingCalculateDto inDto)
{
if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt()))
{
return FDGAffinityFociInBM.NE.GetEnumInt();
}
else
{
return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.EvidenceFocalFDG).Select(x => x.Answer).FirstOrDefault();
}
}
#endregion
#region 肝脏评估
/// <summary>
/// 获取肝脏评估
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<string> GetLiverAssessment(ReadingCalculateDto inDto)
{
return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverState).Select(x => x.Answer).FirstIsNullReturnEmpty();
}
#endregion
#region SuvMax所在病灶
@ -2071,18 +2253,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
List<CalculationDto> data = new List<CalculationDto>() {
//ND NE NE ND
//ND NE NE/NA ND
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE}),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.ND }),
},
//ND/PD/CR/NE/PR/SD PMD PMD/CMR/PMR/NMR/NE PMD/PD
//ND/PD/CR/NE/PR/SD PMD PMD/CMR/PMR/NMR/NE/NA PMD/PD
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD}),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() {FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() {FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMDPD }),
},
//ND/PD/CR/NE/PR/SD PMD/CMR/PMR/NMR/NE PMD PMD/PD
@ -2092,25 +2274,59 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, }),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMDPD }),
},
//PD NE CMR/PMR/NMR/NE PMD/PD
//PD NE CMR/PMR/NMR/NE/NA PMD/PD
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD}),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMDPD }),
},
//NE NE NE/NA NE
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NE }),
},
//CR、PR、SD、NE、ND、PD CMR CMR/PMR/NMR/PMD/NE/NA CMR/CR
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND,CTMRIOverallAssessment.PD }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR, FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.CMRCR }),
},
//CR NE NE/NA CMR/CR
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.CMRCR }),
},
//CR、PR、SD、NE、ND CMR NE/NA CMR/CR
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.CMRCR }),
},
//ND/PD/CR/NE/PR/SD PMR PMD/CMR/PMR/NMR/NE PMR/PR
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE,FDGPETOverallAssessment.NA, }),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMRPR }),
},
//PR NE NE PMR/PR
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE}),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMRPR }),
},
//CR/PR/SD/NE/ND NE PMR PMR/PR
@ -2124,7 +2340,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND,CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NMR }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR, FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE}),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR, FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NMRSD }),
},
//CR/PR/SD/ND/NE NE NMR NMR/SD
@ -2138,7 +2354,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.SD }),
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE}),
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NMRSD }),
},
};
@ -2204,11 +2420,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task<string> GetTargetLesionEvaluate(ReadingCalculateDto inDto)
{
var rowInfo = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
//if (inDto.IsBaseLine)
//{
// return TargetAssessment.NA.GetEnumInt();
//}
if (inDto.IsBaseLine)
{
return TargetAssessment.NA.GetEnumInt();
}
var tableQuestions = rowInfo.SelectMany(x => x.TableQuestionList).ToList();
TargetAssessment result = TargetAssessment.SD;
@ -2273,10 +2492,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
{
result = TargetAssessment.PD;
}
//在排除PD后有任一靶病灶为NE状态
else if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)))
//当前访视没有任何一个状态为“疾病进展”的靶病灶;
//当前访视存在至少一个状态为“不可评估”的靶病灶。
else if (
!tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.DiseaseProgression))&&
tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)))
{
result = TargetAssessment.PD;
result = TargetAssessment.NE;
}
//1、基线非淋巴结靶病灶不存在或者当前访视非淋巴结靶病灶全部消失
//并且 2.当前访视淋巴结靶病灶的状态全部变为“消失”。
@ -2308,10 +2530,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
NoTargetAssessment result = NoTargetAssessment.PD;
//if (inDto.IsBaseLine)
//{
// return NoTargetAssessment.NA.GetEnumInt();
//}
if (inDto.IsBaseLine)
{
return NoTargetAssessment.NA.GetEnumInt();
}
var tableRows = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList).ToList();
@ -2409,14 +2631,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task<string> CTMRIEvaluation(ReadingCalculateDto inDto)
{
if (inDto.IsBaseLine)
{
return CTMRIOverallAssessment.NA.GetEnumInt();
}
// 靶病灶评估
var targetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.Answer).FirstOrDefault();
// 非靶病灶评估
var noTargetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NETarget).Select(x => x.Answer).FirstOrDefault();
var noTargetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NoTargetLesion).Select(x => x.Answer).FirstOrDefault();
// 存在新病灶
var existsNewTarget = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewTargetLesion).Select(x => x.Answer).FirstOrDefault();
var existsNewTarget = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionEvaluation).Select(x => x.Answer).FirstOrDefault();
// 肝脏评估
var liverEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverAssessment).Select(x => x.Answer).FirstOrDefault();
@ -2454,14 +2680,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
},
//PD 任一结果 是 任一结果 任一结果 PD
//任一结果 任一结果 是 任一结果 任一结果 PD
new CalculationDto(){
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.PD }),
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.Yes }),
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
},
//任一结果 任一结果 任一结果 显著增大 任一结果 PD
new CalculationDto(){
@ -2470,7 +2696,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { }),
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Increase }),
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
},
//任一结果 任一结果 任一结果 任一结果 显著增大 PD
new CalculationDto(){
@ -2479,7 +2705,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() {}),
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
},
//CR CR/ND 否 正常 正常 CR
new CalculationDto(){
@ -2499,9 +2725,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR }),
},
//NE 非PD 否/疑似/无法评估 显著增大 显著增大 NE
//NE 非PD 否/疑似/无法评估 显著增大 显著增大 NE
new CalculationDto(){
NotEq=new List<int>(){ 2},
NotEq=new List<int>(){ 2,4,5},
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.NE }),
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.PD }),
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected, NewLesionAssessment.NE}),
@ -2531,7 +2757,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
},
//ND ND 否/疑似 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) NE
new CalculationDto(){
NotEq=new List<int>(){ 4},
NotEq=new List<int>(){ 5},
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.ND }),
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected }),
@ -2598,6 +2824,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
},
};
var index= data.FindIndex(x =>
(x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) &&
(x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) &&
(x.NotEq.Contains(3) ? !x.Column3.Contains(existsNewTarget) : x.Column3.Contains(existsNewTarget) || x.Column3.Count() == 0) &&
(x.NotEq.Contains(4) ? !x.Column4.Contains(liverEvaluation) : x.Column4.Contains(liverEvaluation) || x.Column4.Count() == 0) &&
(x.NotEq.Contains(5) ? !x.Column5.Contains(spleenEvaluation) : x.Column5.Contains(spleenEvaluation) || x.Column5.Count() == 0))
;
Console.WriteLine(index);
var result = data.Where(x =>
(x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) &&
(x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) &&

View File

@ -0,0 +1,130 @@
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Domain.Share;
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.Third_partyProject.DTO
{
public class TrialListDTO_UltrasonicDicom: TrialBaseInfoDto
{
public DateTime CreateTime { get; set; }
public string Sponsor { get; set; }
public string TrialStatusStr { get; set; }
}
public class VisitTaskQuery_UltrasonicDicom : PageInput
{
[NotDefault]
public Guid TrialId { get; set; }
public Guid? SiteId { get; set; }
public Guid? SubjectId { get; set; }
public string SubjectCode { get; set; } = String.Empty;
public bool? IsUrgent { get; set; }
public string TaskName { get; set; } = String.Empty;
public Guid? DoctorUserId { get; set; }
public string? TaskCode { get; set; }
public String? TrialSiteCode { get; set; }
public Arm? ArmEnum { get; set; }
public Guid? TrialReadingCriterionId { get; set; }
}
public class VisitTaskDTO_UltrasonicDicom
{
public Guid Id { get;set; }
public Guid SubjectId { get; set; }
public String TrialSiteCode { get; set; } = String.Empty;
public string SubjectCode { get; set; } = String.Empty;
public string UserName { get; set; }
public string FullName { get; set; }
public Arm ArmEnum { get; set; }
public Guid? DoctorUserId { get; set; }
public string TaskCode { get; set; }
public string TaskName { get; set; }
public string TaskBlindName { get; set; }
public decimal VisitTaskNum { get; set; }
public int ImageStudyState { get; set; }
public Guid TrialReadingCriterionId { get; set; }
public string TrialReadingCriterionName { get; set; }
}
public class UpdateTaskImageStateCommand
{
[NotDefault]
public Guid VisitTaskId { get; set; }
public int ImageStudyState { get; set; }
}
public class StudyDTO_UltrasonicDicom : UnionStudyViewModel
{
}
public class StudySeriesModality
{
public Guid StudyId { get; set; }
public int SeriesCount { get; set; }
public string StudyCode { get; set; }
public List<ModalitySeriesIdList> ModalitySeriesList => SeriesModalityList.GroupBy(t=>t.Modality).Select(g=>new ModalitySeriesIdList() { Modality= g.Key,SeriesIdList=g.Select(t=>t.SeriesId).ToList() }).ToList();
public List<SeriesModality> SeriesModalityList { get; set; }
}
public class StudySeriesModalitySelectDTO
{
public Guid StudyId { get; set; }
public List<Guid> SeriesIdList { get; set; }
}
public class ModalitySeriesIdList
{
public string Modality { get; set; }
public List<Guid> SeriesIdList { get; set; }
}
public class SeriesModality
{
public Guid SeriesId { get; set; }
public string Modality { get; set; }
}
public class InstancePathDTO
{
public string StudyInstanceUid { get; set; }
public string SopInstanceUid { get; set; }
public string StudyCode { get; set; }
public string InstancePath { get; set; }
}
}

View File

@ -0,0 +1,443 @@
using EasyCaching.Core;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Service.Third_partyProject.DTO;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using Medallion.Threading;
using Microsoft.AspNetCore.Mvc;
using OfficeOpenXml.FormulaParsing.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.Service.Third_partyProject
{
[ApiExplorerSettings(GroupName = "Trial")]
public class UltrasonicDicomService : BaseService
{
public readonly IRepository<Trial> _trialRepository;
public readonly IRepository<DicomStudy> _studyRepository;
private readonly IRepository<Dictionary> _dictionaryRepository;
public readonly IRepository<VisitTask> _visitTaskRepository;
public UltrasonicDicomService(IRepository<Trial> trialRepository, IRepository<DicomStudy> studyRepository, IRepository<VisitTask> visitTaskRepository, IRepository<Dictionary> dictionaryRepository)
{
_trialRepository = trialRepository;
_studyRepository = studyRepository;
_visitTaskRepository = visitTaskRepository;
_dictionaryRepository = dictionaryRepository;
}
/// <summary>
/// 项目列表
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput<PageOutput<TrialListDTO_UltrasonicDicom>>> GetTrialList(TrialToBeDoneQuery inQuery)
{
var isPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM;
var isCRC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator;
var isIQC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC;
var isMIM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM;
var isSPMOrCPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM;
var query = _trialRepository.AsQueryable().IgnoreQueryFilters()
.WhereIf(inQuery.SponsorId != null, o => o.SponsorId == inQuery.SponsorId)
.WhereIf(!string.IsNullOrEmpty(inQuery.Code), o => o.TrialCode.Contains(inQuery.Code))
.WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName))
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false)
.Select(t => new TrialListDTO_UltrasonicDicom()
{
TrialId = t.Id,
ResearchProgramNo = t.ResearchProgramNo,
ExperimentName = t.ExperimentName,
TrialCode = t.TrialCode,
CreateTime = t.CreateTime,
Sponsor = _userInfo.IsEn_Us ? t.Sponsor.SponsorName : t.Sponsor.SponsorNameCN,
TrialStatusStr = t.TrialStatusStr
});
var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialListDTO_UltrasonicDicom.CreateTime) : inQuery.SortField, inQuery.Asc);
return ResponseOutput.Ok(result);
}
/// <summary>
/// 任务列表 第一层级
/// </summary>
/// <param name="queryVisitTask"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<VisitTaskDTO_UltrasonicDicom>> GetVisitTaskList(VisitTaskQuery_UltrasonicDicom queryVisitTask)
{
var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && t.SourceSubjectVisitId != null)
.WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId)
.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId)
.WhereIf(queryVisitTask.IsUrgent != null, t => t.IsUrgent == queryVisitTask.IsUrgent)
.WhereIf(queryVisitTask.DoctorUserId != null, t => t.DoctorUserId == queryVisitTask.DoctorUserId)
.WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId)
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false))
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName))
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate))
.ProjectTo<VisitTaskDTO_UltrasonicDicom>(_mapper.ConfigurationProvider);
var defalutSortArray = new string[] { nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) };
var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray);
return pageList;
}
/// <summary>
/// 检查列表 第二层级
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<List<StudyDTO_UltrasonicDicom>> GetDicomAndNoneDicomStudyList(Guid visiTaskId, [FromServices] IRepository<VisitTask> _visitTaskRepository)
{
var query = from dicomStudy in _visitTaskRepository.Where(t => t.Id == visiTaskId).Select(t => t.SourceSubjectVisit).SelectMany(t => t.StudyList)
select new StudyDTO_UltrasonicDicom()
{
TrialId = dicomStudy.TrialId,
SiteId = dicomStudy.SiteId,
SubjectId = dicomStudy.SubjectId,
SubjectVisitId = dicomStudy.SubjectVisitId,
VisitName = dicomStudy.SubjectVisit.VisitName,
VisitNum = dicomStudy.SubjectVisit.VisitNum,
IsDicom = true,
SubjectCode = dicomStudy.Subject.Code,
Id = dicomStudy.Id,
Bodypart = dicomStudy.BodyPartExamined,
Modalities = dicomStudy.Modalities,
Count = dicomStudy.SeriesCount,
StudyCode = dicomStudy.StudyCode,
StudyTime = dicomStudy.StudyTime,
TrialSiteAliasName = dicomStudy.TrialSite.TrialSiteAliasName,
TrialSiteCode = dicomStudy.TrialSite.TrialSiteCode,
Uploader = dicomStudy.Uploader.UserName,
UploadTime = dicomStudy.CreateTime
};
return await query.ToListAsync();
}
/// <summary>
/// 修改任务上的 影像上传状态
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
[HttpPut]
public async Task<IResponseOutput> UpdateTaskImageState(UpdateTaskImageStateCommand command)
{
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == command.VisitTaskId, u => new VisitTask() { ImageStudyState = command.ImageStudyState });
return ResponseOutput.Ok();
}
/// <summary>
/// 通过任务Id 获取检查模态下拉框
/// </summary>
/// <returns></returns>
public async Task<List<StudySeriesModality>> GetStudyModalityList(Guid visiTaskId)
{
var list = await _visitTaskRepository.Where(t => t.Id == visiTaskId).Select(t => t.SourceSubjectVisit).SelectMany(t => t.StudyList).Select(t => new StudySeriesModality
{
StudyId = t.Id,
SeriesCount = t.SeriesCount,
StudyCode = t.StudyCode,
SeriesModalityList = t.SeriesList.Select(t => new SeriesModality { SeriesId = t.Id, Modality = t.Modality }).ToList()
}).ToListAsync();
return list;
}
/// <summary>
/// 通过选择的序列Id 数组获取下面的Instance 路径
/// </summary>
/// <param name="seriesIdList"></param>
/// <param name="_dicomSeriesRepository"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<InstancePathDTO>> GetStudyModalityOSSPath(List<Guid> seriesIdList, [FromServices] IRepository<DicomSeries> _dicomSeriesRepository)
{
return await _dicomSeriesRepository.Where(t => seriesIdList.Contains(t.Id)).SelectMany(t => t.DicomInstanceList).Select(t => new InstancePathDTO() {InstancePath= t.Path,StudyCode=t.DicomStudy.StudyCode , SopInstanceUid = t.SopInstanceUid, StudyInstanceUid = t.StudyInstanceUid} ).ToListAsync();
}
/// <summary>
/// 归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列两个人公用的影像不应该绑定
/// </summary>
/// <param name="incommand"></param>
/// <param name="_studyMonitorRepository"></param>
/// <param name="_distributedLockProvider"></param>
/// <param name="_provider"></param>
/// <param name="_dicomSeriesRepository"></param>
/// <param name="_dicomInstanceRepository"></param>
/// <returns></returns>
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand,
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository,
[FromServices] IDistributedLockProvider _distributedLockProvider,
[FromServices] IEasyCachingProvider _provider,
[FromServices] IRepository<DicomSeries> _dicomSeriesRepository,
[FromServices] IRepository<DicomInstance> _dicomInstanceRepository)
{
try
{
var trialId = incommand.TrialId;
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId);
studyMonitor.UploadFinishedTime = DateTime.Now;
studyMonitor.ArchiveFinishedTime = DateTime.Now;
studyMonitor.FailedFileCount = incommand.FailedFileCount;
studyMonitor.IsSuccess = true;
//上传
if (studyMonitor.IsDicomReUpload == false)
{
var study = _mapper.Map<DicomStudy>(incommand.Study);
var @lock = _distributedLockProvider.CreateLock($"StudyCode");
using (await @lock.AcquireAsync())
{
//查询数据库获取最大的Code 没有记录则为0
var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
//获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增
var cacheMaxCodeInt = _provider.Get<int>($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value;
int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
study.Code = currentNextCodeInt;
study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
_provider.Set<int>($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30));
}
study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString());
study.TrialId = incommand.TrialId;
study.SiteId = incommand.SiteId;
study.SubjectId = incommand.SubjectId;
study.SubjectVisitId = incommand.SubjectVisitId;
//特殊处理逻辑
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct());
SpecialArchiveStudyDeal(study);
await _studyRepository.AddAsync(study);
studyMonitor.StudyId = study.Id;
studyMonitor.StudyCode = study.StudyCode;
foreach (var seriesItem in incommand.Study.SeriesList)
{
var series = _mapper.Map<DicomSeries>(seriesItem);
series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString());
series.StudyId = study.Id;
series.TrialId = incommand.TrialId;
series.SiteId = incommand.SiteId;
series.SubjectId = incommand.SubjectId;
series.SubjectVisitId = incommand.SubjectVisitId;
await _dicomSeriesRepository.AddAsync(series);
foreach (var instanceItem in seriesItem.InstanceList)
{
var isntance = _mapper.Map<DicomInstance>(instanceItem);
Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString());
isntance.Id = instanceId;
isntance.StudyId = study.Id;
isntance.SeriesId = series.Id;
isntance.TrialId = incommand.TrialId;
isntance.SiteId = incommand.SiteId;
isntance.SubjectId = incommand.SubjectId;
isntance.SubjectVisitId = incommand.SubjectVisitId;
await _dicomInstanceRepository.AddAsync(isntance);
}
}
}
else
{
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); ;
var study = await _studyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
//特殊处理逻辑
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
SpecialArchiveStudyDeal(study);
// 少了整个序列
//某个序列下少了instance
foreach (var seriesItem in incommand.Study.SeriesList)
{
var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString());
DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
//判断重复
if (dicomSeries == null)
{
var series = _mapper.Map<DicomSeries>(seriesItem);
series.Id = seriesId;
series.StudyId = study.Id;
series.TrialId = incommand.TrialId;
series.SiteId = incommand.SiteId;
series.SubjectId = incommand.SubjectId;
series.SubjectVisitId = incommand.SubjectVisitId;
dicomSeries = await _dicomSeriesRepository.AddAsync(series);
//新的序列 那么 检查的序列数量+1
study.SeriesCount += 1;
}
else
{
//该序列掉了instance
dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
}
foreach (var instanceItem in seriesItem.InstanceList)
{
var insntance = _mapper.Map<DicomInstance>(instanceItem);
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString());
insntance.StudyId = study.Id;
insntance.SeriesId = dicomSeries.Id;
insntance.TrialId = incommand.TrialId;
insntance.SiteId = incommand.SiteId;
insntance.SubjectId = incommand.SubjectId;
insntance.SubjectVisitId = incommand.SubjectVisitId;
await _dicomInstanceRepository.AddAsync(insntance);
}
// 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加
study.InstanceCount += seriesItem.InstanceList.Count;
}
}
var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit");
using (await @lock2.AcquireAsync())
{
await _dicomInstanceRepository.SaveChangesAsync();
}
}
catch (Exception ex)
{
return ResponseOutput.NotOk(ex.Message);
}
finally
{
_provider.Remove($"StudyUid_{incommand.TrialId}_{incommand.Study.StudyInstanceUid}");
}
return ResponseOutput.Ok();
}
private void SpecialArchiveStudyDeal(DicomStudy study)
{
#region 特殊逻辑
if (study.PatientBirthDate.Length == 8)
{
study.PatientBirthDate = $"{study.PatientBirthDate[0]}{study.PatientBirthDate[1]}{study.PatientBirthDate[2]}{study.PatientBirthDate[3]}-{study.PatientBirthDate[4]}{study.PatientBirthDate[5]}-{study.PatientBirthDate[6]}{study.PatientBirthDate[7]}";
}
var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList();
var modality = study.Modalities;
var modalityForEdit = dicModalityList.Contains(modality) ? modality : String.Empty;
if (modality == "MR")
{
modalityForEdit = "MRI";
}
if (modality == "PT")
{
modalityForEdit = "PET";
}
if (modality == "PT、CT")
{
modalityForEdit = "PET-CT";
}
study.ModalityForEdit = modalityForEdit;
#endregion
}
}
}

View File

@ -0,0 +1,29 @@
using AutoMapper;
using AutoMapper.EquivalencyExpression;
using DocumentFormat.OpenXml.Spreadsheet;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.DTO;
using IRaCIS.Core.Application.Service.Third_partyProject.DTO;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Service
{
public class UltrasonicDicomConfig : Profile
{
public UltrasonicDicomConfig()
{
CreateMap<VisitTask, VisitTaskDTO_UltrasonicDicom>()
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code))
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
.ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName))
.ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
;
}
}
}

View File

@ -267,8 +267,7 @@ namespace IRaCIS.Core.Application.Services
foreach (var t in studyList)
{
t.SeriesList = await _repository.Where<DicomSeries>(s => s.StudyId == t.StudyId)
.WhereIf(isReading == 1, s => s.IsReading).OrderBy(s => s.SeriesNumber).
ThenBy(s => s.SeriesTime)
.WhereIf(isReading == 1, s => s.IsReading).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime)
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();

View File

@ -67,6 +67,18 @@ namespace IRaCIS.Core.Domain.Share
}
/// <summary>
/// 分组分类
/// </summary>
public enum GroupClassify
{
/// <summary>
/// 质量问题
/// </summary>
QualityProblem = 1,
}
/// <summary>
/// 临床表格问题标识
/// </summary>
@ -832,7 +844,7 @@ namespace IRaCIS.Core.Domain.Share
Normal = 1,
/// <summary>
/// 缓解
/// 部分缓解
/// </summary>
Remission = 2,
@ -854,10 +866,11 @@ namespace IRaCIS.Core.Domain.Share
/// <summary>
/// 肿大
/// </summary>
Swelling = 5,
Swelling = 6,
}
/// <summary>
/// 是1或否0
/// </summary>
@ -893,38 +906,12 @@ namespace IRaCIS.Core.Domain.Share
/// <summary>
/// 稳定
/// </summary>
Stabilization = 2,
Tumefaction = 2,
/// <summary>
/// 显著增大
/// 稳定
/// </summary>
Increase = 3,
/// <summary>
/// 无法评估
/// </summary>
NotEvaluable = 4,
}
/// <summary>
/// 脾脏状态
/// </summary>
public enum SpleenState
{
/// <summary>
/// 正常
/// </summary>
Normal = 1,
/// <summary>
/// 肿大
/// </summary>
Swelling = 2,
/// <summary>
/// 部分缓解稳定
/// </summary>
PartialRemission = 3,
Stabilization = 3,
/// <summary>
/// 显著增大
@ -936,6 +923,47 @@ namespace IRaCIS.Core.Domain.Share
/// </summary>
NotEvaluable = 5,
}
/// <summary>
/// 脾脏状态
/// </summary>
public enum SpleenState
{
/// <summary>
/// NA
/// </summary>
NA = -1,
/// <summary>
/// 正常
/// </summary>
Normal = 1,
/// <summary>
/// 部分缓解
/// </summary>
Remission = 2,
/// <summary>
/// 稳定
/// </summary>
Stabilization = 3,
/// <summary>
/// 显著增大
/// </summary>
Increase = 4,
/// <summary>
/// 无法评估
/// </summary>
NotEvaluable = 5,
/// <summary>
/// 肿大
/// </summary>
Swelling = 6,
}
/// <summary>
@ -2219,8 +2247,6 @@ public enum SUVChangeVSBaseline
/// <summary>
/// PET 5PS 评分
/// </summary>
@ -2244,7 +2270,7 @@ public enum SUVChangeVSBaseline
/// <summary>
/// 2分
/// </summary>
Two = 5,
Two = 2,
/// <summary>
/// 1分
@ -2263,6 +2289,22 @@ public enum SUVChangeVSBaseline
}
/// <summary>
/// 计算触发
/// </summary>
public enum ComputationTrigger
{
/// <summary>
/// 病灶
/// </summary>
Lesion=0,
/// <summary>
/// 报告
/// </summary>
Report=1,
}
/// <summary>
/// 新靶病灶评估
/// </summary>

View File

@ -426,5 +426,8 @@ namespace IRaCIS.Core.Domain.Models
}
}
public int ImageStudyState { get; set; }
}
}

View File

@ -16,7 +16,11 @@ namespace IRaCIS.Core.Domain.Models
[Table("Attachment")]
public partial class Attachment : Entity, IAuditAdd
{
public Guid? DoctorId { get; set; }
[JsonIgnore]
public Doctor Doctor { get; set; }
public Guid DoctorId { get; set; }
public string Type { get; set; }
public bool IsOfficial { get; set; } = false;
public string Path { get; set; } = string.Empty;

View File

@ -11,6 +11,10 @@ namespace IRaCIS.Core.Domain.Models
[ForeignKey("SeriesId")]
public DicomSeries DicomSerie { get; set; }
[JsonIgnore]
[ForeignKey("StudyId")]
public DicomStudy DicomStudy { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid SeqId { get; set; }

View File

@ -61,7 +61,9 @@ namespace IRaCIS.Core.Domain.Models
public bool IsDeleted {get;set;}
public bool IsReading { get; set; } = true;
public string IamgeResizePath { get; set; }=string.Empty;
public string ImageResizePath { get; set; }=string.Empty;
public Guid? VisitTaskId { get; set; }
}
}

View File

@ -203,6 +203,11 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public string? FileType { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 问题分类
/// </summary>

View File

@ -271,6 +271,13 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public Guid? GroupId { get; set; }
/// <summary>
/// 分组分类
/// </summary>
public GroupClassify? GroupClassify { get; set; }
/// <summary>
/// 问题分类
/// </summary>

View File

@ -589,6 +589,12 @@ namespace IRaCIS.Core.Infra.EFCore
throw new DBSaveFailedException("SQL 事务失败,请检查环境。");
}
catch (Exception ex)
{
_logger.LogError(ex.InnerException is null ? ex.Message : ex.InnerException?.Message);
throw new DBSaveFailedException("数据保存异常。");
}
}