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

510 lines
21 KiB
C#
Raw Permalink 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.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);
}
}
}