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 _companyChannelRepository; private readonly IBaseRepository _repository; private readonly IRepositoryBase _resourcemobileRepository; private readonly IRepositoryBase _customeruserRepository; private readonly IRepositoryBase _cmsLogRepository; private readonly IRepositoryBase _customerRepository; private readonly IBaseRepository _cmsrepository; private readonly IRepositoryBase _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 repository, IBaseRepository crmrepository, IRegUserDomain reguserService, IBasParameterDomain basParameterService, ISystemConfigDomain systemConfigService, IBaseRepository cmsrepository, IBaseRepository dbcmsrepository, IResCustomerDomain resCustomerService, IMapper mapper, IUserInfoDomain userInfoDomain, IHttpClient httpClient) { _httpClient = httpClient; _serviceProvider = serviceProvider; _reguserService = reguserService; _repository = repository; _cmsrepository = cmsrepository; _companyChannelRepository = _repository.GetRepository(); _resourcemobileRepository = _repository.GetRepository(); _customeruserRepository = _repository.GetRepository(); _cmsLogRepository = _repository.GetRepository(); _basParameterService = basParameterService; _customerRepository = _repository.GetRepository(); _resPassRepository = _cmsrepository.GetRepository(); _mapper = mapper; _systemConfigService = systemConfigService; _resCustomerService = resCustomerService; _httpClient = httpClient; } #region 注册同步 public async Task 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(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; } /// /// /// /// 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(rep); if (!ret.result) Log.Error("接口 SoftUserRegisterEventHandler 写入失败!"); } catch (Exception ex) { Log.Error(ex.ToString()); } } #endregion 注册同步 #region 活动报名 /// /// 用户活动申请 /// /// /// /// /// public async Task 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(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() { "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(rep); if (!ret.result) Log.Error("接口 JoinActiveAllDeptEventHandler 写入失败!"); } } catch (Exception ex) { Log.Error(ex.ToString()); } } /// /// 资源分配接口 /// /// /// public async Task 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(cmsData); var innerModel = _mapper.Map(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(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 GetUserCanOpenOrder(CheckUserDTO dto) { await using var scope = _serviceProvider.CreateAsyncScope(); var userInfoDomain = scope.ServiceProvider.GetRequiredService(); var zxdRepository = scope.ServiceProvider.GetRequiredService>(); 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().Query() .AnyAsync(x => usernames.Contains(x.Username) && x.Status == 1)) { canopenorder = true; } return canopenorder; } public async Task GetUserCanOpenOrderByResid(string? resid) { if (string.IsNullOrEmpty(resid)) { throw new ApiException("客户id不能为空"); } await using var scope = _serviceProvider.CreateAsyncScope(); var userInfoDomain = scope.ServiceProvider.GetRequiredService(); var zxdRepository = scope.ServiceProvider.GetRequiredService>(); 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().Query() .AnyAsync(x => usernames.Contains(x.Username) && x.Status == 1)) { canopenorder = true; } return canopenorder; } public async Task> GetUserProtectInfo(CheckUserDTO dto) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var res = new List(); using var scope = _serviceProvider.CreateAsyncScope(); var userInfoDomain = scope.ServiceProvider.GetRequiredService(); var resPassRepository = scope.ServiceProvider.GetRequiredService>(); 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; } /// /// /// java长整型日期,毫秒为单位 /// 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 } /// /// /// /// public async Task InitUserProtect(int type) { //var orderList = await _repository.GetRepository().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().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().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().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> GetSoftUserByResid(string resid) { List res = new List(); 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 GetResoucePassTime(CheckUserDTO dto) { ResourcePassTime res = new ResourcePassTime(); using var scope = _serviceProvider.CreateAsyncScope(); var userInfoDomain = scope.ServiceProvider.GetRequiredService(); var sourcePassRepository = scope.ServiceProvider.GetRequiredService>(); var basParameterService = scope.ServiceProvider.GetRequiredService(); 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(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 GetResoucePassTimeBySql(CheckUserDTO dto) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); ResourcePassTime res = new ResourcePassTime(); using var scope = _serviceProvider.CreateAsyncScope(); var userInfoDomain = scope.ServiceProvider.GetRequiredService(); var cmsrepository = scope.ServiceProvider.GetRequiredService>(); var dbcmsrepository = scope.ServiceProvider.GetRequiredService>(); 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(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(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 extuserpass = new List(); 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 extuserpass = new List(); 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> GetRootPassTime(string username) { List res = new List(); var url = $"https://r2.soft.dn8188.com/order/doGetUserPerssion"; var postJson = new { username = username }; try { var data = await _httpClient.PostAsync(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 GetSoftUserDetail(string softUserName) { SoftUserNameDetailModel model = new SoftUserNameDetailModel(); var orderList = _repository.GetRepository().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>(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; } } }