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
{
///
/// 更新抖音订单
///
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();
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(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(pay_success_time);
var order = db.Queryable().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 IsUpdateing = new Dictionary();
public SqlSugar.SqlSugarClient Db { get { return client.Db; } }
protected override void Run(object state, bool timedOut)
{
//第一步:获取可以更新的联盟集合
var List = Db.Queryable().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);
}
}
///
/// 处理橱窗订单
///
///
///
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());
//订单ID
var orderId = token["order_id"].Value();
//订单状态
var orderStatus = token["order_status"].Value();
//商品id
var productId = token["product_id"].Value();
var tableNames = db.GetTableName(payTime);
var order = db.Queryable().
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));
}
///
/// 设置橱窗订单状态
///
///
///
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(queryId);
var cache = db.Queryable().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;
}
}
}
}