using Crm.Core.Domain.Dto.Customer; using Crm.Core.Domain.Impl; using Crm.Core.Entity.Crm; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Primitives; using MySqlConnector; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; using static Crm.Core.Domain.Config.SystemEnums; namespace Crm.Core.Domain { public 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; } public async Task> GetDeptmentIds() { var eid = await GetCurrentEid(); var data = await GetDeptmentIdsByEid(eid); return data; } public async Task> GetDeptmentIdsByEid(decimal eid) { var appid = GetApp(); if (eid == 0) { return new List(); } var key = $"{CacheKeys.UserInfo}_{appid}_{eid}"; if (await _redisManager.ExistsAsync(key)) { var data = await _redisManager.GetListAsync(key); Log.Information($"getdeptids{eid}_{string.Join(",", data)}"); return data; } 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 _repository.ExecuteSqlToEntityAsync(sql, param); if (business != null && business.Businessid != null) businessId = business.Businessid.Value; if (businessId == 0) { var user = await _repository.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 _repository.GetRepository().Query() .Include(x => x.BAS_BUSINESSDEPARTMENT) .FirstOrDefaultAsync(x => x.DEPARTMENT_ID == sales.DEPARTMENT_PARENTID); } } } else { businessIds.Add(businessId); } // 获取员工数据权限配置的部门对应的事业线ID var inneruser = await _repository.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(); var depts = await _repository.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(); if (leadDept != null && leadDept.Any()) { depts.AddRange(leadDept); } var seftdept = await _repository.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 bussinessIds = await _repository.GetRepository().Query().Where(n => deptList.Contains(n.DEPTID)).Select(x => x.BUSINESSID).ToListAsync(); businessIds.AddRange(bussinessIds); } businessIds = businessIds.Where(x => x != 0).Distinct().ToList(); await _redisManager.SetAsync(key, businessIds, TimeSpan.FromMinutes(30)); Log.Information($"getdeptids{eid}_{string.Join(",", businessIds)}"); return businessIds; } /// /// 根据特殊权限查找权限 /// /// /// public async Task> GetSpecialDeptmentIdsByRightCode(string rightcode) { var businessIds = new List(); try { var eid = await GetCurrentEid(); var appid = GetApp(); if (eid == 0) { return new List(); } var key = $"{CacheKeys.UserInfo}_{appid}_special_{rightcode}_{eid}";//特殊权限缓存 if (await _redisManager.ExistsAsync(key)) { return await _redisManager.GetListAsync(key); } var businessId = decimal.Zero; var sql1 = @"select a.inneruserid,b.code,b.roleid,c.eid,c.uname,d.rightid,d.rname,d.remarks,e.typeid,e.cid from bas_inneruserrole a left join bas_role b on a.roleid=b.roleid left join bas_inneruser c on c.pkid=a.inneruserid left join bas_right_level d on d.rolecode=b.code left join bas_right_level_detail e on e.levelid=d.pkid where c.eid=:eid and d.rightid=:rightcode"; var param1 = new OracleParameter[] { new OracleParameter() { ParameterName = ":eid", OracleDbType = OracleDbType.Int64, Value = eid }, new OracleParameter() { ParameterName = ":rightcode", OracleDbType = OracleDbType.Varchar2, Value = rightcode } }; var specialrightList = await _repository.ExecuteSqlToListAsync(sql1, param1); if (!specialrightList.Any())//如果没有特殊权限直接返回空 { return new List(); } var sql = ""; var param = new List(); if (specialrightList.FirstOrDefault(m => m.cid == 0) != null)//表明有查看全部的权限 { sql = @"select a.businessid, b.businessname, b.channel from ( select * from bas_businessdepartment ) a join bas_businesslines b on a.businessid = b.businessid"; } else { // 获取员工所属部门事业线ID var deptlist = specialrightList.Where(m => m.cid != 0).Select(m => m.cid); if (deptlist.Any()) { string mmm = string.Join(',', deptlist); sql = $@"select a.businessid, b.businessname, b.channel from ( select * from bas_businessdepartment where deptid in ( select saledeptid from bas_salesdepartment start with saledeptid in( select v.saledeptid from bas_salesdepartment v where v.saledeptid in( {mmm} ) or v.saledeptid in( select y.deptid from bas_innerusergroup y where y.gid in( {mmm} ) ) ) connect by prior department_parentid = department_id ) ) a join bas_businesslines b on a.businessid = b.businessid"; } } var business = await _repository.ExecuteSqlToListAsync(sql); if (business != null) businessIds = business.Select(m => m.Businessid ?? 0).Distinct().Where(x => x != 0).ToList(); await _redisManager.SetAsync(key, businessIds, TimeSpan.FromMinutes(5)); return businessIds; } catch (Exception ex) { Log.Error(ex, "specialRightErro"); } return businessIds; } /// /// 根据销售组 或者部门获取eids /// /// /// public async Task> GetEidsByDeptmentIds(GroupOrDeptIdDto dto) { List res = new List(); if (string.IsNullOrWhiteSpace(dto.DeptId) && string.IsNullOrWhiteSpace(dto.GroupIds)) { return res; } var appid = GetApp(); var key = $"{CacheKeys.EidInfo}_{appid}_{dto.DeptId}_{dto.GroupIds}"; if (await _redisManager.ExistsAsync(key)) { return await _redisManager.GetListAsync(key); } if (!string.IsNullOrEmpty(dto.GroupIds)) { var groupIds = dto.GroupIds.Split(",").Select(n => Convert.ToDecimal(n)).ToList(); var userGroup = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER).Where(n => n.GID.HasValue && groupIds.Contains(n.GID.Value)).ToListAsync(); res = userGroup.Where(n => n.BAS_INNERUSER != null).Select(n => n.BAS_INNERUSER.EID).ToList(); } else if (!string.IsNullOrEmpty(dto.DeptId)) { List ALLdeptIDS = new List(); List ALLgidS = new List(); //向下遍历 GetAllDeptIDOrGidByDeptStr(dto.DeptId, ref ALLdeptIDS, ref ALLgidS); var userGroup = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER).Where(u => ALLdeptIDS.Contains(u.DEPTID.Value) || (u.GID != null && ALLgidS.Contains(u.GID.Value))).ToListAsync(); res = userGroup.Where(n => n.BAS_INNERUSER != null).Select(n => n.BAS_INNERUSER.EID).ToList(); } res = res.Where(x => x != 0).Distinct().ToList(); await _redisManager.SetAsync(key, res, TimeSpan.FromMinutes(30)); return res; } public async Task GetBusinessLineByDeptMentIds(GroupOrDeptIdDto dto) { BusinessLineInfo res = new BusinessLineInfo(); if (string.IsNullOrWhiteSpace(dto.DeptId) && string.IsNullOrWhiteSpace(dto.GroupIds)) { return res; } var appid = GetApp(); var key = $"{CacheKeys.LineInfo}_{appid}_{dto.DeptId}_{dto.GroupIds}"; if (await _redisManager.ExistsAsync(key)) { return await _redisManager.GetAsync(key); } if (!string.IsNullOrEmpty(dto.GroupIds)) { var groupIds = dto.GroupIds.Split(",").Select(n => Convert.ToDecimal(n)).ToList(); var userGroup = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER).Where(n => n.GID.HasValue && groupIds.Contains(n.GID.Value)).ToListAsync(); res.eidInfo = userGroup.Where(n => n.BAS_INNERUSER != null).Select(n => n.BAS_INNERUSER.EID).ToList(); } else if (!string.IsNullOrEmpty(dto.DeptId)) { var deptids = dto.DeptId.Split(",").Select(n => Convert.ToDecimal(n)).ToList(); var line = await _repository.GetRepository().FirstOrDefaultAsync(n => deptids.Contains(n.DEPTID)); if (line != null) { res.isLine = true; res.deptId = line.BUSINESSID; } List ALLdeptIDS = new List(); List ALLgidS = new List(); //向下遍历 GetAllDeptIDOrGidByDeptStr(dto.DeptId, ref ALLdeptIDS, ref ALLgidS); var userGroup = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER).Where(u => ALLdeptIDS.Contains(u.DEPTID.Value) || (u.GID != null && ALLgidS.Contains(u.GID.Value))).ToListAsync(); res.eidInfo = userGroup.Where(n => n.BAS_INNERUSER != null).Select(n => n.BAS_INNERUSER.EID).ToList(); } res.eidInfo = res.eidInfo.Where(x => x != 0).Distinct().ToList(); await _redisManager.SetAsync(key, res, TimeSpan.FromMinutes(30)); return res; } public async Task> GetUserInfoByEIds(string eids) { if (string.IsNullOrWhiteSpace(eids)) { throw new ApiException("参数不能为空"); } var eidList = eids.Split(",").ToList(); var parameters = new List(); var where = new List(); var i = 1; foreach (var eidStr in eidList) { if (int.TryParse(eidStr, out int eid)) { parameters.Add(new OracleParameter($":eid{i}", OracleDbType.Int32) { Value = eid }); where.Add($":eid{i}"); i++; } } var whereStr = string.Join(",", where); var sql = @$"select a.pkid,a.uname,a.eid,c.gid as GroupId,c.GNAME as GroupName,d.saledeptid as DeptId,d.DEPTNAME as DeptName from bas_inneruser a join bas_innerusergroup b on a.pkid = b.inneruserid left join bas_innergroup c on b.gid = c.gid left join bas_salesdepartment d on b.deptid = d.saledeptid where a.eid in ({whereStr}) or a.pkid in ({whereStr})"; var res = await _repository.ExecuteSqlToListAsync(sql, parameters.ToArray()); return res; } /// /// 获取上级部门id /// /// /// private List GetParentDeptId(decimal? deptId) { List res = new List { }; var salesDeptList = _repository.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); } } } public 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(); } private void GetAllDeptIDOrGidByDeptId(decimal deptId, ref List deptIDS, ref List gidS) { var salesDeptList = _repository.GetRepository().Query().ToList(); var groupList = _repository.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)); } public async Task> GetSalesDeptList() { var appid = GetApp(); var key = $"{CacheKeys.SalesDeptList}_{appid}"; if (!await _redisManager.ExistsAsync(key)) { var result = new List(); var list = new List(); // 切换事业部 await SetApp(_repository, appid); var salesList = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERGROUP) .ToListAsync(); foreach (var item in salesList) { var groups = item.BAS_INNERGROUP.Where(x => x.DEPARTMENT_ID != null).ToList(); var sales = new SalesDeptDto { SalesGroupId = item.SALEDEPTID, Title = item.DEPTNAME, DepartmentParentId = item.DEPARTMENT_PARENTID, GroupIds = groups.Select(x => x.DEPARTMENT_ID.Value).ToList() }; foreach (var group in groups) { var groupSales = new SalesDeptDto { SalesGroupId = group.GID, Title = group.GNAME, DepartmentParentId = null, GroupIds = new List { group.DEPARTMENT_ID.Value } }; list.Add(groupSales); } list.Add(sales); } foreach (var item in list) { GetSalesDepts(salesList, item, result); } foreach (var item in result) { if (list.Any(x => x.SalesGroupId == item.SalesGroupId)) { var sales = list.First(x => x.SalesGroupId == item.SalesGroupId); sales.GroupIds.AddRange(item.GroupIds); sales.GroupIds = sales.GroupIds.Distinct().ToList(); } else { list.Add(item); } } list = list.OrderBy(x => x.SalesGroupId).ToList(); await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1)); return list; } return await _redisManager.GetListAsync(key); } private void GetSalesDepts(List salesList, SalesDeptDto item, List result) { if (item.DepartmentParentId == null) { return; } Log.Information($"test: result: {result.ToJson()}"); foreach (var salesDept in salesList.Where(x => x.DEPARTMENT_ID == item.DepartmentParentId).ToList()) { var sales = new SalesDeptDto(); if (result.Any(x => x.SalesGroupId == salesDept.SALEDEPTID)) { sales = result.First(x => x.SalesGroupId == salesDept.SALEDEPTID); sales.GroupIds.AddRange(item.GroupIds); sales.GroupIds = sales.GroupIds.Distinct().ToList(); } else { sales = new SalesDeptDto { SalesGroupId = salesDept.SALEDEPTID, Title = salesDept.DEPTNAME, DepartmentParentId = salesDept.DEPARTMENT_PARENTID }; sales.GroupIds.AddRange(item.GroupIds); result.Add(sales); } if (sales.DepartmentParentId != null) { GetSalesDepts(salesList, sales, result); } } } 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 groupIds = await _repository.GetRepository().Query() .Include(x => x.BAS_GROUPLEADER) .Where(x => x.EID == eid) .Select(x => x.BAS_GROUPLEADER.Select(x => x.INNERGROUPID).ToList()) .FirstOrDefaultAsync(); var eids = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER) .Where(x => groupIds.Contains(x.INNERGROUPID)) .Select(x => x.BAS_INNERUSER.EID) .Distinct() .ToListAsync(); return eids; } /// /// 获取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> 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(); } /// /// 获取员工领导Eid(销售组长、总监、业务负责人) /// /// /// /// public async Task> GetLeadEid(decimal deptid, decimal eid) { var result = new List { eid }; var user = await _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSERGROUP) .Where(x => x.EID == eid) .FirstOrDefaultAsync(); if (user == null || user.BAS_INNERUSERGROUP == null) return result; var groupid = user.BAS_INNERUSERGROUP.GID; var query = _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER) .Where(x => x.INNERGROUPID == groupid); var groups = await query.ToListAsync(); var saleDeptids = new List(); if (groups.Any()) { result.AddRange(groups.Select(x => x.BAS_INNERUSER.EID).ToList()); saleDeptids.AddRange(await _repository.GetRepository().Query() .Where(x => groups.Select(y => y.INNERGROUPID).Contains(x.GID)) .Select(x => x.SALEDEPTID) .ToListAsync()); if (saleDeptids.Any() && saleDeptids.Any(x => x.HasValue)) { query = _repository.GetRepository().Query() .Include(x => x.BAS_INNERUSER) .Where(x => x.TYPE == 1 && saleDeptids.Contains(x.INNERGROUPID) && x.LEADERTYPE.HasValue && new List { 10, 40 }.Contains(x.LEADERTYPE.Value)); var saleDepts = await query.ToListAsync(); if (saleDepts.Any()) { result.AddRange(saleDepts.Select(x => x.BAS_INNERUSER.EID).Distinct().ToList()); } } } // todo 添加部门负责人 return result; } /// /// 同步数据 /// /// /// public async Task SynchronousCustomer(SynchronousCustomerDto dto) { var Edd = _repository.GetRepository().Query(); //var Ed = _repository.GetRepository().Query(); #region 处理 员工部门归属 var newIds = dto.eddList.Select(m => m.id); var oldEdd = Edd.Where(m => newIds.Contains(m.ID)).ToList(); var newEddDto = dto.eddList.Where(m => !oldEdd.Select(m => m.ID).Contains(m.id)); List newEdd = new List(); foreach (var item in newEddDto) { EmployeeDepartmentDetail nedd = new EmployeeDepartmentDetail(); nedd.ID = item.id; nedd.EID = item.eid; nedd.DEPARTMENT_ID = item.department_type; nedd.DEPARTMENT_ID = item.department_id; nedd.LEVEL = item.level; nedd.IS_DELETE = item.is_deleted; nedd.CREATE_TIME = item.create_time; nedd.UPDATE_TIME = item.update_time; newEdd.Add(nedd); } #endregion 处理 员工部门归属 using var transaction = await _repository.BeginTransactionAsync(); try { await _repository.GetRepository().BatchUpdateAsync(oldEdd); await _repository.GetRepository().BatchInsertAsync(newEdd); await transaction.CommitAsync(); return true; } catch (Exception ex) { Log.Error(ex, "同步失败!"); await transaction.RollbackAsync(); await transaction.DisposeAsync(); return false; } } public async Task GetSeq_smallid_get(decimal deptid) { SetApp(_repository, deptid); OracleParameter[] p = { new OracleParameter("pkid", OracleDbType.Int64) }; p[0].Direction = ParameterDirection.ReturnValue; await _repository.ExecuteSqlCommandAsync(CommandType.StoredProcedure, "PACK_BASE.Seq_smallid_get", p); return decimal.Parse(p[0].Value.ToString() ?? ""); } } }