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 _repository; private readonly IMapper _mapper; private readonly IConfiguration _configuration; private readonly SystemConfig _systemConfig; private readonly IHttpContextAccessor _httpContext; public CacheDomain(IRedisManager redisManager, IOracleRepository repository, IMapper mapper, IConfiguration configuration, IHttpContextAccessor httpContext, IHttpClient httpClient, IAppManager appManager) { _redisManager = redisManager; _repository = repository; _mapper = mapper; _configuration = configuration; _systemConfig = _configuration.GetSection("SystemConfig").Get(); _httpContext = httpContext; _httpClient = httpClient; _appManager = appManager; } private async Task> GetParameterList(string appid) { var key = $"{CacheKeys.ParameterList}_{appid}"; if (!await _redisManager.ExistsAsync(key)) { var list = await _repository.GetRepository().QueryListAsync(); await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1)); return list; } else { return await _redisManager.GetListAsync(key); } } public async Task GetValueParameter(string key) { var list = await GetParameterList(GetApp()); return list.FirstOrDefault(x => x.PARAKEY == key)?.PARAVALUE ?? ""; } public async Task GetValueParameter(ParameterEnums key) { var list = await GetParameterList(GetApp()); return list.FirstOrDefault(x => x.PARAKEY == key.ToString())?.PARAVALUE ?? ""; } public async Task GetParameter(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(value); } public async Task GetParameter(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(value); } public async Task SetApp(IOracleRepository 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 SetApp(IOracleRepository repository, string? appid) { if (!string.IsNullOrEmpty(appid)) { await repository.SetConnectionString(appid); return true; } return false; } public async Task> GetDeptmentIdByApp(string app) { var apps = _systemConfig.Apps; if (apps.All(x => x.Appid != app)) { return new List(); } var deptids = apps.Where(x => x.Appid == app).Select(x => x.Deptids).FirstOrDefault(); if (deptids != null) { return await Task.FromResult(deptids); } return new List(); } public async Task 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 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>($"{_systemConfig.GetSsoTokenUrl()}", data); if (response == null || response.Ret != 0 || !response.Data.EmployeeId.HasValue) { return eid; } else { return response.Data.EmployeeId.Value; } } return eid; } /// /// 获取appid /// /// /// 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> GetDeptments() { var key = $"{CacheKeys.ZxdParameterList}"; if (!await _redisManager.ExistsAsync(key)) { var response = await _httpClient.GetAsync>>($"{_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(key); } return new List(); } public async Task> 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> GetSubComTypeList(string appid) { var key = $"{CacheKeys.SubComTypeList}_{appid}"; if (!await _redisManager.ExistsAsync(key)) { var list = await _repository.GetRepository().QueryListAsync(); await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1)); return list; } else { return await _redisManager.GetListAsync(key); } } public async Task 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 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 LevelSSO(decimal eid) { var roleLevels = new List(); 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(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 RefreshLevelSSO(List roleLevels, decimal eid, string appid) { var key = $"{CacheKeys.UserRoleLevelList}_{appid}"; var level = RoleLevel.Self; var roleIds = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER) .Where(x => x.BAS_INNERUSER.EID == eid) .Select(x => x.ROLEID) .ToListAsync(); var codes = await _repository.GetRepository().Query() .Where(x => roleIds.Contains(x.ROLEID)) .Select(x => x.CODE) .ToListAsync(); var roleCodes = string.Join(",", codes); var groupIds = await _repository.GetRepository().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> GetSalesDeptsForEid(decimal eid) { var groupId = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSERGROUP) .Where(x => x.EID == eid) .Select(x => x.BAS_INNERUSERGROUP.GID) .FirstOrDefaultAsync(); var eids = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER) .Where(x => x.GID == groupId) .Select(x => x.BAS_INNERUSER.EID) .Distinct() .ToListAsync(); return eids; } } }