crm.core/code/Crm.Core.External.Domain/CacheDomain.cs

343 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Primitives;
using Oracle.ManagedDataAccess.Client;
using System.Data;
using static Crm.Core.External.Domain.Config.SystemEnums;
namespace Crm.Core.Domain
{
internal class CacheDomain : ICacheDomain
{
private readonly IHttpClient _httpClient;
private readonly IAppManager _appManager;
private readonly IRedisManager _redisManager;
private readonly IOracleRepository<CrmDbContext> _repository;
private readonly IMapper _mapper;
private readonly IConfiguration _configuration;
private readonly SystemConfig _systemConfig;
private readonly IHttpContextAccessor _httpContext;
public CacheDomain(IRedisManager redisManager,
IOracleRepository<CrmDbContext> repository,
IMapper mapper,
IConfiguration configuration,
IHttpContextAccessor httpContext,
IHttpClient httpClient,
IAppManager appManager)
{
_redisManager = redisManager;
_repository = repository;
_mapper = mapper;
_configuration = configuration;
_systemConfig = _configuration.GetSection("SystemConfig").Get<SystemConfig>();
_httpContext = httpContext;
_httpClient = httpClient;
_appManager = appManager;
}
private async Task<List<BAS_PARAMETER>> GetParameterList(string appid)
{
var key = $"{CacheKeys.ParameterList}_{appid}";
if (!await _redisManager.ExistsAsync(key))
{
var list = await _repository.GetRepository<BAS_PARAMETER>().QueryListAsync();
await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1));
return list;
}
else
{
return await _redisManager.GetListAsync<BAS_PARAMETER>(key);
}
}
public async Task<string> GetValueParameter(string key)
{
var list = await GetParameterList(GetApp());
return list.FirstOrDefault(x => x.PARAKEY == key)?.PARAVALUE ?? "";
}
public async Task<string> GetValueParameter(ParameterEnums key)
{
var list = await GetParameterList(GetApp());
return list.FirstOrDefault(x => x.PARAKEY == key.ToString())?.PARAVALUE ?? "";
}
public async Task<T> GetParameter<T>(string key) where T : new()
{
var list = await GetParameterList(GetApp());
var value = list.FirstOrDefault(x => x.PARAKEY == key)?.PARAVALUE ?? "";
return string.IsNullOrEmpty(value) ? new T() : JsonSerializer.Deserialize<T>(value);
}
public async Task<T> GetParameter<T>(ParameterEnums key) where T : new()
{
var list = await GetParameterList(GetApp());
var value = list.FirstOrDefault(x => x.PARAKEY == key.ToString())?.PARAVALUE ?? "";
return string.IsNullOrEmpty(value) ? new T() : JsonSerializer.Deserialize<T>(value);
}
public async Task<bool> SetApp(IOracleRepository<CrmDbContext> repository, decimal deptmentId)
{
var apps = _systemConfig.Apps;
Log.Information($"事业部切换deptmentId{deptmentId}");
if (apps.All(x => !x.Deptids.Contains(deptmentId)))
{
Log.Information($"事业部切换失败deptmentId{deptmentId}");
return false;
}
var app = apps.Where(x => x.Deptids.Contains(deptmentId)).Select(x => x.Appid).FirstOrDefault();
if (!string.IsNullOrEmpty(app))
{
await repository.SetConnectionString(app);
return true;
}
return false;
}
public async Task<bool> SetApp(IOracleRepository<CrmDbContext> repository, string? appid)
{
if (!string.IsNullOrEmpty(appid))
{
await repository.SetConnectionString(appid);
return true;
}
return false;
}
public async Task<List<decimal>> GetDeptmentIdByApp(string app)
{
var apps = _systemConfig.Apps;
if (apps.All(x => x.Appid != app))
{
return new List<decimal>();
}
var deptids = apps.Where(x => x.Appid == app).Select(x => x.Deptids).FirstOrDefault();
if (deptids != null)
{
return await Task.FromResult(deptids);
}
return new List<decimal>();
}
public async Task<string> GetAppidByDeptmentId(decimal deptmentId)
{
var apps = _systemConfig.Apps;
if (apps.All(x => !x.Deptids.Contains(deptmentId)))
{
return string.Empty;
}
var appid = apps.Where(x => x.Deptids.Contains(deptmentId)).Select(x => x.Appid).FirstOrDefault();
if (!string.IsNullOrEmpty(appid))
{
return await Task.FromResult(appid);
}
return string.Empty;
}
public async Task<decimal> GetCurrentEid()
{
var appid = GetApp();
var values = new StringValues();
_httpContext?.HttpContext?.Request.Headers.TryGetValue("token", out values);
var authToken = values.ToString();
var eid = decimal.Zero;
if (string.IsNullOrEmpty(authToken))
{
_httpContext?.HttpContext?.Request.Headers.TryGetValue("eid", out values);
if (string.IsNullOrEmpty(values.ToString()) || !decimal.TryParse(values.ToString(), out eid))
{
return eid;
}
}
if (eid == 0)
{
var data = new
{
appId = appid,
grantType = 1,
token = authToken
};
var response = await _httpClient.PostAsync<RetResult<SsoResponseDataDto>>($"{_systemConfig.GetSsoTokenUrl()}", data);
if (response == null || response.Ret != 0 || !response.Data.EmployeeId.HasValue)
{
return eid;
}
else
{
return response.Data.EmployeeId.Value;
}
}
return eid;
}
/// <summary>
/// 获取appid
/// </summary>
/// <returns></returns>
/// <exception cref="ApiException"></exception>
public string GetApp()
{
if (_httpContext.HttpContext == null) return _appManager.GetApp();
_httpContext.HttpContext.Request.Headers.TryGetValue(AppHeaderAppoint.GetAppHeader(), out StringValues appValue);
var app = appValue.ToString();
if (string.IsNullOrEmpty(app))
{
app = _appManager.GetApp();
if (string.IsNullOrEmpty(app))
{
throw new ApiException($"{AppHeaderAppoint.GetAppHeader()}不能为空!");
}
}
return app;
}
public string GetAppByDeptid(decimal deptmentId)
{
var apps = _systemConfig.Apps;
Log.Information($"事业部切换deptmentId{deptmentId}");
if (apps.All(x => !x.Deptids.Contains(deptmentId)))
{
Log.Information($"事业部切换失败deptmentId{deptmentId}");
return "";
}
var app = apps.Where(x => x.Deptids.Contains(deptmentId)).Select(x => x.Appid).FirstOrDefault();
return app;
}
public async Task<List<DeptmentDto>> GetDeptments()
{
var key = $"{CacheKeys.ZxdParameterList}";
if (!await _redisManager.ExistsAsync(key))
{
var response = await _httpClient.GetAsync<ApiResult<List<DeptmentDto>>>($"{_systemConfig.ZxdUrl}/Api/Deptment/Depts");
if (response.Code == 0)
{
await _redisManager.SetAsync(key, response.Data, TimeSpan.FromDays(1));
return response.Data;
}
}
else
{
return await _redisManager.GetListAsync<DeptmentDto>(key);
}
return new List<DeptmentDto>();
}
public async Task<List<BAS_SUBCOMTYPE>> GetSubComTypeListByComType(string appid, ComType type)
{
var list = await GetSubComTypeList(appid);
list = list.Where(x => x.TYPECODE == type.ToString()).OrderBy(x => x.SUBTYPECODE).ToList();
return list;
}
public async Task<List<BAS_SUBCOMTYPE>> GetSubComTypeList(string appid)
{
var key = $"{CacheKeys.SubComTypeList}_{appid}";
if (!await _redisManager.ExistsAsync(key))
{
var list = await _repository.GetRepository<BAS_SUBCOMTYPE>().QueryListAsync();
await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1));
return list;
}
else
{
return await _redisManager.GetListAsync<BAS_SUBCOMTYPE>(key);
}
}
public async Task<string> GetCodeByDeptid(decimal? deptid)
{
var deptments = await GetDeptments();
var deptment = deptments.FirstOrDefault(x => x.Id == deptid);
if (deptment == null) return "";
return deptment.Code;
}
public async Task<string> GetCodeByAppid(string? appid)
{
var deptments = await GetDeptments();
var deptids = await GetDeptmentIdByApp(appid);
var deptment = deptments.FirstOrDefault(x => deptids.Contains(x.Id));
if (deptment == null) return "";
return deptment.Code;
}
public async Task<RoleLevel> LevelSSO(decimal eid)
{
var roleLevels = new List<UserRoleLevelDto>();
var level = RoleLevel.Self;
var appid = _appManager.GetApp();
var key = $"{CacheKeys.UserRoleLevelList}_{appid}";
if (!await _redisManager.ExistsAsync(key))
{
return await RefreshLevelSSO(roleLevels, eid, appid);
}
roleLevels = await _redisManager.GetListAsync<UserRoleLevelDto>(key);
if (roleLevels.Any(x => x.Eid == eid))
{
return roleLevels.Where(x => x.Eid == eid).Select(x => x.Level).FirstOrDefault();
}
return await RefreshLevelSSO(roleLevels, eid, appid);
}
private async Task<RoleLevel> RefreshLevelSSO(List<UserRoleLevelDto> roleLevels, decimal eid, string appid)
{
var key = $"{CacheKeys.UserRoleLevelList}_{appid}";
var level = RoleLevel.Self;
var roleIds = await _repository.GetRepository<BAS_INNERUSERROLE>().Query()
.Include(x => x.BAS_INNERUSER)
.Where(x => x.BAS_INNERUSER.EID == eid)
.Select(x => x.ROLEID)
.ToListAsync();
var codes = await _repository.GetRepository<BAS_ROLE>().Query()
.Where(x => roleIds.Contains(x.ROLEID))
.Select(x => x.CODE)
.ToListAsync();
var roleCodes = string.Join(",", codes);
var groupIds = await _repository.GetRepository<BAS_GROUPLEADER>().Query()
.Include(x => x.BAS_INNERUSER)
.Where(x => x.BAS_INNERUSER.EID == eid)
.Select(x => x.INNERGROUPID)
.ToListAsync();
if (codes.IndexOf("GLY") > -1 || codes.IndexOf("LOOKALL") > -1)//LOOKALL作为扩展权限
{
level = RoleLevel.All;
}
else if (groupIds != null && groupIds.Any())//管理了部门或者组
{
level = RoleLevel.Dept;
if (groupIds.Contains(0))//如果有管理0那么将进行显示全部
{
level = RoleLevel.All;
}
}
roleLevels.Add(new UserRoleLevelDto
{
Eid = eid,
Level = level
});
await _redisManager.SetAsync(key, roleLevels, TimeSpan.FromDays(1));
return level;
}
public async Task<List<decimal>> GetSalesDeptsForEid(decimal eid)
{
var groupId = await _repository.GetRepository<BAS_INNERUSER>().Query()
.Include(x => x.BAS_INNERUSERGROUP)
.Where(x => x.EID == eid)
.Select(x => x.BAS_INNERUSERGROUP.GID)
.FirstOrDefaultAsync();
var eids = await _repository.GetRepository<BAS_INNERUSERGROUP>().Query()
.Include(x => x.BAS_INNERUSER)
.Where(x => x.GID == groupId)
.Select(x => x.BAS_INNERUSER.EID)
.Distinct()
.ToListAsync();
return eids;
}
}
}