You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingCustomer/Myshipping.Core/MQ/RecCompanyUserChangeService.cs

317 lines
16 KiB
C#

using Furion;
using Furion.DataEncryption;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Myshipping.Core.Entity;
using Myshipping.Core.Service;
using Newtonsoft.Json.Linq;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace Myshipping.Core.MQ
{
/// <summary>
/// 接收公司、员工变动消息推送
/// </summary>
public class RecCompanyUserChangeService : BackgroundService
{
private readonly IServiceScopeFactory _scopeFactory;
private readonly IServiceScope _serviceScope;
private readonly ISysUserService _serviceUser;
private readonly ILogger<RecCompanyUserChangeService> _logger;
private readonly ISysTenantService _tenantService;
private readonly ISysUserService _userService;
private readonly SqlSugarRepository<SysUser> _sysUserRep;
private readonly SqlSugarRepository<SysTenant> _sysTenantRep;
private readonly SqlSugarRepository<SysOrg> _sysOrgRep;
private readonly SqlSugarRepository<SysPos> _sysPosRep;
private readonly SqlSugarRepository<SysRole> _sysRoleRep;
private readonly SqlSugarRepository<SysMenu> _sysMenuRep;
private readonly ISysRoleMenuService _sysRoleMenuService;
private IConnection mqConn;
private IModel model;
public RecCompanyUserChangeService(IServiceScopeFactory scopeFactory, ISysUserService serviceUser, ISysRoleMenuService sysRoleMenuService)
{
_scopeFactory = scopeFactory;
//通过这个注入DBContext
_serviceScope = _scopeFactory.CreateScope();
_serviceUser = serviceUser;
_sysRoleMenuService = sysRoleMenuService;
_logger = _serviceScope.ServiceProvider.GetService<ILogger<RecCompanyUserChangeService>>();
_tenantService = _serviceScope.ServiceProvider.GetService<ISysTenantService>();
_userService = _serviceScope.ServiceProvider.GetService<ISysUserService>();
_sysUserRep = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysUser>>();
_sysTenantRep = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysTenant>>();
_sysOrgRep = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysOrg>>();
_sysPosRep = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysPos>>();
_sysRoleRep = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysRole>>();
_sysMenuRep = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysMenu>>();
}
public override void Dispose()
{
base.Dispose();
_serviceScope.Dispose();
if (mqConn != null && mqConn.IsOpen)
mqConn.Close();
_logger.LogInformation("RecCompanyUserChangeService Dispose");
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("RecCompanyUserChangeService ExecuteAsync");
return Task.Run(() =>
{
_logger.LogInformation("RecCompanyUserChangeService ExecuteAsync RunTask");
string ExchangeName = "djy.comp&user.change";
string QueueName = $"djy.comp&user.change.{DateTime.Now.Ticks}";
ConnectionFactory factory = new ConnectionFactory();
var repoSysCfg = _serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysConfig>>();
var mqUrl = repoSysCfg.FirstOrDefault(x => x.Code == "CompanyUserChangeMqUrl").Value;
factory.Uri = new Uri(mqUrl);
mqConn = factory.CreateConnection("客户订舱平台");
model = mqConn.CreateModel();
model.ExchangeDeclare(ExchangeName, ExchangeType.Fanout);
model.QueueDeclare(QueueName, false, false, true, null);
model.QueueBind(QueueName, ExchangeName, "", null);
var consumer = new EventingBasicConsumer(model);
consumer.Received += Consumer_Received;
model.BasicConsume(QueueName, true, consumer);
});
}
private async void Consumer_Received(object ch, BasicDeliverEventArgs ea)
{
//授权---------- (用超级管理员的权限)
var httpContext = App.HttpContext;
var sysTenant = _sysTenantRep.AsQueryable().Filter(null, true).First(x => x.TenantType == TenantTypeEnum.SYSTEM);
var systemtenantid = sysTenant.Id;
var userauth = _sysUserRep.AsQueryable().Filter(null, true).First(x => x.Account == "superAdmin" && x.TenantId == systemtenantid);
ClaimsIdentity identity = new ClaimsIdentity("AuthenticationTypes.Federation");
identity.AddClaim(new Claim(type: ClaimConst.CLAINM_USERID, value: userauth.Id.ToString()));
identity.AddClaim(new Claim(type: ClaimConst.CLAINM_ACCOUNT, value: userauth.Account));
identity.AddClaim(new Claim(type: ClaimConst.CLAINM_NAME, value: userauth.Name));
identity.AddClaim(new Claim(type: ClaimConst.CLAINM_SUPERADMIN, value: ((int)userauth.AdminType).ToString()));
identity.AddClaim(new Claim(type: ClaimConst.CLAINM_TENANT_TYPE, value: sysTenant.TenantType.ToString()));
identity.AddClaim(new Claim(type: ClaimConst.TENANT_ID, value: sysTenant.Id.ToString()));
identity.AddClaim(new Claim(type: ClaimConst.TENANT_NAME, value: sysTenant.Name));
identity.AddClaim(new Claim(type: ClaimConst.DjyUserId, value: userauth.DjyUserId));
ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(identity);
httpContext.User = claimsPrincipal;
//-----
var body = ea.Body;
var strBody = Encoding.UTF8.GetString(body.ToArray());
var jobj = JObject.Parse(strBody);
var type = jobj.GetStringValue("type");
if (type == "CompanyAudit") //新公司审核通过
{
var comp = jobj.GetJObjectValue("company");
var compid = comp.GetStringValue("CompId");
var compname = comp.GetStringValue("CompName");
var adminShowName = comp.GetStringValue("AdminShowName");
var findTenant = _sysTenantRep.FirstOrDefault(x => x.CompId == compid); //先根据关联ID查找
if (findTenant == null)
{
findTenant = _sysTenantRep.FirstOrDefault(x => x.Name == compname); //再根据公司全称查找
}
if (findTenant == null) //找不到,新建
{
var tenant = new SysTenant();
tenant.Id = YitIdHelper.NextId();
tenant.Name = compname;
tenant.AdminName = adminShowName;
tenant.Email = $"{tenant.Id}";
tenant.TenantType = TenantTypeEnum.COMMON;
tenant.CompId = compid;
findTenant = _sysTenantRep.InsertReturnEntity(tenant);
await _tenantService.InitNewTenant(findTenant);
//新增的系统租户新增权限
GrantRoleMenuInput tenantmenuInput = new GrantRoleMenuInput();
tenantmenuInput.Id = findTenant.Id;
List<long> tenantGrantMenuIdList = new List<long>();
tenantGrantMenuIdList = _sysMenuRep.AsQueryable().Where(x => x.Pids.Contains("142307070910563")).Select(x => x.Id).ToList();//暂时写死默认新增权限管理
tenantmenuInput.GrantMenuIdList = tenantGrantMenuIdList;
await _sysRoleMenuService.GrantMenu(tenantmenuInput);
}
}
else if (type == "UserJoin") //用户加入公司
{
var compid = jobj.GetStringValue("compId");
var findTenant = _sysTenantRep.FirstOrDefault(x => x.CompId == compid); //先根据关联ID查找
//同步用户
var user = jobj.GetJArrayValue("users");
//租户id
var tenantid = findTenant.Id;
var keyDES = App.GetOptions<EncryptKeyOptions>().DES;
foreach (JObject item in user)
{
var GID = item.GetStringValue("GID");
var Accont = item.GetStringValue("CODENAME");
var Name = item.GetStringValue("SHOWNAME");
var Pass = DESCEncryption.Encrypt(item.GetStringValue("PASSWORD"), keyDES);
var Email = item.GetStringValue("EMAIL1");
var Phone = item.GetStringValue("MOBILE");
var PassWord = item.GetStringValue("PASSWORD");
var Org = await _sysOrgRep.AsQueryable().Filter(null, true).Where(x => x.TenantId == tenantid && x.IsDeleted == false && x.Pid == 0).FirstAsync();
//------ 拼接对象调用新增用户接口
AddUserInput adduser = new AddUserInput();
adduser.Account = Accont;
adduser.Password = PassWord;
adduser.Confirm = PassWord;
adduser.Sex = 1;
adduser.Phone = Phone;
adduser.TenantId = tenantid;
EmpOutput2 empOutput2 = new EmpOutput2();
empOutput2.OrgId = Org.Id.ToString();
empOutput2.OrgName = Org.Name;
List<long> PosIdList = new List<long>();
var pos = _sysPosRep.AsQueryable().Filter(null, true).Where(x => x.TenantId == tenantid && x.IsDeleted == false).FirstAsync();
PosIdList.Add(pos.Id);
empOutput2.PosIdList = PosIdList;
adduser.SysEmpParam = empOutput2;
await _serviceUser.AddUser(adduser, true);
}
//-----授权角色id普通用户
var role = _sysRoleRep.AsQueryable().Filter(null, true).Where(x => x.TenantId == tenantid && x.Name == "普通用户").FirstAsync();
GrantRoleMenuInput menuInput = new GrantRoleMenuInput();
menuInput.Id = Convert.ToInt64(role.Id);
List<long> GrantMenuIdList = new List<long>();
GrantMenuIdList.Add(351064299098181);//暂时写死 ,后续从字典获取 新增订舱台账
menuInput.GrantMenuIdList = GrantMenuIdList;
await _sysRoleMenuService.GrantMenu(menuInput);
}
else if (type == "UserLeave") //用户离职
{
var userId = jobj.GetJObjectValue("userId");
var compId = jobj.GetStringValue("compId");
//删除用户
_sysUserRep.Delete(x => x.DjyUserId == userId.ToString());
}
else if (type == "CompanyUserSync") //公司及员工数据同步
{
//----------同步租户
var comp = jobj.GetJObjectValue("company");
var compid = comp.GetStringValue("CompId");
var compname = comp.GetStringValue("CompName");
var adminShowName = comp.GetStringValue("AdminShowName");
var findTenant = _sysTenantRep.FirstOrDefault(x => x.CompId == compid); //先根据关联ID查找
if (findTenant == null)
{
findTenant = _sysTenantRep.FirstOrDefault(x => x.Name == compname); //再根据公司全称查找
}
if (findTenant == null) //找不到,新建
{
var tenant = new SysTenant();
tenant.Id = YitIdHelper.NextId();
tenant.Name = compname;
tenant.AdminName = adminShowName;
tenant.Email = $"{tenant.Id}";
tenant.TenantType = TenantTypeEnum.COMMON;
tenant.CompId = compid;
findTenant = _sysTenantRep.InsertReturnEntity(tenant);
await _tenantService.InitNewTenant(findTenant);
//新增的系统租户新增权限
GrantRoleMenuInput tenantmenuInput = new GrantRoleMenuInput();
tenantmenuInput.Id = findTenant.Id;
List<long> tenantGrantMenuIdList = new List<long>();
tenantGrantMenuIdList = _sysMenuRep.AsQueryable().Where(x => x.Pids.Contains("142307070910563")).Select(x => x.Id).ToList();//暂时写死默认新增权限管理
tenantmenuInput.GrantMenuIdList = tenantGrantMenuIdList;
await _sysRoleMenuService.GrantMenu(tenantmenuInput);
}
//----------
//同步用户
var user = jobj.GetJArrayValue("users");
//租户id
var tenantid = findTenant.Id;
var keyDES = App.GetOptions<EncryptKeyOptions>().DES;
foreach (JObject item in user)
{
var GID = item.GetStringValue("GID");
var Accont = item.GetStringValue("CODENAME");
var Name = item.GetStringValue("SHOWNAME");
var Pass = DESCEncryption.Encrypt(item.GetStringValue("PASSWORD"), keyDES);
var Email = item.GetStringValue("EMAIL1");
var Phone = item.GetStringValue("MOBILE");
var PassWord = item.GetStringValue("PASSWORD");
var Org = await _sysOrgRep.AsQueryable().Filter(null, true).Where(x => x.TenantId == tenantid && x.IsDeleted == false && x.Pid == 0).FirstAsync();
//------ 拼接对象调用新增用户接口
AddUserInput adduser = new AddUserInput();
adduser.Account = Accont;
adduser.Password = PassWord;
adduser.Confirm = PassWord;
adduser.Sex = 1;
adduser.Phone = Phone;
adduser.TenantId = tenantid;
EmpOutput2 empOutput2 = new EmpOutput2();
empOutput2.OrgId = Org.Id.ToString();
empOutput2.OrgName = Org.Name;
List<long> PosIdList = new List<long>();
var pos = _sysPosRep.AsQueryable().Filter(null, true).Where(x => x.TenantId == tenantid && x.IsDeleted == false).FirstAsync();
PosIdList.Add(pos.Id);
empOutput2.PosIdList = PosIdList;
adduser.SysEmpParam = empOutput2;
await _serviceUser.AddUser(adduser, true);
}
//-----授权角色id普通用户
var role = _sysRoleRep.AsQueryable().Filter(null, true).Where(x => x.TenantId == tenantid && x.Name == "普通用户").FirstAsync();
GrantRoleMenuInput menuInput = new GrantRoleMenuInput();
menuInput.Id = Convert.ToInt64(role.Id);
List<long> GrantMenuIdList = new List<long>();
GrantMenuIdList.Add(351064299098181);//暂时写死 ,后续从字典获取 新增订舱台账
menuInput.GrantMenuIdList = GrantMenuIdList;
await _sysRoleMenuService.GrantMenu(menuInput);
}
_logger.LogInformation($"收到消息:{strBody}");
}
}
}