yz_server/Server/Timers/DyUpdateTimer.cs

280 lines
12 KiB
C#
Raw 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 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;
}
}
}
}