424 lines
19 KiB
C#
424 lines
19 KiB
C#
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<fl_order_douyin>("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<OrderNoticeEvent>();
|
|
|
|
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<ItemPoint>(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<fl_query_hist>("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<Compute>(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<Update_NoticeQueue>() 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
|
|
|
|
/// <summary>
|
|
/// 抖客判断
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 达人判断
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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; }
|
|
}
|
|
|
|
}
|