957 lines
41 KiB
C#
957 lines
41 KiB
C#
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() ?? "");
|
||
}
|
||
}
|
||
} |