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

957 lines
41 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 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<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;
}
public async Task<List<decimal>> GetDeptmentIds()
{
var eid = await GetCurrentEid();
var data = await GetDeptmentIdsByEid(eid);
return data;
}
public async Task<List<decimal>> GetDeptmentIdsByEid(decimal eid)
{
var appid = GetApp();
if (eid == 0)
{
return new List<decimal>();
}
var key = $"{CacheKeys.UserInfo}_{appid}_{eid}";
if (await _redisManager.ExistsAsync(key))
{
var data = await _redisManager.GetListAsync<decimal>(key);
Log.Information($"getdeptids{eid}_{string.Join(",", data)}");
return data;
}
var businessIds = new List<decimal>();
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<BusinessDto>(sql, param);
if (business != null && business.Businessid != null) businessId = business.Businessid.Value;
if (businessId == 0)
{
var user = await _repository.GetRepository<BAS_INNERUSER>().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<decimal>();
}
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<decimal>();
}
count++;
if (sales.BAS_BUSINESSDEPARTMENT != null)
{
parent = false;
businessIds.Add(sales.BAS_BUSINESSDEPARTMENT.BUSINESSID);
}
else
{
sales = await _repository.GetRepository<BAS_SALESDEPARTMENT>().Query()
.Include(x => x.BAS_BUSINESSDEPARTMENT)
.FirstOrDefaultAsync(x => x.DEPARTMENT_ID == sales.DEPARTMENT_PARENTID);
}
}
}
else
{
businessIds.Add(businessId);
}
// 获取员工数据权限配置的部门对应的事业线ID
var inneruser = await _repository.GetRepository<BAS_INNERUSER>().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<BAS_INNERGROUP>().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<BAS_INNERUSERGROUP>().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<decimal> ALLdeptIDS = new List<decimal>();
List<decimal> ALLgidS = new List<decimal>();
//向下遍历
GetAllDeptIDOrGidByDeptStr(item.ToString(), ref ALLdeptIDS, ref ALLgidS);
deptList.AddRange(ALLdeptIDS);
var bussinessIds = await _repository.GetRepository<BAS_BUSINESSDEPARTMENT>().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;
}
/// <summary>
/// 根据特殊权限查找权限
/// </summary>
/// <param name="eid"></param>
/// <returns></returns>
public async Task<List<decimal>> GetSpecialDeptmentIdsByRightCode(string rightcode)
{
var businessIds = new List<decimal>();
try
{
var eid = await GetCurrentEid();
var appid = GetApp();
if (eid == 0)
{
return new List<decimal>();
}
var key = $"{CacheKeys.UserInfo}_{appid}_special_{rightcode}_{eid}";//特殊权限缓存
if (await _redisManager.ExistsAsync(key))
{
return await _redisManager.GetListAsync<decimal>(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<SpecialRihgtDto>(sql1, param1);
if (!specialrightList.Any())//如果没有特殊权限直接返回空
{
return new List<decimal>();
}
var sql = "";
var param = new List<OracleParameter>();
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<BusinessDto>(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;
}
/// <summary>
/// 根据销售组 或者部门获取eids
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<List<decimal>> GetEidsByDeptmentIds(GroupOrDeptIdDto dto)
{
List<decimal> res = new List<decimal>();
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<decimal>(key);
}
if (!string.IsNullOrEmpty(dto.GroupIds))
{
var groupIds = dto.GroupIds.Split(",").Select(n => Convert.ToDecimal(n)).ToList();
var userGroup = await _repository.GetRepository<BAS_INNERUSERGROUP>().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<decimal> ALLdeptIDS = new List<decimal>();
List<decimal> ALLgidS = new List<decimal>();
//向下遍历
GetAllDeptIDOrGidByDeptStr(dto.DeptId, ref ALLdeptIDS, ref ALLgidS);
var userGroup = await _repository.GetRepository<BAS_INNERUSERGROUP>().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<BusinessLineInfo> 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<BusinessLineInfo>(key);
}
if (!string.IsNullOrEmpty(dto.GroupIds))
{
var groupIds = dto.GroupIds.Split(",").Select(n => Convert.ToDecimal(n)).ToList();
var userGroup = await _repository.GetRepository<BAS_INNERUSERGROUP>().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<BAS_BUSINESSDEPARTMENT>().FirstOrDefaultAsync(n => deptids.Contains(n.DEPTID));
if (line != null)
{
res.isLine = true;
res.deptId = line.BUSINESSID;
}
List<decimal> ALLdeptIDS = new List<decimal>();
List<decimal> ALLgidS = new List<decimal>();
//向下遍历
GetAllDeptIDOrGidByDeptStr(dto.DeptId, ref ALLdeptIDS, ref ALLgidS);
var userGroup = await _repository.GetRepository<BAS_INNERUSERGROUP>().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<List<UserDeptNameInfo>> GetUserInfoByEIds(string eids)
{
if (string.IsNullOrWhiteSpace(eids))
{
throw new ApiException("参数不能为空");
}
var eidList = eids.Split(",").ToList();
var parameters = new List<OracleParameter>();
var where = new List<string>();
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<UserDeptNameInfo>(sql, parameters.ToArray());
return res;
}
/// <summary>
/// 获取上级部门id
/// </summary>
/// <param name="deptId"></param>
/// <returns></returns>
private List<decimal> GetParentDeptId(decimal? deptId)
{
List<decimal> res = new List<decimal> { };
var salesDeptList = _repository.GetRepository<BAS_SALESDEPARTMENT>().Query().ToList();
var dept = salesDeptList.FirstOrDefault(b => b.SALEDEPTID == deptId);
BuildParentDept(dept, salesDeptList, res);
return res;
}
private void BuildParentDept(BAS_SALESDEPARTMENT dept, List<BAS_SALESDEPARTMENT> deptList, List<decimal> 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<decimal> ALLdeptIDS, ref List<decimal> ALLgidS)
{
var depts = deptstr.Split(',').Select(x => decimal.Parse(x)).ToList();
foreach (var item in depts)
{
List<decimal> deptIDS = new List<decimal>();
List<decimal> gidS = new List<decimal>();
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<decimal> deptIDS, ref List<decimal> gidS)
{
var salesDeptList = _repository.GetRepository<BAS_SALESDEPARTMENT>().Query().ToList();
var groupList = _repository.GetRepository<BAS_INNERGROUP>().Query().ToList();
GetAllDeptIDOrGid(salesDeptList, groupList, deptId, ref deptIDS, ref gidS);//获取所有的子部门和销售组
}
private void GetAllDeptIDOrGid(List<BAS_SALESDEPARTMENT> salesDeptList, List<BAS_INNERGROUP> groupList, decimal deptId, ref List<decimal> deptIDS, ref List<decimal> gidS)
{
var dept = salesDeptList.FirstOrDefault(m => m.SALEDEPTID == deptId);
if (dept != null)
{
deptIDS.Add(deptId);//本ID也是需要加入
List<BAS_SALESDEPARTMENT> 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<List<SalesDeptDto>> GetSalesDeptList()
{
var appid = GetApp();
var key = $"{CacheKeys.SalesDeptList}_{appid}";
if (!await _redisManager.ExistsAsync(key))
{
var result = new List<SalesDeptDto>();
var list = new List<SalesDeptDto>();
// 切换事业部
await SetApp(_repository, appid);
var salesList = await _repository.GetRepository<BAS_SALESDEPARTMENT>().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<decimal> { 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<SalesDeptDto>(key);
}
private void GetSalesDepts(List<BAS_SALESDEPARTMENT> salesList, SalesDeptDto item, List<SalesDeptDto> 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<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 groupIds = await _repository.GetRepository<BAS_INNERUSER>().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<BAS_GROUPLEADER>().Query()
.Include(x => x.BAS_INNERUSER)
.Where(x => groupIds.Contains(x.INNERGROUPID))
.Select(x => x.BAS_INNERUSER.EID)
.Distinct()
.ToListAsync();
return eids;
}
/// <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 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>();
}
/// <summary>
/// 获取员工领导Eid销售组长、总监、业务负责人
/// </summary>
/// <param name="deptid"></param>
/// <param name="eid"></param>
/// <returns></returns>
public async Task<List<decimal>> GetLeadEid(decimal deptid, decimal eid)
{
var result = new List<decimal> { eid };
var user = await _repository.GetRepository<BAS_INNERUSER>().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<BAS_GROUPLEADER>().Query()
.Include(x => x.BAS_INNERUSER)
.Where(x => x.INNERGROUPID == groupid);
var groups = await query.ToListAsync();
var saleDeptids = new List<decimal?>();
if (groups.Any())
{
result.AddRange(groups.Select(x => x.BAS_INNERUSER.EID).ToList());
saleDeptids.AddRange(await _repository.GetRepository<BAS_INNERGROUP>().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<BAS_GROUPLEADER>().Query()
.Include(x => x.BAS_INNERUSER)
.Where(x => x.TYPE == 1 && saleDeptids.Contains(x.INNERGROUPID) && x.LEADERTYPE.HasValue && new List<decimal> { 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;
}
/// <summary>
/// 同步数据
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<bool> SynchronousCustomer(SynchronousCustomerDto dto)
{
var Edd = _repository.GetRepository<EmployeeDepartmentDetail>().Query();
//var Ed = _repository.GetRepository<EmployeeDepartment>().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<EmployeeDepartmentDetail> newEdd = new List<EmployeeDepartmentDetail>();
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<EmployeeDepartmentDetail>().BatchUpdateAsync(oldEdd);
await _repository.GetRepository<EmployeeDepartmentDetail>().BatchInsertAsync(newEdd);
await transaction.CommitAsync();
return true;
}
catch (Exception ex)
{
Log.Error(ex, "同步失败!");
await transaction.RollbackAsync();
await transaction.DisposeAsync();
return false;
}
}
public async Task<decimal> 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() ?? "");
}
}
}