Merge branch 'Test_HIR_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_HIR_Net8
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
he 2025-04-03 09:20:23 +08:00
commit d5609560e2
15 changed files with 19164 additions and 54 deletions

View File

@ -0,0 +1,35 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "MinIO",
"MinIO": {
"EndPoint": "192.168.40.99",
"Port": "9000",
"UseSSL": false,
"AccessKeyId": "Jnywl9aIw83yewZIJKod",
"SecretAccessKey": "N83bTzoJGkg4OLW8x54IZRwwSvdxcdYi9UZ2BYII",
"BucketName": "tj-hir",
"ViewEndpoint": "http://192.168.40.99:9000/tj-hir"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=192.168.40.98,1433;Database=TJ_Prod_HIR;User ID=sa;Password=xc_123456;TrustServerCertificate=true",
"Hangfire": "Server=192.168.40.98,1433;Database=TJ_Prod_HIR_Hangfire;User ID=sa;Password=xc_123456;TrustServerCertificate=true"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP",
"HIRAE",
"Value2",
"Value3"
],
"ServerPort": 11112
}
}

View File

@ -31,7 +31,6 @@ public static class ServiceCollectionSetup
services.AddOptions().Configure<IRCEncreptOption>(_configuration.GetSection("EncrypteResponseConfig")); services.AddOptions().Configure<IRCEncreptOption>(_configuration.GetSection("EncrypteResponseConfig"));
services.AddOptions().Configure<SystemPacsConfig>(_configuration.GetSection("SystemPacsConfig")); services.AddOptions().Configure<SystemPacsConfig>(_configuration.GetSection("SystemPacsConfig"));
services.Configure<IRaCISBasicConfigOption>(_configuration.GetSection("IRaCISBasicConfig")); services.Configure<IRaCISBasicConfigOption>(_configuration.GetSection("IRaCISBasicConfig"));
services.AddOptions().Configure<SystemHospitalOption>(_configuration.GetSection("SystemHospitalConfig"));
services.Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig")); services.Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig"));

View File

@ -0,0 +1,62 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "MinIO",
"MinIO": {
"EndPoint": "192.168.40.99",
"Port": "9000",
"UseSSL": false,
"AccessKeyId": "Jnywl9aIw83yewZIJKod",
"SecretAccessKey": "N83bTzoJGkg4OLW8x54IZRwwSvdxcdYi9UZ2BYII",
"BucketName": "tj-hir",
"ViewEndpoint": "http://192.168.40.99:9000/tj-hir"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=192.168.40.98,1433;Database=TJ_Prod_HIR;User ID=sa;Password=xc_123456;TrustServerCertificate=true",
"Hangfire": "Server=192.168.40.98,1433;Database=TJ_Prod_HIR_Hangfire;User ID=sa;Password=xc_123456;TrustServerCertificate=true"
},
"BasicSystemConfig": {
"OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": false,
"OpenLoginLimit": true,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 120,
"AESKey": "HIR_System_AES_Key_Info",
"CmoveIntervalMinutes": 1,
"CmoveInstanceIntervalMinutes": 1
},
"SystemHospitalConfig": {
"HospitalCode": "EI",
"HospitalLogoPath": "/System/GeneralDocuments/1716453306898_图片2.png",
"TrialKeepCount": 60,
"HospitalName": "上海展影医疗科技有限公司",
"HospitalAliasName": "展影医疗",
"Country": "中国",
"City": "上海",
"Province": "上海",
"Address": "上海市杨浦区国泰路复旦科技园",
"Phone": "021-60702575",
"IsCanConnectInternet": false
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "test-study@extimaging.com",
"FromName": "Test_HIR",
"AuthorizationCode": "zhanying123",
"SiteUrl": "http://hir.test.extimaging.com/login"
}
}

View File

@ -29,30 +29,17 @@
}, },
"BasicSystemConfig": { "BasicSystemConfig": {
"OpenUserComplexPassword": true, "OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": false, "OpenSignDocumentBeforeWork": true,
"OpenTrialRelationDelete": true, "OpenTrialRelationDelete": true,
"OpenLoginLimit": false, "OpenLoginLimit": true,
"LoginMaxFailCount": 5, "LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30, "LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 120, "AutoLoginOutMinutes": 120,
"AESKey": "HIR_System_AES_Key_Info", "AESKey": "HIR_System_AES_Key_Info",
"CmoveIntervalMinutes": 1, "CmoveIntervalMinutes": 1,
"CmoveInstanceIntervalMinutes": 1 "CmoveInstanceIntervalMinutes": 1
},
},
"SystemHospitalConfig": {
"HospitalCode": "EI",
"HospitalLogoPath": "/System/GeneralDocuments/1732515108701_肿瘤医院logo 新.jpg",
"TrialKeepCount": 60,
"HospitalName": "上海展影医疗科技有限公司",
"HospitalAliasName": "展影医疗",
"Country": "中国",
"City": "上海",
"Province": "上海",
"Address": "上海市杨浦区国泰路复旦科技园",
"Phone": "021-60702575",
"IsCanConnectInternet": false
},
"SystemEmailSendConfig": { "SystemEmailSendConfig": {
"Port": 465, "Port": 465,
"Host": "smtp.qiye.aliyun.com", "Host": "smtp.qiye.aliyun.com",

View File

@ -19,7 +19,8 @@ namespace IRaCIS.Core.Application.Filter;
public class TrialGlobalLimitActionFilter(IFusionCache _fusionCache, IUserInfo _userInfo, IRepository<Trial> _trialRepository, public class TrialGlobalLimitActionFilter(IFusionCache _fusionCache, IUserInfo _userInfo, IRepository<Trial> _trialRepository,
IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig, IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig,
IOptionsMonitor<SystemHospitalOption> _hospitalOption, IStringLocalizer _localizer) : IAsyncActionFilter IRepository<HIRHospital> _hirHospitalRepository,
IStringLocalizer _localizer) : IAsyncActionFilter
{ {
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{ {
@ -152,6 +153,9 @@ public class TrialGlobalLimitActionFilter(IFusionCache _fusionCache, IUserInfo _
if (!string.IsNullOrWhiteSpace(trialIdStr)) if (!string.IsNullOrWhiteSpace(trialIdStr))
{ {
var trialInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Trial(trialIdStr), _ => CacheHelper.GetTrialStatusAsync(Guid.Parse(trialIdStr), _trialRepository), TimeSpan.FromDays(7)); var trialInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Trial(trialIdStr), _ => CacheHelper.GetTrialStatusAsync(Guid.Parse(trialIdStr), _trialRepository), TimeSpan.FromDays(7));
var hospitalInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Hospital, _ => CacheHelper.GetHospitalCode(_hirHospitalRepository), TimeSpan.FromDays(7));
var trialStatusStr = string.Empty; var trialStatusStr = string.Empty;
if (trialInfo != null) if (trialInfo != null)
@ -181,7 +185,7 @@ public class TrialGlobalLimitActionFilter(IFusionCache _fusionCache, IUserInfo _
} }
var hospitalCode = _hospitalOption.CurrentValue.HospitalCode; var hospitalCode = hospitalInfo.HospitalCode;
var authInfo = JsonConvert.DeserializeObject<TrialAuthorizationInfo>(decodedText); var authInfo = JsonConvert.DeserializeObject<TrialAuthorizationInfo>(decodedText);
if (authInfo != null) if (authInfo != null)

View File

@ -1,4 +1,5 @@
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Core.Application.Helper; namespace IRaCIS.Core.Application.Helper;
@ -61,6 +62,8 @@ public static class CacheKeys
public static string CmoveStudyId(string studyIdStr) => $"CmoveStudyId:{studyIdStr}"; public static string CmoveStudyId(string studyIdStr) => $"CmoveStudyId:{studyIdStr}";
public static string Hospital => $"Hospital";
} }
public static class CacheHelper public static class CacheHelper
@ -79,4 +82,10 @@ public static class CacheHelper
return list; return list;
} }
public static async Task<HIRHospital> GetHospitalCode(IRepository<HIRHospital> _hirHospitalRepository)
{
return await _hirHospitalRepository.Where(t => t.IsDefault == true).FirstNotNullAsync();
}
} }

View File

@ -17998,6 +17998,16 @@
数据 数据
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Application.Contracts.TJCmoveStudyCommand.StudyInstanceUIDList">
<summary>
C-move 检查 数组
</summary>
</member>
<member name="P:IRaCIS.Application.Contracts.TJCmoveStudyCommand.CalledAE">
<summary>
PacsAE 的名字
</summary>
</member>
<member name="T:IRaCIS.Application.Contracts.WorkLoadDetailDTO"> <member name="T:IRaCIS.Application.Contracts.WorkLoadDetailDTO">
<summary> <summary>
后台 工作量审核视图模型 后台 工作量审核视图模型
@ -18257,19 +18267,18 @@
<returns></returns> <returns></returns>
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception> <exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
</member> </member>
<member name="M:IRaCIS.Application.Services.PatientService.GetTrialAuthorizationCode(IRaCIS.Application.Contracts.TrialAuthorizationInfo,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Application.Contracts.SystemHospitalOption})"> <member name="M:IRaCIS.Application.Services.PatientService.GetTrialAuthorizationCode(IRaCIS.Application.Contracts.TrialAuthorizationInfo)">
<summary> <summary>
获取项目授权码 获取项目授权码
</summary> </summary>
<param name="authInfo"></param> <param name="authInfo"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Application.Services.PatientService.GetAuthorizationCodeInfo(System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Application.Contracts.SystemHospitalOption})"> <member name="M:IRaCIS.Application.Services.PatientService.GetAuthorizationCodeInfo(System.String)">
<summary> <summary>
获取授权码明文信息 获取授权码明文信息
</summary> </summary>
<param name="authorizationCode"></param> <param name="authorizationCode"></param>
<param name="_hospitalOption"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Application.Services.PatientService.GetTrialActivationCode(IRaCIS.Application.Contracts.TrialAuthorizationInfo,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption})"> <member name="M:IRaCIS.Application.Services.PatientService.GetTrialActivationCode(IRaCIS.Application.Contracts.TrialAuthorizationInfo,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption})">
@ -18280,7 +18289,7 @@
<param name="_basicSystemConfigConfig"></param> <param name="_basicSystemConfigConfig"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Application.Services.PatientService.GetActivationCodeInfo(System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Application.Contracts.SystemHospitalOption},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption})"> <member name="M:IRaCIS.Application.Services.PatientService.GetActivationCodeInfo(System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption})">
<summary> <summary>
激活码获取明文信息 激活码获取明文信息
</summary> </summary>
@ -18289,7 +18298,7 @@
<param name="_basicSystemConfigConfig"></param> <param name="_basicSystemConfigConfig"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Application.Services.PatientService.ActivateTrial(System.Guid,System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},ZiggyCreatures.Caching.Fusion.IFusionCache,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Application.Contracts.SystemHospitalOption})"> <member name="M:IRaCIS.Application.Services.PatientService.ActivateTrial(System.Guid,System.String,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},ZiggyCreatures.Caching.Fusion.IFusionCache)">
<summary> <summary>
设置项目授权信息 设置项目授权信息
</summary> </summary>
@ -18540,14 +18549,18 @@
<param name="inCommand"></param> <param name="inCommand"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Application.Services.PatientService.CmoveStudyList(IRaCIS.Application.Contracts.SCUCmoveCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomAE},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SCPInstance},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption})"> <member name="M:IRaCIS.Application.Services.PatientService.CmoveStudyList(IRaCIS.Application.Contracts.SCUCmoveCommand)">
<summary> <summary>
拉取影像 拉取影像
</summary> </summary>
<param name="inCommand"></param> <param name="inCommand"></param>
<param name="_dicomAEReposiotry"></param> <returns></returns>
<param name="_scpInstanceRepository"></param> </member>
<param name="_basicSystemConfigConfig"></param> <member name="M:IRaCIS.Application.Services.PatientService.TjCmoveStudy(IRaCIS.Application.Contracts.TJCmoveStudyCommand)">
<summary>
同济医院 第三方系统 发送命令拉取影像
</summary>
<param name="inCommand"></param>
<returns></returns> <returns></returns>
</member> </member>
</members> </members>

View File

@ -25,7 +25,11 @@ namespace IRaCIS.Application.Contracts
public class TJUserInfoDto public class TJUserInfoDto
{ {
public string Code { get; set; } public string Code { get; set; }
public string Msg { get; set; } public string Msg { get; set; }
public bool Success { get; set; }
public TJUserInfoData Data { get; set; } public TJUserInfoData Data { get; set; }
} }
@ -38,6 +42,8 @@ namespace IRaCIS.Application.Contracts
public string Birthday { get; set; } public string Birthday { get; set; }
public string Title { get; set; } public string Title { get; set; }
public string UserType { get; set; } public string UserType { get; set; }
public List<string> Roles { get; set; }
} }

View File

@ -1,5 +1,7 @@
using IP2Region.Net.Abstractions; using DocumentFormat.OpenXml.Spreadsheet;
using IP2Region.Net.Abstractions;
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Helper.OtherTool; using IRaCIS.Core.Application.Helper.OtherTool;
@ -10,6 +12,7 @@ using Medallion.Threading;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using NPOI.SS.Formula.Functions;
using Panda.DynamicWebApi.Attributes; using Panda.DynamicWebApi.Attributes;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using ZiggyCreatures.Caching.Fusion; using ZiggyCreatures.Caching.Fusion;
@ -28,12 +31,14 @@ namespace IRaCIS.Core.Application.Service
IRepository<Trial> _trialRepository, IRepository<Trial> _trialRepository,
IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig, IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig,
IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig,
IOptionsMonitor<SystemHospitalOption> _systemHospitalConfig, IRepository<HIRHospital> _hirHospitalRepository,
ITokenService _tokenService,
ISearcher _searcher, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IUserService ISearcher _searcher, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IUserService
{ {
private SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; private SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
private async Task VerifyUserNameAsync(Guid? userId, string userName) private async Task VerifyUserNameAsync(Guid? userId, string userName)
{ {
if (await _userRepository.WhereIf(userId != null, t => t.Id != userId).AnyAsync(t => t.UserName == userName)) if (await _userRepository.WhereIf(userId != null, t => t.Id != userId).AnyAsync(t => t.UserName == userName))
@ -274,12 +279,14 @@ namespace IRaCIS.Core.Application.Service
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> ResetPassword(Guid userId) public async Task<IResponseOutput> ResetPassword(Guid userId)
{ {
var hospitalInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Hospital, _ => CacheHelper.GetHospitalCode(_hirHospitalRepository), TimeSpan.FromDays(7));
//var pwd = IRCEmailPasswordHelper.GenerateRandomPassword(10); //var pwd = IRCEmailPasswordHelper.GenerateRandomPassword(10);
var pwd = "123456"; var pwd = "123456";
if (_systemHospitalConfig.CurrentValue.IsCanConnectInternet) if (hospitalInfo.IsCanConnectInternet)
{ {
await _mailVerificationService.AdminResetPwdSendEmailAsync(userId, pwd); await _mailVerificationService.AdminResetPwdSendEmailAsync(userId, pwd);
} }
@ -413,7 +420,7 @@ namespace IRaCIS.Core.Application.Service
var result = await (userQuery.FirstOrDefaultAsync()).IfNullThrowException(); var result = await (userQuery.FirstOrDefaultAsync()).IfNullThrowException();
result.AccountList = _userRepository.Where(t => t.EMail == result.EMail && t.UserTypeEnum != UserTypeEnum.SuperAdmin) result.AccountList = _userRepository.Where(t => t.EMail == result.EMail && t.UserTypeEnum != UserTypeEnum.SuperAdmin)
.ProjectTo<UserAccountInfo>(_mapper.ConfigurationProvider).ToList(); .ProjectTo<UserAccountInfo>(_mapper.ConfigurationProvider).OrderBy(t => t.UserTypeShortName).ToList();
return result; return result;
} }
@ -426,6 +433,7 @@ namespace IRaCIS.Core.Application.Service
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel) public async Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel)
{ {
var hospitalInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Hospital, _ => CacheHelper.GetHospitalCode(_hirHospitalRepository), TimeSpan.FromDays(7));
await VerifyUserNameAsync(null, userAddModel.UserName); await VerifyUserNameAsync(null, userAddModel.UserName);
@ -461,7 +469,7 @@ namespace IRaCIS.Core.Application.Service
var success = await _userRepository.SaveChangesAsync(); var success = await _userRepository.SaveChangesAsync();
} }
if (_systemHospitalConfig.CurrentValue.IsCanConnectInternet) if (hospitalInfo.IsCanConnectInternet)
{ {
await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl); await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl);
@ -630,8 +638,12 @@ namespace IRaCIS.Core.Application.Service
[AllowAnonymous] [AllowAnonymous]
public async Task<IResponseOutput> TJUserLoginInfo(string token) [HttpGet]
public async Task<IResponseOutput> TJUserLoginInfo(string token,
[FromServices] IRepository<UserType> _userTypeRepository,
[FromServices] IRepository<HIRHospital> _hirHospitalRepository)
{ {
#region MyRegion
//同济医院token 地址http://192.168.40.88:8080 appid:third-hirs //同济医院token 地址http://192.168.40.88:8080 appid:third-hirs
//本地测试地址接口 //本地测试地址接口
@ -644,14 +656,118 @@ namespace IRaCIS.Core.Application.Service
var requestData = new var requestData = new
{ {
userToken = token, token = token,
appId = "third-hirs", appId = "third-hirs",
}; };
var tjUserInfo = await RestClientAPI.PostAsync<TJUserInfoDto>(apiUrl, requestData, headers); var tjUserInfo = await RestClientAPI.PostAsync<TJUserInfoDto>(apiUrl, requestData, headers);
#endregion
#region 测试数据
//var tjUserInfo = new TJUserInfoDto
//{
// Code = "200",
// Msg = "操作成功",
// Success = true,
// Data = new TJUserInfoData
// {
// UserCode = "YS10138",
// UserName = "胡学梅",
// DeptCode = "2121",
// Sex = "未知",
// Birthday = "",
// Title = "",
// UserType = "doctor",
// Roles = new List<string> { "pm", "crc" }
// }
//};
#endregion
var generateRoles = new List<string>() { "PM", "CRC", "SR", "PI", "QA" };
if (tjUserInfo != null && tjUserInfo.Data?.Roles != null &&
tjUserInfo.Data.Roles.Any(role => generateRoles.Any(gRole => string.Equals(gRole, role, StringComparison.OrdinalIgnoreCase))))
{
var sysUserTypeList = _userTypeRepository.Where().Select(t => new { t.UserTypeShortName, t.UserTypeEnum, t.Id }).ToList();
var matchedRoles = generateRoles.Where(role => tjUserInfo.Data.Roles.Any(r => string.Equals(r, role, StringComparison.OrdinalIgnoreCase))).ToList();
var hospital = await _hirHospitalRepository.Where(t => t.IsDefault == true).ProjectTo<HIRHospitalView>(_mapper.ConfigurationProvider).FirstNotNullAsync();
var thirdUId = tjUserInfo.Data.UserCode;
var email = $"{tjUserInfo.Data.UserCode}@tjhir.com";
var @lock = _distributedLockProvider.CreateLock($"UserAccount");
using (await @lock.AcquireAsync())
{
//匹配的角色 都匹配一遍账号,没有便生成
foreach (var roleName in matchedRoles)
{
var userType = sysUserTypeList.Where(t => t.UserTypeShortName == roleName).First();
var userTypeId = userType.Id;
if (!_userRepository.Any(t => t.ThirdUserCode == thirdUId && t.UserTypeId == userTypeId))
{
var newCode = await _userRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1;
var newUser = new User()
{
FirstName = $"{tjUserInfo.Data.UserName}",
LastName = "tj",
IsFirstAdd = false,
IsZhiZhun = true,
OrganizationName = hospital.HospitalName,
Code = newCode,
Password = MD5Helper.Md5("123456"),
CheckCode = "123456",
UserCode = AppSettings.GetCodeStr(newCode, nameof(User)),
UserTypeId = userTypeId,
UserTypeEnum = userType.UserTypeEnum,
EMail = email,
UserName = $"{tjUserInfo.Data.UserName}-{roleName}",
ThirdUserCode = thirdUId,
};
await _userRepository.AddAsync(newUser);
}
}
await _userRepository.SaveChangesAsync();
}
//返回该账号的在系统的中的所有角色,如果单个角色,就直接登录,如果是多个角色,那么前端进行选择后进行登录
var accountList = _userRepository.Where(t => t.EMail == email && t.UserTypeEnum != UserTypeEnum.SuperAdmin)
.ProjectTo<UserAccountInfo>(_mapper.ConfigurationProvider).OrderBy(t => t.UserTypeShortName).ToList();
var hirToken = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo() { Id = Guid.NewGuid(), UserName = tjUserInfo.Data.UserName }));
return ResponseOutput.Ok(accountList, hirToken);
}
else
{
return ResponseOutput.NotOk("跳转系统对接的用户未配置当前系统的角色,无法自动生成账号,请联系管理员配置该跳转账户信息");
}
return ResponseOutput.Ok(tjUserInfo);
} }
@ -829,7 +945,9 @@ namespace IRaCIS.Core.Application.Service
[HttpGet("{email}/{verifyCode}")] [HttpGet("{email}/{verifyCode}")]
public async Task<List<UserAccountDto>> VerifyAnonymousVerifyCode(string email, string verifyCode) public async Task<List<UserAccountDto>> VerifyAnonymousVerifyCode(string email, string verifyCode)
{ {
if (_systemHospitalConfig.CurrentValue.IsCanConnectInternet) var hospitalInfo = await _fusionCache.GetOrSetAsync(CacheKeys.Hospital, _ => CacheHelper.GetHospitalCode(_hirHospitalRepository), TimeSpan.FromDays(7));
if (hospitalInfo.IsCanConnectInternet)
{ {
var verificationRecord = await _verificationCodeRepository var verificationRecord = await _verificationCodeRepository
.Where(t => t.UserId == Guid.Empty && t.Code == verifyCode && t.CodeType == VerifyType.Email && t.EmailOrPhone == email).OrderByDescending(t => t.CreateTime).FirstOrDefaultAsync(); .Where(t => t.UserId == Guid.Empty && t.Code == verifyCode && t.CodeType == VerifyType.Email && t.EmailOrPhone == email).OrderByDescending(t => t.CreateTime).FirstOrDefaultAsync();

View File

@ -61,4 +61,19 @@ namespace IRaCIS.Application.Contracts
public string? ModalitiesInStudy { get; set; } public string? ModalitiesInStudy { get; set; }
} }
public class TJCmoveStudyCommand
{
public string Token { get; set; }
/// <summary>
/// C-move 检查 数组
/// </summary>
public List<string> StudyInstanceUIDList { get; set; }
/// <summary>
///PacsAE 的名字
/// </summary>
public string CalledAE { get; set; }
}
} }

View File

@ -52,6 +52,7 @@ using IRaCIS.Core.Infra.EFCore.Migrations;
using System.Dynamic; using System.Dynamic;
using System.Threading.Channels; using System.Threading.Channels;
using NPOI.HSSF.Record.Chart; using NPOI.HSSF.Record.Chart;
using IRaCIS.Core.Application.Helper.OtherTool;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
@ -68,6 +69,9 @@ namespace IRaCIS.Application.Services
IRepository<SCPImageUpload> _SCPImageUploadRepository, IRepository<SCPImageUpload> _SCPImageUploadRepository,
IRepository<User> _userRepository, IRepository<User> _userRepository,
IRepository<HIRHospital> _hIRHospitalRepository, IRepository<HIRHospital> _hIRHospitalRepository,
IRepository<DicomAE> _dicomAEReposiotry,
IRepository<SCPInstance> _scpInstanceRepository,
IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig,
ILogger<PatientService> _logger, ILogger<PatientService> _logger,
IDistributedLockProvider _distributedLockProvider, IMapper _mapper, IUserInfo _userInfo, IWebHostEnvironment _hostEnvironment, IStringLocalizer _localizer, IFusionCache _fusionCache IDistributedLockProvider _distributedLockProvider, IMapper _mapper, IUserInfo _userInfo, IWebHostEnvironment _hostEnvironment, IStringLocalizer _localizer, IFusionCache _fusionCache
@ -380,8 +384,13 @@ namespace IRaCIS.Application.Services
public async Task<IResponseOutput<TrialAuthorizationInfo>> GetTrialAuthorizationInfo(Guid trialId, [FromServices] IOptionsMonitor<SystemHospitalOption> _hospitalOption) public async Task<IResponseOutput<TrialAuthorizationInfo>> GetTrialAuthorizationInfo(Guid trialId)
{ {
var query = _hIRHospitalRepository.Where(t => t.IsDefault == true).ProjectTo<HIRHospitalView>(_mapper.ConfigurationProvider);
var hospitalInfo = await query.FirstNotNullAsync();
var trialInfo = _trialRepository.Where(t => t.Id == trialId, ignoreQueryFilters: true).FirstOrDefault(); var trialInfo = _trialRepository.Where(t => t.Id == trialId, ignoreQueryFilters: true).FirstOrDefault();
var authInfo = new TrialAuthorizationInfo() var authInfo = new TrialAuthorizationInfo()
@ -392,8 +401,8 @@ namespace IRaCIS.Application.Services
PurchaseDuration = 1, PurchaseDuration = 1,
CriterionTypeList = trialInfo.CriterionTypeList, CriterionTypeList = trialInfo.CriterionTypeList,
//CriterionTypes = trialInfo.CriterionTypes, //CriterionTypes = trialInfo.CriterionTypes,
HospitalName = _hospitalOption.CurrentValue.HospitalName, HospitalName = hospitalInfo.HospitalName,
HospitalCode = _hospitalOption.CurrentValue.HospitalCode, HospitalCode = hospitalInfo.HospitalCode,
}; };
return ResponseOutput.Ok(authInfo); return ResponseOutput.Ok(authInfo);
@ -405,7 +414,7 @@ namespace IRaCIS.Application.Services
/// <param name="authInfo"></param> /// <param name="authInfo"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public async Task<IResponseOutput> GetTrialAuthorizationCode(TrialAuthorizationInfo authInfo, [FromServices] IOptionsMonitor<SystemHospitalOption> _hospitalOption) public async Task<IResponseOutput> GetTrialAuthorizationCode(TrialAuthorizationInfo authInfo)
{ {
// 将明文信息转换成 Base64 编码 // 将明文信息转换成 Base64 编码
@ -419,10 +428,9 @@ namespace IRaCIS.Application.Services
/// 获取授权码明文信息 /// 获取授权码明文信息
/// </summary> /// </summary>
/// <param name="authorizationCode"></param> /// <param name="authorizationCode"></param>
/// <param name="_hospitalOption"></param>
/// <returns></returns> /// <returns></returns>
[AllowAnonymous] [AllowAnonymous]
public async Task<IResponseOutput> GetAuthorizationCodeInfo(string authorizationCode, [FromServices] IOptionsMonitor<SystemHospitalOption> _hospitalOption) public async Task<IResponseOutput> GetAuthorizationCodeInfo(string authorizationCode)
{ {
// 解密 Base64 编码后的数据 // 解密 Base64 编码后的数据
byte[] base64DecodedBytes = Convert.FromBase64String(authorizationCode); byte[] base64DecodedBytes = Convert.FromBase64String(authorizationCode);
@ -464,7 +472,6 @@ namespace IRaCIS.Application.Services
/// <param name="_basicSystemConfigConfig"></param> /// <param name="_basicSystemConfigConfig"></param>
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput> GetActivationCodeInfo(string activationCode, public async Task<IResponseOutput> GetActivationCodeInfo(string activationCode,
[FromServices] IOptionsMonitor<SystemHospitalOption> _hospitalOption,
[FromServices] IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig) [FromServices] IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig)
{ {
@ -505,10 +512,12 @@ namespace IRaCIS.Application.Services
[HttpPut] [HttpPut]
public async Task<IResponseOutput> ActivateTrial(Guid trialId, string activationCode, public async Task<IResponseOutput> ActivateTrial(Guid trialId, string activationCode,
[FromServices] IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig, [FromServices] IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig,
[FromServices] IFusionCache _provider, [FromServices] IFusionCache _provider)
[FromServices] IOptionsMonitor<SystemHospitalOption> _hospitalOption)
{ {
var hospitalCode = _hospitalOption.CurrentValue.HospitalCode; var query = _hIRHospitalRepository.Where(t => t.IsDefault == true).ProjectTo<HIRHospitalView>(_mapper.ConfigurationProvider);
var hospitalInfo = await query.FirstNotNullAsync();
var hospitalCode = hospitalInfo.HospitalCode;
var trialInfo = _trialRepository.Where(t => t.Id == trialId, ignoreQueryFilters: true).FirstOrDefault(); var trialInfo = _trialRepository.Where(t => t.Id == trialId, ignoreQueryFilters: true).FirstOrDefault();
var decodedText = string.Empty; var decodedText = string.Empty;
@ -3303,14 +3312,8 @@ namespace IRaCIS.Application.Services
/// 拉取影像 /// 拉取影像
/// </summary> /// </summary>
/// <param name="inCommand"></param> /// <param name="inCommand"></param>
/// <param name="_dicomAEReposiotry"></param>
/// <param name="_scpInstanceRepository"></param>
/// <param name="_basicSystemConfigConfig"></param>
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput> CmoveStudyList(SCUCmoveCommand inCommand, public async Task<IResponseOutput> CmoveStudyList(SCUCmoveCommand inCommand)
[FromServices] IRepository<DicomAE> _dicomAEReposiotry,
[FromServices] IRepository<SCPInstance> _scpInstanceRepository,
[FromServices] IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig)
{ {
var result = new List<SCUStudyView>(); var result = new List<SCUStudyView>();
@ -3402,7 +3405,57 @@ namespace IRaCIS.Application.Services
} }
/// <summary>
/// 同济医院 第三方系统 发送命令拉取影像
/// </summary>
/// <param name="inCommand"></param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public async Task<IResponseOutput> TjCmoveStudy(TJCmoveStudyCommand inCommand)
{
var apiUrl = "http://192.168.40.88:8080/dock/userinfo";
var headers = new Dictionary<string, string>
{
{ "Content-Type", "application/json" } // 根据需要添加其他头部信息
};
var requestData = new
{
token = inCommand.Token,
appId = "third-hirs",
};
var tjUserInfo = await RestClientAPI.PostAsync<TJUserInfoDto>(apiUrl, requestData, headers);
if (tjUserInfo != null && tjUserInfo.Data?.Roles != null &&
tjUserInfo.Data.Roles.Any(role => string.Equals("PM", role, StringComparison.OrdinalIgnoreCase)))
{
var find = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.CalledAE == inCommand.CalledAE && t.PacsTypeEnum == PacsType.PacsServer);
if (find == null)
{
return ResponseOutput.NotOk($"{inCommand.CalledAE}在系统中未配置,请联系维护人员核查");
}
else
{
var cmoveCommand = new SCUCmoveCommand() { PacsDicomAEId = find.Id, StudyInstanceUIDList = inCommand.StudyInstanceUIDList };
return await CmoveStudyList(cmoveCommand);
}
}
else
{
return ResponseOutput.NotOk("未获取到该用户信息或者该用户token 不包含PM 角色");
}
}
#endregion #endregion

View File

@ -87,7 +87,11 @@ public class User : BaseFullAuditEntity
public Guid UserTypeId { get; set; } public Guid UserTypeId { get; set; }
#region HIR #region HIR
public string CheckCode { get; set; } = string.Empty; public string CheckCode { get; set; } = string.Empty;
//目前是tj医院
public string ThirdUserCode { get; set; } = string.Empty;
#endregion #endregion
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class tjAddUserCode : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "ThirdUserCode",
table: "User",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ThirdUserCode",
table: "User");
}
}
}

View File

@ -13148,6 +13148,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<bool>("SuperAdmin") b.Property<bool>("SuperAdmin")
.HasColumnType("bit"); .HasColumnType("bit");
b.Property<string>("ThirdUserCode")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<DateTime>("UpdateTime") b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");