using BBWY.Common.Http; using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Dto; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Yitter.IdGenerator; using System.Linq; using BBWY.Server.Model.Db; using FreeSql; using BBWY.Common.Extensions; namespace BBWY.Server.Business.Sync { public class JDServiceOrderSyncBusiness : BaseSyncBusiness, IDenpendency { private IList jd_kd100_logisticsCompanyDictionary; private IList kuaiDi100PushStateList_zaitu; private IList kuaiDi100PushStateList_lanshou; private IList kuaiDi100PushStateList_qianshou; private IList kuaiDi100PushStateList_paijian; private Dictionary processResultDic; private List subscribeKD100ShopNames; public JDServiceOrderSyncBusiness(RestApiService restApiService, IOptions options, NLogManager nLogManager, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness) : base(restApiService, options, nLogManager, fsql, idGenerator, taskSchedulerManager, venderBusiness, yunDingBusiness) { /* yuantong 圆通速递 yunda 韵达快递 zhongtong 中通快递 shentong 申通快递 jtexpress 极兔速递 youzhengguonei 邮政快递包裹 shunfeng 顺丰速运 ems EMS jd 京东物流 youzhengbk 邮政标准快递 fengwang 丰网速运 debangkuaidi 德邦快递 debangwuliu 德邦 zhongtongkuaiyun 中通快运 danniao 丹鸟 subida 速必达 lianhaowuliu 联昊通 yundakuaiyun 韵达快运 annengwuliu 安能快运 kuayue 跨越速运 jingdongkuaiyun 京东快运 huitongkuaidi 百世快递 */ kuaiDi100PushStateList_zaitu = new List() { 0, 1001, 1002, 1003 }; kuaiDi100PushStateList_lanshou = new List() { 1, 101, 102, 103 }; kuaiDi100PushStateList_qianshou = new List() { 3, 301, 302, 303, 304 }; kuaiDi100PushStateList_paijian = new List() { 5, 501 }; jd_kd100_logisticsCompanyDictionary = new List() { new LogisticsCompanyRelationship(){ SourceName="圆通速递",TargetName="圆通速递",TargetCode="yuantong"}, new LogisticsCompanyRelationship(){ SourceName="圆通快递",TargetName="圆通速递",TargetCode="yuantong"}, new LogisticsCompanyRelationship(){ SourceName="韵达快递",TargetName="韵达快递",TargetCode="yunda"}, new LogisticsCompanyRelationship(){ SourceName="韵达快运",TargetName="韵达快运",TargetCode="yundakuaiyun"}, new LogisticsCompanyRelationship(){ SourceName="中通快递",TargetName="中通快递",TargetCode="zhongtong"}, new LogisticsCompanyRelationship(){ SourceName="中通速递",TargetName="中通快递",TargetCode="zhongtong"}, new LogisticsCompanyRelationship(){ SourceName="中通快运",TargetName="中通快运",TargetCode="zhongtongkuaiyun"}, new LogisticsCompanyRelationship(){ SourceName="极兔速递",TargetName="极兔速递",TargetCode="jtexpress"}, new LogisticsCompanyRelationship(){ SourceName="极兔快递",TargetName="极兔速递",TargetCode="jtexpress"}, new LogisticsCompanyRelationship(){ SourceName="邮政快递包裹",TargetName="邮政快递包裹",TargetCode="youzhengguonei"}, new LogisticsCompanyRelationship(){ SourceName="顺丰速运",TargetName="顺丰速运",TargetCode="shunfeng"}, new LogisticsCompanyRelationship(){ SourceName="顺丰快递",TargetName="顺丰速运",TargetCode="shunfeng"}, new LogisticsCompanyRelationship(){ SourceName="EMS",TargetName="EMS",TargetCode="ems"}, new LogisticsCompanyRelationship(){ SourceName="京东物流",TargetName="京东物流",TargetCode="jd"}, new LogisticsCompanyRelationship(){ SourceName="京东快递",TargetName="京东快运",TargetCode="jingdongkuaiyun"}, new LogisticsCompanyRelationship(){ SourceName="德邦快递",TargetName="德邦快递",TargetCode="debangkuaidi"}, new LogisticsCompanyRelationship(){ SourceName="德邦",TargetName="德邦",TargetCode="debangwuliu"}, new LogisticsCompanyRelationship(){ SourceName="丹鸟",TargetName="丹鸟",TargetCode="danniao"}, new LogisticsCompanyRelationship(){ SourceName="其他-丹鸟KD",TargetName="丹鸟",TargetCode="danniao"}, new LogisticsCompanyRelationship(){ SourceName="百世快递",TargetName="百世快递",TargetCode="huitongkuaidi"}, new LogisticsCompanyRelationship(){ SourceName="百世快运",TargetName="百世快递",TargetCode="huitongkuaidi"}, }; processResultDic = new Dictionary() { { 23,Enums.ServiceResult.换新}, { 40,Enums.ServiceResult.退货}, { 60,Enums.ServiceResult.原返}, { 90,Enums.ServiceResult.线下换新}, { 110,Enums.ServiceResult.商品补发} }; subscribeKD100ShopNames = new List() { "知礼家居专营店", "墨森玩具专营店", "可优车品专营店", "灵动母婴玩具专营店", "佳尤汽车用品专营店" }; } public void SyncServiceOrder() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); //SyncAfterOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true); foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncServiceOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncServiceOrderTaskScheduler); } } public void SyncServiceOrder(long shopId, string serviceId) { var shopList = venderBusiness.GetShopList(shopId); Task.Factory.StartNew(() => SyncServiceOrder(shopList[0], serviceId, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncServiceOrderTaskScheduler); } private void SyncServiceOrder(ShopResponse shop, long shopId, IList jtokenList, string relayAPIHost, string appKey, string appSecret, string token) { var serviceIdList = jtokenList.Select(j => j.Value("serviceId")).ToList(); var dbServiceOrderList = fsql.Select().Where(s => s.ShopId == shop.ShopId && serviceIdList.Contains(s.ServiceId)).ToList(); var dbServiceIdList = dbServiceOrderList.Select(s => s.ServiceId).ToList(); var exceptServiceIdList = serviceIdList.Except(dbServiceIdList); var apiOrderIdList = jtokenList.Where(j => exceptServiceIdList.Contains(j.Value("serviceId"))).Select(j => j.Value("orderId")).ToList(); var dbOrderSkuList = fsql.Select() .InnerJoin((osku, o, ocd, po) => osku.OrderId == o.Id) .LeftJoin((osku, o, ocd, po) => osku.OrderId == ocd.OrderId && osku.SkuId == ocd.SkuId) .LeftJoin((osku, o, ocd, po) => ocd.PurchaseOrderPKId == po.Id) .Where((osku, o, ocd, po) => o.ShopId == shopId && apiOrderIdList.Contains(osku.OrderId) && osku.Price != 0) .ToList((osku, o, ocd, po) => new { osku.Id, osku.ProductId, osku.SkuId, osku.OrderId, osku.ItemTotal, o.StorageType, po.PurchasePlatform, po.PurchaseMethod, po.PurchaseOrderId, ocd.PurchaseOrderPKId }); List insertServiceOrderList = new List(); List> updateServiceOrderList = new List>(); foreach (var serviceOrderJToken in jtokenList) { var serviceId = serviceOrderJToken.Value("serviceId"); var status = (Enums.ServiceOrderState)serviceOrderJToken.Value("serviceStatus"); var statusUpdateTime = serviceOrderJToken.Value("updateTime").StampToDateTime(); var dbServiceOrder = dbServiceOrderList.FirstOrDefault(s => s.ServiceId == serviceId); if (dbServiceOrder == null) { var serviceOrderId = serviceOrderJToken.Value("orderId"); var skuId = serviceOrderJToken.Value("skuId"); var dbOsku = dbOrderSkuList.FirstOrDefault(osku => osku.OrderId == serviceOrderId && osku.SkuId == skuId); if (dbOsku == null) continue; var isNeedSubscribeKuaiDi100 = false; var isTuiHuoCang = false; Enums.ServiceResult? serviceResult = null; #region 待收货服务单,检查是否需要订阅快递100 if (status == Enums.ServiceOrderState.待收货) //&& subscribeKD100ShopNames.Contains(shop.ShopName) { try { var serviceOrderDetailResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetServiceOrderDetail", new QueryServiceOrderDetailRequest() { AppKey = appKey, AppSecret = appSecret, AppToken = token, OrderId = serviceOrderId, ServiceId = serviceId, Platform = Enums.Platform.京东, VenderId = shop.VenderId }, GetYunDingRequestHeader(), HttpMethod.Post); if (serviceOrderDetailResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"获取服务单详情失败 {serviceOrderDetailResult.Content}"); var serviceOrderDetailResponse = JsonConvert.DeserializeObject>(serviceOrderDetailResult.Content); if (!serviceOrderDetailResponse.Success) throw new Exception($"获取服务单详情失败 {serviceOrderDetailResponse.Msg}"); var processResult = serviceOrderDetailResponse.Data.Value("processResult"); if (processResultDic.ContainsKey(processResult)) serviceResult = processResultDic[processResult]; //检查退货城市是否为泉州鲤城区 isNeedSubscribeKuaiDi100 = (serviceOrderDetailResponse.Data["afsContactInfo"]?.Value("cityCode") ?? 0) == 1332 && (serviceOrderDetailResponse.Data["afsContactInfo"]?.Value("countyCode") ?? 0) == 42930; isTuiHuoCang = isNeedSubscribeKuaiDi100; } catch { } if (dbOsku.StorageType == Enums.StorageType.代发) isNeedSubscribeKuaiDi100 = true; } #endregion dbServiceOrder = new ServiceOrder() { Id = idGenerator.NewLong(), ServiceId = serviceId, OrderId = serviceOrderId, ShopId = shop.ShopId, ProductId = dbOsku.ProductId, SkuItemCount = dbOsku.ItemTotal, Status = status, CreateTime = DateTime.Now, SkuId = skuId, StatusUpdateTime = statusUpdateTime, IsSubscribeKuaiDi100 = false, IsNeedSubscribeKuaiDi100 = isNeedSubscribeKuaiDi100, ApplyTime = serviceOrderJToken.Value("applyTime").StampToDateTime(), ServiceResult = serviceResult, PurchaseMethod = dbOsku.PurchaseMethod, PurchasePlatform = dbOsku.PurchasePlatform, PurchaseOrderId = dbOsku.PurchaseOrderId, PurchaseOrderPKId = dbOsku.PurchaseOrderPKId }; if (isTuiHuoCang) dbServiceOrder.ReturnDirection = 0; insertServiceOrderList.Add(dbServiceOrder); } else if (dbServiceOrder.Status != status) { var update = fsql.Update(dbServiceOrder.Id).Set(s => s.Status, status) .Set(s => s.StatusUpdateTime, statusUpdateTime); updateServiceOrderList.Add(update); } } fsql.Transaction(() => { if (insertServiceOrderList.Count() > 0) fsql.Insert(insertServiceOrderList).ExecuteAffrows(); if (updateServiceOrderList.Count() > 0) foreach (var update in updateServiceOrderList) update.ExecuteAffrows(); }); } private void SyncServiceOrder(ShopResponse shop, string serviceId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) { /* 审核阶段: 待审核: 10001 待用户反馈: 10002 用户已反馈: 10012 【待收货: 10005】 【取消: 10011】 审核关闭: 10004 待用户确认: 10009 【完成: 10010】 处理阶段: 已收货,待处理 : 10007 原返取消,待处理:7060 换新取消,待处理:7023 线下换新取消,待处理:7090 商家催收: 13000 */ var loggerName = $"新服务单同步-{shop.ShopName}"; try { var shopId = long.Parse(shop.ShopId); var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); var serviceStatusList = new List() { 10005, 10011, 10010 }; var request = new QueryServiceOrderRequest() { UpdateTimeBegin = startTime ?? DateTime.Now.Date.AddHours(-1), UpdateTimeEnd = endTime ?? DateTime.Now, AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, PageIndex = 1, PageSize = 50, Platform = shop.PlatformId, SaveResponseLog = true, ServiceId = serviceId, VenderId = shop.VenderId }; List jtokenList = new List(); foreach (var serviceStatus in serviceStatusList) { if (string.IsNullOrEmpty(serviceId)) request.ServiceStatus = serviceStatus; var serviceOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetServiceOrderList", request, GetYunDingRequestHeader(), HttpMethod.Post); if (serviceOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"获取服务单失败 {serviceOrderListApiResult.Content}"); var serviceOrderListResponse = JsonConvert.DeserializeObject>(serviceOrderListApiResult.Content); if (!serviceOrderListResponse.Success) throw new Exception($"获取服务单失败 {serviceOrderListResponse.Msg}"); if (serviceOrderListResponse.Data != null && serviceOrderListResponse.Data.Count() > 0) jtokenList.AddRange(serviceOrderListResponse.Data); if (!string.IsNullOrEmpty(serviceId)) break; } if (jtokenList.Count() > 0) SyncServiceOrder(shop, shopId, jtokenList, relayAPIHost, request.AppKey, request.AppSecret, request.AppToken); } catch (Exception ex) { nLogManager.GetLogger(loggerName).Error(ex, $"SyncServiceOrder ShopName:{shop.ShopName} ShopId:{shop.ShopId}"); } } public void SubscribeKuaiDi100() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); foreach (var shop in shopList) { Task.Factory.StartNew(() => SubscribeKuaiDi100(shop), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncServiceOrderTaskScheduler); } } public void SubscribeKuaiDi100(long shopId) { var shop = venderBusiness.GetShopList(shopId).FirstOrDefault(); Task.Factory.StartNew(() => SubscribeKuaiDi100(shop), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncServiceOrderTaskScheduler); } private void SubscribeKuaiDi100(ShopResponse shop) { var loggerName = $"订阅快递100-{shop.ShopName}"; try { var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); var serviceOrderList = fsql.Select().Where(s => s.ShopId == shop.ShopId && s.IsNeedSubscribeKuaiDi100 == true && s.IsSubscribeKuaiDi100 == false) .OrderByDescending(s => s.StatusUpdateTime) .Page(1, 50) .ToList(); List> updateSerivceOrderList = new List>(); List insertExpressOrderList = new List(); foreach (var serviceOrder in serviceOrderList) { bool isUpdateDelivery = false, isUpdateSubscribe = false; if (string.IsNullOrEmpty(serviceOrder.WayBillNo) || string.IsNullOrEmpty(serviceOrder.ExpressName)) { try { #region 查询服务单运单详情 var serviceOrderDeliveryResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetServiceOrderDeliveryDetail", new QueryServiceOrderDetailRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, OrderId = serviceOrder.OrderId, ServiceId = serviceOrder.ServiceId, Platform = Enums.Platform.京东, VenderId = shop.VenderId }, GetYunDingRequestHeader(), HttpMethod.Post); if (serviceOrderDeliveryResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"获取服务单运单详情失败 {serviceOrderDeliveryResult.Content}"); var serviceOrderDeliveryResponse = JsonConvert.DeserializeObject>(serviceOrderDeliveryResult.Content); if (!serviceOrderDeliveryResponse.Success) throw new Exception($"获取服务单运单详情失败 {serviceOrderDeliveryResponse.Msg}"); if (serviceOrderDeliveryResponse.Data != null) { serviceOrder.WayBillNo = serviceOrderDeliveryResponse.Data.Value("expressCode"); serviceOrder.ExpressName = serviceOrderDeliveryResponse.Data.Value("expressCompany"); if (!string.IsNullOrEmpty(serviceOrder.WayBillNo) && serviceOrder.WayBillNo.StartsWith("JD") && string.IsNullOrEmpty(serviceOrder.ExpressName)) { serviceOrder.ExpressName = "京东快递"; } isUpdateDelivery = !string.IsNullOrEmpty(serviceOrder.WayBillNo) && !string.IsNullOrEmpty(serviceOrder.ExpressName); } #endregion } catch (Exception ex) { nLogManager.GetLogger(loggerName).Error(ex, $"SubscribeKuaiDi100 ShopName:{shop.ShopName} ShopId:{shop.ShopId} ServiceId:{serviceOrder.ServiceId}"); } } if (!string.IsNullOrEmpty(serviceOrder.WayBillNo) && !string.IsNullOrEmpty(serviceOrder.ExpressName)) { #region 订阅快递100 isUpdateSubscribe = true; try { var kuaidi100CompanyCode = ConvertToKuaiDi100CompanyCode(serviceOrder.ExpressName); var paramStr = JsonConvert.SerializeObject(new { company = kuaidi100CompanyCode, number = serviceOrder.WayBillNo, key = "SdcRPzxo8802", parameters = new { callbackurl = "https://bbwy.qiyue666.com/api/ServiceOrderSync/ReceiveKuaiDi100Push", salt = Guid.NewGuid(), resultv2 = "4" } }); var subscribeResult = restApiService.SendRequest("https://poll.kuaidi100.com", "poll", $"schema=json¶m=/{paramStr}", / null, HttpMethod.Post, RestApiService.ContentType_Form); if (subscribeResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"订阅快递100失败 {subscribeResult.Content}"); var subscribeResponse = JsonConvert.DeserializeObject(subscribeResult.Content); if (!subscribeResponse.result) throw new Exception($"订阅快递100失败 {subscribeResponse.message}"); isUpdateSubscribe = true; } catch (Exception ex) { nLogManager.GetLogger(loggerName).Error(ex, $"SubscribeKuaiDi100 ShopName:{shop.ShopName} ShopId:{shop.ShopId} /ServiceId:/{serviceOrder.ServiceId}"); } #endregion } if (isUpdateSubscribe || isUpdateDelivery) { var update = fsql.Update(serviceOrder.Id) .SetIf(isUpdateDelivery, e => e.WayBillNo, serviceOrder.WayBillNo) .SetIf(isUpdateDelivery, e => e.ExpressName, serviceOrder.ExpressName) .SetIf(isUpdateSubscribe, s => s.IsSubscribeKuaiDi100, true); updateSerivceOrderList.Add(update); if (isUpdateDelivery && insertExpressOrderList.Count(e => e.WayBillNo == serviceOrder.WayBillNo) == 0) { insertExpressOrderList.Add(new ExpressOrder() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, ExpressName = serviceOrder.ExpressName, WayBillNo = serviceOrder.WayBillNo, OrderId = serviceOrder.OrderId, PackageType = 1, UpdateTime = DateTime.Now }); } } } if (insertExpressOrderList.Count() > 0) { var insertExpressOrderWayBillNoList = insertExpressOrderList.Select(e => e.WayBillNo).ToList(); var dbWayBillNoList = fsql.Select().Where(e => insertExpressOrderWayBillNoList.Contains(e.WayBillNo)).ToList(e => e.WayBillNo); if (dbWayBillNoList.Count() > 0) { for (var i = 0; i < insertExpressOrderList.Count(); i++) { if (dbWayBillNoList.Any(w => w == insertExpressOrderList[i].WayBillNo)) { insertExpressOrderList.Remove(insertExpressOrderList[i]); i--; } } } } fsql.Transaction(() => { if (insertExpressOrderList.Count() > 0) fsql.Insert(insertExpressOrderList).ExecuteAffrows(); if (updateSerivceOrderList.Count() > 0) foreach (var update in updateSerivceOrderList) update.ExecuteAffrows(); }); } catch (Exception ex) { nLogManager.GetLogger(loggerName).Error(ex, $"SubscribeKuaiDi100 ShopName:{shop.ShopName} ShopId:{shop.ShopId}"); } } private string ConvertToKuaiDi100CompanyCode(string sourceExpressName) { var result = jd_kd100_logisticsCompanyDictionary.FirstOrDefault(l => l.SourceName == sourceExpressName); if (result == null) throw new Exception($"匹配快递100公司失败,原快递名称 {sourceExpressName}"); return result.TargetCode; } public void ReceiveKuaiDi100Push(string param) { nLogManager.Default().Info($"收到快递100推送 {param}"); JObject jobject = JObject.Parse(param); var waybillNo = jobject["lastResult"].Value("nu"); var state = jobject["lastResult"].Value("state"); if (!kuaiDi100PushStateList_lanshou.Contains(state) && !kuaiDi100PushStateList_zaitu.Contains(state) && !kuaiDi100PushStateList_paijian.Contains(state) && !kuaiDi100PushStateList_qianshou.Contains(state)) return; var serviceOrderList = fsql.Select().Where(s => s.WayBillNo == waybillNo).ToList(); if (serviceOrderList.Count() == 0) throw new Exception($"快递单号{waybillNo} 未找到对应的服务单"); var expressOrder = fsql.Select().Where(e => e.WayBillNo == waybillNo).ToOne(); if (expressOrder == null) throw new Exception($"快递单号{waybillNo} 未找到对应的快递单"); DateTime? signTime = null; if (expressOrder.TransportStatus == Enums.TransportState.已入库) { if (kuaiDi100PushStateList_qianshou.Contains(state) && expressOrder.SignTime == null) { signTime = GetSignTime(jobject); fsql.Update(expressOrder.Id).Set(e => e.SignTime, signTime) .Set(e => e.UpdateTime, DateTime.Now) .ExecuteAffrows(); } return; } var isUpdate = false; Enums.TransportState? newStatus = null; IUpdate updateExpressOrder = null; List> updateServiceOrderList = new List>(); if (kuaiDi100PushStateList_zaitu.Contains(state) || kuaiDi100PushStateList_lanshou.Contains(state)) { //在途 //揽收 if (expressOrder.TransportStatus != Enums.TransportState.运输中) { isUpdate = true; newStatus = Enums.TransportState.运输中; } } else if (kuaiDi100PushStateList_qianshou.Contains(state)) { if (expressOrder.TransportStatus != Enums.TransportState.待质检) { isUpdate = true; newStatus = Enums.TransportState.待质检; signTime = GetSignTime(jobject); } } else if (kuaiDi100PushStateList_paijian.Contains(state)) { if (expressOrder.TransportStatus != Enums.TransportState.派送中) { isUpdate = true; newStatus = Enums.TransportState.派送中; } } if (isUpdate) { fsql.Transaction(() => { fsql.Update(expressOrder.Id).Set(e => e.TransportStatus, newStatus) .SetIf(kuaiDi100PushStateList_qianshou.Contains(state), e => e.SignTime, signTime) .Set(e => e.UpdateTime, DateTime.Now) .ExecuteAffrows(); //签收 foreach (var serviceOrder in serviceOrderList) { if (serviceOrder.TransportDetails == Enums.TransportState.已入库) continue; fsql.Update(serviceOrder.Id).Set(s => s.TransportDetails, newStatus) .ExecuteAffrows(); } }); } } public DateTime? GetSignTime(JObject jobject) { DateTime? signTime = null; var data = jobject["lastResult"]["data"].Children().FirstOrDefault(d => kuaiDi100PushStateList_qianshou.Contains(d.Value("statusCode"))); if (data != null) signTime = DateTime.Parse(data.Value("ftime")); return signTime; } } }