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; } } } }