nuget 包升级,清理没用的包,预备net8

Uat_Study
hang 2023-10-12 14:07:33 +08:00
commit 5171af975d
16 changed files with 288 additions and 178 deletions

View File

@ -69,6 +69,10 @@
<PackageReference Include="aliyun-net-sdk-sts" Version="3.1.2" /> <PackageReference Include="aliyun-net-sdk-sts" Version="3.1.2" />
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" /> <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
<PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.9.1" />
<PackageReference Include="EasyCaching.Serialization.MessagePack" Version="1.9.1" />
<PackageReference Include="EntityFrameworkCore.Triggered.Extensions" Version="3.2.1" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="EasyCaching.InMemory" Version="1.9.1" /> <PackageReference Include="EasyCaching.InMemory" Version="1.9.1" />
<PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.9.1" /> <PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.9.1" />

View File

@ -29,6 +29,7 @@ using IRaCIS.Core.Application.Helper;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Autofac.Core; using Autofac.Core;
using DocumentFormat.OpenXml.InkML; using DocumentFormat.OpenXml.InkML;
using EasyCaching.Core;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
{ {
@ -114,7 +115,7 @@ namespace IRaCIS.Core.API
// MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系 // MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系
services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<ConsistencyVerificationHandler>()); services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<ConsistencyVerificationHandler>());
// EasyCaching 缓存 // EasyCaching 缓存
services.AddEasyCachingSetup(); services.AddEasyCachingSetup(_configuration);
//services.AddDistributedMemoryCache(); //services.AddDistributedMemoryCache();

View File

@ -1,8 +1,12 @@
using IRaCIS.Core.Application.Triggers; using Hangfire.SqlServer;
using IRaCIS.Core.Application.Triggers;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using Medallion.Threading;
using Medallion.Threading.SqlServer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using StackExchange.Redis;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
{ {
@ -52,6 +56,13 @@ namespace IRaCIS.Core.API
}); });
//注意区分 easy caching 也有 IDistributedLockProvider
services.AddSingleton<IDistributedLockProvider>(sp =>
{
//var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
return new SqlDistributedSynchronizationProvider(configuration.GetSection("ConnectionStrings:RemoteNew").Value);
});
//services.AddAssemblyTriggers(typeof(SubjectVisitImageDateTrigger).Assembly); //services.AddAssemblyTriggers(typeof(SubjectVisitImageDateTrigger).Assembly);
} }

View File

@ -1,17 +1,26 @@
using EasyCaching.Core; using EasyCaching.Core;
using EasyCaching.Core.Configurations;
using EasyCaching.Interceptor.Castle; using EasyCaching.Interceptor.Castle;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
{ {
public static class EasyCachingSetup public static class EasyCachingSetup
{ {
public static void AddEasyCachingSetup(this IServiceCollection services) public static void AddEasyCachingSetup(this IServiceCollection services, IConfiguration configuration)
{ {
services.AddEasyCaching(options => services.AddEasyCaching(options =>
{ {
options.UseInMemory(); options.UseInMemory();
//options.UseRedis(configuration, EasyCachingConstValue.DefaultRedisName).WithMessagePack(EasyCachingConstValue.DefaultRedisName);
}); });
//services.ConfigureCastleInterceptor(options => options.CacheProviderName = EasyCachingConstValue.DefaultRedisName);
services.ConfigureCastleInterceptor(options => options.CacheProviderName = EasyCachingConstValue.DefaultInMemoryName); services.ConfigureCastleInterceptor(options => options.CacheProviderName = EasyCachingConstValue.DefaultInMemoryName);
} }
} }

View File

@ -57,6 +57,26 @@
"EnableReadDeepClone": true, "EnableReadDeepClone": true,
"EnableWriteDeepClone": false "EnableWriteDeepClone": false
} }
},
"redis": {
"MaxRdSecond": 120,
"EnableLogging": false,
"LockMs": 5000,
"SleepMs": 300,
"dbconfig": {
"Password": "xc@123456",
"IsSsl": false,
"SslHost": null,
"ConnectionTimeout": 5000,
"AllowAdmin": true,
"Endpoints": [
{
"Host": "47.117.164.182",
"Port": 6379
}
],
"Database": 0
}
} }
}, },
"IRaCISImageStore": { "IRaCISImageStore": {

View File

@ -65,7 +65,11 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" /> <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
<PackageReference Include="AutoMapper.Collection.EntityFrameworkCore" Version="9.0.0" /> <PackageReference Include="AutoMapper.Collection.EntityFrameworkCore" Version="9.0.0" />
<PackageReference Include="EntityFrameworkCore.Triggered" Version="3.2.2" /> <PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.3" />
<PackageReference Include="EasyCaching.InMemory" Version="1.9.1" />
<PackageReference Include="EasyCaching.Redis" Version="1.9.1" />
<PackageReference Include="EntityFrameworkCore.Triggered" Version="3.2.1" />
<PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.1.0" /> <PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.1.0" />
<PackageReference Include="EasyCaching.Interceptor.AspectCore" Version="1.9.1" /> <PackageReference Include="EasyCaching.Interceptor.AspectCore" Version="1.9.1" />
<PackageReference Include="ExcelDataReader" Version="3.6.0" /> <PackageReference Include="ExcelDataReader" Version="3.6.0" />
@ -93,12 +97,12 @@
<TreatAsUsed>true</TreatAsUsed> <TreatAsUsed>true</TreatAsUsed>
</PackageReference> </PackageReference>
<PackageReference Include="Nito.AsyncEx" Version="5.1.2" /> <PackageReference Include="Nito.AsyncEx" Version="5.1.2" />
<PackageReference Include="NPOI" Version="2.6.2" /> <PackageReference Include="NPOI" Version="2.6.0" />
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.1" /> <PackageReference Include="Panda.DynamicWebApi" Version="1.2.0" />
<PackageReference Include="Quartz" Version="3.7.0" /> <PackageReference Include="Quartz" Version="3.5.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.2" /> <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.11" /> <PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.5" />
<PackageReference Include="WinSCP" Version="6.1.2" /> <PackageReference Include="WinSCP" Version="5.21.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -6,7 +6,6 @@ using Microsoft.AspNetCore.Hosting;
using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Auth;
using AutoMapper; using AutoMapper;
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using Nito.AsyncEx;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
@ -55,7 +54,6 @@ namespace IRaCIS.Application.Services
private readonly AsyncLock _mutex = new AsyncLock();
private readonly SystemEmailSendConfig _systemEmailConfig; private readonly SystemEmailSendConfig _systemEmailConfig;

View File

@ -9,10 +9,11 @@ using Microsoft.AspNetCore.Hosting;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using FellowOakDicom; using FellowOakDicom;
using FellowOakDicom.Imaging.Codec; using FellowOakDicom.Imaging.Codec;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Services namespace IRaCIS.Core.Application.Services
{ {
public class DicomArchiveService :BaseService, IDicomArchiveService public class DicomArchiveService : BaseService, IDicomArchiveService
{ {
private readonly IRepository<DicomStudy> _studyRepository; private readonly IRepository<DicomStudy> _studyRepository;
private readonly IRepository<DicomSeries> _seriesRepository; private readonly IRepository<DicomSeries> _seriesRepository;
@ -22,7 +23,7 @@ namespace IRaCIS.Core.Application.Services
private readonly IWebHostEnvironment _hostEnvironment; private readonly IWebHostEnvironment _hostEnvironment;
private static object lockCodeGenerate = new object(); private readonly IDistributedLockProvider _distributedLockProvider;
private List<Guid> _instanceIdList = new List<Guid>(); private List<Guid> _instanceIdList = new List<Guid>();
@ -32,8 +33,9 @@ namespace IRaCIS.Core.Application.Services
IRepository<DicomInstance> instanceRepository, IRepository<DicomInstance> instanceRepository,
IWebHostEnvironment hostEnvironment, IWebHostEnvironment hostEnvironment,
IRepository<Dictionary> dictionaryRepository, IRepository<Dictionary> dictionaryRepository,
IEasyCachingProvider provider) IEasyCachingProvider provider, IDistributedLockProvider distributedLockProvider)
{ {
_distributedLockProvider = distributedLockProvider;
_hostEnvironment = hostEnvironment; _hostEnvironment = hostEnvironment;
_studyRepository = studyRepository; _studyRepository = studyRepository;
@ -51,7 +53,7 @@ namespace IRaCIS.Core.Application.Services
return success; return success;
} }
public async Task<(Guid StudyId, string StudyCode)> ArchiveDicomStreamAsync(Stream dicomStream, public async Task<(Guid StudyId, string StudyCode)> ArchiveDicomStreamAsync(Stream dicomStream,
@ -130,7 +132,7 @@ namespace IRaCIS.Core.Application.Services
DicomStudy dicomStudy = CreateDicomStudy(dataset, addtionalInfo, out bool isStudyNeedAdd); DicomStudy dicomStudy = CreateDicomStudy(dataset, addtionalInfo, out bool isStudyNeedAdd);
DicomSeries dicomSeries = CreateDicomSeries(dataset, dicomStudy, out bool isSeriesNeedAdd); DicomSeries dicomSeries = CreateDicomSeries(dataset, dicomStudy, out bool isSeriesNeedAdd);
DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries,out bool isInstanceNeedAdd); DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries, out bool isInstanceNeedAdd);
dicomSeries.DicomStudy = dicomStudy; dicomSeries.DicomStudy = dicomStudy;
@ -184,7 +186,7 @@ namespace IRaCIS.Core.Application.Services
//正常保存 不做处理 //正常保存 不做处理
await dicomFile.SaveAsync(physicalPath); await dicomFile.SaveAsync(physicalPath);
} }
else else
{ {
//RLELossless 保存 //RLELossless 保存
await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(physicalPath); //RLELossless await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(physicalPath); //RLELossless
@ -236,7 +238,7 @@ namespace IRaCIS.Core.Application.Services
{ {
modalityForEdit = "PET"; modalityForEdit = "PET";
} }
if(modality== "PT、CT") if (modality == "PT、CT")
{ {
modalityForEdit = "PET-CT"; modalityForEdit = "PET-CT";
} }
@ -283,9 +285,10 @@ namespace IRaCIS.Core.Application.Services
dicomStudy.PatientBirthDate = $"{dicomStudy.PatientBirthDate[0]}{dicomStudy.PatientBirthDate[1]}{dicomStudy.PatientBirthDate[2]}{dicomStudy.PatientBirthDate[3]}-{dicomStudy.PatientBirthDate[4]}{dicomStudy.PatientBirthDate[5]}-{dicomStudy.PatientBirthDate[6]}{dicomStudy.PatientBirthDate[7]}"; dicomStudy.PatientBirthDate = $"{dicomStudy.PatientBirthDate[0]}{dicomStudy.PatientBirthDate[1]}{dicomStudy.PatientBirthDate[2]}{dicomStudy.PatientBirthDate[3]}-{dicomStudy.PatientBirthDate[4]}{dicomStudy.PatientBirthDate[5]}-{dicomStudy.PatientBirthDate[6]}{dicomStudy.PatientBirthDate[7]}";
} }
lock (lockCodeGenerate) var @lock = _distributedLockProvider.CreateLock($"StudyCode");
{
using (@lock.Acquire())
{
//查询数据库获取最大的Code 没有记录则为0 //查询数据库获取最大的Code 没有记录则为0
var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.Code).DefaultIfEmpty().Max(); var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.Code).DefaultIfEmpty().Max();
@ -299,9 +302,9 @@ namespace IRaCIS.Core.Application.Services
dicomStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); dicomStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
_provider.Set<int>($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}", dicomStudy.Code, TimeSpan.FromMinutes(30)); _provider.Set<int>($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}", dicomStudy.Code, TimeSpan.FromMinutes(30));
} }
#region Setting Code old #region Setting Code old
//var studyCode = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.StudyCode).OrderByDescending(c => c).FirstOrDefault(); //var studyCode = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.StudyCode).OrderByDescending(c => c).FirstOrDefault();
@ -469,7 +472,7 @@ namespace IRaCIS.Core.Application.Services
_instanceIdList.Add(instanceId); _instanceIdList.Add(instanceId);
} }
return dicomInstance; return dicomInstance;
} }

View File

@ -14,16 +14,13 @@ using IRaCIS.Core.Application.MediatR.Handlers;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Threading; using System.Threading;
using Nito.AsyncEx; using Medallion.Threading;
namespace IRaCIS.Core.Application.Service.ImageAndDoc namespace IRaCIS.Core.Application.Service.ImageAndDoc
{ {
[ApiExplorerSettings(GroupName = "Image")] [ApiExplorerSettings(GroupName = "Image")]
public class StudyService : BaseService, IStudyService public class StudyService : BaseService, IStudyService
{ {
private static object lockObj = new object();
private static readonly AsyncLock _mutex = new AsyncLock();
private static readonly AsyncLock _mutex2 = new AsyncLock();
private readonly IEasyCachingProvider _provider; private readonly IEasyCachingProvider _provider;
@ -35,12 +32,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
private readonly IRepository<Dictionary> _dictionaryRepository; private readonly IRepository<Dictionary> _dictionaryRepository;
private readonly IRepository<StudyMonitor> _studyMonitorRepository; private readonly IRepository<StudyMonitor> _studyMonitorRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
public StudyService(IEasyCachingProvider provider public StudyService(IEasyCachingProvider provider
, IRepository<SubjectVisit> subjectVisitRepository, , IRepository<SubjectVisit> subjectVisitRepository,
IRepository<DicomInstance> dicomInstanceRepository, IRepository<DicomInstance> dicomInstanceRepository,
IRepository<DicomSeries> dicomSeriesRepository, IRepository<DicomStudy> dicomstudyRepository, IRepository<Dictionary> dictionaryRepository, IRepository<StudyMonitor> studyMonitorRepository) IRepository<DicomSeries> dicomSeriesRepository, IRepository<DicomStudy> dicomstudyRepository, IRepository<Dictionary> dictionaryRepository, IRepository<StudyMonitor> studyMonitorRepository, IDistributedLockProvider distributedLockProvider)
{ {
_provider = provider; _provider = provider;
_subjectVisitRepository = subjectVisitRepository; _subjectVisitRepository = subjectVisitRepository;
@ -49,6 +46,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
_dicomstudyRepository = dicomstudyRepository; _dicomstudyRepository = dicomstudyRepository;
_dictionaryRepository = dictionaryRepository; _dictionaryRepository = dictionaryRepository;
_studyMonitorRepository = studyMonitorRepository; _studyMonitorRepository = studyMonitorRepository;
_distributedLockProvider = distributedLockProvider;
} }
@ -160,7 +158,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{ {
var study = _mapper.Map<DicomStudy>(incommand.Study); var study = _mapper.Map<DicomStudy>(incommand.Study);
using (await _mutex.LockAsync()) var @lock = _distributedLockProvider.CreateLock($"StudyCode");
using (await @lock.AcquireAsync())
{ {
//查询数据库获取最大的Code 没有记录则为0 //查询数据库获取最大的Code 没有记录则为0
var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
@ -306,11 +306,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
} }
using (await _mutex2.LockAsync()) var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit");
using (await @lock2.AcquireAsync())
{ {
await _dicomInstanceRepository.SaveChangesAsync(); await _dicomInstanceRepository.SaveChangesAsync();
} }
} }
catch (Exception ex) catch (Exception ex)
@ -765,7 +765,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
if (_provider.Exists($"StudyUid_{trialId}_{studyInstanceUid}")) if (_provider.Exists($"StudyUid_{trialId}_{studyInstanceUid}"))
{ {
result.AllowUpload = false; result.AllowUpload = false;
result.AllowReUpload = false; result.AllowReUpload = false;
@ -826,22 +826,22 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
} }
result.StudyInstanceUid = studyInstanceUid; result.StudyInstanceUid = studyInstanceUid;
var @lock = _distributedLockProvider.CreateLock($"StudyUpload");
if (result.AllowReUpload || result.AllowUpload) using (@lock.Acquire())
{ {
lock (lockObj) if (result.AllowReUpload || result.AllowUpload)
{ {
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30)); _provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
} }
} else
else
{
lock (lockObj)
{ {
_provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}"); _provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}");
} }
} }
return result; return result;
} }

View File

@ -3,7 +3,7 @@ using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Nito.AsyncEx; using Medallion.Threading;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
{ {
@ -12,13 +12,13 @@ namespace IRaCIS.Application.Services
{ {
private readonly IRepository<Site> _siteRepository; private readonly IRepository<Site> _siteRepository;
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository; private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
private readonly AsyncLock _mutex = new AsyncLock(); public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider)
public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository)
{ {
_siteRepository = siteRepository; _siteRepository = siteRepository;
this._trialSiteUserRepository = trialSiteUserRepository; _trialSiteUserRepository = trialSiteUserRepository;
_distributedLockProvider = distributedLockProvider;
} }
/// <summary> 分页获取研究中心列表 </summary> /// <summary> 分页获取研究中心列表 </summary>
@ -27,7 +27,7 @@ namespace IRaCIS.Application.Services
{ {
var siteQueryable = _siteRepository var siteQueryable = _siteRepository
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.Contains(searchModel.SiteName)||t.SiteNameCN.Contains(searchModel.SiteName)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.Contains(searchModel.SiteName) || t.SiteNameCN.Contains(searchModel.SiteName))
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.AliasName), t => t.AliasName.Contains(searchModel.AliasName)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.AliasName), t => t.AliasName.Contains(searchModel.AliasName))
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.City), t => t.City.Contains(searchModel.City)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.City), t => t.City.Contains(searchModel.City))
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.Country), t => t.Country.Contains(searchModel.Country)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.Country), t => t.Country.Contains(searchModel.Country))
@ -58,7 +58,9 @@ namespace IRaCIS.Application.Services
VerifyMsg = _localizer["Site_DupName"] VerifyMsg = _localizer["Site_DupName"]
}; };
using (await _mutex.LockAsync()) var @lock = _distributedLockProvider.CreateLock($"SiteAdd");
using (await @lock.AcquireAsync())
{ {
if (siteCommand.Id == null) if (siteCommand.Id == null)
{ {

View File

@ -12,6 +12,7 @@ using IRaCIS.Core.Infra.Common.Cache;
using Microsoft.Identity.Client; using Microsoft.Identity.Client;
using static IRaCIS.Core.Domain.Share.StaticData; using static IRaCIS.Core.Domain.Share.StaticData;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using Medallion.Threading;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
{ {
@ -24,7 +25,7 @@ namespace IRaCIS.Application.Services
private readonly IRepository<TrialUser> _userTrialRepository; private readonly IRepository<TrialUser> _userTrialRepository;
private readonly IRepository<UserLog> _userLogRepository; private readonly IRepository<UserLog> _userLogRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
private readonly IMemoryCache _cache; private readonly IMemoryCache _cache;
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig; private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig;
@ -38,7 +39,8 @@ namespace IRaCIS.Application.Services
IRepository<TrialUser> userTrialRepository, IRepository<TrialUser> userTrialRepository,
IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig, IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig,
IRepository<UserLog> userLogRepository IRepository<UserLog> userLogRepository
) ,
IDistributedLockProvider distributedLockProvider)
{ {
_userLogRepository = userLogRepository; _userLogRepository = userLogRepository;
@ -47,9 +49,10 @@ namespace IRaCIS.Application.Services
_userRepository = userRepository; _userRepository = userRepository;
_mailVerificationService = mailVerificationService; _mailVerificationService = mailVerificationService;
_verificationCodeRepository = verificationCodeRepository; _verificationCodeRepository = verificationCodeRepository;
_userTrialRepository = userTrialRepository; _userTrialRepository = userTrialRepository;
_userLogRepository = userLogRepository; _userLogRepository = userLogRepository;
_distributedLockProvider = distributedLockProvider;
} }
@ -502,29 +505,32 @@ namespace IRaCIS.Application.Services
var saveItem = _mapper.Map<User>(userAddModel); var saveItem = _mapper.Map<User>(userAddModel);
saveItem.Code = await _userRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1; var @lock = _distributedLockProvider.CreateLock($"UserAccount");
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User)); using (await @lock.AcquireAsync())
if (saveItem.IsZhiZhun)
{ {
saveItem.OrganizationName = AppSettings.DefaultInternalOrganizationName; saveItem.Code = await _userRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1;
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User));
if (saveItem.IsZhiZhun)
{
saveItem.OrganizationName = AppSettings.DefaultInternalOrganizationName;
}
saveItem.Password = MD5Helper.Md5("123456");
await _userRepository.AddAsync(saveItem);
var success = await _userRepository.SaveChangesAsync();
} }
saveItem.Password = MD5Helper.Md5("123456");
await _userRepository.AddAsync(saveItem);
var success = await _userRepository.SaveChangesAsync();
await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl); await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl);
return ResponseOutput.Ok( new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
return ResponseOutput.Result(success, new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
} }

View File

@ -5,10 +5,10 @@
//-------------------------------------------------------------------- //--------------------------------------------------------------------
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Filter;
using Nito.AsyncEx;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Contracts namespace IRaCIS.Core.Application.Contracts
{ {
@ -20,19 +20,19 @@ namespace IRaCIS.Core.Application.Contracts
{ {
private readonly IRepository<NoneDicomStudy> _noneDicomStudyRepository; private readonly IRepository<NoneDicomStudy> _noneDicomStudyRepository;
private readonly IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository; private readonly IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository;
private readonly AsyncLock _mutex = new AsyncLock(); private readonly IDistributedLockProvider _distributedLockProvider;
private readonly QCCommon _qCCommon; private readonly QCCommon _qCCommon;
public NoneDicomStudyService(IRepository<NoneDicomStudy> noneDicomStudyRepository, public NoneDicomStudyService(IRepository<NoneDicomStudy> noneDicomStudyRepository,
QCCommon qCCommon, QCCommon qCCommon,
IRepository<NoneDicomStudyFile> noneDicomStudyFileRepository) IRepository<NoneDicomStudyFile> noneDicomStudyFileRepository, IDistributedLockProvider distributedLockProvider)
{ {
_qCCommon = qCCommon; _qCCommon = qCCommon;
_noneDicomStudyRepository = noneDicomStudyRepository; _noneDicomStudyRepository = noneDicomStudyRepository;
_noneDicomStudyFileRepository = noneDicomStudyFileRepository; _noneDicomStudyFileRepository = noneDicomStudyFileRepository;
_distributedLockProvider = distributedLockProvider;
} }
@ -62,7 +62,9 @@ namespace IRaCIS.Core.Application.Contracts
} }
NoneDicomStudy? optEntity = null; NoneDicomStudy? optEntity = null;
using (await _mutex.LockAsync()) var @lock = _distributedLockProvider.CreateLock($"NoneDicomCode");
using (await @lock.AcquireAsync())
{ {
if (addOrEditNoneDicomStudy.Id == Guid.Empty || addOrEditNoneDicomStudy.Id == null) if (addOrEditNoneDicomStudy.Id == Guid.Empty || addOrEditNoneDicomStudy.Id == null)
{ {

View File

@ -10,13 +10,13 @@ using WinSCP;
using Newtonsoft.Json; using Newtonsoft.Json;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Application.Service.Inspection.DTO; using IRaCIS.Core.Application.Service.Inspection.DTO;
using Nito.AsyncEx;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Image.QA namespace IRaCIS.Core.Application.Image.QA
{ {
@ -35,8 +35,7 @@ namespace IRaCIS.Core.Application.Image.QA
private readonly IRepository<Trial> _trialRepository; private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<VisitTask> _visitTaskRepository; private readonly IRepository<VisitTask> _visitTaskRepository;
private readonly IVisitTaskHelpeService _IVisitTaskHelpeService; private readonly IVisitTaskHelpeService _IVisitTaskHelpeService;
private readonly IDistributedLockProvider _distributedLockProvider;
private readonly AsyncLock _mutex = new AsyncLock();
public QCOperationService(IRepository<SubjectVisit> subjectVisitRepository, public QCOperationService(IRepository<SubjectVisit> subjectVisitRepository,
IRepository<QCChallenge> qcChallengeRepository, IRepository<QCChallenge> qcChallengeRepository,
@ -48,7 +47,8 @@ namespace IRaCIS.Core.Application.Image.QA
IRepository<ReadingClinicalData> readingClinicalDataRepository, IRepository<ReadingClinicalData> readingClinicalDataRepository,
IRepository<QCChallengeDialog> qCChallengeDialogrepository, IRepository<QCChallengeDialog> qCChallengeDialogrepository,
IRepository<CheckChallengeDialog> checkChallengeDialogrepository, IRepository<CheckChallengeDialog> checkChallengeDialogrepository,
IVisitTaskHelpeService visitTaskHelpeService IVisitTaskHelpeService visitTaskHelpeService,
IDistributedLockProvider distributedLockProvider
) )
{ {
_subjectVisitRepository = subjectVisitRepository; _subjectVisitRepository = subjectVisitRepository;
@ -62,6 +62,7 @@ namespace IRaCIS.Core.Application.Image.QA
_trialRepository = trialRepository; _trialRepository = trialRepository;
this._visitTaskRepository = visitTaskRepository; this._visitTaskRepository = visitTaskRepository;
_IVisitTaskHelpeService = visitTaskHelpeService; _IVisitTaskHelpeService = visitTaskHelpeService;
_distributedLockProvider = distributedLockProvider;
} }
#region QC质疑 以及回复 关闭 #region QC质疑 以及回复 关闭
@ -108,9 +109,9 @@ namespace IRaCIS.Core.Application.Image.QA
var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }).FirstOrDefaultAsync()).IfNullThrowException(); var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }).FirstOrDefaultAsync()).IfNullThrowException();
var @lock = _distributedLockProvider.CreateLock($"QCChallengeCode");
using (await @lock.AcquireAsync())
using (await _mutex.LockAsync())
{ {
//获取编号 //获取编号
var code = _qcChallengeRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); var code = _qcChallengeRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();

View File

@ -20,6 +20,7 @@ using Microsoft.VisualBasic;
using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml.Spreadsheet;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Contracts namespace IRaCIS.Core.Application.Contracts
{ {
@ -35,13 +36,14 @@ namespace IRaCIS.Core.Application.Contracts
private readonly IRepository<TrialSite> _trialSiteRepository; private readonly IRepository<TrialSite> _trialSiteRepository;
private readonly IRepository<TrialUser> _trialUserRepository; private readonly IRepository<TrialUser> _trialUserRepository;
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository; private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
private readonly ITokenService _tokenService; private readonly ITokenService _tokenService;
private readonly IMailVerificationService _mailVerificationService; private readonly IMailVerificationService _mailVerificationService;
public TrialSiteSurveyService(IRepository<TrialSiteSurvey> trialSiteSurveyRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialSiteUserSurvey> trialSiteUserSurveyRepository, public TrialSiteSurveyService(IRepository<TrialSiteSurvey> trialSiteSurveyRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialSiteUserSurvey> trialSiteUserSurveyRepository,
IRepository<User> userRepository, IRepository<TrialSite> trialSiteRepository, IRepository<User> userRepository, IRepository<TrialSite> trialSiteRepository,
ITokenService tokenService, ITokenService tokenService,
IMailVerificationService mailVerificationService, IRepository<TrialSiteUser> trialSiteUserRepository) IMailVerificationService mailVerificationService, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider)
{ {
_trialSiteSurveyRepository = trialSiteSurveyRepository; _trialSiteSurveyRepository = trialSiteSurveyRepository;
_trialSiteUserSurveyRepository = trialSiteUserSurveyRepository; _trialSiteUserSurveyRepository = trialSiteUserSurveyRepository;
@ -51,9 +53,9 @@ namespace IRaCIS.Core.Application.Contracts
_tokenService = tokenService; _tokenService = tokenService;
_mailVerificationService = mailVerificationService; _mailVerificationService = mailVerificationService;
_trialSiteUserRepository = trialSiteUserRepository; _trialSiteUserRepository = trialSiteUserRepository;
_distributedLockProvider = distributedLockProvider;
} }
private object lockObj { get; set; } = new object();
/// <summary> /// <summary>
/// 发送验证码 /// 发送验证码
@ -791,7 +793,9 @@ namespace IRaCIS.Core.Application.Contracts
if (sysUserInfo == null) if (sysUserInfo == null)
{ {
lock (lockObj) var @lock = _distributedLockProvider.CreateLock($"UserCode");
using (await @lock.AcquireAsync())
{ {
var saveItem = _mapper.Map<User>(item); var saveItem = _mapper.Map<User>(item);
@ -971,7 +975,9 @@ namespace IRaCIS.Core.Application.Contracts
if (sysUserInfo == null) if (sysUserInfo == null)
{ {
lock (lockObj) var @lock = _distributedLockProvider.CreateLock($"UserCode");
using (await @lock.AcquireAsync())
{ {
var saveItem = _mapper.Map<User>(item); var saveItem = _mapper.Map<User>(item);

View File

@ -16,6 +16,7 @@ using Panda.DynamicWebApi.Attributes;
using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Auth;
using IRaCIS.Application.Services; using IRaCIS.Application.Services;
using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Filter;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@ -31,10 +32,11 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<TrialSiteUserSurvey> _trialSiteSurveyUserRepository; private readonly IRepository<TrialSiteUserSurvey> _trialSiteSurveyUserRepository;
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository; private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
private readonly IMailVerificationService _mailVerificationService; private readonly IMailVerificationService _mailVerificationService;
private readonly IDistributedLockProvider _distributedLockProvider;
public TrialExternalUserService(IRepository<TrialExternalUser> trialExternalUseRepository, IRepository<User> userRepository, IRepository<TrialUser> trialUserRepository, public TrialExternalUserService(IRepository<TrialExternalUser> trialExternalUseRepository, IRepository<User> userRepository, IRepository<TrialUser> trialUserRepository,
IRepository<TrialSiteUserSurvey> trialSiteSurveyUserRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IRepository<TrialSiteUserSurvey> trialSiteSurveyUserRepository, IRepository<TrialSiteUser> trialSiteUserRepository,
IMailVerificationService mailVerificationService) IMailVerificationService mailVerificationService, IDistributedLockProvider distributedLockProvider)
{ {
_trialExternalUseRepository = trialExternalUseRepository; _trialExternalUseRepository = trialExternalUseRepository;
_userRepository = userRepository; _userRepository = userRepository;
@ -43,6 +45,7 @@ namespace IRaCIS.Core.Application.Service
_trialSiteUserRepository = trialSiteUserRepository; _trialSiteUserRepository = trialSiteUserRepository;
_mailVerificationService = mailVerificationService; _mailVerificationService = mailVerificationService;
_distributedLockProvider = distributedLockProvider;
} }
@ -75,121 +78,125 @@ namespace IRaCIS.Core.Application.Service
if (addOrEditTrialExternalUser.Id == null) if (addOrEditTrialExternalUser.Id == null)
{ {
var existSysUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); var @lock = _distributedLockProvider.CreateLock($"UserCode");
if (existSysUser != null) using (await @lock.AcquireAsync())
{ {
if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName) var existSysUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId);
if (existSysUser != null)
{ {
//$"该用户在系统中的用户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存", if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName)
return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips); {
//$"该用户在系统中的用户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存",
return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips);
}
} }
} //处理 生成账户
//处理 生成账户 if (await _trialExternalUseRepository.AnyAsync(t =>
t.Email == addOrEditTrialExternalUser.Email &&
if (await _trialExternalUseRepository.AnyAsync(t => t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.TrialId == addOrEditTrialExternalUser.TrialId))
t.Email == addOrEditTrialExternalUser.Email && {
t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.TrialId == addOrEditTrialExternalUser.TrialId)) //---系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。
{ return ResponseOutput.NotOk(_localizer["TrialExternalUser_EmailTypeDuplicate"]);
//---系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。 }
return ResponseOutput.NotOk(_localizer["TrialExternalUser_EmailTypeDuplicate"]);
}
var addEntity = _mapper.Map<TrialExternalUser>(addOrEditTrialExternalUser); var addEntity = _mapper.Map<TrialExternalUser>(addOrEditTrialExternalUser);
await _trialExternalUseRepository.AddAsync(addEntity); await _trialExternalUseRepository.AddAsync(addEntity);
var existUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); var existUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId);
var trialType = await _repository.Where<Trial>(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync(); var trialType = await _repository.Where<Trial>(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync();
if (existUser != null) if (existUser != null)
{ {
addEntity.IsSystemUser = true; addEntity.IsSystemUser = true;
addEntity.SystemUserId = existUser.Id; addEntity.SystemUserId = existUser.Id;
} }
else else
{ {
//生成账户 并插入 //生成账户 并插入
var generateUser = _mapper.Map<User>(addOrEditTrialExternalUser); var generateUser = _mapper.Map<User>(addOrEditTrialExternalUser);
if (trialType == TrialType.NoneOfficial)
{
generateUser.IsTestUser = true;
}
// 外部人员生成账号 都是外部的
generateUser.IsZhiZhun = false;
generateUser.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(User));
generateUser.UserName = generateUser.UserCode;
generateUser.UserTypeEnum = _repository.Where<UserType>(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First();
generateUser.Password = MD5Helper.Md5("123456");
generateUser.Status = UserStateEnum.Disable;
var newAddUser = await _repository.AddAsync(generateUser);
addEntity.IsSystemUser = false;
addEntity.SystemUserId = newAddUser.Id;
existUser = newAddUser;
}
#region 验证用户 能否加入
if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training)
{
if (existUser.IsTestUser)
{
//---正式类型 、培训类型的项目 不允许加入测试用户
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]);
}
}
if (trialType == TrialType.NoneOfficial) if (trialType == TrialType.NoneOfficial)
{ {
generateUser.IsTestUser = true;
if (existUser.IsTestUser == false)
{
//---测试项目 不允许加入正式用户
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_FormalUserNotAllowed"]);
}
} }
// 外部人员生成账号 都是外部的 #endregion
generateUser.IsZhiZhun = false;
generateUser.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(User)); await _trialExternalUseRepository.SaveChangesAsync();
generateUser.UserName = generateUser.UserCode;
generateUser.UserTypeEnum = _repository.Where<UserType>(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First();
generateUser.Password = MD5Helper.Md5("123456");
generateUser.Status = UserStateEnum.Disable;
var newAddUser = await _repository.AddAsync(generateUser);
addEntity.IsSystemUser = false; //添加的时候就发邮件 现在省略
addEntity.SystemUserId = newAddUser.Id; if (addOrEditTrialExternalUser.IsSendEmail)
existUser = newAddUser;
}
#region 验证用户 能否加入
if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training)
{
if (existUser.IsTestUser)
{ {
//---正式类型 、培训类型的项目 不允许加入测试用户 await SendExternalUserJoinEmail(new TrialExternalUserSendEmail()
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]); {
BaseUrl = addOrEditTrialExternalUser.BaseUrl,
} RouteUrl = addOrEditTrialExternalUser.RouteUrl,
} TrialId = addOrEditTrialExternalUser.TrialId,
SendUsers = new List<UserEmail>()
if (trialType == TrialType.NoneOfficial)
{
if (existUser.IsTestUser == false )
{
//---测试项目 不允许加入正式用户
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_FormalUserNotAllowed"]);
}
}
#endregion
await _trialExternalUseRepository.SaveChangesAsync();
//添加的时候就发邮件 现在省略
if (addOrEditTrialExternalUser.IsSendEmail)
{
await SendExternalUserJoinEmail(new TrialExternalUserSendEmail()
{
BaseUrl = addOrEditTrialExternalUser.BaseUrl,
RouteUrl = addOrEditTrialExternalUser.RouteUrl,
TrialId = addOrEditTrialExternalUser.TrialId,
SendUsers = new List<UserEmail>()
{ {
new UserEmail() new UserEmail()
{ {
@ -199,12 +206,13 @@ namespace IRaCIS.Core.Application.Service
SystemUserId=addEntity.SystemUserId SystemUserId=addEntity.SystemUserId
} }
} }
}); });
}
return ResponseOutput.Ok(addEntity.Id.ToString());
} }
return ResponseOutput.Ok(addEntity.Id.ToString());
} }
else else
{ {

View File

@ -1,15 +1,19 @@
using IRaCIS.Core.Application.Service; using DocumentFormat.OpenXml.Office2010.Excel;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using MassTransit; using MassTransit;
using Medallion.Threading;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MiniExcelLibs; using MiniExcelLibs;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection.Metadata;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -20,6 +24,8 @@ namespace IRaCIS.Application.Services
[ApiExplorerSettings(GroupName = "Institution")] [ApiExplorerSettings(GroupName = "Institution")]
public class TestService : BaseService public class TestService : BaseService
{ {
public static int IntValue = 100;
private readonly IRepository<Dictionary> _dicRepository; private readonly IRepository<Dictionary> _dicRepository;
private readonly IRepository<Trial> _trialRepository; private readonly IRepository<Trial> _trialRepository;
@ -30,10 +36,13 @@ namespace IRaCIS.Application.Services
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _basicConfig; private readonly IOptionsMonitor<ServiceVerifyConfigOption> _basicConfig;
private readonly IRepository<VisitTask> _visitTaskRepositoryy; private readonly IRepository<VisitTask> _visitTaskRepositoryy;
private readonly IDistributedLockProvider _distributedLockProvider;
public TestService(IRepository<Dictionary> dicRepository, IRepository<Trial> trialRepository/*, IDistributedCache cache*/ private readonly ILogger<TestService> _logger;
, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IOptionsMonitor<ServiceVerifyConfigOption> basicConfig, IRepository<VisitTask> visitTaskRepository) public TestService(IRepository<Dictionary> dicRepository, IRepository<Trial> trialRepository,ILogger<TestService> logger
, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IOptionsMonitor<ServiceVerifyConfigOption> basicConfig, IRepository<VisitTask> visitTaskRepository, IDistributedLockProvider distributedLockProvider)
{ {
_visitTaskRepositoryy = visitTaskRepository; _visitTaskRepositoryy = visitTaskRepository;
@ -42,10 +51,36 @@ namespace IRaCIS.Application.Services
_dicRepository = dicRepository; _dicRepository = dicRepository;
_trialRepository = trialRepository; _trialRepository = trialRepository;
_distributedLockProvider= distributedLockProvider;
_logger= logger;
//_cache = cache; //_cache = cache;
} }
[AllowAnonymous]
public async Task<IResponseOutput> TestDistributedLock( )
{
Console.WriteLine($"我进来了当前值是:" + IntValue);
_logger.LogWarning($"我进来了当前值是:" + IntValue);
var @lock = _distributedLockProvider.CreateLock($"UserAccount");
using (await @lock.AcquireAsync())
{
await Task.Delay(4);
IntValue--;
_logger.LogWarning( IntValue.ToString());
Console.WriteLine(IntValue);
}
return ResponseOutput.Ok(IntValue);
}
[AllowAnonymous] [AllowAnonymous]
public async Task<IResponseOutput> GetMemoryStoreData() public async Task<IResponseOutput> GetMemoryStoreData()
{ {