343 lines
13 KiB
C#
343 lines
13 KiB
C#
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;
|
||
}
|
||
}
|
||
} |