510 lines
21 KiB
C#
510 lines
21 KiB
C#
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<CrmDbContext> _crmRepository;
|
||
private readonly IBaseRepository<HgDbContext> _hgRepository;
|
||
private readonly IMapper _mapper;
|
||
private readonly IConfiguration _configuration;
|
||
private readonly SystemConfig _systemConfig;
|
||
private readonly IHttpContextAccessor _httpContext;
|
||
|
||
public CacheDomain(IRedisManager redisManager,
|
||
IOracleRepository<CrmDbContext> crmRepository,
|
||
IBaseRepository<HgDbContext> 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<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 _crmRepository.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<List<decimal>> GetDeptmentIds(decimal eid)
|
||
{
|
||
var appid = GetApp();
|
||
if (eid == 0)
|
||
{
|
||
//从头部取事业线
|
||
eid = await GetCurrentEid();
|
||
}
|
||
|
||
if (eid == 0)
|
||
{
|
||
return new List<decimal>();
|
||
}
|
||
|
||
var key = $"{CacheKeys.UserInfo}_{appid}_{eid}";
|
||
if (await _redisManager.ExistsAsync(key))
|
||
{
|
||
return await _redisManager.GetListAsync<decimal>(key);
|
||
}
|
||
|
||
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 _crmRepository.ExecuteSqlToEntityAsync<BusinessDto>(sql, param);
|
||
if (business != null && business.Businessid != null) businessId = business.Businessid.Value;
|
||
|
||
if (businessId == 0)
|
||
{
|
||
var user = await _crmRepository.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 _crmRepository.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 _crmRepository.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();
|
||
if (groupids.Count > 0)
|
||
{
|
||
//全部则为全部事业线
|
||
businessIds = await _crmRepository.GetRepository<BAS_BUSINESSLINES>().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<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();
|
||
var seftdept = await _crmRepository.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 bussinessId = await _crmRepository.GetRepository<BAS_BUSINESSDEPARTMENT>().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<List<BusinessMapDto>> GetEmployeeBusinessMap()
|
||
{
|
||
var key = $"EmployeeBusinessMap";
|
||
if (await _redisManager.ExistsAsync(key))
|
||
{
|
||
return await _redisManager.GetListAsync<BusinessMapDto>(key);
|
||
}
|
||
|
||
var deptUrl = $"{_systemConfig.GetBusinessLine()}";
|
||
var deptResponse = await _httpClient.GetAsync<RetResult<List<BusinessMapDto>>>(deptUrl);
|
||
await _redisManager.SetAsync("EmployeeBusinessMap", deptResponse.Data, TimeSpan.FromMinutes(30));
|
||
return deptResponse.Data;
|
||
}
|
||
|
||
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<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<decimal> 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() ?? "");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取上级部门id
|
||
/// </summary>
|
||
/// <param name="deptId"></param>
|
||
/// <returns></returns>
|
||
private List<decimal> GetParentDeptId(decimal? deptId)
|
||
{
|
||
List<decimal> res = new List<decimal> { };
|
||
var salesDeptList = _crmRepository.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);
|
||
}
|
||
}
|
||
}
|
||
|
||
private 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();
|
||
}
|
||
|
||
public void GetAllDeptIDOrGidByDeptId(decimal deptId, ref List<decimal> deptIDS, ref List<decimal> gidS)
|
||
{
|
||
var salesDeptList = _crmRepository.GetRepository<BAS_SALESDEPARTMENT>().Query().ToList();
|
||
var groupList = _crmRepository.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));
|
||
}
|
||
|
||
/// <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<BAS_INNERUSER>> GetUserList()
|
||
{
|
||
var app = GetApp();
|
||
var key = CacheKeys.CacheUserList + $"{app}";
|
||
if (!await _redisManager.ExistsAsync(key))
|
||
{
|
||
var list = await _crmRepository.GetRepository<BAS_INNERUSER>().QueryListAsync();
|
||
await _redisManager.SetAsync(key, list, TimeSpan.FromDays(1));
|
||
return list;
|
||
}
|
||
else
|
||
{
|
||
return await _redisManager.GetListAsync<BAS_INNERUSER>(key);
|
||
}
|
||
}
|
||
|
||
public async Task<BAS_INNERUSER> 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<string> GetUserNameByEid(decimal eid)
|
||
{
|
||
var user = await GetUserByEid(eid);
|
||
return user.UNAME ?? "";
|
||
}
|
||
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送信息
|
||
/// </summary>
|
||
/// <param name="data"></param>
|
||
/// <returns></returns>
|
||
public async Task<bool> SendCrmMessage(dynamic data)
|
||
{
|
||
var url = _systemConfig.GetCrmCoreSendMessage();
|
||
var result = await _httpClient.PostAsync<ApiResult>(url, data);
|
||
if (result.Code == 0)
|
||
{
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取版本号
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public async Task<MsgToolVersionModel> GetMsgToolVersion()
|
||
{
|
||
var key = CacheKeys.CacheMsgToolVersion;
|
||
if (await _redisManager.ExistsAsync(key))
|
||
{
|
||
return await _redisManager.GetAsync<MsgToolVersionModel>(key);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取版本号
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public async Task<bool> SetMsgToolVersion(MsgToolVersionModel model)
|
||
{
|
||
var key = CacheKeys.CacheMsgToolVersion;
|
||
if (await _redisManager.ExistsAsync(key))
|
||
{
|
||
await _redisManager.RemoveAsync(key);
|
||
}
|
||
return await _redisManager.SetAsync(key, model);
|
||
}
|
||
}
|
||
} |