diff --git a/IRaCIS.Core.API/Controllers/ExtraController.cs b/IRaCIS.Core.API/Controllers/ExtraController.cs index 95fba4ab5..4dced3fdd 100644 --- a/IRaCIS.Core.API/Controllers/ExtraController.cs +++ b/IRaCIS.Core.API/Controllers/ExtraController.cs @@ -33,6 +33,7 @@ using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO; using DocumentFormat.OpenXml.Spreadsheet; using AutoMapper.QueryableExtensions; using NetTopologySuite.Algorithm; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Api.Controllers { @@ -100,7 +101,7 @@ namespace IRaCIS.Api.Controllers [HttpPost, Route("user/login")] [AllowAnonymous] public async Task Login(UserLoginDTO loginUser, - [FromServices] IEasyCachingProvider provider, + [FromServices] IFusionCache _fusionCache, [FromServices] IUserService _userService, [FromServices] ITokenService _tokenService, [FromServices] IReadingImageTaskService readingImageTaskService, @@ -139,9 +140,9 @@ namespace IRaCIS.Api.Controllers // 验证阅片休息时间 await readingImageTaskService.ResetReadingRestTime(userId); - await provider.SetAsync(userId.ToString(), loginReturn.JWTStr, TimeSpan.FromDays(7)); + await _fusionCache.SetAsync(userId.ToString(), loginReturn.JWTStr, TimeSpan.FromDays(7)); - await provider.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes)); + await _fusionCache.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes)); return ResponseOutput.Ok(loginReturn); @@ -254,9 +255,9 @@ namespace IRaCIS.Api.Controllers // 验证阅片休息时间 await readingImageTaskService.ResetReadingRestTime(returnModel.Data.BasicInfo.Id); - await provider.SetAsync(userId.ToString(), returnModel.Data.JWTStr, TimeSpan.FromDays(7)); + await _fusionCache.SetAsync(CacheKeys.UserToken(userId) , returnModel.Data.JWTStr, TimeSpan.FromDays(7)); - await provider.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes)); + await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(userId) , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes)); } } diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index a59862537..15bcd764f 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -45,6 +45,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using ZiggyCreatures.Caching.Fusion; using Path = System.IO.Path; namespace IRaCIS.Core.API.Controllers @@ -244,14 +245,12 @@ namespace IRaCIS.Core.API.Controllers private readonly IRepository _repository; - private readonly IEasyCachingProvider _provider; private readonly QCCommon _qCCommon; - public StudyController(IMapper mapper, IStringLocalizer localizer, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, IEasyCachingProvider provider, + public StudyController(IMapper mapper, IStringLocalizer localizer, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, QCCommon qCCommon, IRepository repository) { _qCCommon = qCCommon; - _provider = provider; _hostEnvironment = hostEnvironment; _mediator = mediator; _localizer = localizer; @@ -295,9 +294,8 @@ namespace IRaCIS.Core.API.Controllers [DisableFormValueModelBinding] [DisableRequestSizeLimit] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, Guid studyMonitorId, + public async Task ArchiveStudyNew( Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, Guid studyMonitorId, [FromServices] ILogger _logger, - [FromServices] IEasyCachingProvider _provider, [FromServices] IStudyService _studyService, [FromServices] IHubContext _uploadHub, [FromServices] IDicomArchiveService _dicomArchiveService, @@ -322,22 +320,6 @@ namespace IRaCIS.Core.API.Controllers var startTime = DateTime.Now; - if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}") && _provider.Get($"StudyUid_{trialId}_{studyInstanceUid}").Value == _userInfo.Id) - { - _provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30)); - } - - - - //if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}")) - //{ - // //---当前已有人正在上传和归档该检查! - // return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress")); - //} - //else - //{ - // _provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30)); - //} //到了接口,代表上传结束了 @@ -403,7 +385,6 @@ namespace IRaCIS.Core.API.Controllers } catch (Exception) { - _provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"); //---请求异常,请重试! throw new BusinessValidationFailedException(_localizer["UploadDownLoad_RequestError"]); @@ -442,7 +423,6 @@ namespace IRaCIS.Core.API.Controllers } finally { - _provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"); studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id ?? Guid.Empty; studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode; diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index d82437315..47e8140ae 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -29,7 +29,7 @@ - + 系统用户登录接口[New] @@ -278,7 +278,7 @@ 流式上传 Dicom上传 - + Dicom 归档 @@ -359,13 +359,6 @@ 序列化成员 - - - 为了前端 一段时间无操作,需要重新登陆 - - - - 废弃,没用 diff --git a/IRaCIS.Core.API/_PipelineExtensions/AuthMiddleware.cs b/IRaCIS.Core.API/_PipelineExtensions/AuthMiddleware.cs deleted file mode 100644 index 9f0a73355..000000000 --- a/IRaCIS.Core.API/_PipelineExtensions/AuthMiddleware.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.IdentityModel.Tokens.Jwt; -using System.Net; -using System.Threading.Tasks; -using EasyCaching.Core; -using IRaCIS.Core.Domain.Share; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Http; - -namespace IRaCIS.WX.CoreApi.Auth -{ - public class AuthMiddleware - { - private readonly RequestDelegate _next; - private readonly IEasyCachingProvider _provider; - public AuthMiddleware(RequestDelegate next, IEasyCachingProvider provider) - { - _next = next; - _provider = provider; - } - /// - ///为了前端 一段时间无操作,需要重新登陆 - /// - /// - /// - public async Task Invoke(HttpContext httpContext) - { - - var isLogin = httpContext.Request.Path.ToString().ToLower().Contains("login"); - - var result = await httpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); - - if (!isLogin) - { - if (!result.Succeeded) - { - httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; - await httpContext.Response.WriteAsync("Unauthorized"); - } - else - { - var toekn = result.Properties.Items[".Token.access_token"]; - var jwtHandler = new JwtSecurityTokenHandler(); - JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(toekn); - object userId; - jwtToken.Payload.TryGetValue("id", out userId); - - var cacheValueExist = await _provider.ExistsAsync(userId.ToString()); //Get(userId.ToString()).ToString(); - if (!cacheValueExist) - { - httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; - await httpContext.Response.WriteAsync("Unauthorized"); - } - else - { - await _provider.SetAsync(userId.ToString(), userId.ToString(), TimeSpan.FromMinutes(15)); - httpContext.User = result.Principal; - await _next.Invoke(httpContext); - } - } - } - else await _next.Invoke(httpContext); - } - } -} diff --git a/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs b/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs index 7e062a0f8..c5934c0db 100644 --- a/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs @@ -17,15 +17,12 @@ namespace IRaCIS.Application.Services.BackGroundJob public interface IIRaCISHangfireJob { - Task MemoryCacheTrialStatusAsync(); + //Task MemoryCacheTrialStatusAsync(); Task InitHangfireJobTaskAsync(); } - public class IRaCISCHangfireJob(IRepository _trialRepository, - IEasyCachingProvider _provider, - ILogger _logger, - IRepository _systemAnonymizationRepository, + public class IRaCISCHangfireJob(ILogger _logger, IRepository _internationalizationRepository, IRepository _trialEmailNoticeConfigRepository ) : IIRaCISHangfireJob @@ -107,34 +104,7 @@ namespace IRaCIS.Application.Services.BackGroundJob } - #region 废弃 前端上传的时候获取 - - /// - /// 缓存项目状态--之前是启动的时候就获取所有的项目进行缓存,加上定时任务刷新,现在的话,改为是按照需要进行缓存请求数据库 - /// - /// - public async Task MemoryCacheTrialStatusAsync() - { - - var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr }) - .ToListAsync(); - - list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7))); - - } - public async Task MemoryCacheAnonymizeData() - { - var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync(); - - _provider.Set(StaticData.Anonymize.Anonymize_AddFixedFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed).ToList(), TimeSpan.FromDays(7)); - _provider.Set(StaticData.Anonymize.Anonymize_AddIRCInfoFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed == false).ToList(), TimeSpan.FromDays(7)); - _provider.Set(StaticData.Anonymize.Anonymize_FixedField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed).ToList(), TimeSpan.FromDays(7)); - _provider.Set(StaticData.Anonymize.Anonymize_IRCInfoField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed == false).ToList(), TimeSpan.FromDays(7)); - } - - - #endregion } diff --git a/IRaCIS.Core.Application/BusinessFilter/LimitUserRequestAuthorization.cs b/IRaCIS.Core.Application/BusinessFilter/LimitUserRequestAuthorization.cs index aed97b1ec..fada696d2 100644 --- a/IRaCIS.Core.Application/BusinessFilter/LimitUserRequestAuthorization.cs +++ b/IRaCIS.Core.Application/BusinessFilter/LimitUserRequestAuthorization.cs @@ -1,4 +1,4 @@ -using EasyCaching.Core; +using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; using Newtonsoft.Json; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Filter; @@ -18,15 +19,15 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter { public IStringLocalizer _localizer { get; set; } - private readonly IEasyCachingProvider _provider; + private readonly IFusionCache _fusionCache; private readonly IUserInfo _userInfo; private readonly IOptionsMonitor _verifyConfig; - public LimitUserRequestAuthorization(IEasyCachingProvider provider, IUserInfo userInfo, IStringLocalizer localizer ,IOptionsMonitor verifyConfig) + public LimitUserRequestAuthorization(IFusionCache fusionCache, IUserInfo userInfo, IStringLocalizer localizer ,IOptionsMonitor verifyConfig) { - _provider = provider; + _fusionCache = fusionCache; _userInfo = userInfo; _verifyConfig = verifyConfig; _localizer = localizer; @@ -63,7 +64,7 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter //2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉 - var cacheUserToken = (await _provider.GetAsync(_userInfo.Id.ToString())).Value; + var cacheUserToken = await _fusionCache.GetOrDefaultAsync(CacheKeys.UserToken(_userInfo.Id)); @@ -73,17 +74,17 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter cacheUserToken = _userInfo.UserToken; //设置当前用户最新Token - await _provider.SetAsync(_userInfo.Id.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7)); + await _fusionCache.SetAsync(CacheKeys.UserToken(_userInfo.Id), _userInfo.UserToken, TimeSpan.FromDays(7)); //重启应用程序,所有人续期,不一下子踢出所有人 - await _provider.SetAsync($"{_userInfo.Id.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(minutes)); + await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(_userInfo.Id), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(minutes)); } //是同一个人 else if (cacheUserToken == _userInfo.UserToken) { - var cacheTime = (await _provider.GetAsync($"{_userInfo.Id.ToString()}_Online")).Value; + var cacheTime = await _fusionCache.GetOrDefaultAsync(CacheKeys.UserAutoLoginOut(_userInfo.Id)); //过期了 需要自动退出 if (string.IsNullOrEmpty(cacheTime)) @@ -91,33 +92,23 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden; - context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AccountAuto_LoginOut"], ApiResponseCodeEnum.AutoLoginOut)); - + context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AccountAuto_LoginOut"], ApiResponseCodeEnum.AutoLoginOut)); } else { - await _provider.SetAsync($"{_userInfo.Id.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(minutes)); + await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(_userInfo.Id), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(minutes)); } - } - else { - context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden; //---您的账户在其他地方已登陆,您被迫下线。 - context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AccountLoggedInElsewhere"], ApiResponseCodeEnum.LoginInOtherPlace)); - - //await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AccountLoggedInElsewhere"], ApiResponseCodeEnum.LoginInOtherPlace))); - } - - } } @@ -125,52 +116,3 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter } } - - - - - - - - - - - - - -//public class UserTypeRequirement : IAuthorizationRequirement -//{ -//} - -//public class UserTypeHandler : AuthorizationHandler -//{ - -// private IUserInfo _userInfo; - -// public UserTypeHandler(IUserInfo userInfo) -// { -// _userInfo = userInfo; -// } - - -// protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserTypeRequirement requirement) -// { - -// //if (context.User.Claims.Count() == 0) -// //{ -// // return Task.CompletedTask; -// //} - -// //string userId = context.User.Claims.First(c => c.Type == "Userid").Value; -// //string qq = context.User.Claims.First(c => c.Type == "QQ").Value; - -// //if (_UserService.Validata(userId, qq)) -// //{ -// // context.Succeed(requirement); //验证通过了 -// //} -// ////在这里就可以做验证 - -// return Task.CompletedTask; -// } -//} - diff --git a/IRaCIS.Core.Application/BusinessFilter/TrialResourceFilter.cs b/IRaCIS.Core.Application/BusinessFilter/TrialResourceFilter.cs index 683059714..58467110b 100644 --- a/IRaCIS.Core.Application/BusinessFilter/TrialResourceFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/TrialResourceFilter.cs @@ -1,5 +1,4 @@ -using EasyCaching.Core; -using IRaCIS.Core.Application.Helper; +using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -16,7 +15,6 @@ namespace IRaCIS.Core.Application.Filter /// public class TrialResourceFilter : Attribute, IAsyncResourceFilter { - private readonly IEasyCachingProvider _provider; private readonly IUserInfo _userInfo; private readonly IFusionCache _fusionCache; public IStringLocalizer _localizer; @@ -24,10 +22,9 @@ namespace IRaCIS.Core.Application.Filter private readonly List _trialOptList = new List(); - public TrialResourceFilter(IFusionCache fusionCache, IRepository trialRepository, IEasyCachingProvider provider, IStringLocalizer localizer, IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null) + public TrialResourceFilter(IFusionCache fusionCache, IRepository trialRepository, IStringLocalizer localizer, IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null) { _fusionCache = fusionCache; - _provider = provider; _userInfo = userInfo; _localizer = localizer; _trialRepository = trialRepository; diff --git a/IRaCIS.Core.Application/Helper/CacheHelper.cs b/IRaCIS.Core.Application/Helper/CacheHelper.cs index 9e0035e9e..8198049df 100644 --- a/IRaCIS.Core.Application/Helper/CacheHelper.cs +++ b/IRaCIS.Core.Application/Helper/CacheHelper.cs @@ -1,4 +1,5 @@ -using System; +using IRaCIS.Core.Domain.Models; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -11,6 +12,23 @@ namespace IRaCIS.Core.Application.Helper { public static string Trial(string trialIdStr) => $"TrialId:{trialIdStr}"; + public static string TrialStudyMaxCode(Guid trialId) => $"TrialStudyMaxCode:{trialId}"; + + public static string TrialStudyUidUploading(Guid trialId, string studyUid) => $"TrialStudyUid:{trialId}_{studyUid}"; + + public static string TrialStudyUidDBLock(Guid trialId, string studyUid) => $"TrialStudyUidDBLock:{trialId}_{studyUid}"; + + + + public static string SystemAnonymization => $"SystemAnonymization"; + + public static string FrontInternational => $"FrontInternationalList"; + + //登录挤账号 + public static string UserToken(Guid userId) => $"UserToken:{userId}"; + + //超时没请求接口自动退出 + public static string UserAutoLoginOut(Guid userId) => $"UserAutoLoginOut:{userId}"; // 你可以为其他实体和模块定义更多的键 } @@ -23,5 +41,12 @@ namespace IRaCIS.Core.Application.Helper return statusStr; } + + public static async Task> GetSystemAnonymizationListAsync(IRepository _repository) + { + var list = await _repository.Where(t => t.IsEnable).ToListAsync(); + + return list; + } } } diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 667fa4564..4b089d6e9 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -274,6 +274,13 @@ + + + 获取GetIsClinicalDataSignTest + + + + 访视读片任务 @@ -9864,14 +9871,14 @@ - + 归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列(两个人公用的影像,不应该绑定) - + @@ -13313,12 +13320,6 @@ 维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果 - - - 缓存项目状态--之前是启动的时候就获取所有的项目进行缓存,加上定时任务刷新,现在的话,改为是按照需要进行缓存请求数据库 - - - 统一返回前端数据包装,之前在控制器包装,现在修改为动态Api 在ResultFilter这里包装,减少重复冗余代码 diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 3be59de67..950076470 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -18,6 +18,8 @@ using System.Linq.Expressions; using IRaCIS.Core.Domain.Share.Reading; using IRaCIS.Core.Application.Service.Reading.Dto; using System.Runtime.InteropServices; +using IRaCIS.Core.Application.Helper; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Service { @@ -32,7 +34,6 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _visitTaskRepository; private readonly IRepository _trialRepository; - private readonly IEasyCachingProvider _provider; private readonly IRepository _subjectVisitRepository; private readonly IRepository _readingJudgeInfoRepository; private readonly IRepository _taskAllocationRuleRepository; @@ -44,8 +45,6 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _readingOncologyTaskInfoRepository; private readonly IRepository _readingTableQuestionTrialRepository; private readonly IRepository _readingQuestionTrialRepository; - private readonly IMapper _mapper; - private readonly IUserInfo _userInfo; private readonly IRepository _visitTaskReReadingRepository; private readonly IRepository _trialReadingCriterionRepository; @@ -57,7 +56,7 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _subjectCriteriaEvaluationRepository; - public VisitTaskHelpeService(IRepository visitTaskRepository, IRepository subjectUserRepository, IRepository trialRepository, IEasyCachingProvider provider, + public VisitTaskHelpeService(IRepository visitTaskRepository, IRepository subjectUserRepository, IRepository trialRepository, IRepository subjectVisitRepository, IRepository readModuleRepository, IRepository readingTaskQuestionAnswerRepository, @@ -67,7 +66,7 @@ namespace IRaCIS.Core.Application.Service IRepository readingTableQuestionTrialRepository, IRepository readingQuestionTrialRepository, IRepository readingJudgeInfoRepository, - IRepository taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository visitTaskReReadingRepository, + IRepository taskAllocationRuleRepository, IRepository visitTaskReReadingRepository, IRepository trialReadingCriterionRepository, IRepository trialClinicalDataSetRepository, IRepository readingClinicalDataRepository, IRepository subjectCriteriaEvaluationRepository, IRepository readingConsistentClinicalDataRepository) { @@ -84,13 +83,10 @@ namespace IRaCIS.Core.Application.Service _readingOncologyTaskInfoRepository = ReadingOncologyTaskInfoRepository; this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository; this._readingQuestionTrialRepository = readingQuestionTrialRepository; - _provider = provider; _subjectVisitRepository = subjectVisitRepository; this._readingJudgeInfoRepository = readingJudgeInfoRepository; _taskAllocationRuleRepository = taskAllocationRuleRepository; _subjectUserRepository = subjectUserRepository; - _mapper = mapper; - _userInfo = userInfo; _visitTaskReReadingRepository = visitTaskReReadingRepository; _subjectCriteriaEvaluationRepository = subjectCriteriaEvaluationRepository; _trialReadingCriterionRepository = trialReadingCriterionRepository; @@ -186,7 +182,7 @@ namespace IRaCIS.Core.Application.Service var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); - var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.TaskMaxCode}").Value; + var cacheMaxCodeInt =_fusionCache.GetOrDefault(CacheKeys.TrialStudyMaxCode(trialId)); int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode; @@ -318,7 +314,7 @@ namespace IRaCIS.Core.Application.Service } - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); @@ -379,7 +375,7 @@ namespace IRaCIS.Core.Application.Service - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); @@ -625,7 +621,7 @@ namespace IRaCIS.Core.Application.Service var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); - var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.TaskMaxCode}").Value; + var cacheMaxCodeInt =_fusionCache.GetOrDefault(CacheKeys.TrialStudyMaxCode(trialId)); int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode; @@ -782,7 +778,7 @@ namespace IRaCIS.Core.Application.Service } - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); #region 分配 @@ -955,7 +951,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } } @@ -1023,7 +1019,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } } @@ -1106,7 +1102,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); #region 分配 @@ -1234,7 +1230,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } } @@ -1423,7 +1419,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); //} @@ -1519,7 +1515,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } break; @@ -1566,7 +1562,7 @@ namespace IRaCIS.Core.Application.Service currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } break; @@ -1604,7 +1600,7 @@ namespace IRaCIS.Core.Application.Service await _visitTaskRepository.AddAsync(visitTask); currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => generateTaskCommand.JudgeVisitTaskIdList.Contains(x.Id), x => new VisitTask() { @@ -1665,7 +1661,7 @@ namespace IRaCIS.Core.Application.Service }); currentMaxCodeInt = currentMaxCodeInt + 1; - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } } @@ -1735,7 +1731,7 @@ namespace IRaCIS.Core.Application.Service TrialId = originalTaskInfo.TrialId }); - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(trialId), currentMaxCodeInt, TimeSpan.FromMinutes(30)); } break; } diff --git a/IRaCIS.Core.Application/Service/Common/InternationalizationService.cs b/IRaCIS.Core.Application/Service/Common/InternationalizationService.cs index 47723708e..d66ba79e1 100644 --- a/IRaCIS.Core.Application/Service/Common/InternationalizationService.cs +++ b/IRaCIS.Core.Application/Service/Common/InternationalizationService.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Helper; using EasyCaching.Core; using IRaCIS.Core.Domain.Share; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Service { @@ -21,13 +22,13 @@ namespace IRaCIS.Core.Application.Service [ApiExplorerSettings(GroupName = "Common")] public class InternationalizationService : BaseService, IInternationalizationService { - private readonly IEasyCachingProvider _provider; + private readonly IFusionCache _fusionCache; private readonly IRepository _internationalizationRepository; - public InternationalizationService(IRepository internationalizationRepository, IEasyCachingProvider provider) + public InternationalizationService(IRepository internationalizationRepository, IFusionCache fusionCache) { _internationalizationRepository = internationalizationRepository; - _provider = provider; + _fusionCache = fusionCache; } /// @@ -38,7 +39,7 @@ namespace IRaCIS.Core.Application.Service [HttpGet] public async Task> GetFrontInternationalizationList() { - var cacheList= _provider.Get>(StaticData.InternationalData.Front).Value; + var cacheList = await _fusionCache.GetOrDefaultAsync>(CacheKeys.FrontInternational); //if(cacheList != null && cacheList.Count!=0) //{ @@ -55,11 +56,11 @@ namespace IRaCIS.Core.Application.Service Description = t.Description, }).ToListAsync(); - _provider.Set>(StaticData.InternationalData.Front, list, TimeSpan.FromDays(1)); + await _fusionCache.SetAsync>(CacheKeys.FrontInternational, list, TimeSpan.FromDays(1)); return list; } - + } /// @@ -74,7 +75,7 @@ namespace IRaCIS.Core.Application.Service var find = await _internationalizationRepository.FirstOrDefaultAsync(t => t.Code == item.Code && t.Description == item.Description && t.InternationalizationType == 0); if (find != null) - { + { _mapper.Map(item, find); } else @@ -82,7 +83,7 @@ namespace IRaCIS.Core.Application.Service var mapItem = _mapper.Map(item); mapItem.InternationalizationType = 0; - // 0 是预翻译 1是已确认 2是后端废弃 + // 0 是预翻译 1是已确认 2是后端废弃 mapItem.State = 0; await _internationalizationRepository.AddAsync(mapItem); @@ -91,7 +92,7 @@ namespace IRaCIS.Core.Application.Service await _internationalizationRepository.SaveChangesAsync(); //清理缓存 - _provider.Set>(StaticData.InternationalData.Front, new List(), TimeSpan.FromDays(1)); + await _fusionCache.SetAsync>(CacheKeys.FrontInternational, new List(), TimeSpan.FromDays(1)); return ResponseOutput.Ok(); } @@ -103,7 +104,7 @@ namespace IRaCIS.Core.Application.Service var internationalizationQueryable = _internationalizationRepository .WhereIf(inQuery.Description != null, t => t.Description.Contains(inQuery.Description)) .WhereIf(inQuery.Module != null, t => t.Module.Contains(inQuery.Module)) - .WhereIf(inQuery.PublishLogId != null, t => t.PublishLogId==inQuery.PublishLogId) + .WhereIf(inQuery.PublishLogId != null, t => t.PublishLogId == inQuery.PublishLogId) .WhereIf(inQuery.Code != null, t => t.Code.Contains(inQuery.Code)) .WhereIf(inQuery.State != null, t => t.State == inQuery.State) .WhereIf(inQuery.InternationalizationType != null, t => t.InternationalizationType == inQuery.InternationalizationType) @@ -148,7 +149,7 @@ namespace IRaCIS.Core.Application.Service await _internationalizationRepository.SaveChangesAsync(); //清理缓存 - _provider.Set>(StaticData.InternationalData.Front, new List(), TimeSpan.FromDays(1)); + await _fusionCache.SetAsync>(CacheKeys.FrontInternational, new List(), TimeSpan.FromDays(1)); return ResponseOutput.Ok(); } @@ -168,7 +169,7 @@ namespace IRaCIS.Core.Application.Service VerifyExp = t => t.Code == addOrEditInternationalization.Code && t.InternationalizationType == addOrEditInternationalization.InternationalizationType, VerifyMsg = $"该类型已有{addOrEditInternationalization.Code}名称的国际化标识", - IsVerify = true /*internationalizationType == 1*/ + IsVerify = true /*internationalizationType == 1*/ }; //前端验证标识重复与否 @@ -184,12 +185,12 @@ namespace IRaCIS.Core.Application.Service if (addOrEditInternationalization.InternationalizationType == 1) { - await InternationalizationHelper.AddOrUpdateJsonKeyValueAsync(entity.Code, addOrEditInternationalization.Value, addOrEditInternationalization.ValueCN,addOrEditInternationalization.Description); + await InternationalizationHelper.AddOrUpdateJsonKeyValueAsync(entity.Code, addOrEditInternationalization.Value, addOrEditInternationalization.ValueCN, addOrEditInternationalization.Description); } else { //清理缓存 - _provider.Set>(StaticData.InternationalData.Front, new List(), TimeSpan.FromDays(1)); + await _fusionCache.SetAsync>(CacheKeys.FrontInternational, new List(), TimeSpan.FromDays(1)); } return ResponseOutput.Ok(entity.Id.ToString()); @@ -202,7 +203,7 @@ namespace IRaCIS.Core.Application.Service var success = await _internationalizationRepository.DeleteFromQueryAsync(t => t.Id == internationalizationId, true); //清理缓存 - _provider.Set>(StaticData.InternationalData.Front, new List(), TimeSpan.FromDays(1)); + await _fusionCache.SetAsync>(CacheKeys.FrontInternational, new List(), TimeSpan.FromDays(1)); return ResponseOutput.Ok(); } @@ -214,7 +215,7 @@ namespace IRaCIS.Core.Application.Service [HttpPut] public async Task BatchUpdateInternationalInfo(BatchUpdateInfoCommand inCommand) { - await _internationalizationRepository.BatchUpdateNoTrackingAsync(t => inCommand.IdList.Contains(t.Id), t => new Internationalization() { State = inCommand.State, PublishLogId = inCommand.PublishLogId }); + await _internationalizationRepository.BatchUpdateNoTrackingAsync(t => inCommand.IdList.Contains(t.Id), t => new Internationalization() { State = inCommand.State, PublishLogId = inCommand.PublishLogId }); return ResponseOutput.Ok(); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index c3b3bd27e..6ce9a5864 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -12,6 +12,8 @@ using FellowOakDicom.Imaging.Codec; using System.Data; using IRaCIS.Core.Domain.Models; using FellowOakDicom.Network; +using DocumentFormat.OpenXml.Drawing.Charts; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Services { @@ -21,7 +23,6 @@ namespace IRaCIS.Core.Application.Services private readonly IRepository _seriesRepository; private readonly IRepository _instanceRepository; private readonly IRepository _dictionaryRepository; - private readonly IEasyCachingProvider _provider; private readonly IDistributedLockProvider _distributedLockProvider; @@ -33,7 +34,7 @@ namespace IRaCIS.Core.Application.Services IRepository seriesRepository, IRepository instanceRepository, IRepository dictionaryRepository, - IEasyCachingProvider provider, IDistributedLockProvider distributedLockProvider) + IDistributedLockProvider distributedLockProvider) { _distributedLockProvider = distributedLockProvider; _studyRepository = studyRepository; @@ -42,7 +43,6 @@ namespace IRaCIS.Core.Application.Services _instanceRepository = instanceRepository; _dictionaryRepository = dictionaryRepository; - _provider = provider; } @@ -74,20 +74,15 @@ namespace IRaCIS.Core.Application.Services } - var anonymize_AddFixedFiledList = _provider.Get>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value ?? new List(); - var anonymize_AddIRCInfoFiledList = _provider.Get>(StaticData.Anonymize.Anonymize_AddIRCInfoFiled).Value ?? new List(); - var anonymize_FixedFieldList = _provider.Get>(StaticData.Anonymize.Anonymize_FixedField).Value ?? new List(); - var anonymize_IRCInfoFieldList = _provider.Get>(StaticData.Anonymize.Anonymize_IRCInfoField).Value ?? new List(); + var anonymizeList = await _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_repository), TimeSpan.FromDays(7)); + + var fixedFiledList= anonymizeList.Where(t=>t.IsFixed).ToList(); + var ircFiledList = anonymizeList.Where(t => t.IsFixed==false).ToList(); - if (anonymize_AddFixedFiledList.Union(anonymize_AddIRCInfoFiledList).Union(anonymize_FixedFieldList).Union(anonymize_IRCInfoFieldList).Count() == 0) - { - //---未取到缓存匿名化配置数据,上传停止,请联系开发人员核实 - throw new BusinessValidationFailedException(_localizer["DAS_NoAnonCacheData"]); - } - foreach (var item in anonymize_AddFixedFiledList.Union(anonymize_FixedFieldList)) + foreach (var item in fixedFiledList) { var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); @@ -95,7 +90,7 @@ namespace IRaCIS.Core.Application.Services dataset.AddOrUpdate(dicomTag, item.ReplaceValue); } - foreach (var item in anonymize_AddIRCInfoFiledList.Union(anonymize_IRCInfoFieldList)) + foreach (var item in ircFiledList) { var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); @@ -196,7 +191,7 @@ namespace IRaCIS.Core.Application.Services } - private DicomStudy CreateDicomStudy(DicomDataset dataset, DicomTrialSiteSubjectInfo addtionalInfo, out bool isStudyNeedAdd) + private DicomStudy CreateDicomStudy(DicomDataset dataset, DicomTrialSiteSubjectInfo addtionalInfo, out bool isStudyNeedAdd) { string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID); @@ -291,7 +286,7 @@ namespace IRaCIS.Core.Application.Services var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 - var cacheMaxCodeInt = _provider.Get($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}").Value; + var cacheMaxCodeInt = _fusionCache.GetOrDefault(CacheKeys.TrialStudyMaxCode(addtionalInfo.TrialId)); int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; @@ -299,53 +294,10 @@ namespace IRaCIS.Core.Application.Services dicomStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); - _provider.Set($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}", dicomStudy.Code, TimeSpan.FromMinutes(30)); + _fusionCache.Set(CacheKeys.TrialStudyMaxCode(addtionalInfo.TrialId), dicomStudy.Code, TimeSpan.FromMinutes(30)); } - #region Setting Code old - - //var studyCode = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.StudyCode).OrderByDescending(c => c).FirstOrDefault(); - - //var cacheMaxCode = _provider.Get($"{addtionalInfo.TrialId }_{ StaticData.StudyMaxCode}").Value; - - //if (studyCode == null && string.IsNullOrEmpty(cacheMaxCode)) - //{ - // dicomStudy.StudyCode = "ST" + 1.ToString().PadLeft(5, '0'); - - // _logger.LogWarning($"Thread {id} DB:{studyCode} 生成{ dicomStudy.StudyCode}"); - //} - //else - //{ - // int dbNum = 0; - - // int cacheNum = 0; - - // if (studyCode != null) - // { - // int.TryParse(studyCode.Substring(studyCode.Length - 5, 5), out dbNum); - // } - - // if (!string.IsNullOrEmpty(cacheMaxCode)) - // { - // int.TryParse(cacheMaxCode.Substring(cacheMaxCode.Length - 5, 5), out cacheNum); - // } - - // dbNum = cacheNum > dbNum ? cacheNum : dbNum; - - - // dicomStudy.StudyCode = "ST" + (++dbNum).ToString().PadLeft(5, '0'); - - // _logger.LogWarning($" Thread {id} DB:{studyCode} cache:{cacheNum} 生成{ dicomStudy.StudyCode}"); - //} - - //_provider.Set($"{addtionalInfo.TrialId }_{ StaticData.StudyMaxCode}", dicomStudy.StudyCode, TimeSpan.FromMinutes(30)); - - - #endregion - - - return dicomStudy; diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index acf4c3dd5..e7fd27a43 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -22,6 +22,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Service.ImageAndDoc { @@ -32,14 +33,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc [ApiExplorerSettings(GroupName = "Trial")] public class DownloadAndUploadService : BaseService, IDownloadAndUploadService { - private readonly IEasyCachingProvider _provider; private readonly IRepository _systemAnonymizationRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _subjectVisitRepository; private readonly IOSSService _oSSService; private readonly IRepository _studyMonitorRepository; private readonly IDistributedLockProvider _distributedLockProvider; - public DownloadAndUploadService(IEasyCachingProvider provider, IRepository systemAnonymizationRepository, IRepository subjectVisitRepository, IOSSService oSSService, + public DownloadAndUploadService(IRepository systemAnonymizationRepository, IRepository subjectVisitRepository, IOSSService oSSService, IRepository studyMonitorRepository, IDistributedLockProvider distributedLockProvider, IRepository visitTaskRepository) { _systemAnonymizationRepository = systemAnonymizationRepository; @@ -49,7 +49,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc _oSSService = oSSService; _studyMonitorRepository = studyMonitorRepository; _distributedLockProvider = distributedLockProvider; - _provider = provider; _visitTaskRepository = visitTaskRepository; } @@ -301,14 +300,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var dbStudyCodeIntMax = _repository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 - var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value; + var cacheMaxCodeInt = await _fusionCache.GetOrDefaultAsync(CacheKeys.TrialStudyMaxCode(trialId)); int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; study.Code = currentNextCodeInt; study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); - _provider.Set($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30)); + await _fusionCache.SetAsync(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30)); } @@ -460,7 +459,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } finally { - _provider.Remove($"StudyUid_{incommand.TrialId}_{incommand.Study.StudyInstanceUid}"); + await _fusionCache.RemoveAsync(CacheKeys.TrialStudyUidUploading(incommand.TrialId, incommand.Study.StudyInstanceUid)); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index adbd3a14c..ee251cdd8 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -17,6 +17,7 @@ using Medallion.Threading; using System.Reactive.Subjects; using DocumentFormat.OpenXml.Drawing.Diagrams; using IRaCIS.Core.Application.Service.ImageAndDoc.DTO; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Service.ImageAndDoc { @@ -24,7 +25,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public class StudyService : BaseService, IStudyService { - private readonly IEasyCachingProvider _provider; private readonly IRepository _subjectVisitRepository; @@ -36,12 +36,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc private readonly IRepository _studyMonitorRepository; private readonly IDistributedLockProvider _distributedLockProvider; - public StudyService(IEasyCachingProvider provider - , IRepository subjectVisitRepository, + public StudyService(IRepository subjectVisitRepository, IRepository dicomInstanceRepository, IRepository dicomSeriesRepository, IRepository dicomstudyRepository, IRepository dictionaryRepository, IRepository studyMonitorRepository, IDistributedLockProvider distributedLockProvider) { - _provider = provider; _subjectVisitRepository = subjectVisitRepository; _dicomInstanceRepository = dicomInstanceRepository; _dicomSeriesRepository = dicomSeriesRepository; @@ -93,19 +91,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public async Task PreArchiveDicomStudy(PreArchiveDicomStudyCommand preArchiveStudyCommand) { - //lock (lockObj) - //{ - // if (_provider.Exists($"StudyUid_{preArchiveStudyCommand.TrialId}_{preArchiveStudyCommand.StudyInstanceUid}")) - // { - // //---当前已有人正在上传和归档该检查! - // return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress")); - // } - // else - // { - // _provider.Set($"StudyUid_{preArchiveStudyCommand.TrialId}_{preArchiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30)); - // } - //} - var studyMonitor = new StudyMonitor() { TrialId = preArchiveStudyCommand.TrialId, @@ -131,9 +116,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } [HttpGet] - public IResponseOutput DicomUploadInProgress(Guid trialId, string studyInstanceUid) + public async Task DicomUploadInProgress(Guid trialId, string studyInstanceUid) { - _provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(15)); + await _fusionCache.SetAsync(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid), _userInfo.Id, TimeSpan.FromSeconds(15)); return ResponseOutput.Ok(); @@ -149,7 +134,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc using (await @uploadLock.AcquireAsync()) { - if (_provider.Exists($"{incommand.TrialId}_{incommand.Study.StudyInstanceUid}")) + if (_fusionCache.GetOrDefault(CacheKeys.TrialStudyUidDBLock(incommand.TrialId, incommand.Study.StudyInstanceUid)) != Guid.Empty) { //---当前已有人正在上传和归档该检查! return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress")); @@ -157,7 +142,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc else { //在事务未完成前 防止前端重复提交 - _provider.Set($"{incommand.TrialId}_{incommand.Study.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(3)); + await _fusionCache.SetAsync(CacheKeys.TrialStudyUidDBLock(incommand.TrialId, incommand.Study.StudyInstanceUid), _userInfo.Id, TimeSpan.FromMinutes(3)); } } @@ -188,7 +173,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 - var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value; + var cacheMaxCodeInt = await _fusionCache.GetOrDefaultAsync(CacheKeys.TrialStudyMaxCode(trialId)); int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; @@ -196,7 +181,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); - _provider.Set($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30)); + await _fusionCache.SetAsync(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30)); } @@ -356,8 +341,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } finally { - _provider.Remove($"StudyUid_{incommand.TrialId}_{incommand.Study.StudyInstanceUid}"); - _provider.Remove($"{incommand.TrialId}_{incommand.Study.StudyInstanceUid}"); + await _fusionCache.RemoveAsync(CacheKeys.TrialStudyUidUploading(incommand.TrialId, incommand.Study.StudyInstanceUid)); + await _fusionCache.RemoveAsync(CacheKeys.TrialStudyUidDBLock(incommand.TrialId, incommand.Study.StudyInstanceUid)); + } @@ -672,7 +658,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var result = new VerifyStudyUploadResult(); - if (_provider.Exists($"StudyUid_{trialId}_{studyInstanceUid}") && _provider.Get($"StudyUid_{trialId}_{studyInstanceUid}").Value != _userInfo.Id) + if ( _fusionCache.GetOrDefault($"StudyUid_{trialId}_{studyInstanceUid}") != _userInfo.Id) { result.AllowUpload = false; @@ -722,11 +708,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { if (result.AllowReUpload || result.AllowUpload) { - _provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30)); + await _fusionCache.SetAsync($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30)); + } else { - _provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}"); + + await _fusionCache.RemoveAsync(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid)); } } resultList.Add(result); @@ -797,13 +785,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc // 写入dicom 固定的信息,以及组织路径的信息 以及匿名化的信息 var otherData = GetSaveToDicomInfo(verifyInfo.SubjectVisitId); - var systemAnonymizationList = _repository.Where(t => t.IsEnable).ToList(); + var anonymizeList = _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_repository), TimeSpan.FromDays(7)).Result; return ResponseOutput.Ok>(result, new { DicomStoreInfo = otherData, - AnonymizeFixedList = systemAnonymizationList.Where(t => t.IsFixed).ToList(), - AnonymizeNotFixedList = systemAnonymizationList.Where(t => t.IsFixed == false).ToList() + AnonymizeFixedList = anonymizeList.Where(t => t.IsFixed).ToList(), + AnonymizeNotFixedList = anonymizeList.Where(t => t.IsFixed == false).ToList() }); } @@ -813,7 +801,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var result = new VerifyStudyUploadResult(); - if (_provider.Exists($"StudyUid_{trialId}_{studyInstanceUid}") && _provider.Get($"StudyUid_{trialId}_{studyInstanceUid}").Value != _userInfo.Id) + if (_fusionCache.GetOrDefault(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid)) != _userInfo.Id) { result.AllowUpload = false; @@ -882,11 +870,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { if (result.AllowReUpload || result.AllowUpload) { - _provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30)); + _fusionCache.Set(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid), _userInfo.Id, TimeSpan.FromSeconds(30)); } else { - _provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}"); + _fusionCache.Remove(CacheKeys.TrialStudyUidUploading(trialId, studyInstanceUid)); } } diff --git a/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs b/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs index 255ab1556..ee25c579e 100644 --- a/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs +++ b/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs @@ -2,6 +2,7 @@ using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Service.Third_partyProject.DTO; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; @@ -14,6 +15,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.Application.Service.Third_partyProject { @@ -84,7 +86,7 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject [HttpPost] public async Task> GetVisitTaskList(VisitTaskQuery_UltrasonicDicom queryVisitTask) { - var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect &&t.TaskAllocationState==TaskAllocationState.Allocated && t.SourceSubjectVisitId != null) + var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.SourceSubjectVisitId != null) .WhereIf(queryVisitTask.TrialSiteId != null, t => t.Subject.TrialSiteId == queryVisitTask.TrialSiteId) .WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) @@ -193,7 +195,7 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject [HttpPost] public async Task> GetStudyModalityOSSPath(List seriesIdList, [FromServices] IRepository _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(); + 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(); } @@ -203,7 +205,7 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject /// /// /// - /// + /// /// /// /// @@ -212,7 +214,7 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject public async Task AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand, [FromServices] IRepository _studyMonitorRepository, [FromServices] IDistributedLockProvider _distributedLockProvider, - [FromServices] IEasyCachingProvider _provider, + [FromServices] IFusionCache _fusionCache, [FromServices] IRepository _dicomSeriesRepository, [FromServices] IRepository _dicomInstanceRepository) { @@ -241,14 +243,14 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 - var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value; + var cacheMaxCodeInt = await _fusionCache.GetOrDefaultAsync(CacheKeys.TrialStudyMaxCode(trialId)); int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; study.Code = currentNextCodeInt; study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); - _provider.Set($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30)); + await _fusionCache.SetAsync(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30)); } @@ -389,7 +391,7 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject } finally { - _provider.Remove($"StudyUid_{incommand.TrialId}_{incommand.Study.StudyInstanceUid}"); + await _fusionCache.RemoveAsync(CacheKeys.TrialStudyUidUploading(incommand.TrialId,incommand.Study.StudyInstanceUid)); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index f80656e8f..bea69aede 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -40,7 +40,6 @@ namespace IRaCIS.Core.Application private readonly IRepository _readingQuestionCriterionSystemRepository; private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _readingCriterionPageRepository; - private readonly IEasyCachingProvider _provider; private readonly IOrganInfoService _iOrganInfoService; private readonly IRepository _taskAllocationRuleRepository; private readonly IRepository _readingCriterionDictionaryRepository; @@ -69,7 +68,6 @@ namespace IRaCIS.Core.Application IRepository readingCriterionDictionaryRepository, IRepository readingTrialCriterionDictionaryRepository, IReadingQuestionService iReadingQuestionService, - IEasyCachingProvider provider, IOrganInfoService iOrganInfoService, IRepository trialCriterionAdditionalAssessmentTypeRepository, IRepository visitTaskRepository, @@ -93,7 +91,6 @@ namespace IRaCIS.Core.Application this._systemCriterionDictionaryCode = systemCriterionDictionaryCode; this._readingQuestionCriterionSystemRepository = readingQuestionCriterionSystemRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; - this._provider = provider; this._iOrganInfoService = iOrganInfoService; this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository; this._readingCriterionPageRepository = readingCriterionPageRepository; diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs index 7534c3860..6962141ae 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs @@ -23,7 +23,6 @@ namespace IRaCIS.Application.Services public class TrialService : BaseService, ITrialService { - private readonly IEasyCachingProvider _provider; private readonly IRepository _trialRepository; private readonly IRepository _trialUserRepository; private readonly IOptionsMonitor _verifyConfig; @@ -31,12 +30,11 @@ namespace IRaCIS.Application.Services public bool TrialExpeditedChange { get; set; } = false; - public TrialService(IEasyCachingProvider provider, IRepository trialRepository, + public TrialService(IRepository trialRepository, IRepository trialUserRepository, IOptionsMonitor verifyConfig ) { _verifyConfig = verifyConfig; - _provider = provider; _trialRepository = trialRepository; this._trialUserRepository = trialUserRepository; } diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs index 79ccfa568..7c49b4275 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs @@ -193,10 +193,6 @@ public static class StaticData - public static class InternationalData - { - public const string Front = "Front"; - } /// /// 匿名化配置 key