922 lines
45 KiB
C#
922 lines
45 KiB
C#
using System.Text;
|
||
using System.Web;
|
||
using Zxd.Domain.Dto.Resource;
|
||
using Serilog;
|
||
using Zxd.Domain.Impl;
|
||
using Zxd.Entity.Zxd.Order;
|
||
using MySqlConnector;
|
||
using System.Diagnostics;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
using Zxd.EntityFramework;
|
||
|
||
namespace Zxd.Domain
|
||
{
|
||
public class ReSourceDomain : IReSourceDomain
|
||
{
|
||
private readonly IRegUserDomain _reguserService;
|
||
private readonly IRepositoryBase<ZxdDbContext, Bas_CompanyChannel> _companyChannelRepository;
|
||
private readonly IBaseRepository<ZxdDbContext> _repository;
|
||
private readonly IRepositoryBase<ZxdDbContext, RES_RESOURCEMOBILE> _resourcemobileRepository;
|
||
private readonly IRepositoryBase<ZxdDbContext, RES_CUSTOMERUSER> _customeruserRepository;
|
||
private readonly IRepositoryBase<ZxdDbContext, CMS_QIWEI_POSTLOG> _cmsLogRepository;
|
||
private readonly IRepositoryBase<ZxdDbContext, RES_CUSTOMER> _customerRepository;
|
||
private readonly IBaseRepository<DncmsbaseDbContext> _cmsrepository;
|
||
private readonly IRepositoryBase<DncmsbaseDbContext, ResCutomerPassTime> _resPassRepository;
|
||
private readonly ISystemConfigDomain _systemConfigService;
|
||
private readonly IBasParameterDomain _basParameterService;
|
||
private readonly IResCustomerDomain _resCustomerService;
|
||
private readonly IServiceProvider _serviceProvider;
|
||
private readonly IMapper _mapper;
|
||
private readonly IHttpClient _httpClient;
|
||
|
||
public ReSourceDomain(IServiceProvider serviceProvider,
|
||
IBaseRepository<ZxdDbContext> repository, IBaseRepository<CrmDbContext> crmrepository, IRegUserDomain reguserService,
|
||
IBasParameterDomain basParameterService, ISystemConfigDomain systemConfigService, IBaseRepository<DncmsbaseDbContext> cmsrepository,
|
||
IBaseRepository<DncmsDbContext> dbcmsrepository,
|
||
IResCustomerDomain resCustomerService, IMapper mapper, IUserInfoDomain userInfoDomain, IHttpClient httpClient)
|
||
{
|
||
_httpClient = httpClient;
|
||
_serviceProvider = serviceProvider;
|
||
_reguserService = reguserService;
|
||
_repository = repository;
|
||
_cmsrepository = cmsrepository;
|
||
_companyChannelRepository = _repository.GetRepository<Bas_CompanyChannel>();
|
||
_resourcemobileRepository = _repository.GetRepository<RES_RESOURCEMOBILE>();
|
||
_customeruserRepository = _repository.GetRepository<RES_CUSTOMERUSER>();
|
||
_cmsLogRepository = _repository.GetRepository<CMS_QIWEI_POSTLOG>();
|
||
_basParameterService = basParameterService;
|
||
_customerRepository = _repository.GetRepository<RES_CUSTOMER>();
|
||
_resPassRepository = _cmsrepository.GetRepository<ResCutomerPassTime>();
|
||
_mapper = mapper;
|
||
_systemConfigService = systemConfigService;
|
||
_resCustomerService = resCustomerService;
|
||
_httpClient = httpClient;
|
||
}
|
||
|
||
#region 注册同步
|
||
|
||
public async Task<string> SyncRegUser(SyncRegUserDto activeModel, string clientid)
|
||
{
|
||
bool isTrue = true;
|
||
string retMsg = string.Empty;
|
||
var client = _systemConfigService.GetClientKey(clientid);
|
||
try
|
||
{
|
||
if (string.IsNullOrEmpty(activeModel.username))
|
||
{
|
||
retMsg = (new { result = false, retcode = (int)EnumInterfaceErrcode.参数错误 }).ToJson();
|
||
retMsg = SecurityHelper.EncyptData(retMsg, client.AccessKey);
|
||
return retMsg;
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
retMsg = (new { result = false, retcode = (int)EnumInterfaceErrcode.参数错误 }).ToJson();
|
||
isTrue = false;
|
||
Log.Error(string.Concat("当前请求" + activeModel.ToJson() + "|", ex.ToString()));
|
||
}
|
||
var innerModel = _mapper.Map<SyncRegUserDto, SynInnerModel>(activeModel);
|
||
if (isTrue)
|
||
{
|
||
try
|
||
{
|
||
if (innerModel.curChannel.HasValue)
|
||
{
|
||
innerModel.ch = innerModel.curChannel.ToString();
|
||
}
|
||
await _reguserService.RegUser(innerModel);
|
||
|
||
retMsg = (new { result = true, retcode = (int)EnumInterfaceErrcode.调用成功 }).ToJson();
|
||
|
||
#region 发布用户注册事件
|
||
|
||
try
|
||
{
|
||
//根据渠道号获取部门编码
|
||
var ch = int.Parse(innerModel.ch);
|
||
var company = await _companyChannelRepository.FirstOrDefaultAsync(p => p.Min <= ch && p.Max >= ch);
|
||
|
||
var c = SecurityHelper.EncyptData(innerModel.ToJson(), client.AccessKey);
|
||
var s = SecurityHelper.SignData(c, client.AccessKey);
|
||
|
||
HandleRegUser(new SoftUserRegisterEvent(c, client.Id, s, company != null ? company.CompanyCode : "DNZZ"));
|
||
}
|
||
catch (Exception exx)
|
||
{
|
||
Log.Error("发布注册用户事件错误:" + exx.ToString());
|
||
}
|
||
|
||
#endregion 发布用户注册事件
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error("同步注册用户出现异常" + ex);
|
||
retMsg = (new
|
||
{
|
||
result = false,
|
||
retcode = (int)EnumInterfaceErrcode.系统错误
|
||
}).ToJson();
|
||
}
|
||
finally
|
||
{
|
||
//CacheHelper.RemoveRegCache(activeModel.username);
|
||
}
|
||
}
|
||
return retMsg;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="event"></param>
|
||
public void HandleRegUser(SoftUserRegisterEvent @event)
|
||
{
|
||
try
|
||
{
|
||
Log.Error($"注册用户事件执行:" + @event.ToJson());
|
||
var host = _systemConfigService.GetSystemConfig().DataSyncApiUrl;
|
||
var url = host + "/api/DataSync";
|
||
|
||
var para = new SYNC_PUSH_DTO()
|
||
{
|
||
bidatatype = "Client_Soft_User",
|
||
deptcode = @event.deptcode,
|
||
jsontext = new { @event.content, @event.clientid, @event.sign }.ToJson()
|
||
};
|
||
//LogHelper.Info("para:" + para.ToJson());
|
||
var rep = HttpHelper.PostAjaxData(url, para.ToJson(), Encoding.UTF8);
|
||
//LogHelper.Info("rep:" + rep);
|
||
var ret = JsonHelper.FromJson<retMsg>(rep);
|
||
if (!ret.result)
|
||
Log.Error("接口 SoftUserRegisterEventHandler 写入失败!");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error(ex.ToString());
|
||
}
|
||
}
|
||
|
||
#endregion 注册同步
|
||
|
||
#region 活动报名
|
||
|
||
/// <summary>
|
||
/// 用户活动申请
|
||
/// </summary>
|
||
/// <param name="content"></param>
|
||
/// <param name="clientid"></param>
|
||
/// <param name="sign"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> Join(JionActiveDto activeModel, string clientid)
|
||
{
|
||
string retMsg = string.Empty;
|
||
var clientKey = _systemConfigService.GetSystemConfig().CRMClientKey;
|
||
var client = _systemConfigService.GetClientKey(clientid);
|
||
try
|
||
{
|
||
string resid = string.Empty;
|
||
Log.Information("活动资源进入:" + activeModel.ToJson());
|
||
|
||
if (string.IsNullOrWhiteSpace(activeModel.campaignId) && string.IsNullOrWhiteSpace(activeModel.account))
|
||
{
|
||
retMsg = (new { result = false, retcode = (int)EnumInterfaceErrcode.参数错误 }).ToJson();
|
||
retMsg = SecurityHelper.EncyptData(retMsg, client.AccessKey);
|
||
return HttpUtility.UrlEncode(retMsg);
|
||
}
|
||
if (activeModel.accounttype == 0)
|
||
{
|
||
//手机号
|
||
activeModel.mobile = activeModel.account;
|
||
}
|
||
else if (activeModel.accounttype == 1)
|
||
{
|
||
//用户名
|
||
activeModel.username = activeModel.account;
|
||
}
|
||
else if (activeModel.accounttype == 2)
|
||
{
|
||
//客户ID
|
||
resid = activeModel.account;
|
||
}
|
||
else
|
||
{
|
||
return SecurityHelper.EncyptData((new { result = false, retcode = (int)EnumInterfaceErrcode.参数错误 }).ToJson(), client.AccessKey);
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(activeModel.mobile))
|
||
{
|
||
resid = ResUtil.CreateResId(activeModel.mobile);
|
||
await _resCustomerService.ResgisterCustomer(activeModel.mobile, resid, activeModel.campaignId);
|
||
}
|
||
else
|
||
{
|
||
if (!string.IsNullOrEmpty(resid))
|
||
{
|
||
var m = _resourcemobileRepository.Query().FirstOrDefault(p => p.RESID == resid);
|
||
activeModel.mobile = SecurityHelper.DecyptData(m.MOBILE, client.AccessKey);
|
||
}
|
||
else
|
||
{
|
||
var cust = _customeruserRepository.Query().FirstOrDefault(p => p.USERNAME == activeModel.username);
|
||
if (cust == null)
|
||
{
|
||
retMsg = SecurityHelper.EncyptData((new { result = false, retcode = (int)EnumInterfaceErrcode.不存在此用户 }).ToJson(), client.AccessKey);
|
||
return retMsg;
|
||
}
|
||
else
|
||
{
|
||
resid = cust.RESID;
|
||
var m = _resourcemobileRepository.Query().FirstOrDefault(p => p.RESID == resid);
|
||
activeModel.mobile = SecurityHelper.DecyptData(m.MOBILE, client.AccessKey);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (activeModel.campaignId == "TNB26001")
|
||
{
|
||
activeModel.deptcode = "QBJZ";
|
||
}
|
||
|
||
if (activeModel.ch.HasValue)
|
||
{
|
||
var ch = activeModel.ch.GetValueOrDefault();
|
||
var company = await _companyChannelRepository.FirstOrDefaultAsync(p => p.Min <= ch && p.Max >= ch);
|
||
//LogHelper.Info("根据渠道获取推送码:" + company.ToJson());
|
||
if (company != null)
|
||
{
|
||
activeModel.deptcode = company.CompanyCode;
|
||
}
|
||
}
|
||
///传过来的aes加密 需要按照之前加密
|
||
var c = SecurityHelper.EncyptData(activeModel.ToJson(), client.AccessKey);
|
||
var s = SecurityHelper.SignData(c, client.AccessKey);
|
||
if (!string.IsNullOrEmpty(activeModel.deptcode))
|
||
{
|
||
//推送到分部
|
||
if (activeModel.assigntype.HasValue && activeModel.assigntype.Value == 1 && activeModel.eid.HasValue)
|
||
{
|
||
HandleJoinActive(new JoinActiveEvent(c, clientid, s, activeModel.deptcode));
|
||
}
|
||
else
|
||
{
|
||
HandleJoinActive(new JoinActiveEvent(c, clientid, s, activeModel.deptcode));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//如果没有部门编码
|
||
HandleJoinAllDeptActive(new JoinActiveAllDeptEvent(c, clientid, s, resid, activeModel.campaignId));
|
||
}
|
||
|
||
retMsg = (new { result = true, retcode = (int)EnumInterfaceErrcode.调用成功, ResId = resid }).ToJson();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error(ex.ToString());
|
||
retMsg = (new { result = false, retcode = (int)EnumInterfaceErrcode.系统错误, ResId = "" }).ToJson();
|
||
}
|
||
return HttpUtility.UrlEncode(SecurityHelper.EncyptData(retMsg, client.AccessKey));
|
||
}
|
||
|
||
public void HandleJoinActive(JoinActiveEvent @event)
|
||
{
|
||
try
|
||
{
|
||
Log.Information("活动事件执行:" + @event.ToJson());
|
||
|
||
var host = _systemConfigService.GetSystemConfig().DataSyncApiUrl;
|
||
var url = host + "/api/DataSync";
|
||
|
||
var para = new SYNC_PUSH_DTO()
|
||
{
|
||
bidatatype = "Client_Active",
|
||
deptcode = @event.deptcode,
|
||
jsontext = new { @event.content, @event.clientid, @event.sign }.ToJson(),
|
||
isbatch = 1
|
||
};
|
||
//LogHelper.Info("para:" + para.ToJson());
|
||
//LogHelper.Info("url:" + url);
|
||
var rep = HttpHelper.PostAjaxData(url, para.ToJson(), Encoding.UTF8);
|
||
//LogHelper.Info("rep:" + rep);
|
||
var ret = JsonHelper.FromJson<retMsg>(rep);
|
||
if (!ret.result)
|
||
Log.Error("接口 ApplyResEventHandler 写入失败!");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error(ex.ToString());
|
||
}
|
||
}
|
||
|
||
public void HandleJoinAllDeptActive(JoinActiveAllDeptEvent @event)
|
||
{
|
||
try
|
||
{
|
||
Log.Information("推送开通订单事件执行:" + @event.ToJson());
|
||
|
||
var host = _systemConfigService.GetSystemConfig().DataSyncApiUrl;
|
||
var url = host + "/api/DataSync";
|
||
|
||
var list = new List<string>() { "QBJZ", "QBJX", "DNZZ" };
|
||
//var list = _cache.GetList_innerCompany().Where(p => p.SYSTEMCODE != null).Select(p => p.SYSTEMCODE);
|
||
|
||
foreach (var item in list)
|
||
{
|
||
var para = new SYNC_PUSH_DTO()
|
||
{
|
||
bidatatype = "Client_ActiveAllDept",
|
||
deptcode = item,
|
||
jsontext = new { @event.content, @event.clientid, @event.sign, @event.resid, @event.resourcetag }.ToJson()
|
||
};
|
||
|
||
var rep = HttpHelper.PostAjaxData(url, para.ToJson(), Encoding.UTF8);
|
||
var ret = JsonHelper.FromJson<retMsg>(rep);
|
||
if (!ret.result)
|
||
Log.Error("接口 JoinActiveAllDeptEventHandler 写入失败!");
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error(ex.ToString());
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 资源分配接口
|
||
/// </summary>
|
||
/// <param name="resAllocationDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> Allocation(ResAllocationDto activeModel, string clientid)
|
||
{
|
||
try
|
||
{
|
||
CMS_QIWEI_POSTLOG cmslog = new CMS_QIWEI_POSTLOG()
|
||
{
|
||
Appid = activeModel?.Appid,
|
||
Appuserid = activeModel?.Appuserid,
|
||
jsondata = activeModel?.ToJson(),
|
||
Deptid = activeModel?.Deptid,
|
||
ctime = DateTime.Now,
|
||
STATUS = 0
|
||
};
|
||
retMsg retMsg = new retMsg()
|
||
{
|
||
result = true,
|
||
};
|
||
var client = _systemConfigService.GetClientKey(clientid);
|
||
Log.Information("资源分配执行:" + activeModel.ToJson());
|
||
//不是企微资源 先拦截
|
||
if (activeModel.AssignType != 1)
|
||
{
|
||
Log.Error("非企微资源,先拦截");
|
||
/* cmslog.Reason = "非企微资源,先拦截";
|
||
await _cmsLogRepository.InsertAsync(cmslog);*/
|
||
return retMsg.ToJson();
|
||
//throw new Exception($"非企微资源,先拦截");
|
||
}
|
||
CmsRequestDto cmsRequestDto = new CmsRequestDto()
|
||
{
|
||
appId = activeModel.Appid,
|
||
appUserId = activeModel.Appuserid,
|
||
deptId = activeModel.Deptid,
|
||
};
|
||
var cmsUrl = $"{_systemConfigService.GetSystemConfig().CmsUrl}resource/query/i";
|
||
var cmsData = HttpHelper.PostAjaxData(cmsUrl, cmsRequestDto.ToJson(), Encoding.UTF8);
|
||
cmslog.CmsData = cmsData;
|
||
var cmsModel = JsonHelper.FromJson<CmsResData>(cmsData);
|
||
var innerModel = _mapper.Map<ResAllocationDto, SyncAllocationModel>(activeModel);
|
||
if (cmsModel == null || cmsModel.ret != 0 || cmsModel.data == null)
|
||
{
|
||
// Log.Error($"参数错误,获取不到资源系统信息【{cmsRequestDto.ToJson()}】");
|
||
cmslog.Reason = "参数错误,获取不到资源系统信息";
|
||
await _cmsLogRepository.InsertAsync(cmslog);
|
||
return retMsg.ToJson();
|
||
//throw new Exception($"参数错误,获取不到资源系统信息");
|
||
}
|
||
innerModel.Ch = cmsModel.data.regCampainId;
|
||
innerModel.Unionid = cmsModel.data.unionId;
|
||
innerModel.Resid = cmsModel.data.resid;
|
||
innerModel.CampaignId = cmsModel.data.scene;
|
||
innerModel.Ctime = string.IsNullOrEmpty(cmsModel.data.cTime) ? null : Convert.ToDateTime(cmsModel.data.cTime);
|
||
innerModel.Scene = cmsModel.data.scene;
|
||
innerModel.SceneName = cmsModel.data.sceneName;
|
||
innerModel.SceneType = cmsModel.data.sceneType;
|
||
innerModel.SceneTypeName = cmsModel.data.sceneTypeName;
|
||
var company = await _companyChannelRepository.FirstOrDefaultAsync(p => p.Min <= Convert.ToInt32(innerModel.Ch) && p.Max >= Convert.ToInt32(innerModel.Ch));
|
||
if (company == null)
|
||
{
|
||
cmslog.Reason = $"找不到对应的渠道号{innerModel.Ch}";
|
||
await _cmsLogRepository.InsertAsync(cmslog);
|
||
return retMsg.ToJson();
|
||
//throw new Exception($"找不到对应的渠道号{innerModel.Ch}");
|
||
}
|
||
var syncCode = _basParameterService.GetParameterValue("QiWeiSyncCode");
|
||
if (string.IsNullOrWhiteSpace(syncCode) || !syncCode.Split(',').ToList().Contains(company?.CompanyCode))
|
||
{
|
||
cmslog.Reason = $"没有配置syncCode,【{company.CompanyCode}】已跳过";
|
||
await _cmsLogRepository.InsertAsync(cmslog);
|
||
return retMsg.ToJson();
|
||
}
|
||
var host = _systemConfigService.GetSystemConfig().DataSyncApiUrl;
|
||
var url = host + "/api/DataSync";
|
||
var newcontent = SecurityHelper.EncyptData(innerModel.ToJson(), client.AccessKey);
|
||
var newsign = SecurityHelper.SignData(newcontent, client.AccessKey);
|
||
var para = new SYNC_PUSH_DTO()
|
||
{
|
||
bidatatype = "Client_Res_Allocation",
|
||
deptcode = company?.CompanyCode,
|
||
jsontext = new { content = newcontent, clientid, sign = newsign }.ToJson(),
|
||
isbatch = 1
|
||
};
|
||
var rep = HttpHelper.PostAjaxData(url, para.ToJson(), Encoding.UTF8);
|
||
Log.Information($"请求中心点接口:【{url}】【{para.ToJson()}】返回【{rep}】");
|
||
var ret = JsonHelper.FromJson<retMsg>(rep);
|
||
if (!ret.result)
|
||
{
|
||
Log.Error($"接口 DataSync 写入失败!{ret.retmsg}");
|
||
throw new Exception($"接口 DataSync 写入失败!{ret.retmsg}");
|
||
}
|
||
cmslog.STATUS = 1;
|
||
await _cmsLogRepository.InsertAsync(cmslog);
|
||
return ret.ToJson();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error($"分配资源出错{ex.Message}");
|
||
throw new Exception(ex.Message);
|
||
}
|
||
}
|
||
|
||
#endregion 活动报名
|
||
|
||
public async Task<bool> GetUserCanOpenOrder(CheckUserDTO dto)
|
||
{
|
||
await using var scope = _serviceProvider.CreateAsyncScope();
|
||
var userInfoDomain = scope.ServiceProvider.GetRequiredService<IUserInfoDomain>();
|
||
var zxdRepository = scope.ServiceProvider.GetRequiredService<IBaseRepository<ZxdDbContext>>();
|
||
var userInfoList = await userInfoDomain.GetUserInfoByApi(dto.Appid, dto.Appuserid);
|
||
var canopenorder = false;
|
||
var usernames = userInfoList.Where(x => x.appid == "com.dongniu").Select(x => x.appuserid).ToList();
|
||
if (await zxdRepository.GetRepository<WxCanopenorder>().Query()
|
||
.AnyAsync(x => usernames.Contains(x.Username) && x.Status == 1))
|
||
{
|
||
canopenorder = true;
|
||
}
|
||
|
||
return canopenorder;
|
||
}
|
||
|
||
public async Task<bool> GetUserCanOpenOrderByResid(string? resid)
|
||
{
|
||
if (string.IsNullOrEmpty(resid))
|
||
{
|
||
throw new ApiException("客户id不能为空");
|
||
}
|
||
await using var scope = _serviceProvider.CreateAsyncScope();
|
||
var userInfoDomain = scope.ServiceProvider.GetRequiredService<IUserInfoDomain>();
|
||
var zxdRepository = scope.ServiceProvider.GetRequiredService<IBaseRepository<ZxdDbContext>>();
|
||
var userInfoList = await userInfoDomain.GetUserInfoByApi(resid);
|
||
var canopenorder = false;
|
||
var usernames = userInfoList.Where(x => x.appid == "com.dongniu").Select(x => x.appuserid).ToList();
|
||
if (await zxdRepository.GetRepository<WxCanopenorder>().Query()
|
||
.AnyAsync(x => usernames.Contains(x.Username) && x.Status == 1))
|
||
{
|
||
canopenorder = true;
|
||
}
|
||
|
||
return canopenorder;
|
||
}
|
||
|
||
public async Task<List<UserPassInfo>> GetUserProtectInfo(CheckUserDTO dto)
|
||
{
|
||
Stopwatch stopwatch = new Stopwatch();
|
||
stopwatch.Start();
|
||
var res = new List<UserPassInfo>();
|
||
using var scope = _serviceProvider.CreateAsyncScope();
|
||
var userInfoDomain = scope.ServiceProvider.GetRequiredService<IUserInfoDomain>();
|
||
var resPassRepository = scope.ServiceProvider.GetRequiredService<IRepositoryBase<DncmsbaseDbContext, ResCutomerPassTime>>();
|
||
var userInfoList = await userInfoDomain.GetUserInfoByApi(dto.Appid, dto.Appuserid);
|
||
var resids = userInfoList.Where(n => !string.IsNullOrWhiteSpace(n.resid)).Select(n => n.resid).Distinct().ToList();
|
||
if (resids.Count == 0)
|
||
{
|
||
return res;
|
||
}
|
||
var passTimeInfoList = await resPassRepository.Query().Where(n => resids.Contains(n.RESID)).ToListAsync();
|
||
var deptCodes = passTimeInfoList.GroupBy(n => new { n.Deptid, n.GroupId, n.DeptName }).ToList();
|
||
foreach (var code in deptCodes)
|
||
{
|
||
var passInfo = passTimeInfoList.Where(n => n.Deptid == code.Key.Deptid).ToList();
|
||
var info = new UserPassInfo
|
||
{
|
||
DeptId = code.Key.Deptid,
|
||
GroupId = code.Key.GroupId,
|
||
DeptName = code.Key.DeptName,
|
||
OrderPassTime = passInfo.Max(n => n.orderpasstime),
|
||
ProtectTime = passInfo.Max(n => n.protecttime),
|
||
FirstPayTime = passInfo.Min(n => n.firstPayTime),
|
||
ArrivePrice = passInfo.Sum(n => n.arrivalpay),
|
||
RefundPrice = passInfo.Sum(n => n.refundpay),
|
||
InCome = passInfo.Sum(n => n.inpay),
|
||
BalancePay = passInfo.Sum(n => n.balancepay)
|
||
};
|
||
info.IsProtect = info.ProtectTime == null || info.ProtectTime < DateTime.Now ? false : true;
|
||
res.Add(info);
|
||
}
|
||
|
||
stopwatch.Stop();
|
||
Log.Warning($"GetUserProtectInfo:{stopwatch.ElapsedMilliseconds}");
|
||
return res;
|
||
}
|
||
|
||
/// <summary>
|
||
/// </summary>
|
||
/// <param name="timeJavaLong">java长整型日期,毫秒为单位</param>
|
||
/// <returns></returns>
|
||
private DateTime JavaLongToDateTime(long timeJavaLong)
|
||
{
|
||
var dt1970 = new DateTime(1970, 1, 1, 0, 0, 0);
|
||
var tricks1970 = dt1970.Ticks;//1970年1月1日刻度
|
||
var timeTricks = tricks1970 + timeJavaLong * 10000;//日志日期刻度
|
||
return new DateTime(timeTricks).AddHours(8);//转化为DateTime
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public async Task InitUserProtect(int type)
|
||
{
|
||
//var orderList = await _repository.GetRepository<res_>().Query().Where(n => !string.IsNullOrWhiteSpace(n.activeproductext)).ToListAsync();
|
||
|
||
var passTimeInfoList = await _resPassRepository.Query().Select(n => n.RESID).Distinct().ToListAsync();
|
||
foreach (var passInfo in passTimeInfoList)
|
||
{
|
||
Log.Information($"更新订单【{passInfo}】");
|
||
var url = "http://120.77.165.155:8089/Api/Customer/initCustomerPasstime";
|
||
var postData = new
|
||
{
|
||
resId = string.Join(",", passInfo)
|
||
};
|
||
Log.Information($"初始化【{postData.ToJson()}】条数据");
|
||
var sss = HttpHelper.PostAjaxData(url, postData.ToJson(), Encoding.UTF8);
|
||
}
|
||
|
||
/*Log.Information($"L2_SOFT_ORDER开始处理");
|
||
var orderList = await _repository.GetRepository<WX_SZZYORDER>().Query().Where(n => !string.IsNullOrWhiteSpace(n.activeproductext)).ToListAsync();
|
||
Log.Information($"orderList {orderList.Count}");
|
||
var resids = orderList.Select(n => n.RESID).Distinct().ToList();
|
||
var freeList = await _repository.GetRepository<L2_SOFT_ORDER>().Query().Where(n => (!string.IsNullOrWhiteSpace(n.WEBORDERID) && !n.MainOrderId.HasValue && resids.Contains(n.RESID)) || n.ORDERTYPE == 4).ToListAsync();
|
||
Log.Information($"L2_SOFT_ORDER {freeList.Count}");
|
||
foreach (var order in freeList)
|
||
{
|
||
Log.Information($"找到免费订单 【{order.ORDERID}】【{order.WEBORDERID}】");
|
||
var ss = orderList.FirstOrDefault(n => n.activeproductext.Contains(order.WEBORDERID));
|
||
if (ss != null)
|
||
{
|
||
Log.Information($"刷新订单【{order.ORDERID}】【{ss.ORDERID}】");
|
||
order.MainOrderId = ss.ORDERID;
|
||
order.sourcetype = 4;
|
||
order.ORDERTYPE = 1;
|
||
order.deptid = ss.Deptid;
|
||
order.deptName = ss.DeptName;
|
||
order.groupid = ss.GroupId;
|
||
await _repository.GetRepository<L2_SOFT_ORDER>().UpdateAsync(order);
|
||
Log.Information($"更新订单【{order.ORDERID}】【{ss.ORDERID}】");
|
||
var url = "http://120.77.165.155:8089/Api/Customer/initCustomerPasstime";
|
||
var postData = new
|
||
{
|
||
resId = string.Join(",", order.RESID)
|
||
};
|
||
Log.Information($"初始化【{postData.ToJson()}】条数据");
|
||
var sss = HttpHelper.PostAjaxData(url, postData.ToJson(), Encoding.UTF8);
|
||
}
|
||
}*/
|
||
}
|
||
|
||
public async Task<List<UserPassInfo>> GetSoftUserByResid(string resid)
|
||
{
|
||
List<UserPassInfo> res = new List<UserPassInfo>();
|
||
var resids = resid.Split(",").ToList();
|
||
if (resids.Count == 0)
|
||
{
|
||
return res;
|
||
}
|
||
var customerQuery = _customerRepository.Query();
|
||
var allresid = (from a in customerQuery
|
||
join b in customerQuery on a.CUSTOMERID equals b.CUSTOMERID
|
||
where resids.Contains(b.RESID)
|
||
select a.RESID).ToList();
|
||
var passTimeInfoList = await _resPassRepository.Query().Where(n => allresid.Contains(n.RESID)).ToListAsync();
|
||
var deptCodes = passTimeInfoList.GroupBy(n => new { n.Deptid, n.GroupId, n.DeptName }).ToList();
|
||
foreach (var code in deptCodes)
|
||
{
|
||
var passInfo = passTimeInfoList.Where(n => n.Deptid == code.Key.Deptid).ToList();
|
||
UserPassInfo info = new UserPassInfo
|
||
{
|
||
DeptId = code.Key.Deptid,
|
||
GroupId = code.Key.GroupId,
|
||
DeptName = code.Key.DeptName,
|
||
OrderPassTime = passInfo.Max(n => n.orderpasstime),
|
||
ProtectTime = passInfo.Max(n => n.protecttime),
|
||
FirstPayTime = passInfo.Min(n => n.firstPayTime),
|
||
ArrivePrice = passInfo.Sum(n => n.arrivalpay),
|
||
RefundPrice = passInfo.Sum(n => n.refundpay),
|
||
InCome = passInfo.Sum(n => n.inpay),
|
||
BalancePay = passInfo.Sum(n => n.balancepay)
|
||
};
|
||
info.IsProtect = info.ProtectTime == null || info.ProtectTime < DateTime.Now ? false : true;
|
||
res.Add(info);
|
||
}
|
||
return res;
|
||
}
|
||
|
||
public async Task<ResourcePassTime> GetResoucePassTime(CheckUserDTO dto)
|
||
{
|
||
ResourcePassTime res = new ResourcePassTime();
|
||
using var scope = _serviceProvider.CreateAsyncScope();
|
||
var userInfoDomain = scope.ServiceProvider.GetRequiredService<IUserInfoDomain>();
|
||
var sourcePassRepository = scope.ServiceProvider.GetRequiredService<IRepositoryBase<DncmsbaseDbContext, ResourceProtectInfo>>();
|
||
var basParameterService = scope.ServiceProvider.GetRequiredService<IBasParameterDomain>();
|
||
|
||
var userInfoList = await userInfoDomain.GetUserInfoByApi(dto.Appid, dto.Appuserid);
|
||
var uidfilter = userInfoList.Where(n => !string.IsNullOrWhiteSpace(n.uid)).Select(n => Convert.ToInt32(n.uid)).Distinct().ToList();
|
||
var sourcepassList = await sourcePassRepository.Query().Where(n => uidfilter.Contains(n.uid)).ToListAsync();
|
||
var parakey = basParameterService.GetParameterValue("InComeResourceSetting");
|
||
if (string.IsNullOrWhiteSpace(parakey))
|
||
{
|
||
throw new Exception("没找到相关的资源保护期过期配置InComeResourceSetting");
|
||
}
|
||
var setting = JsonHelper.FromJson<resoucePassSetting>(parakey);
|
||
sourcepassList = sourcepassList.Where(n => n.deptid.HasValue && setting.deptids.Contains(n.deptid.Value)).ToList();
|
||
if (sourcepassList.Count == 0)
|
||
{
|
||
return res;
|
||
}
|
||
//最早注册时间
|
||
var regData = sourcepassList.Where(n => n.regtime.HasValue).OrderBy(n => n.regtime).FirstOrDefault();
|
||
res.Regtime = regData?.regtime;
|
||
//最早关注事业部
|
||
var firstFollow = sourcepassList.Where(n => n.firstfollowtime.HasValue).OrderBy(n => n.firstfollowtime).FirstOrDefault();
|
||
res.FirstFollowTime = firstFollow?.firstfollowtime;
|
||
//仍在关注的最早事业部
|
||
var nowFollow = sourcepassList.Where(n => n.followtime.HasValue).OrderBy(n => n.followtime).FirstOrDefault();
|
||
res.FollowTime = nowFollow?.firstfollowtime;
|
||
//判断最早加好友时间 是否大于注册时间
|
||
var type = "follow";
|
||
if (res.Regtime.HasValue)
|
||
{
|
||
type = !res.FirstFollowTime.HasValue ? "reg" : res.Regtime < res.FirstFollowTime ? "reg" : "follow";
|
||
}
|
||
if (type == "reg")
|
||
{
|
||
res.ProtectTime = res.Regtime.Value.AddDays(setting.protectday);
|
||
}
|
||
else
|
||
{
|
||
res.ProtectTime = res.FirstFollowTime.Value.AddDays(setting.protectday);
|
||
}
|
||
//有关注 取 还在关注状态下的部门 否则不保护
|
||
if (nowFollow != null)
|
||
{
|
||
res.DeptId = nowFollow.deptid;
|
||
res.DeptName = nowFollow.deptname;
|
||
res.IsProtect = res.ProtectTime == null || res.ProtectTime < DateTime.Now ? false : true;
|
||
}
|
||
return res;
|
||
}
|
||
|
||
public async Task<ResourcePassTime> GetResoucePassTimeBySql(CheckUserDTO dto)
|
||
{
|
||
Stopwatch stopWatch = new Stopwatch();
|
||
stopWatch.Start();
|
||
ResourcePassTime res = new ResourcePassTime();
|
||
using var scope = _serviceProvider.CreateAsyncScope();
|
||
var userInfoDomain = scope.ServiceProvider.GetRequiredService<IUserInfoDomain>();
|
||
var cmsrepository = scope.ServiceProvider.GetRequiredService<IBaseRepository<DncmsbaseDbContext>>();
|
||
var dbcmsrepository = scope.ServiceProvider.GetRequiredService<IBaseRepository<DncmsDbContext>>();
|
||
var setting = new resoucePassSetting(); //写死保护期30 和对应部门
|
||
|
||
var deptidFilter = string.Join(",", setting.deptids);
|
||
var userInfoList = await userInfoDomain.GetUserInfoByApi(dto.Appid, dto.Appuserid);
|
||
var externaluserid = userInfoList.Select(n => $"'{n.appuserid}'").Distinct().ToList();
|
||
if (externaluserid.Count == 0)
|
||
{
|
||
res.content = $"用户中心找不到对应的用户{dto.Appid}【{dto.Appuserid}】";
|
||
Log.Error($"{res.content}");
|
||
return res;
|
||
}
|
||
var exteruserfilter = string.Join(",", externaluserid);
|
||
MySqlParameter[] param = new MySqlParameter[] { };
|
||
//取所有的好友关系 按照事业部分组
|
||
var sql = $@"SELECT a.deptid,regdate as ctime,ctime as firsttime,a.subscribe,a.first_unsubscribe_time as unsubscribe_time,d.title,d.campainid,a.externaluserid FROM dncms.weworkexternaluser AS a
|
||
JOIN dncmsbase.Deptment d on a.deptid = d.id
|
||
WHERE a.`deptid` IN ({deptidFilter}) and a.externaluserid in ({exteruserfilter})";
|
||
var extUserList = await dbcmsrepository.ExecuteSqlToListAsync<ExternaluserModel>(sql, param);
|
||
extUserList = extUserList.OrderBy(n => n.firsttime).ToList();
|
||
//首次关注时间
|
||
var firstFollow = extUserList.FirstOrDefault();
|
||
res.FirstFollowTime = firstFollow?.firsttime;
|
||
//取当前仍在关注状态的最早的事业部作为保护事业部
|
||
var follow = extUserList.Where(n => n.subscribe == 1).GroupBy(n => new { n.deptid, n.title, n.campainid }).Select(n => new { deptid = n.Key.deptid, deptname = n.Key.title, channel = n.Key.campainid, ctime = n.Min(x => x.ctime) }).OrderBy(n => n.ctime).FirstOrDefault();
|
||
res.FollowTime = follow?.ctime;
|
||
//取软件注册时间
|
||
var softusersql = $@" select a.*,d.title,d.campainid from (SELECT a.deptid,MIN(a.regdate) as ctime FROM dncmsbase.accountsoftuser AS a where
|
||
a.userid in ({exteruserfilter}) AND a.`deptid` IN ({deptidFilter})
|
||
GROUP BY a.deptid)a
|
||
JOIN dncmsbase.Deptment d on a.deptid = d.id ";
|
||
var softPassModel = await cmsrepository.ExecuteSqlToListAsync<SoftPassModel>(softusersql, param);
|
||
var register = softPassModel.OrderBy(n => n.ctime).FirstOrDefault();
|
||
res.Regtime = register?.ctime;
|
||
var type = "follow";
|
||
var content = "";
|
||
if (res.Regtime.HasValue)
|
||
{
|
||
type = !res.FirstFollowTime.HasValue ? "reg" : res.Regtime < res.FirstFollowTime ? "reg" : "follow";
|
||
}
|
||
if (type == "reg")
|
||
{
|
||
res.ProtectTime = res.Regtime.Value.AddDays(setting.protectday);
|
||
content += $"最早注册时间【{res.Regtime}】";
|
||
//有关注 取 还在关注状态下的部门 否则不保护
|
||
res.IsProtect = res.ProtectTime == null || res.ProtectTime < DateTime.Now ? false : true;
|
||
if (res.IsProtect.Value)
|
||
{
|
||
var nowDept = extUserList.Where(n => n.deptid == register.deptid).OrderBy(n => n.ctime).FirstOrDefault();
|
||
//该客户只注册这个渠道未加该渠道对应销售的企微好友,保护期依然是该渠道的
|
||
if (nowDept == null)
|
||
{
|
||
content += $"未加本事业部【{register?.title}】好友";
|
||
res.DeptId = register.deptid;
|
||
res.DeptName = register.title;
|
||
res.channel = register.campainid;
|
||
}
|
||
content += $"=>初步确认归属【{register?.ctime}】【{register?.title}】";
|
||
res.DeptId = register.deptid;
|
||
res.DeptName = register.title;
|
||
res.channel = register.campainid;
|
||
List<string> extuserpass = new List<string>();
|
||
while (nowDept != null)
|
||
{
|
||
extuserpass.Add(nowDept.externaluserid);
|
||
if (nowDept.subscribe == 1)
|
||
{
|
||
content += $"=>再次确认归属【{nowDept.ctime}】【{nowDept.title}】";
|
||
res.DeptId = nowDept.deptid;
|
||
res.DeptName = nowDept.title;
|
||
res.channel = nowDept.campainid;
|
||
break;
|
||
}
|
||
content += $"=>寻找好友关系【{nowDept.ctime}】【{nowDept.title}】";
|
||
if (nowDept.subscribe != 1)
|
||
{
|
||
content += $"【{nowDept.unsubscribe_time}取关】";
|
||
nowDept = extUserList.FirstOrDefault(n => n.ctime >= nowDept.unsubscribe_time && !extuserpass.Contains(n.externaluserid));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (res.FirstFollowTime.HasValue)
|
||
{
|
||
res.ProtectTime = res.FirstFollowTime.Value.AddDays(setting.protectday);
|
||
content += $"最早关注时间【{res.FirstFollowTime}】";
|
||
//有关注 取 还在关注状态下的部门 否则不保护
|
||
res.IsProtect = res.ProtectTime == null || res.ProtectTime < DateTime.Now ? false : true;
|
||
if (res.IsProtect.Value)
|
||
{
|
||
var nowDept = firstFollow;
|
||
content += $"=>初步确认归属【{nowDept.ctime}】【{nowDept.title}】";
|
||
res.DeptId = nowDept?.deptid;
|
||
res.DeptName = nowDept?.title;
|
||
res.channel = nowDept?.campainid;
|
||
List<string> extuserpass = new List<string>();
|
||
while (nowDept != null)
|
||
{
|
||
extuserpass.Add(nowDept.externaluserid);
|
||
if (nowDept.subscribe == 1)
|
||
{
|
||
content += $"=>再次确认归属【{nowDept.ctime}】【{nowDept.title}】";
|
||
res.DeptId = nowDept.deptid;
|
||
res.DeptName = nowDept.title;
|
||
res.channel = nowDept.campainid;
|
||
break;
|
||
}
|
||
content += $"=>寻找好友关系【{nowDept.ctime}】【{nowDept.title}】";
|
||
if (nowDept.subscribe != 1)
|
||
{
|
||
content += $"【{nowDept.unsubscribe_time}】取关";
|
||
nowDept = extUserList.FirstOrDefault(n => n.ctime >= nowDept.unsubscribe_time && !extuserpass.Contains(n.externaluserid));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
res.content = content;
|
||
stopWatch.Stop();
|
||
Log.Warning($"GetResoucePassTimeBySql:{stopWatch.ElapsedMilliseconds}");
|
||
return res;
|
||
}
|
||
|
||
private async Task<List<UserModuleModel>> GetRootPassTime(string username)
|
||
{
|
||
List<UserModuleModel> res = new List<UserModuleModel>();
|
||
var url = $"https://r2.soft.dn8188.com/order/doGetUserPerssion";
|
||
var postJson = new
|
||
{
|
||
username = username
|
||
};
|
||
try
|
||
{
|
||
var data = await _httpClient.PostAsync<UserModuleApiModel>(url, postJson);
|
||
if (data.ret == 0)
|
||
{
|
||
foreach (var item in data.moduelData)
|
||
{
|
||
try
|
||
{
|
||
res.AddRange(item.Value);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error($"【{username}】接口获取权限数据失败{ex.Message}【{item.Value}】");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Log.Error($"【{username}】接口获取权限数据失败{ex.Message}");
|
||
}
|
||
return res;
|
||
}
|
||
|
||
public async Task<SoftUserNameDetailModel> GetSoftUserDetail(string softUserName)
|
||
{
|
||
SoftUserNameDetailModel model = new SoftUserNameDetailModel();
|
||
var orderList = _repository.GetRepository<WX_SZZYORDER>().Query().Where(n => n.SOFTUSERNAME == softUserName).ToList();
|
||
var passList = await GetRootPassTime(softUserName);
|
||
foreach (var order in orderList)
|
||
{
|
||
var pass = passList.Where(n => n.orderid == order.SZZYORDERID.ToString()).ToList();
|
||
if (pass != null)
|
||
{
|
||
var longStartTime = pass.Min(n => n.start);
|
||
var longEndTime = pass.Max(n => n.end);
|
||
|
||
OrderDetail orderDetail = new OrderDetail()
|
||
{
|
||
OrderId = order.ORDERID,
|
||
SzzyorderId = order.SZZYORDERID,
|
||
ProductCode = order.PRODUCTCODE,
|
||
ProductName = order.PRODUCTNAME,
|
||
Remark = "正价单"
|
||
};
|
||
if (longStartTime.HasValue)
|
||
{
|
||
orderDetail.StartTime = JavaLongToDateTime(longStartTime.Value);
|
||
}
|
||
if (longEndTime.HasValue)
|
||
{
|
||
orderDetail.EndTime = JavaLongToDateTime(longEndTime.Value);
|
||
}
|
||
model.OrderInfo.Add(orderDetail);
|
||
if (!string.IsNullOrEmpty(order.activeproductext))
|
||
{
|
||
var activeProductExt = JsonHelper.FromJson<List<ActiveProduct>>(order.activeproductext);
|
||
foreach (var product in activeProductExt)
|
||
{
|
||
pass = passList.Where(n => n.orderid == product.SzzyOrderId.ToString()).ToList();
|
||
if (pass != null)
|
||
{
|
||
longStartTime = pass.Min(n => n.start);
|
||
longEndTime = pass.Max(n => n.end);
|
||
OrderDetail chDetail = new OrderDetail()
|
||
{
|
||
OrderId = order.ORDERID,
|
||
SzzyorderId = product.SzzyOrderId,
|
||
ProductCode = product.ActiveProductCode,
|
||
ProductName = product.ActiveProductName,
|
||
Remark = "正价单(赠送)"
|
||
};
|
||
if (longStartTime.HasValue)
|
||
{
|
||
chDetail.StartTime = JavaLongToDateTime(longStartTime.Value);
|
||
}
|
||
if (longEndTime.HasValue)
|
||
{
|
||
chDetail.EndTime = JavaLongToDateTime(longEndTime.Value);
|
||
}
|
||
model.OrderInfo.Add(chDetail);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
model.MaxRootTime = model.OrderInfo.Max(n => n.EndTime);
|
||
if (model.MaxRootTime.HasValue)
|
||
{
|
||
model.canopen = model.MaxRootTime.Value > Convert.ToDateTime("2023-11-09");
|
||
}
|
||
|
||
return model;
|
||
}
|
||
}
|
||
} |