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";