HIR 对接自动生成账号
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2025-04-01 15:01:39 +08:00
parent 5beacacc0f
commit 309ea7b1d1
2 changed files with 126 additions and 13 deletions

View File

@ -25,7 +25,11 @@ namespace IRaCIS.Application.Contracts
public class TJUserInfoDto
{
public string Code { get; set; }
public string Msg { get; set; }
public bool Success { get; set; }
public TJUserInfoData Data { get; set; }
}
@ -38,6 +42,8 @@ namespace IRaCIS.Application.Contracts
public string Birthday { get; set; }
public string Title { 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.Core.Application.Auth;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Helper.OtherTool;
@ -10,6 +12,7 @@ using Medallion.Threading;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using NPOI.SS.Formula.Functions;
using Panda.DynamicWebApi.Attributes;
using System.Text.RegularExpressions;
using ZiggyCreatures.Caching.Fusion;
@ -29,6 +32,7 @@ namespace IRaCIS.Core.Application.Service
IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig,
IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig,
IRepository<HIRHospital> _hirHospitalRepository,
ITokenService _tokenService,
ISearcher _searcher, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IUserService
{
@ -635,28 +639,131 @@ namespace IRaCIS.Core.Application.Service
[AllowAnonymous]
[HttpGet]
public async Task<IResponseOutput> TJUserLoginInfo(string token)
public async Task<IResponseOutput> TJUserLoginInfo(string token,
[FromServices] IRepository<UserType> _userTypeRepository,
[FromServices] IRepository<HIRHospital> _hirHospitalRepository)
{
//同济医院token 地址http://192.168.40.88:8080 appid:third-hirs
#region MyRegion
////同济医院token 地址http://192.168.40.88:8080 appid:third-hirs
//本地测试地址接口
////本地测试地址接口
var apiUrl = "http://192.168.40.88:8080/dock/userinfo";
var headers = new Dictionary<string, string>
//var apiUrl = "http://192.168.40.88:8080/dock/userinfo";
//var headers = new Dictionary<string, string>
//{
// { "Content-Type", "application/json" } // 根据需要添加其他头部信息
//};
//var requestData = new
//{
// token = token,
// appId = "third-hirs",
//};
//var tjUserInfo = await RestClientAPI.PostAsync<TJUserInfoDto>(apiUrl, requestData, headers);
#endregion
var tjUserInfo = new TJUserInfoDto
{
{ "Content-Type", "application/json" } // 根据需要添加其他头部信息
Code = "200",
Msg = "操作成功",
Success = true,
Data = new TJUserInfoData
{
UserCode = "YS101389",
UserName = "胡学梅",
DeptCode = "2121",
Sex = "未知",
Birthday = "",
Title = "",
UserType = "doctor",
Roles = new List<string> { "PM", "CRC", "CRC", "PI", "QA", "Other" }
}
};
var requestData = new
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))))
{
userToken = token,
appId = "third-hirs",
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,
};
var tjUserInfo = await RestClientAPI.PostAsync<TJUserInfoDto>(apiUrl, requestData, headers);
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() { UserName = tjUserInfo.Data.UserName }));
return ResponseOutput.Ok(accountList, hirToken);
}
else
{
return ResponseOutput.NotOk("跳转系统对接的用户未配置当前系统的角色,无法自动生成账号,请联系管理员配置该跳转账户信息");
}
return ResponseOutput.Ok(tjUserInfo);
}