using Common.DbExtends.Extends; using Common.Models.Enums; using Common.Models.SubTables; using Common.Models.UnqTables; using Common.Requests.Lianmengs; using Common.Utils; using Newtonsoft.Json.Linq; using Server.MyClass.Caches; using SqlSugar; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Server.Timers { /// /// 美团订单定时同步 /// public class MtOrderTimer : MyTimer { public MtOrderTimer() { MTRequest.OrderNoticeEvent += MTRequest_OrderNoticeEvent; } Client Client = Client.SingleClient; private SqlSugar.SqlSugarClient Db { get { return Client.Db; } } private ConcurrentDictionary IsUpdateing = new ConcurrentDictionary(); protected override void Run(object state, bool timedOut) { var lianmengs = this.Db.Queryable().Where(w => w.LianmengType == Common.Models.Enums.LianmengType.美团联盟&&w.ExpirationTime>DateTime.Now).ToList(); foreach (var lianmeng in lianmengs) { //防止重复读取 if (IsUpdateing.ContainsKey(lianmeng.Id)) { continue; } var lastDateTime = GetLastDateTime(lianmeng.Id + ""); if ((DateTime.Now - lastDateTime).TotalSeconds <= 60)//60秒间隔读取 { continue; } //启动线程读取 ThreadPool.QueueUserWorkItem((o) => { HandleOrderLianmeng(o as Lianmeng); }, lianmeng); } } /// /// 同步某个账号美团订单 /// /// private void HandleOrderLianmeng(Lianmeng lianmeng) { //防止重复读取 if (IsUpdateing.ContainsKey(lianmeng.Id)) { return; } //标记防止重复读取 IsUpdateing[lianmeng.Id] = true; try { var req = new MTRequest(lianmeng); //上次读取时间 var lastDateTime = GetLastDateTime(lianmeng.Id + ""); if (lastDateTime == DateTime.MinValue) { //如果没有时间,读取最近1个月的数据 lastDateTime = DateTime.Now.AddDays(-30); } //本次读取时间 var datetime = DateTime.Now; //处理订单 HandleOrder(lianmeng, req, lastDateTime, datetime); //记录本次读取时间 SetLastDateTime(lianmeng.Id + "", datetime); } catch (Exception ex) { Db.OnLog("美团订单同步2", ex); } finally { //删除防止重复读取标记 IsUpdateing.TryRemove(lianmeng.Id, out _); if (lianmeng.ExpirationTime < DateTime.Now) { Db.Updateable(lianmeng).UpdateColumns(s => new { s.ExpirationTime }).ExecuteCommand(); } } } /// /// 处理订单 /// /// /// /// /// private void HandleOrder(Lianmeng lianmeng, MTRequest req, DateTime lastDateTime, DateTime datetime) { lastDateTime = lastDateTime.AddMinutes(-1); req.GetCPSOrderList(lastDateTime, datetime, (items) => { var db = Db; db.UseTran(() => { var addlist = new List(); foreach (var item in items) { var uniqueItemId = item["uniqueItemId"].Value(); var modifyTime = item["modifyTime"].Value(); var orderPayTime = item["orderPayTime"].Value(); var itemStatus = (MtItemOrderStatus)item["itemStatus"].Value(); var itemBizStatus = (MtItemBizStatusEnum)item["itemBizStatus"].Value(); var tablenames = db.GetTableName(orderPayTime); var info = db.Queryable().Where(w => w.uniqueItemId == uniqueItemId).SplitTable(t => t.InTableNames(tablenames)).First(); if (info != null) { if (info.modifyTime == modifyTime) { continue; } else if ((int)info.SystemOrderStatus > 3000) { continue; } //复制对象 Util.CopyToObj(item, info); //设置订单状态 SetOrderState(itemStatus, itemBizStatus, info); //修改数据 db.Updateable(info).SplitTable(t => t.InTableNames(tablenames)).ExecuteCommand(); } else { var order = new MtOrder(); order.Id = Util.CreateID(orderPayTime); order.LianmengId = lianmeng.Id; Util.CopyToObj(item, order); SetOrderState(itemStatus, itemBizStatus, order); addlist.Add(order); } } if (addlist.Count > 0) { //批量插入到数据库 db.Insertable(addlist).SplitTable().ExecuteCommand(); } }, ex => db.OnLog("美团订单同步", ex)); return false; }); //处理异常订单 HandleAbnormalOrderLianmeng(lianmeng, lastDateTime, datetime); } /// /// 设置订单状态 /// /// /// /// private void SetOrderState(MtItemOrderStatus itemStatus, MtItemBizStatusEnum itemBizStatus, MtOrder order) { switch (itemStatus) { case MtItemOrderStatus.未使用: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.未知; break; case MtItemOrderStatus.已使用: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单收货; break; case MtItemOrderStatus.退款中: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单退款中; break; case MtItemOrderStatus.已退款: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.全额退款; break; case MtItemOrderStatus.已消费退款: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.全额退款; break; default: break; } switch (itemBizStatus) { case MtItemBizStatusEnum.支付成功: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单付款; break; case MtItemBizStatusEnum.核销成功: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单收货; break; case MtItemBizStatusEnum.结算成功: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单结算; break; case MtItemBizStatusEnum.无效订单: order.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单失效; break; case MtItemBizStatusEnum.未知状态: break; default: break; } } /// /// 读取异常订单处理 /// /// /// private void HandleAbnormalOrderLianmeng(Lianmeng lianmeng, DateTime lastDateTime, DateTime dateTime) { var req = new MTRequest(lianmeng); req.GetCPSAbnormalOrderList(lastDateTime, dateTime, items => { var db = Db; db.UseTran(() => { foreach (var item in items) { var uniqueItemId = item["uniqueItemId"].Value(); var eventType = item["eventType"].Value(); var info = db.Queryable().Where(w => w.uniqueItemId == uniqueItemId).SplitTable(t => t.Take(2)).First(); if (info != null) { if ((int)info.SystemOrderStatus > 3000) { continue; } switch (eventType) { case 1: //退款 info.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.全额退款; break; case 2: //风控 info.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单失效; break; case 4: //负项调整 info.SystemOrderStatus = Common.Models.Enums.SystemOrderStatus.订单失效; break; } //修改数据 db.Updateable(info).SplitTable(t => t.Take(2)).ExecuteCommand(); } else { //订单不存在 } } }, ex => db.OnLog("美团异常订单处理", ex)); return false; }); } /// /// 获取上次时间 /// /// /// private DateTime GetLastDateTime(string id) { return Client.Config.RuntimeCache.GetPublicValue("订单同步" + id, () => DateTime.MinValue); } /// /// 记录上次时间 /// /// /// private void SetLastDateTime(string id, DateTime now) { Client.Config.RuntimeCache.SetPublicValue("订单同步" + id, now); } /// /// 收到需要订单更新事件 /// /// /// /// private void MTRequest_OrderNoticeEvent(Lianmeng lianmeng, DateTime start, DateTime end) { var req = new MTRequest(lianmeng); HandleOrder(lianmeng, req, start, end); } } }