master
hang 2023-09-15 13:12:39 +08:00
parent 33a8b4117c
commit bd6ed51a8c
15 changed files with 114 additions and 74 deletions

View File

@ -2,8 +2,10 @@
using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Drawing;
using EasyCaching.Core; using EasyCaching.Core;
using ExcelDataReader; using ExcelDataReader;
using Hangfire;
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Application.Interfaces; using IRaCIS.Application.Interfaces;
using IRaCIS.Application.Services.BackGroundJob;
using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.Dicom; using IRaCIS.Core.Application.Contracts.Dicom;
@ -424,7 +426,12 @@ namespace IRaCIS.Core.API.Controllers
} }
/// <summary>
/// 创建zip包
/// </summary>
/// <param name="visitTaskId"></param>
/// <param name="_uploadHub"></param>
/// <returns></returns>
[HttpPost, Route("Study/CreateImageZip")] [HttpPost, Route("Study/CreateImageZip")]
public async Task<IResponseOutput> CreateImageZipAsync(Guid visitTaskId, [FromServices] IHubContext<UploadHub, IUploadClient> _uploadHub) public async Task<IResponseOutput> CreateImageZipAsync(Guid visitTaskId, [FromServices] IHubContext<UploadHub, IUploadClient> _uploadHub)
{ {
@ -452,22 +459,17 @@ namespace IRaCIS.Core.API.Controllers
var relativePath = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TempFileFolder}/{zipFileName}"; var relativePath = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TempFileFolder}/{zipFileName}";
BackgroundJob.Schedule<IIRaCISCacheHangfireJob>(t => t.CreateImageZipTask(folderPath,zipFilePath,relativePath, visitTaskId), TimeSpan.FromSeconds(1));
await Task.Run(async () =>
{
ZipFile.CreateFromDirectory(folderPath, zipFilePath);
await _repository.BatchUpdateAsync<VisitTask>(t => t.Id == visitTaskId, u => new VisitTask() { PackState = PackState.Packed, PackRelativePath = relativePath });
});
// 发送最终进度信息到客户端
//await _uploadHub.Clients.User(_userInfo.Id.ToString()).CompressProgressAsync(visitTaskId, $"打包完成");
return ResponseOutput.Ok(relativePath); return ResponseOutput.Ok(relativePath);
} }
/// <summary>
/// 下载压缩包
/// </summary>
/// <param name="relativePath"></param>
/// <returns></returns>
[AllowAnonymous] [AllowAnonymous]
[HttpGet("Study/DownloadImageZip")] [HttpGet("Study/DownloadImageZip")]
public IActionResult DownloadImageZip(string relativePath) public IActionResult DownloadImageZip(string relativePath)

View File

@ -1,5 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<SignAssembly>false</SignAssembly> <SignAssembly>false</SignAssembly>
@ -110,7 +109,8 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Hangfire.Tags.SqlServer" Version="1.8.1" /> <PackageReference Include="Hangfire.AspNetCore" Version="1.8.5" />
<PackageReference Include="Hangfire.InMemory" Version="0.5.1" />
<PackageReference Include="Invio.Extensions.Authentication.JwtBearer" Version="2.0.1" /> <PackageReference Include="Invio.Extensions.Authentication.JwtBearer" Version="2.0.1" />
<PackageReference Include="LogDashboard" Version="1.4.8" /> <PackageReference Include="LogDashboard" Version="1.4.8" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.0.0" /> <PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />

View File

@ -229,6 +229,21 @@
<member name="M:IRaCIS.Core.API.Controllers.StudyController.ArchiveStudyNew(System.Guid,System.Guid,System.String,System.Nullable{System.Guid},System.Guid,Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.API.Controllers.UploadDownLoadController},EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Application.Contracts.IStudyService,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient},IRaCIS.Core.Application.Contracts.Dicom.IDicomArchiveService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})"> <member name="M:IRaCIS.Core.API.Controllers.StudyController.ArchiveStudyNew(System.Guid,System.Guid,System.String,System.Nullable{System.Guid},System.Guid,Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.API.Controllers.UploadDownLoadController},EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Application.Contracts.IStudyService,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient},IRaCIS.Core.Application.Contracts.Dicom.IDicomArchiveService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
<summary>Dicom 归档</summary> <summary>Dicom 归档</summary>
</member> </member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.CreateImageZipAsync(System.Guid,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient})">
<summary>
创建zip包
</summary>
<param name="visitTaskId"></param>
<param name="_uploadHub"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.DownloadImageZip(System.String)">
<summary>
下载压缩包
</summary>
<param name="relativePath"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadVisitClinicalData(System.Guid)"> <member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadVisitClinicalData(System.Guid)">
<summary> <summary>
上传临床数据 多文件 上传临床数据 多文件

View File

@ -84,8 +84,6 @@ namespace IRaCIS.Core.API
options.Filters.Add<LimitUserRequestAuthorization>(); options.Filters.Add<LimitUserRequestAuthorization>();
} }
}) })
.AddNewtonsoftJsonSetup(); // NewtonsoftJson 序列化 处理 .AddNewtonsoftJsonSetup(); // NewtonsoftJson 序列化 处理
@ -115,7 +113,7 @@ namespace IRaCIS.Core.API
//services.AddDistributedMemoryCache(); //services.AddDistributedMemoryCache();
// hangfire 定时任务框架 有界面,更友好~ // hangfire 定时任务框架 有界面,更友好~
//services.AddhangfireSetup(_configuration); services.AddhangfireSetup(_configuration);
// QuartZ 定时任务框架 使用了hangfire 暂时不用,后续需要可以打开,已经配好 // QuartZ 定时任务框架 使用了hangfire 暂时不用,后续需要可以打开,已经配好
services.AddQuartZSetup(_configuration); services.AddQuartZSetup(_configuration);

View File

@ -13,15 +13,15 @@ namespace IRaCIS.Core.API
public static void UseHangfireConfig(this IApplicationBuilder app, IWebHostEnvironment env) public static void UseHangfireConfig(this IApplicationBuilder app, IWebHostEnvironment env)
{ {
app.UseHangfireDashboard("/api/hangfire", new DashboardOptions() //app.UseHangfireDashboard("/api/hangfire", new DashboardOptions()
{ //{
//直接访问没有带token 获取不到用户身份信息,所以这种自定义授权暂时没法使用 // //直接访问没有带token 获取不到用户身份信息,所以这种自定义授权暂时没法使用
//Authorization = new[] { new hangfireAuthorizationFilter() } // //Authorization = new[] { new hangfireAuthorizationFilter() }
//本地请求 才能看 // //本地请求 才能看
Authorization = new[] { new LocalRequestsOnlyAuthorizationFilter() } // Authorization = new[] { new LocalRequestsOnlyAuthorizationFilter() }
}); //});
#region hangfire #region hangfire
//// 延迟任务执行 1秒之后执行 有时启动没运行 换成添加到队列中 //// 延迟任务执行 1秒之后执行 有时启动没运行 换成添加到队列中
@ -31,7 +31,7 @@ namespace IRaCIS.Core.API
//周期性任务1天执行一次 //周期性任务1天执行一次
RecurringJob.AddOrUpdate<IIRaCISCacheHangfireJob>(t => t.ProjectStartCache(), Cron.Daily); //RecurringJob.AddOrUpdate<IIRaCISCacheHangfireJob>(t => t.ProjectStartCache(), Cron.Daily);
#endregion #endregion

View File

@ -6,10 +6,10 @@ namespace IRaCIS.Core.API.Filter
{ {
public bool Authorize(DashboardContext context) public bool Authorize(DashboardContext context)
{ {
var httpContext = context.GetHttpContext(); //var httpContext = context.GetHttpContext();
// Allow all authenticated users to see the Dashboard (potentially dangerous). // Allow all authenticated users to see the Dashboard (potentially dangerous).
return httpContext.User.Identity.IsAuthenticated; return true;
//return true; //return true;
} }

View File

@ -1,6 +1,4 @@
using Hangfire; using Hangfire;
using Hangfire.SqlServer;
using Hangfire.Tags.SqlServer;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System; using System;
@ -11,26 +9,10 @@ namespace IRaCIS.Core.API
{ {
public static void AddhangfireSetup(this IServiceCollection services, IConfiguration configuration) public static void AddhangfireSetup(this IServiceCollection services, IConfiguration configuration)
{ {
var hangFireConnStr = configuration.GetSection("ConnectionStrings:Hangfire").Value;
services.AddHangfire(hangFireConfig =>
{
//指定存储介质
hangFireConfig.UseSqlServerStorage(hangFireConnStr, new SqlServerStorageOptions()
{
SchemaName = "hangfire",
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
});
hangFireConfig.UseTagsWithSql(); //nuget引入Hangfire.Tags.SqlServer services.AddHangfire(configuration => configuration
//.UseHangfireHttpJob(); .UseInMemoryStorage()); // 使用内存存储
});
services.AddHangfireServer(); services.AddHangfireServer();

View File

@ -2,6 +2,7 @@
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Microsoft.EntityFrameworkCore.SqlServer.Query.Internal; using Microsoft.EntityFrameworkCore.SqlServer.Query.Internal;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.IO.Compression;
namespace IRaCIS.Application.Services.BackGroundJob namespace IRaCIS.Application.Services.BackGroundJob
{ {
@ -15,10 +16,14 @@ namespace IRaCIS.Application.Services.BackGroundJob
Task MemoryCacheAnonymizeData(); Task MemoryCacheAnonymizeData();
Task CacheUserTypePermission(Guid? cacheUserTypeId); Task CacheUserTypePermission(Guid? cacheUserTypeId);
Task CreateImageZipTask(string folderPath, string zipPath, string relativePath, Guid visitTaskId);
} }
public class IRaCISCacheHangfireJob: IIRaCISCacheHangfireJob public class IRaCISCacheHangfireJob: IIRaCISCacheHangfireJob
{ {
private readonly IRepository<Trial> _trialRepository; private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<VisitTask> _VisitTaskRepository;
private readonly IEasyCachingProvider _provider; private readonly IEasyCachingProvider _provider;
private readonly ILogger<IRaCISCacheHangfireJob> _logger; private readonly ILogger<IRaCISCacheHangfireJob> _logger;
private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository; private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;
@ -27,13 +32,14 @@ namespace IRaCIS.Application.Services.BackGroundJob
public IRaCISCacheHangfireJob(IRepository<Trial> trialRepository, public IRaCISCacheHangfireJob(IRepository<Trial> trialRepository,
IRepository<SystemAnonymization> systemAnonymizationRepository, IRepository<UserTypeMenu> userTypeMenuRepository, IRepository<SystemAnonymization> systemAnonymizationRepository, IRepository<UserTypeMenu> userTypeMenuRepository,
IEasyCachingProvider provider,ILogger<IRaCISCacheHangfireJob> logger) IEasyCachingProvider provider,ILogger<IRaCISCacheHangfireJob> logger, IRepository<VisitTask> visitTaskRepository)
{ {
_trialRepository = trialRepository; _trialRepository = trialRepository;
_provider = provider; _provider = provider;
_logger = logger; _logger = logger;
_systemAnonymizationRepository = systemAnonymizationRepository; _systemAnonymizationRepository = systemAnonymizationRepository;
_userTypeMenuRepository = userTypeMenuRepository; _userTypeMenuRepository = userTypeMenuRepository;
_VisitTaskRepository = visitTaskRepository;
} }
@ -67,11 +73,6 @@ namespace IRaCIS.Application.Services.BackGroundJob
} }
public async Task MemoryCacheAnonymizeData() public async Task MemoryCacheAnonymizeData()
{ {
var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync(); var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync();
@ -94,6 +95,10 @@ namespace IRaCIS.Application.Services.BackGroundJob
} }
} }
public async Task CreateImageZipTask(string folderPath, string zipFilePath, string relativePath,Guid visitTaskId)
{
ZipFile.CreateFromDirectory(folderPath, zipFilePath);
await _VisitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTaskId, u => new VisitTask() { PackState = PackState.Packed, PackRelativePath = relativePath });
}
} }
} }

View File

@ -3,6 +3,7 @@ using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using static IRaCIS.Core.Domain.Share.StaticData; using static IRaCIS.Core.Domain.Share.StaticData;
@ -15,17 +16,18 @@ namespace IRaCIS.Core.Application.Filter
{ {
private readonly IEasyCachingProvider _provider; private readonly IEasyCachingProvider _provider;
private readonly IUserInfo _userInfo; private readonly IUserInfo _userInfo;
public IStringLocalizer _localizer;
private readonly List<string> _trialOptList=new List<string>(); private readonly List<string> _trialOptList=new List<string>();
public TrialResourceFilter(IEasyCachingProvider provider, IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null) public TrialResourceFilter(IEasyCachingProvider provider, IStringLocalizer localizer, IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null)
{ {
_provider = provider; _provider = provider;
_userInfo = userInfo; _userInfo = userInfo;
//_trialOpt = trialOpt; //_trialOpt = trialOpt;
_localizer = localizer;
if (!string.IsNullOrWhiteSpace(trialOpt)) _trialOptList.Add(trialOpt.Trim()); if (!string.IsNullOrWhiteSpace(trialOpt)) _trialOptList.Add(trialOpt.Trim());
if (!string.IsNullOrWhiteSpace(trialOpt2)) _trialOptList.Add(trialOpt2.Trim()); if (!string.IsNullOrWhiteSpace(trialOpt2)) _trialOptList.Add(trialOpt2.Trim());
if (!string.IsNullOrWhiteSpace(trialOpt3)) _trialOptList.Add(trialOpt3.Trim()); if (!string.IsNullOrWhiteSpace(trialOpt3)) _trialOptList.Add(trialOpt3.Trim());
@ -184,7 +186,8 @@ namespace IRaCIS.Core.Application.Filter
// 项目停止、或者完成 不允许操作 // 项目停止、或者完成 不允许操作
else else
{ {
context.Result = new JsonResult(ResponseOutput.NotOk("本次请求被配置规则拦截:项目状态处于进行中状态时,才允许操作。")); //本次请求被配置规则拦截:项目状态处于进行中状态时,才允许操作。
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_InterceptedProjectStatusRule"]));
} }

View File

@ -96,9 +96,7 @@
<PackageReference Include="fo-dicom.Drawing" Version="4.0.8" /> <PackageReference Include="fo-dicom.Drawing" Version="4.0.8" />
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.1.0" /> <PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.1.0" />
<PackageReference Include="FreeSpire.Doc" Version="10.8.0" /> <PackageReference Include="FreeSpire.Doc" Version="10.8.0" />
<PackageReference Include="Hangfire" Version="1.7.31"> <PackageReference Include="Hangfire.Core" Version="1.8.5" />
<TreatAsUsed>true</TreatAsUsed>
</PackageReference>
<PackageReference Include="Magicodes.IE.Core" Version="2.7.4.2" /> <PackageReference Include="Magicodes.IE.Core" Version="2.7.4.2" />
<PackageReference Include="Magicodes.IE.Csv" Version="2.7.4.2"> <PackageReference Include="Magicodes.IE.Csv" Version="2.7.4.2">
<TreatAsUsed>true</TreatAsUsed> <TreatAsUsed>true</TreatAsUsed>

View File

@ -1,5 +1,4 @@
{ {
"test{0}{1}": "英文本地化{0}{1}",
"RequiredAttribute": "{0} is required", "RequiredAttribute": "{0} is required",
// SiteSurvey -------------------------------------------------------------------------------------------------------------------------- // SiteSurvey --------------------------------------------------------------------------------------------------------------------------

View File

@ -1,5 +1,34 @@
{ {
"test{0}{1}": "中文本地化{0}{1}",
// trial --------------------------------------------------------------------------------------------------------------------------
"TrialService_OnlyInInitOrProgress": "项目状态只有处于:初始化或者进行中时,才允许操作。",
"TrialService_ExistPN": "已经存在相同的项目编号",
"SubjectService_ExistSubjectCode": "已存在具有相关患者编号的患者。",
"SubjectService_ExistImage": "该患者已经有检查批次已经上传影像,不允许删除。",
"SubjectVisitServiece_ExistOtherInCurrent": "该患者的检查批次中,在选择的上一检查后已存在计划外的的检查批次,请重新选择上一检查。",
"SubjectVisitServiece_ExistName": "该患者的检查批次中已经包含一个具有相同名称的检查批次。",
"SubjectVisitServiece_ExistImage": "当前检查批次已经有影像上传,不允许删除。",
"SubjectVisitServiece_HaveSetBeforeBatch": "当前检查批次已经被设置为另一检查批次的上一检查批次,不允许删除。",
"TrialResource_InterceptedProjectStatusRule": null,
"RequiredAttribute": "{0} 字段是必须的", "RequiredAttribute": "{0} 字段是必须的",
// SiteSurvey -------------------------------------------------------------------------------------------------------------------------- // SiteSurvey --------------------------------------------------------------------------------------------------------------------------

View File

@ -146,10 +146,7 @@ namespace IRaCIS.Application.Services
if (trialAddModel.Id == Guid.Empty || trialAddModel.Id == null) if (trialAddModel.Id == Guid.Empty || trialAddModel.Id == null)
{ {
if (await _trialRepository.AnyAsync(u => u.TrialCode == trialAddModel.TrialCode))
{
throw new BusinessValidationFailedException("已经存在相同的项目编号。");
}
var dbMaxCode = await _trialRepository.Where(t => t.CreateTime.Year == DateTime.Now.Year && t.TrialType == trialAddModel.TrialType).Select(t => t.Code).DefaultIfEmpty().MaxAsync(); var dbMaxCode = await _trialRepository.Where(t => t.CreateTime.Year == DateTime.Now.Year && t.TrialType == trialAddModel.TrialType).Select(t => t.Code).DefaultIfEmpty().MaxAsync();
@ -275,13 +272,15 @@ namespace IRaCIS.Application.Services
if (!await _repository.AnyAsync<Trial>(u => u.Id == trialAddModel.Id && (u.TrialStatusStr == StaticData.TrialState.TrialInitializing || u.TrialStatusStr == StaticData.TrialState.TrialOngoing))) if (!await _repository.AnyAsync<Trial>(u => u.Id == trialAddModel.Id && (u.TrialStatusStr == StaticData.TrialState.TrialInitializing || u.TrialStatusStr == StaticData.TrialState.TrialOngoing)))
{ {
throw new BusinessValidationFailedException("项目状态只有处于:初始化或者进行中时,才允许操作。"); //项目状态只有处于:初始化或者进行中时,才允许操作。
throw new BusinessValidationFailedException(_localizer["TrialService_OnlyInInitOrProgress"]);
} }
// 判断项目Id 是否已经存在 // 判断项目Id 是否已经存在
if (await _repository.AnyAsync<Trial>(u => u.TrialCode == updateModel.TrialCode && u.Id != updateModel.Id)) if (await _repository.AnyAsync<Trial>(u => u.TrialCode == updateModel.TrialCode && u.Id != updateModel.Id))
{ {
throw new BusinessValidationFailedException("已经存在相同的项目编号。"); //已经存在相同的项目编号。
throw new BusinessValidationFailedException(_localizer["TrialService_ExistPN"]);
} }

View File

@ -39,7 +39,9 @@ namespace IRaCIS.Application.Services
var verifyExp1 = new EntityVerifyExp<Subject>() var verifyExp1 = new EntityVerifyExp<Subject>()
{ {
VerifyExp = u => u.Code == subjectCommand.Code && u.TrialId == subjectCommand.TrialId, VerifyExp = u => u.Code == subjectCommand.Code && u.TrialId == subjectCommand.TrialId,
VerifyMsg = "已存在具有相关患者编号的患者。"
//"已存在具有相关患者编号的患者。"
VerifyMsg = _localizer["SubjectService_ExistSubjectCode"]
}; };
@ -88,7 +90,8 @@ namespace IRaCIS.Application.Services
if (await _subjectVisitRepository.AnyAsync(u => u.SubjectId == id && u.VisitExecuted == VisitExecutedEnum.Executed)) if (await _subjectVisitRepository.AnyAsync(u => u.SubjectId == id && u.VisitExecuted == VisitExecutedEnum.Executed))
{ {
return ResponseOutput.NotOk("该患者已经有检查批次已经上传影像,不允许删除。"); //"该患者已经有检查批次已经上传影像,不允许删除。"
return ResponseOutput.NotOk(_localizer["SubjectService_ExistImage"] );
} }
await _subjectRepository.UpdatePartialFromQueryAsync(id, x => new Subject await _subjectRepository.UpdatePartialFromQueryAsync(id, x => new Subject

View File

@ -68,12 +68,15 @@ namespace IRaCIS.Core.Application.Services
var verifyExp1 = new EntityVerifyExp<SubjectVisit>() var verifyExp1 = new EntityVerifyExp<SubjectVisit>()
{ {
VerifyExp = t => t.VisitNum == svCommand.VisitNum && t.SubjectId == svCommand.SubjectId, VerifyExp = t => t.VisitNum == svCommand.VisitNum && t.SubjectId == svCommand.SubjectId,
VerifyMsg = "该患者的检查批次中,在选择的上一检查后已存在计划外的的检查批次,请重新选择上一检查。"
//"该患者的检查批次中,在选择的上一检查后已存在计划外的的检查批次,请重新选择上一检查。"
VerifyMsg = _localizer["SubjectVisitServiece_ExistOtherInCurrent"]
}; };
var verifyExp2 = new EntityVerifyExp<SubjectVisit>() var verifyExp2 = new EntityVerifyExp<SubjectVisit>()
{ {
VerifyExp = t => t.SubjectId == svCommand.SubjectId && t.IsFinalVisit, VerifyExp = t => t.SubjectId == svCommand.SubjectId && t.IsFinalVisit,
//
VerifyMsg = "该患者已经有检查批次设置为末次检查批次,不允许将当前检查批次设置为末次检查批次。", VerifyMsg = "该患者已经有检查批次设置为末次检查批次,不允许将当前检查批次设置为末次检查批次。",
IsVerify = svCommand.IsFinalVisit IsVerify = svCommand.IsFinalVisit
}; };
@ -81,7 +84,9 @@ namespace IRaCIS.Core.Application.Services
var verifyExp3 = new EntityVerifyExp<SubjectVisit>() var verifyExp3 = new EntityVerifyExp<SubjectVisit>()
{ {
VerifyExp = t => t.SubjectId == svCommand.SubjectId && t.VisitName == svCommand.VisitName, VerifyExp = t => t.SubjectId == svCommand.SubjectId && t.VisitName == svCommand.VisitName,
VerifyMsg = "该患者的检查批次中已经包含一个具有相同名称的检查批次。"
//"该患者的检查批次中已经包含一个具有相同名称的检查批次。"
VerifyMsg = _localizer["SubjectVisitServiece_ExistName"]
}; };
@ -197,7 +202,8 @@ namespace IRaCIS.Core.Application.Services
{ {
if (await _repository.AnyAsync<DicomStudy>(t => t.SubjectVisitId == id)) if (await _repository.AnyAsync<DicomStudy>(t => t.SubjectVisitId == id))
{ {
return ResponseOutput.NotOk("当前检查批次已经有影像上传,不允许删除。"); //"当前检查批次已经有影像上传,不允许删除。"
return ResponseOutput.NotOk(_localizer["SubjectVisitServiece_ExistImage"]);
} }
if (await _subjectVisitRepository.AnyAsync(t => t.Id == id && t.InPlan)) if (await _subjectVisitRepository.AnyAsync(t => t.Id == id && t.InPlan))
{ {
@ -205,7 +211,8 @@ namespace IRaCIS.Core.Application.Services
} }
if (await _subjectVisitRepository.AnyAsync(t => t.OutPlanPreviousVisitId == id)) if (await _subjectVisitRepository.AnyAsync(t => t.OutPlanPreviousVisitId == id))
{ {
return ResponseOutput.NotOk("当前检查批次已经被设置为另一检查批次的上一检查批次,不允许删除。"); //"当前检查批次已经被设置为另一检查批次的上一检查批次,不允许删除。"
return ResponseOutput.NotOk(_localizer["SubjectVisitServiece_HaveSetBeforeBatch"]);
} }
await _subjectVisitRepository.DeleteFromQueryAsync(s => s.Id == id, true); await _subjectVisitRepository.DeleteFromQueryAsync(s => s.Id == id, true);