Zxd.Core/code/Zxd.Domain/ReSourceDomain.cs

922 lines
45 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 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;
}
}
}