280 lines
12 KiB
C#
280 lines
12 KiB
C#
using Common.DbExtends.Extends;
|
||
using Common.Models.Enums;
|
||
using Common.Models.SubTables;
|
||
using Common.Models.UnqTables;
|
||
using Common.Requests.Lianmengs;
|
||
using Common.Utils;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using Newtonsoft.Json.Linq;
|
||
using Server.Events;
|
||
using SqlSugar;
|
||
namespace Server.Timers
|
||
{
|
||
/// <summary>
|
||
/// 更新抖音订单
|
||
/// </summary>
|
||
internal class DyUpdateTimer : MyTimer
|
||
{
|
||
public DyUpdateTimer()
|
||
{
|
||
DouyinRequest.OrderNoticeEvent += DouyinRequest_OrderNoticeEvent;
|
||
}
|
||
|
||
private void DouyinRequest_OrderNoticeEvent(DouyinRequest req, Newtonsoft.Json.Linq.JToken Orders, bool NextPage)
|
||
{
|
||
var orderChangeEventArgsList = new List<OrderChangeEventArgs>();
|
||
var db = Db;
|
||
db.UseTran(() =>
|
||
{
|
||
foreach (var item in Orders)
|
||
{
|
||
var pay_success_time = DateTime.Parse(item["pay_success_time"].ToString());
|
||
var tab_name = Db.GetTableName<DyOrder>(pay_success_time);
|
||
var order_id = item["order_id"].ToString();
|
||
var product_id = item["product_id"].ToString();
|
||
var update_time = item["update_time"]?.ToString();
|
||
var order_status = item["order_status"].ToString();
|
||
var tableNames = db.GetTableName<DyOrder>(pay_success_time);
|
||
var order = db.Queryable<DyOrder>().Where(f => f.order_id == order_id && f.product_id == product_id).SplitTable(t => t.InTableNames(tableNames)).First();
|
||
if (order == null)
|
||
{
|
||
order = new DyOrder()
|
||
{
|
||
Id = Util.CreateID(pay_success_time),
|
||
order_id = order_id,
|
||
product_id = product_id,
|
||
LianmengId = req.Lianmeng.Id,
|
||
SystemOrderStatus = SystemOrderStatus.未知
|
||
};
|
||
}
|
||
else if (order.update_time == update_time)
|
||
{
|
||
continue;
|
||
}
|
||
//订单结算也需要进来,因为抖音结算时间要等很久
|
||
else if ((int)order.SystemOrderStatus > 3001)
|
||
{
|
||
continue;
|
||
}
|
||
//旧的订单状态
|
||
var oldSystemOrderStatus = order.SystemOrderStatus;
|
||
|
||
|
||
Util.CopyToObj(item, order);
|
||
SetChuChuangOrderState(db, order, order_status);
|
||
|
||
//事件
|
||
orderChangeEventArgsList.Add(new OrderChangeEventArgs()
|
||
{
|
||
LianmengType = req.Lianmeng.LianmengType,
|
||
NewStatus = order.SystemOrderStatus,
|
||
OldStatus = oldSystemOrderStatus,
|
||
OrderId = order.Id,
|
||
UserId = order.UserId
|
||
});
|
||
}
|
||
|
||
}, ex =>
|
||
{
|
||
db.OnLog("抖音", ex);
|
||
throw ex;
|
||
});
|
||
|
||
//触发事件
|
||
foreach (var orderArgs in orderChangeEventArgsList)
|
||
{
|
||
//Client.Events.OnOrderChange(this, orderArgs);
|
||
}
|
||
}
|
||
|
||
private Client client = Client.SingleClient;
|
||
private Dictionary<int, bool> IsUpdateing = new Dictionary<int, bool>();
|
||
public SqlSugar.SqlSugarClient Db { get { return client.Db; } }
|
||
|
||
protected override void Run(object state, bool timedOut)
|
||
{
|
||
//第一步:获取可以更新的联盟集合
|
||
var List = Db.Queryable<Lianmeng>().WithCache().Where(f => f.LianmengType == Common.Models.Enums.LianmengType.抖音联盟 && f.ExpirationTime > DateTime.Now && f.IsCookiValid).ToList();
|
||
foreach (var item in List)
|
||
{
|
||
//var goodsid = req1.AnalysisKouLingOrLink("【茶杯马克杯带盖勺男女陶瓷杯子家用韩版学生情侣牛奶咖啡杯大容】长按复制此条消息,打开抖音搜索,查看商品详情##NBpa3VHI5r8##[抖:/ 音口令]");
|
||
//req1.AddChuChuang(goodsid,out var pid);
|
||
//req1.UnBindGoods(pid);
|
||
//var dd = req1.GetPromotionUrl(goodsid);
|
||
//更新中跳过
|
||
if (IsUpdateing.ContainsKey(item.Id) && IsUpdateing[item.Id])
|
||
{
|
||
continue;
|
||
}
|
||
IsUpdateing[item.Id] = true;
|
||
Task.Factory.StartNew(() =>
|
||
{
|
||
var req = new DouyinRequest(item);
|
||
var start_time = DateTime.Now.AddDays(-1);
|
||
var endTime = DateTime.Now;
|
||
try
|
||
{
|
||
req.UpdateDouyinOrder(start_time, DateTime.Now);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
if (ex.Message.Contains("cookie已失效"))
|
||
{
|
||
Client.SingleClient.Db.Updateable(item).ExecuteCommand();
|
||
}
|
||
Db.OnLog("更新抖音订单错误", ex);
|
||
}
|
||
try
|
||
{
|
||
//处理橱窗订单
|
||
req.UpdateDouyinChuChuangOrder(start_time, endTime, items =>
|
||
{
|
||
HandleChuChuangOrder(req, items);
|
||
return false;
|
||
});
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
if (ex.Message.Contains("cookie已失效"))
|
||
{
|
||
Client.SingleClient.Db.Updateable(item).ExecuteCommand();
|
||
}
|
||
Db.OnLog("更新抖音订单错误", ex);
|
||
}
|
||
});
|
||
Thread.Sleep(1000);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 处理橱窗订单
|
||
/// </summary>
|
||
/// <param name="req1"></param>
|
||
/// <param name="items"></param>
|
||
private void HandleChuChuangOrder(DouyinRequest req, JToken[] items)
|
||
{
|
||
var db = Db;
|
||
db.UseTran(() =>
|
||
{
|
||
foreach (var token in items)
|
||
{
|
||
//付款时间
|
||
var payTime = Util.TimespanToDatatime(token["pay_time"].Value<string>());
|
||
//订单ID
|
||
var orderId = token["order_id"].Value<string>();
|
||
//订单状态
|
||
var orderStatus = token["order_status"].Value<string>();
|
||
//商品id
|
||
var productId = token["product_id"].Value<string>();
|
||
var tableNames = db.GetTableName<DyOrder>(payTime);
|
||
var order = db.Queryable<DyOrder>().
|
||
Where(f => f.order_id == orderId && f.product_id == productId).
|
||
SplitTable(t => t.InTableNames(tableNames)).
|
||
First();
|
||
if (order == null)
|
||
{
|
||
order = new DyOrder()
|
||
{
|
||
Id = Util.CreateID(payTime),
|
||
order_id = orderId,
|
||
product_id = productId,
|
||
LianmengId = req.Lianmeng.Id,
|
||
SystemOrderStatus = SystemOrderStatus.未知
|
||
};
|
||
}
|
||
//Todo 这里需要看看怎么处理
|
||
//else if (order.update_time == update_time)
|
||
//{
|
||
// continue;
|
||
//}
|
||
//订单结算也需要进来,因为抖音结算时间要等很久
|
||
else if ((int)order.SystemOrderStatus > 3001)
|
||
{
|
||
continue;
|
||
}
|
||
Util.CopyToObj(token, order);
|
||
SetChuChuangOrderState(db, order, orderStatus);
|
||
}
|
||
|
||
}, ex => db.OnLog("抖音橱窗订单", ex));
|
||
}
|
||
/// <summary>
|
||
/// 设置橱窗订单状态
|
||
/// </summary>
|
||
/// <param name="order"></param>
|
||
/// <param name="orderStatus"></param>
|
||
private void SetChuChuangOrderState(SqlSugarClient db, DyOrder order, string orderStatus)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(orderStatus))
|
||
{
|
||
return;
|
||
}
|
||
switch (orderStatus)
|
||
{
|
||
case "PAY_SUCC"://支付完成
|
||
order.SystemOrderStatus = SystemOrderStatus.订单付款;
|
||
if (order.UserId == 0 && order.pid_info != null)
|
||
{
|
||
//通过扩展ID,查到了用户
|
||
if (long.TryParse(order.pid_info.external_info, out var queryId))
|
||
{
|
||
var queryTabName = Db.GetTableName<QueryHist>(queryId);
|
||
var cache = db.Queryable<QueryHist>().SplitTable(tab => tab.InTableNames(queryTabName)).Single(f => f.Id == queryId);
|
||
if (cache != null)
|
||
{
|
||
order.UserId = cache.UserId;
|
||
order.QueryCache = cache;
|
||
|
||
var user = db.GetUserData(order.UserId);
|
||
user.PayOrderCount++;
|
||
db.Save(user);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case "CONFIRM"://确认收货
|
||
order.SystemOrderStatus = SystemOrderStatus.订单收货;
|
||
if (order.PayStatus == OrderPayStatus.未支付)
|
||
{
|
||
//插入支付队列,准备结算佣金
|
||
FinishOrder frozen = null;
|
||
if (order.UserId > 0)
|
||
{
|
||
order.PayStatus = OrderPayStatus.支付中;
|
||
//判断订单是否在24小时内确认收货
|
||
var TimeConsuming = DateTime.Now - order.pay_success_time;
|
||
DateTime ThawingTime = DateTime.Now;
|
||
if (TimeConsuming.TotalDays < 1)
|
||
{
|
||
var pubConfig = db.GetPubConfig();
|
||
if (pubConfig != null && pubConfig.ExtendDay > 0)
|
||
{
|
||
ThawingTime = ThawingTime.AddDays(pubConfig.ExtendDay);
|
||
}
|
||
}
|
||
frozen = new FinishOrder() { CreateTime = DateTime.Now, LianmengType = LianmengType.抖音联盟, OrderId = order.Id, ThawingTime = ThawingTime, UserId = order.UserId };
|
||
}
|
||
}
|
||
break;
|
||
case "SETTLE"://结算
|
||
order.SystemOrderStatus = SystemOrderStatus.订单结算;
|
||
break;
|
||
case "REFUND"://订单退款
|
||
order.SystemOrderStatus = SystemOrderStatus.全额退款;
|
||
if (order.PayStatus == OrderPayStatus.已支付 && order.UserId != 0)
|
||
{
|
||
db.GetUserData(order.UserId);
|
||
}
|
||
break;
|
||
default:
|
||
Db.OnLog("抖音订单更新", $"发现未知状态的订单:{order.order_id}");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|