using Crm.Core.MsgTool.Domain.Dto.CRM; using Microsoft.Extensions.Primitives; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Crm.Core.MsgTool.Domain { internal class CacheDomain : ICacheDomain { private readonly IHttpClient _httpClient; private readonly IAppManager _appManager; private readonly IRedisManager _redisManager; private readonly IOracleRepository _crmRepository; private readonly IBaseRepository _hgRepository; private readonly IMapper _mapper; private readonly IConfiguration _configuration; private readonly SystemConfig _systemConfig; private readonly IHttpContextAccessor _httpContext; public CacheDomain(IRedisManager redisManager, IOracleRepository crmRepository, IBaseRepository hgRepository, IMapper mapper, IConfiguration configuration, IHttpContextAccessor httpContext, IHttpClient httpClient, IAppManager appManager) { _redisManager = redisManager; _crmRepository = crmRepository; _hgRepository = hgRepository; _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 _crmRepository.GetRepository().QueryListAsync(); await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1)); return list; } else { return await _redisManager.GetListAsync(key); } } public async Task> GetDeptmentIds(decimal eid) { var appid = GetApp(); if (eid == 0) { //从头部取事业线 eid = await GetCurrentEid(); } if (eid == 0) { return new List(); } var key = $"{CacheKeys.UserInfo}_{appid}_{eid}"; if (await _redisManager.ExistsAsync(key)) { return await _redisManager.GetListAsync(key); } var businessIds = new List(); var businessId = decimal.Zero; // 获取员工所属部门事业线ID var sql = @"select a.businessid, b.businessname, b.channel from ( select * from bas_businessdepartment where deptid in ( select saledeptid from bas_salesdepartment start with saledeptid =( select a.deptid from bas_innerusergroup a join bas_inneruser b on a.inneruserid = b.pkid where b.eid = :eid ) connect by prior department_parentid = department_id ) ) a join bas_businesslines b on a.businessid = b.businessid"; var param = new OracleParameter[] { new OracleParameter() { ParameterName = ":eid", OracleDbType = OracleDbType.Int64, Value = eid } }; var business = await _crmRepository.ExecuteSqlToEntityAsync(sql, param); if (business != null && business.Businessid != null) businessId = business.Businessid.Value; if (businessId == 0) { var user = await _crmRepository.GetRepository().Query() .Include(x => x.BAS_INNERUSERGROUP) .Include(x => x.BAS_INNERUSERGROUP.BAS_SALESDEPARTMENT) .Include(x => x.BAS_INNERUSERGROUP.BAS_SALESDEPARTMENT.BAS_BUSINESSDEPARTMENT) .Where(x => x.EID == eid) .FirstOrDefaultAsync(); if (user == null || user.BAS_INNERUSERGROUP == null || user.BAS_INNERUSERGROUP.BAS_SALESDEPARTMENT == null) { return new List(); } var sales = user.BAS_INNERUSERGROUP.BAS_SALESDEPARTMENT; var parent = true; var count = 0; while (parent) { if (sales.DEPARTMENT_PARENTID == null || count > 5) { var apps = _systemConfig.Apps; var deptids = apps.Where(x => x.Appid == appid).Select(x => x.Deptids).FirstOrDefault(); if (deptids != null && deptids.Any()) { businessIds.AddRange(deptids); break; } return new List(); } count++; if (sales.BAS_BUSINESSDEPARTMENT != null) { parent = false; businessIds.Add(sales.BAS_BUSINESSDEPARTMENT.BUSINESSID); } else { sales = await _crmRepository.GetRepository().Query() .Include(x => x.BAS_BUSINESSDEPARTMENT) .FirstOrDefaultAsync(x => x.DEPARTMENT_ID == sales.DEPARTMENT_PARENTID); } } } else { businessIds.Add(businessId); } // 获取员工数据权限配置的部门对应的事业线ID var inneruser = await _crmRepository.GetRepository().Query() .Include(x => x.BAS_GROUPLEADER) .Where(x => x.EID == eid) .FirstOrDefaultAsync(); if (inneruser == null || inneruser.BAS_GROUPLEADER == null) { businessIds = businessIds.Where(x => x != 0).ToList(); await _redisManager.SetAsync(key, businessIds, TimeSpan.FromMinutes(30)); return businessIds; } // 如果有全部数据权限,返回所有事业线ID /* if (inneruser.BAS_GROUPLEADER.Select(n => n.INNERGROUPID).Contains(0)) { var apps = _systemConfig.Apps; var deptids = apps.Where(x => x.Appid == appid).Select(x => x.Deptids).FirstOrDefault(); if (deptids != null && deptids.Any()) { businessIds.AddRange(deptids); } businessIds = businessIds.Where(x => x != 0).Distinct().ToList(); await _redisManager.SetAsync(key, businessIds, TimeSpan.FromMinutes(30)); return businessIds; }*/ var userId = inneruser.PKID; var groupids = inneruser.BAS_GROUPLEADER.Where(x => x.TYPE == 0).Select(x => x.INNERGROUPID).ToList(); if (groupids.Count > 0) { //全部则为全部事业线 businessIds = await _crmRepository.GetRepository().Query().Select(x => x.BUSINESSID).ToListAsync(); await _redisManager.SetAsync(key, businessIds, TimeSpan.FromMinutes(30)); return businessIds.Where(x => x != 0).ToList(); } var depts = await _crmRepository.GetRepository().Query() .Where(n => groupids.Contains(n.GID) && n.SALEDEPTID.HasValue) .Select(n => n.SALEDEPTID.Value) .ToListAsync(); var leadDept = inneruser.BAS_GROUPLEADER.Where(x => x.TYPE == 1).Select(x => x.INNERGROUPID).ToList(); var seftdept = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => userId == n.INNERUSERID); if (seftdept != null && seftdept.DEPTID.HasValue) { depts.Add(seftdept.DEPTID.Value); } depts = depts.Distinct().ToList(); foreach (var item in depts) { var deptList = GetParentDeptId(item); List ALLdeptIDS = new List(); List ALLgidS = new List(); //向下遍历 GetAllDeptIDOrGidByDeptStr(item.ToString(), ref ALLdeptIDS, ref ALLgidS); deptList.AddRange(ALLdeptIDS); var bussinessId = await _crmRepository.GetRepository().Query().Where(n => deptList.Contains(n.DEPTID)).Select(x => x.BUSINESSID).FirstOrDefaultAsync(); businessIds.Add(bussinessId); } businessIds = businessIds.Distinct().ToList(); await _redisManager.SetAsync(key, businessIds, TimeSpan.FromMinutes(30)); return businessIds.Where(x => x != 0).ToList(); } public async Task> GetEmployeeBusinessMap() { var key = $"EmployeeBusinessMap"; if (await _redisManager.ExistsAsync(key)) { return await _redisManager.GetListAsync(key); } var deptUrl = $"{_systemConfig.GetBusinessLine()}"; var deptResponse = await _httpClient.GetAsync>>(deptUrl); await _redisManager.SetAsync("EmployeeBusinessMap", deptResponse.Data, TimeSpan.FromMinutes(30)); return deptResponse.Data; } 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; } 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 GetMasterId() { OracleParameter[] p = { new OracleParameter("pkid", OracleDbType.Int64) }; p[0].Direction = ParameterDirection.ReturnValue; await _hgRepository.ExecuteSqlCommandAsync(CommandType.StoredProcedure, "PACK_BASE.Seq_master_get", p); return decimal.Parse(p[0].Value.ToString() ?? ""); } /// /// 获取上级部门id /// /// /// private List GetParentDeptId(decimal? deptId) { List res = new List { }; var salesDeptList = _crmRepository.GetRepository().Query().ToList(); var dept = salesDeptList.FirstOrDefault(b => b.SALEDEPTID == deptId); BuildParentDept(dept, salesDeptList, res); return res; } private void BuildParentDept(BAS_SALESDEPARTMENT dept, List deptList, List res) { if (dept != null) { res.Add(dept.SALEDEPTID); if (dept.DEPARTMENT_PARENTID.HasValue) { var parDept = deptList.FirstOrDefault(n => n.DEPARTMENT_ID == dept.DEPARTMENT_PARENTID); BuildParentDept(parDept, deptList, res); } } } private void GetAllDeptIDOrGidByDeptStr(string deptstr, ref List ALLdeptIDS, ref List ALLgidS) { var depts = deptstr.Split(',').Select(x => decimal.Parse(x)).ToList(); foreach (var item in depts) { List deptIDS = new List(); List gidS = new List(); GetAllDeptIDOrGidByDeptId(item, ref deptIDS, ref gidS);//获取所有的组别和gid ALLdeptIDS.AddRange(deptIDS); ALLgidS.AddRange(gidS); } ALLdeptIDS = ALLdeptIDS.Distinct().ToList(); ALLgidS = ALLgidS.Distinct().ToList(); } public void GetAllDeptIDOrGidByDeptId(decimal deptId, ref List deptIDS, ref List gidS) { var salesDeptList = _crmRepository.GetRepository().Query().ToList(); var groupList = _crmRepository.GetRepository().Query().ToList(); GetAllDeptIDOrGid(salesDeptList, groupList, deptId, ref deptIDS, ref gidS);//获取所有的子部门和销售组 } private void GetAllDeptIDOrGid(List salesDeptList, List groupList, decimal deptId, ref List deptIDS, ref List gidS) { var dept = salesDeptList.FirstOrDefault(m => m.SALEDEPTID == deptId); if (dept != null) { deptIDS.Add(deptId);//本ID也是需要加入 List list = salesDeptList.Where(n => n.DEPARTMENT_PARENTID == dept.DEPARTMENT_ID && n.IS_DELETED == 0 && n.SALEDEPTID != dept.SALEDEPTID).OrderBy(m => m.DEPARTMENT_SORT).ToList(); foreach (var item in list) { deptIDS.Add(item.SALEDEPTID); GetAllDeptIDOrGid(salesDeptList, groupList, item.SALEDEPTID, ref deptIDS, ref gidS); } } gidS.AddRange(groupList.Where(m => m.SALEDEPTID == deptId).Select(m => m.GID)); gidS.AddRange(groupList.Where(m => m.GID == deptId).Select(m => m.GID)); } /// /// 获取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 async Task> GetUserList() { var app = GetApp(); var key = CacheKeys.CacheUserList + $"{app}"; if (!await _redisManager.ExistsAsync(key)) { var list = await _crmRepository.GetRepository().QueryListAsync(); await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1)); return list; } else { return await _redisManager.GetListAsync(key); } } public async Task GetUserByEid(decimal eid) { var users = await GetUserList(); var user = users.FirstOrDefault(x => x.EID == eid); if (user == null) { return new BAS_INNERUSER(); } return user; } public async Task GetUserNameByEid(decimal eid) { var user = await GetUserByEid(eid); return user.UNAME ?? ""; } 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 SendCrmMessage(dynamic data) { var url = _systemConfig.GetCrmCoreSendMessage(); var result = await _httpClient.PostAsync(url, data); if (result.Code == 0) { return true; } else { return false; } } /// /// 获取版本号 /// /// public async Task GetMsgToolVersion() { var key = CacheKeys.CacheMsgToolVersion; if (await _redisManager.ExistsAsync(key)) { return await _redisManager.GetAsync(key); } return null; } /// /// 获取版本号 /// /// public async Task SetMsgToolVersion(MsgToolVersionModel model) { var key = CacheKeys.CacheMsgToolVersion; if (await _redisManager.ExistsAsync(key)) { await _redisManager.RemoveAsync(key); } return await _redisManager.SetAsync(key, model); } } }