diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 1dcd0d757..6a974b4a5 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -993,6 +993,8 @@ namespace IRaCIS.Core.API.Controllers EmailBodyHtml = 4, + ReadKeyFile=5, + Other = 5 } @@ -1025,6 +1027,9 @@ namespace IRaCIS.Core.API.Controllers case UploadFileType.EmailBodyHtml: result = await SingleFileUploadAsync((fileName) => FileStoreHelper.GetSystemFileUploadPath(_hostEnvironment, StaticData.Folder.EmailTemplate, fileName)); break; + case UploadFileType.ReadKeyFile: + result = await SingleFileUploadAsync((fileName) => FileStoreHelper.GetSystemFileUploadPath(_hostEnvironment, StaticData.Folder.ReadKetFile, fileName)); + break; default: result = await SingleFileUploadAsync((fileName) => FileStoreHelper.GetOtherFileUploadPath(_hostEnvironment, StaticData.Folder.TempFile, fileName)); diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 2cb56ec0e..40f5bed09 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -13736,6 +13736,84 @@ + + + 系统标准阅片关键点文件服务 + + + + + + + + + 系统标准阅片关键点文件服务 + + + + + + + + + 获取系统标准阅片关键点文件列表 + + + + + + + 新增或者修改系统标准阅片关键点文件 + + + + + + + 删除系统标准阅片关键点文件 + + + + + + + 项目标准阅片关键点文件服务 + + + + + + + + + 项目标准阅片关键点文件服务 + + + + + + + + + 获取项目标准阅片关键点文件列表 + + + + + + + 新增或者修改项目标准阅片关键点文件 + + + + + + + 删除项目标准阅片关键点文件 + + + + 获取疗效对照 @@ -13790,11 +13868,18 @@ - + IR影像阅片 + + + 设置已阅读关键文件 + + + + 获取阅片的计算数据 @@ -19325,6 +19410,12 @@ + + + 同步阅片关键点 + + + 修改全局阅片配置信息 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index 9ef41eb6e..90ace2e50 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -446,6 +446,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } + public class SetReadKeyFileInDto + { + public Guid TrialCriterionId { get; set; } + } public class ViewStudyPartInDto { public Guid VisitTaskId { get; set; } @@ -1947,6 +1951,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public bool IsConvertedTask { get; set; } = false; + public bool IsReadKeyFile { get; set; } = false; + } public class GetReadingImgInDto diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/SystemCriterionKeyFileViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/SystemCriterionKeyFileViewModel.cs new file mode 100644 index 000000000..e1bf1bd02 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Dto/SystemCriterionKeyFileViewModel.cs @@ -0,0 +1,42 @@ + +//-------------------------------------------------------------------- +// 此代码由liquid模板自动生成 byzhouhang 20240909 +// 生成时间 2025-11-12 06:46:41Z +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using System; +using IRaCIS.Core.Domain.Share; +using System.Collections.Generic; +namespace IRaCIS.Core.Application.Service.Reading.Dto; + +public class SystemCriterionKeyFileView : SystemCriterionKeyFileAddOrEdit +{ + + public DateTime CreateTime { get; set; } + +} + + +public class SystemCriterionKeyFileAddOrEdit +{ + public Guid? Id { get; set; } + + public string FileName { get; set; } + + public string FilePath { get; set; } + + public Guid SystemCriterionId { get; set; } + } + +public class SystemCriterionKeyFileQuery:PageInput +{ + public string? FileName { get; set; } + + public string? FilePath { get; set; } + + public Guid SystemCriterionId { get; set; } + } + + + + diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/TrialCriterionKeyFileViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/TrialCriterionKeyFileViewModel.cs new file mode 100644 index 000000000..35d78668b --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Dto/TrialCriterionKeyFileViewModel.cs @@ -0,0 +1,41 @@ + +//-------------------------------------------------------------------- +// 此代码由liquid模板自动生成 byzhouhang 20240909 +// 生成时间 2025-11-12 06:51:58Z +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using System; +using IRaCIS.Core.Domain.Share; +using System.Collections.Generic; +namespace IRaCIS.Core.Application.Service.Reading.Dto; + +public class TrialCriterionKeyFileView : TrialCriterionKeyFileAddOrEdit +{ + + public DateTime CreateTime { get; set; } + +} + + +public class TrialCriterionKeyFileAddOrEdit +{ + public Guid? Id { get; set; } + + public string FileName { get; set; } + + public string FilePath { get; set; } + + public Guid TrialCriterionId { get; set; } + } + +public class TrialCriterionKeyFileQuery:PageInput +{ + public string? FileName { get; set; } + + + public Guid TrialCriterionId { get; set; } + } + + + + diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/ISystemCriterionKeyFileService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/ISystemCriterionKeyFileService.cs new file mode 100644 index 000000000..99f988c32 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Interface/ISystemCriterionKeyFileService.cs @@ -0,0 +1,23 @@ + +//-------------------------------------------------------------------- +// 此代码由liquid模板自动生成 byzhouhang 20240909 +// 生成时间 2025-11-12 06:46:41Z +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using System; +using IRaCIS.Core.Infrastructure.Extention; +using System.Threading.Tasks; +using IRaCIS.Core.Application.Service.Reading.Dto; +namespace IRaCIS.Core.Application.Service.Reading.Interface; + +public interface ISystemCriterionKeyFileService +{ + + Task> GetSystemCriterionKeyFileList(SystemCriterionKeyFileQuery inQuery); + + Task AddOrUpdateSystemCriterionKeyFile(SystemCriterionKeyFileAddOrEdit addOrEditSystemCriterionKeyFile); + + Task DeleteSystemCriterionKeyFile(Guid systemCriterionKeyFileId); +} + + diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/ITrialCriterionKeyFileService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/ITrialCriterionKeyFileService.cs new file mode 100644 index 000000000..4a2c5ceb6 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Interface/ITrialCriterionKeyFileService.cs @@ -0,0 +1,23 @@ + +//-------------------------------------------------------------------- +// 此代码由liquid模板自动生成 byzhouhang 20240909 +// 生成时间 2025-11-12 06:51:58Z +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using System; +using IRaCIS.Core.Infrastructure.Extention; +using System.Threading.Tasks; +using IRaCIS.Core.Application.Service.Reading.Dto; +namespace IRaCIS.Core.Application.Service.Reading.Interface; + +public interface ITrialCriterionKeyFileService +{ + + Task> GetTrialCriterionKeyFileList(TrialCriterionKeyFileQuery inQuery); + + Task AddOrUpdateTrialCriterionKeyFile(TrialCriterionKeyFileAddOrEdit addOrEditTrialCriterionKeyFile); + + Task DeleteTrialCriterionKeyFile(Guid trialCriterionKeyFileId); +} + + diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/SystemCriterionKeyFileService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/SystemCriterionKeyFileService.cs new file mode 100644 index 000000000..9e605643e --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/SystemCriterionKeyFileService.cs @@ -0,0 +1,78 @@ + +//-------------------------------------------------------------------- +// 此代码由liquid模板自动生成 byzhouhang 20240909 +// 生成时间 2025-11-12 06:46:38Z +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using IRaCIS.Core.Domain.Models; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Infrastructure.Extention; +using System.Threading.Tasks; +using IRaCIS.Core.Infra.EFCore; +using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Application.Service.Reading.Interface; +namespace IRaCIS.Core.Application.Service; + + +/// +/// 系统标准阅片关键点文件服务 +/// +/// +/// +/// +/// +[ApiExplorerSettings(GroupName = "Reading")] +public class SystemCriterionKeyFileService(IRepository _systemCriterionKeyFileRepository, + IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer): BaseService, ISystemCriterionKeyFileService +{ + + /// + /// 获取系统标准阅片关键点文件列表 + /// + /// + /// + [HttpPost] + public async Task> GetSystemCriterionKeyFileList(SystemCriterionKeyFileQuery inQuery) + { + + var systemCriterionKeyFileQueryable =_systemCriterionKeyFileRepository + .Where(x=>x.SystemCriterionId==inQuery.SystemCriterionId) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.FileName),x=>x.FileName.Contains(inQuery.FileName)) + .ProjectTo(_mapper.ConfigurationProvider); + + var pageList= await systemCriterionKeyFileQueryable.ToPagedListAsync(inQuery); + + return pageList; + } + + + /// + /// 新增或者修改系统标准阅片关键点文件 + /// + /// + /// + public async Task AddOrUpdateSystemCriterionKeyFile(SystemCriterionKeyFileAddOrEdit addOrEditSystemCriterionKeyFile) + { + // 在此处拷贝automapper 映射 + var entity = await _systemCriterionKeyFileRepository.InsertOrUpdateAsync(addOrEditSystemCriterionKeyFile, true); + + return ResponseOutput.Ok(entity.Id.ToString()); + + } + + /// + /// 删除系统标准阅片关键点文件 + /// + /// + /// + [HttpDelete("{systemCriterionKeyFileId:guid}")] + public async Task DeleteSystemCriterionKeyFile(Guid systemCriterionKeyFileId) + { + var success = await _systemCriterionKeyFileRepository.DeleteFromQueryAsync(t => t.Id == systemCriterionKeyFileId,true); + return ResponseOutput.Ok(); + } + +} + + + diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/TrialCriterionKeyFileService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/TrialCriterionKeyFileService.cs new file mode 100644 index 000000000..907d586a2 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/TrialCriterionKeyFileService.cs @@ -0,0 +1,81 @@ + +//-------------------------------------------------------------------- +// 此代码由liquid模板自动生成 byzhouhang 20240909 +// 生成时间 2025-11-12 06:51:56Z +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using IRaCIS.Core.Domain.Models; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Infrastructure.Extention; +using System.Threading.Tasks; +using IRaCIS.Core.Infra.EFCore; +using IRaCIS.Core.Application.Service.Reading.Interface; +using IRaCIS.Core.Application.Service.Reading.Dto; +namespace IRaCIS.Core.Application.Service; + +/// +/// 项目标准阅片关键点文件服务 +/// +/// +/// +/// +/// +[ApiExplorerSettings(GroupName = "Reading")] +public class TrialCriterionKeyFileService(IRepository _trialCriterionKeyFileRepository, + IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer): BaseService, ITrialCriterionKeyFileService +{ + + + /// + /// 获取项目标准阅片关键点文件列表 + /// + /// + /// + [HttpPost] + public async Task> GetTrialCriterionKeyFileList(TrialCriterionKeyFileQuery inQuery) + { + + var trialCriterionKeyFileQueryable =_trialCriterionKeyFileRepository + .Where(x=>x.TrialCriterionId==inQuery.TrialCriterionId) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.FileName),x=>x.FileName.Contains(inQuery.FileName)) + .ProjectTo(_mapper.ConfigurationProvider); + + var pageList= await trialCriterionKeyFileQueryable.ToPagedListAsync(inQuery); + + return pageList; + } + + + /// + /// 新增或者修改项目标准阅片关键点文件 + /// + /// + /// + [HttpPost] + public async Task AddOrUpdateTrialCriterionKeyFile(TrialCriterionKeyFileAddOrEdit addOrEditTrialCriterionKeyFile) + { + + + + var entity = await _trialCriterionKeyFileRepository.InsertOrUpdateAsync(addOrEditTrialCriterionKeyFile, true); + + return ResponseOutput.Ok(entity.Id.ToString()); + + } + + /// + /// 删除项目标准阅片关键点文件 + /// + /// + /// + [HttpDelete("{trialCriterionKeyFileId:guid}")] + public async Task DeleteTrialCriterionKeyFile(Guid trialCriterionKeyFileId) + { + var success = await _trialCriterionKeyFileRepository.DeleteFromQueryAsync(t => t.Id == trialCriterionKeyFileId,true); + return ResponseOutput.Ok(); + } + +} + + + diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index ac89912c7..bdb756256 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -71,6 +71,7 @@ namespace IRaCIS.Core.Application.Service IRepository _readingTaskQuestionAnswerRepository, IRepository _readingQuestionCriterionTrialRepository, IRepository _readingQuestionSystem, + IRepository _criterionKeyFileReadRepository, IRepository _noneDicomStudyFileSystem, IGeneralCalculateService _generalCalculateService, IRepository _readingQuestionTrialRepository, @@ -80,7 +81,23 @@ namespace IRaCIS.Core.Application.Service IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IReadingImageTaskService { + /// + /// 设置已阅读关键文件 + /// + /// + /// + [HttpPost] + public async Task SetReadKeyFile(SetReadKeyFileInDto inDto) + { + await _criterionKeyFileReadRepository.AddAsync(new CriterionKeyFileRead() + { + IdentityUserId=_userInfo.IdentityUserId, + TrialCriterionId= inDto.TrialCriterionId, + }); + await _criterionKeyFileReadRepository.SaveChangesAsync(); + return ResponseOutput.Ok(); + } #region 计算 @@ -3747,6 +3764,7 @@ namespace IRaCIS.Core.Application.Service task.ReadingToolList = criterionInfo.ReadingToolList; task.IsExistUnprocessedFeedback = await _userFeedBackRepository.AnyAsync(x => x.VisitTaskId == task.VisitTaskId && x.State == 0); task.IsViewStudyPart= visitTaskInfo.ReadingCategory==ReadingCategory.Judge|| visitTaskInfo.IsViewStudyPart; + task.IsReadKeyFile = await _criterionKeyFileReadRepository.AnyAsync(x => x.IdentityUserId == _userInfo.IdentityUserId && x.TrialCriterionId == task.TrialReadingCriterionId); // 添加默认答案 if (inDto.VisitTaskId == null && visitTaskInfo.ReadingTaskState != ReadingTaskState.HaveSigned) { diff --git a/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs b/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs index 76d0127e1..fc924e285 100644 --- a/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs @@ -15,6 +15,14 @@ namespace IRaCIS.Core.Application.Service //是否英文环境 var isEn_Us = false; + CreateMap(); + CreateMap().ReverseMap(); + + // 在此处拷贝automapper 映射 + + CreateMap(); + CreateMap().ReverseMap(); + //标准Id List CriterionIds = new List(); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 4e4464529..f650253da 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Panda.DynamicWebApi.Attributes; +using System.IO; using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application @@ -30,6 +31,10 @@ namespace IRaCIS.Core.Application IRepository _readingQuestionCriterionSystemRepository, IRepository _clinicalDataTrialSetRepository, IRepository _readingCriterionPageRepository, + + IRepository _systemCriterionKeyFileRepository, + IOSSService oSSService, + IRepository _trialCriterionKeyFileRepository, IOrganInfoService _iOrganInfoService, IRepository _trialBodyPartRepository, IRepository _readingCriterionDictionaryRepository, @@ -276,6 +281,8 @@ namespace IRaCIS.Core.Application await _trialCriterionDictionaryCode.AddRangeAsync(criterionDictionaryCodeList); #endregion + // 同步阅片关键点 + await SynchronizeKeyFile(inDto.TrialReadingCriterionId); //var trialModalitys = _readingQuestionCriterionTrialRepository.Where(t => t.Id == inDto.TrialReadingCriterionId).Select(t => t.Trial.Modalitys).FirstOrDefault(); var systemCriterion = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == trialCriterion.ReadingQuestionCriterionSystemId).FirstNotNullAsync(); @@ -317,6 +324,39 @@ namespace IRaCIS.Core.Application return ResponseOutput.Ok(true); } + + /// + /// 同步阅片关键点 + /// + /// + public async Task SynchronizeKeyFile(Guid TrialReadingCriterionId) + { + var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == TrialReadingCriterionId).AsNoTracking().FirstOrDefaultAsync(); + if (trialCriterion != null && trialCriterion.ReadingQuestionCriterionSystemId!=null) + { + var systemCriterionKeyFile = await _systemCriterionKeyFileRepository.Where(x => x.SystemCriterionId == trialCriterion.ReadingQuestionCriterionSystemId).ToListAsync(); + + List trialCriterionKeyFiles= new List(); + + foreach (var item in systemCriterionKeyFile) + { + + var path= await oSSService.UploadToOSSAsync(item.FilePath, $"{trialCriterion.TrialId}/KeyFile", true); + + trialCriterionKeyFiles.Add(new TrialCriterionKeyFile + { + TrialCriterionId= TrialReadingCriterionId, + FileName= item.FileName, + FilePath= path + }); + } + + await _trialCriterionKeyFileRepository.BatchDeleteNoTrackingAsync(x => x.TrialCriterionId == TrialReadingCriterionId); + await _trialCriterionKeyFileRepository.AddRangeAsync(trialCriterionKeyFiles); + await _trialCriterionKeyFileRepository.SaveChangesAsync(); + } + } + /// /// 修改全局阅片配置信息 /// diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs index 84eb1bc26..f320c92b6 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs @@ -85,6 +85,7 @@ public static class StaticData public static readonly string DataTemplate = "DataTemplate"; public static readonly string EmailTemplate = "EmailTemplate"; + public static readonly string ReadKetFile = "ReadKetFile"; public static readonly string CommonFile = "CommonFile";