Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC
commit
551eb3851b
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 模板
|
||||
|
|
|
@ -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 模板
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -52,6 +52,8 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
CreateMap<TrialUser, TrialDocumentUserConfirmView>();
|
||||
|
||||
CreateMap<BatchAddTrialEmailNoticeConfig, TrialEmailNoticeConfig>();
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
|
||||
|
||||
|
|
|
@ -196,7 +196,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||
{
|
||||
await service.CalculateTask(new CalculateTaskInDto()
|
||||
{
|
||||
|
||||
ComputationTrigger= ComputationTrigger.Report,
|
||||
VisitTaskId = inDto.VisitTaskId
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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) &&
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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))
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -426,5 +426,8 @@ namespace IRaCIS.Core.Domain.Models
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public int ImageStudyState { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -203,6 +203,11 @@ namespace IRaCIS.Core.Domain.Models
|
|||
/// </summary>
|
||||
public string? FileType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分组分类
|
||||
/// </summary>
|
||||
public GroupClassify? GroupClassify { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 问题分类
|
||||
/// </summary>
|
||||
|
|
|
@ -271,6 +271,13 @@ namespace IRaCIS.Core.Domain.Models
|
|||
/// </summary>
|
||||
public Guid? GroupId { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 分组分类
|
||||
/// </summary>
|
||||
public GroupClassify? GroupClassify { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 问题分类
|
||||
/// </summary>
|
||||
|
|
|
@ -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("数据保存异常。");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue