using Api.Framework; using Api.Framework.EntityTmp.Douyin; using Api.Framework.Enums; using Api.Framework.Events; using Api.Framework.Model; using Api.Framework.SDK; using Api.Framework.Timers; using Api.Framework.Tools; using Api.Framework.Utils; using CsharpHttpHelper; using DYRebate.Entitys; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using Api.Framework.Cps; using static DYRebate.Class1; namespace DYRebate { public class MessageOperation { ReciveIMEvent e = null; Class1 plugin = null; object sender = null; public MessageOperation(object sender, ReciveIMEvent e, Class1 plugin) { this.e = e; this.plugin = plugin; this.sender = sender; } #region 订单绑定 public bool BindOrderId() { try { #region 抖音订单绑定 var orderid = e.Message.Trim(); #region 消息为订单类型 if (Regex.IsMatch(orderid, @"^\d{19}$")) { var oid = long.Parse(orderid); if (oid < 4000000000000000000) { return false; } var db = ApiClient.GetSession(); var dy_orders_temp = db.Find("select * from fl_order_douyin where order_id = @order_id", new { order_id = orderid }); var memberTmp = e.GetMemberinfo(); if (dy_orders_temp != null && dy_orders_temp.Count != 0) { var member = dy_orders_temp.FirstOrDefault(f => f.db_userid != 0 && f.db_userid != memberTmp.id); if (member != null) { //订单已经被他人绑定 e.SendMessage(Class1.Config.OccupyOrderErrorTip.Replace("[订单号]", orderid)); return true; } var notices = new List(); var downDyTimer = new DownDouyinTimer(); #region 订单用户已经绑定 纯提示,非结算的订单也提示上级 var bindOrders = dy_orders_temp.Where(f => f.db_userid != 0).ToList(); if (bindOrders != null && bindOrders.Count != 0) { foreach (var order in bindOrders) { var point = HttpHelper.JsonToObject(order.db_point) as ItemPoint; memberTmp = e.GetMemberinfo(true); if (order.db_status == SystemOrderStatus.订单付款) e.SendMessage(new VariateReplace().CommonReplace(Class1.Config.OrderRepetBindTip, order, memberTmp, point)); else e.SendMessage(Class1._GetOrderStateMess(order.db_status, (order.db_status == SystemOrderStatus.订单结算 ? SettleType.已结算提示 : SettleType.未结算提示), order, memberTmp, point)); Thread.Sleep(500); } //return; } #endregion #region 订单没有被绑定(两种情况 => 一个订单已经被结算 一个是订单未结算) var notBindOrders = dy_orders_temp.Where(f => f.db_userid == 0).ToList(); if (notBindOrders != null && notBindOrders.Count != 0) { if (HttpExtend.GetDateTime(notBindOrders[0].pay_time.ToString()) < ApiClient.Setting.SystemConfig.allow_bind_create_order_time) { e.SendMessage($"订单:{orderid},已经过了有效绑定时间!"); return true; } foreach (var order in notBindOrders) { if (order.db_status == SystemOrderStatus.订单结算) order.db_endtime = DateTime.Now.AddMinutes(-5);//重新结算的话,需要将订单的冻结时间重新赋值,让后台处理 //没有绑定用户的订单进行绑定 order.db_userid = memberTmp.id; order.db_robotname = e.RobotName; order.db_robottype = e.RobotInfo.type; order.msg_groupid = e.Groupid; #region 手动绑定,重新计算用户的返利积分 //查询历史查询比例 var compute = db.FindQueryRatioHist(CpsType.抖音联盟, order.id); if (compute == null) { var query_item = db.FindSingle("select * from fl_query_hist where userid = @userid and itemid = @itemid and adzoneid = @adzoneid order by id desc", new { userid = e.GetMemberinfo().id, itemid = order.product_id, adzoneid = order.db_cpsname }); //计算公式不为空 if (query_item != null && !string.IsNullOrWhiteSpace(query_item.compute_configdic)) { try { compute = JsonConvert.DeserializeObject(query_item.compute_configdic); var queryRatioHist = new fl_query_ratio_hist() { compute_config = query_item.compute_configdic, db_orderid = order.id, createtime = DateTime.Now, cpstype = CpsType.抖音联盟 }; db.SaveOrUpdate(queryRatioHist); } catch (Exception ex) { EventClient.OnEvent("抖音计算", $"获取历史查询比异常:{ex.Message}"); } } } ItemPoint itempoint = null; //计算的佣金 if (compute != null) itempoint = db.FindItemPoint(CpsType.抖音联盟, compute, Util.ConvertDouble_FenToYuan(order.estimated_comission), 1); else itempoint = db.FindItemPoint(memberTmp, Util.ConvertDouble_FenToYuan(order.estimated_comission), 1, CpsType.抖音联盟); if (itempoint != null) { order.db_point = HttpHelper.ObjectToJson(itempoint); order.db_userpoint = itempoint.UserPoint; } #endregion #region 用户的完成订单数量加1 if (memberTmp != null) { memberTmp.bind_order++; memberTmp = db.UpdateMemberGroup(memberTmp); } #endregion #region 首次付款时间 var record = db.FindStatisticsRecord(memberTmp.id); if (record == null) { record = new fl_statistics_record() { uid = memberTmp.id, ex2 = 0, ex4 = HttpExtend.GetTimeStamp(DateTime.Now) }; db.Saveable(record).ExecuteCommand(); } else { if (record.ex2 == 0 && record.ex4 == 0) { record.ex4 = HttpExtend.GetTimeStamp(DateTime.Now); db.Saveable(record).ExecuteCommand(); } } #endregion db.SaveOrUpdate(order); downDyTimer.UpdateOrder(order, notices, db, isFrontData: true); } } #endregion #region 触发通知上级获得下级的提成奖励 if (!ApiClient.Setting.SystemConfig.message_warning_switch && notices.Count != 0) { var tasks = TimerTask.GetTimer() as Update_NoticeQueue; foreach (var item in notices) { //if (item.IsRewards) tasks.Add(item); //else //plugin.SDK_OrderNoticeEvent(this, item); } } #endregion } else { #region 未找到订单,提示用户并且加入绑定缓存中 e.SendMessage(Class1.Config.NotFoundOrderErrorTip.Replace("[订单号]", orderid)); var bind = db.FindBindCache(orderid); if (bind == null) { db.Insertable(new fl_bind_cache() { crt_time = DateTime.Now, db_robotid = e.RobotInfo.id, orderid = orderid, groupid = e.Groupid, db_userid = memberTmp.id }).ExecuteCommand(); db.FindBindCache(orderid, true); } #endregion } //消息已经处理完成,将不往后面的插件传递 e.Cancel = true; return true; } #endregion //判断消息是否是其他cps平台的订单号 if (OrderHelper.IsOrderId(e.Message.Trim())) return true; #endregion } catch (Exception ex) { plugin.OnLog($"手动绑定订单号异常:{ex.Message}_{ex.StackTrace}"); } return false; } #endregion /// /// 抖客判断 /// /// public CpsInfo DouKe() { try { var db = ApiClient.GetSession(); var dkefoTemps = db.FindDkInfoTempGroups(); var dyInfoTemp = dkefoTemps.FirstOrDefault(f => f.name == e.RobotInfo.name && f.onoff == false); if (dyInfoTemp == null) { return null; } var memberTmp = e.GetMemberinfo(); //推广位 var pid = string.Empty; fl_cps_member dy_cps = null; var isDefault = true; if (!string.IsNullOrWhiteSpace(e.Groupid))//群pid { var groupAdzone = db.FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.抖客联盟 && f.custom_type == PrivateAdzoneCustomType.群pid.ToString() && f.group_id == e.Groupid); if (groupAdzone != null && !string.IsNullOrWhiteSpace(groupAdzone.adzone_pid)) { pid = groupAdzone.adzone_pid; dy_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.抖客联盟 && f.username == groupAdzone.adzone_pid_cps_name); isDefault = false; } } if (isDefault)//私人pid { var memberAdzone = db.FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.抖客联盟 && f.custom_type == PrivateAdzoneCustomType.用户私人pid.ToString() && f.member_id == memberTmp.id); if (memberAdzone != null && !string.IsNullOrWhiteSpace(memberAdzone.adzone_pid))//私人推广位 { pid = memberAdzone.adzone_pid; dy_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.抖客联盟 && f.username == memberAdzone.adzone_pid_cps_name); isDefault = false; } } if (isDefault)//默认推广位 { dy_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.抖客联盟 && f.username == ((memberTmp.buy_point >= Class1.Config.Point && memberTmp.finish_order >= Class1.Config.OrderNum) ? dyInfoTemp.pid_chief_cps_name : dyInfoTemp.pid_deputy_cps_name));//通过判断用户的购物积分,来判断用户使用哪个推广位 pid = ((memberTmp.buy_point >= Class1.Config.Point && memberTmp.finish_order >= Class1.Config.OrderNum) ? dyInfoTemp.pid_chief : dyInfoTemp.pid_deputy); } if (dy_cps == null) { throw new Exception("抖音推广位设置异常,请检测后重试!"); } var api = CpsClient.CreateDouyinRequestV3(dy_cps); if (api == null) { throw new Exception("@创建抖音API请求失败"); } return new CpsInfo() { api = api, DyCps = dy_cps, Pid = pid }; } catch (Exception ex) { this.plugin.OnLog("抖客判断" + ex.Message); } return null; } /// /// 达人判断 /// /// public CpsInfo DaRen() { try { var db = ApiClient.GetSession(); var dyinfoTemps = db.FindDyInfoTempGroups(); var dyInfoTemp = dyinfoTemps.FirstOrDefault(f => f.name == e.RobotInfo.name && f.onoff == false); if (dyInfoTemp == null) { return null; } var memberTmp = e.GetMemberinfo(); //推广位 var pid = string.Empty; fl_cps_member dy_cps = null; var isDefault = true; if (!string.IsNullOrWhiteSpace(e.Groupid))//群pid { var groupAdzone = db.FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.抖音联盟 && f.custom_type == PrivateAdzoneCustomType.群pid.ToString() && f.group_id == e.Groupid); if (groupAdzone != null && !string.IsNullOrWhiteSpace(groupAdzone.adzone_pid)) { pid = groupAdzone.adzone_pid; dy_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.抖音联盟 && f.username == groupAdzone.adzone_pid_cps_name); isDefault = false; } } if (isDefault)//私人pid { var memberAdzone = db.FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.抖音联盟 && f.custom_type == PrivateAdzoneCustomType.用户私人pid.ToString() && f.member_id == memberTmp.id); if (memberAdzone != null && !string.IsNullOrWhiteSpace(memberAdzone.adzone_pid))//私人推广位 { pid = memberAdzone.adzone_pid; dy_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.抖音联盟 && f.username == memberAdzone.adzone_pid_cps_name); isDefault = false; } } if (isDefault)//默认推广位 { dy_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.抖音联盟 && f.username == ((memberTmp.buy_point >= Class1.Config.Point && memberTmp.finish_order >= Class1.Config.OrderNum) ? dyInfoTemp.pid_chief_cps_name : dyInfoTemp.pid_deputy_cps_name));//通过判断用户的购物积分,来判断用户使用哪个推广位 pid = ((memberTmp.buy_point >= Class1.Config.Point && memberTmp.finish_order >= Class1.Config.OrderNum) ? dyInfoTemp.pid_chief : dyInfoTemp.pid_deputy); } if (dy_cps == null) { throw new Exception("抖音推广位设置异常,请检测后重试!"); } var api = CpsClient.CreateDouyinRequest(dy_cps); if (api == null) { throw new Exception("@创建抖音API请求失败"); } return new CpsInfo() { DyCps = dy_cps, Pid = pid, api = api }; } catch (Exception ex) { this.plugin.OnLog("达人判断" + ex.Message); } return null; } public bool AnalyseFanLi() { var cpsInfo = DouKe(); if (cpsInfo != null) { var douke = new DouKeHandle(sender, e, this.plugin); var flag = douke.Invok(cpsInfo); return flag; } cpsInfo = DaRen(); if (cpsInfo != null) { var douke = new DaRenHandle(sender, e, this.plugin); var flag = douke.Invok(cpsInfo); return flag; } return false; } } public class CpsInfo { public BaseCpsApi api { get; set; } public fl_cps_member DyCps { get; set; } public string Pid { get; set; } } }