You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
602 lines
32 KiB
602 lines
32 KiB
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<LogisticsCompanyRelationship> jd_kd100_logisticsCompanyDictionary;
|
|
private IList<int> kuaiDi100PushStateList_zaitu;
|
|
private IList<int> kuaiDi100PushStateList_lanshou;
|
|
private IList<int> kuaiDi100PushStateList_qianshou;
|
|
private IList<int> kuaiDi100PushStateList_paijian;
|
|
private Dictionary<int, Enums.ServiceResult> processResultDic;
|
|
private List<string> subscribeKD100ShopNames;
|
|
|
|
|
|
public JDServiceOrderSyncBusiness(RestApiService restApiService, IOptions<GlobalConfig> 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<int>() { 0, 1001, 1002, 1003 };
|
|
kuaiDi100PushStateList_lanshou = new List<int>() { 1, 101, 102, 103 };
|
|
kuaiDi100PushStateList_qianshou = new List<int>() { 3, 301, 302, 303, 304 };
|
|
kuaiDi100PushStateList_paijian = new List<int>() { 5, 501 };
|
|
|
|
jd_kd100_logisticsCompanyDictionary = new List<LogisticsCompanyRelationship>()
|
|
{
|
|
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<int, Enums.ServiceResult>()
|
|
{
|
|
{ 23,Enums.ServiceResult.换新},
|
|
{ 40,Enums.ServiceResult.退货},
|
|
{ 60,Enums.ServiceResult.原返},
|
|
{ 90,Enums.ServiceResult.线下换新},
|
|
{ 110,Enums.ServiceResult.商品补发}
|
|
};
|
|
subscribeKD100ShopNames = new List<string>()
|
|
{
|
|
"知礼家居专营店",
|
|
"墨森玩具专营店",
|
|
"可优车品专营店",
|
|
"灵动母婴玩具专营店",
|
|
"佳尤汽车用品专营店"
|
|
};
|
|
}
|
|
|
|
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<JToken> jtokenList, string relayAPIHost, string appKey, string appSecret, string token)
|
|
{
|
|
var serviceIdList = jtokenList.Select(j => j.Value<string>("serviceId")).ToList();
|
|
var dbServiceOrderList = fsql.Select<ServiceOrder>().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<string>("serviceId"))).Select(j => j.Value<string>("orderId")).ToList();
|
|
var dbOrderSkuList = fsql.Select<OrderSku, Order, OrderCostDetail, PurchaseOrder>()
|
|
.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<ServiceOrder> insertServiceOrderList = new List<ServiceOrder>();
|
|
List<IUpdate<ServiceOrder>> updateServiceOrderList = new List<IUpdate<ServiceOrder>>();
|
|
|
|
foreach (var serviceOrderJToken in jtokenList)
|
|
{
|
|
var serviceId = serviceOrderJToken.Value<string>("serviceId");
|
|
var status = (Enums.ServiceOrderState)serviceOrderJToken.Value<int>("serviceStatus");
|
|
var statusUpdateTime = serviceOrderJToken.Value<long>("updateTime").StampToDateTime();
|
|
var dbServiceOrder = dbServiceOrderList.FirstOrDefault(s => s.ServiceId == serviceId);
|
|
if (dbServiceOrder == null)
|
|
{
|
|
var serviceOrderId = serviceOrderJToken.Value<string>("orderId");
|
|
var skuId = serviceOrderJToken.Value<string>("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<ApiResponse<JToken>>(serviceOrderDetailResult.Content);
|
|
if (!serviceOrderDetailResponse.Success)
|
|
throw new Exception($"获取服务单详情失败 {serviceOrderDetailResponse.Msg}");
|
|
|
|
var processResult = serviceOrderDetailResponse.Data.Value<int>("processResult");
|
|
if (processResultDic.ContainsKey(processResult))
|
|
serviceResult = processResultDic[processResult];
|
|
|
|
//检查退货城市是否为泉州鲤城区
|
|
isNeedSubscribeKuaiDi100 = (serviceOrderDetailResponse.Data["afsContactInfo"]?.Value<int>("cityCode") ?? 0) == 1332 &&
|
|
(serviceOrderDetailResponse.Data["afsContactInfo"]?.Value<int>("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<long>("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<ServiceOrder>(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<int>() { 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<JToken> jtokenList = new List<JToken>();
|
|
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<ApiResponse<JArray>>(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<ServiceOrder>().Where(s => s.ShopId == shop.ShopId &&
|
|
s.IsNeedSubscribeKuaiDi100 == true &&
|
|
s.IsSubscribeKuaiDi100 == false)
|
|
.OrderByDescending(s => s.StatusUpdateTime)
|
|
.Page(1, 50)
|
|
.ToList();
|
|
List<IUpdate<ServiceOrder>> updateSerivceOrderList = new List<IUpdate<ServiceOrder>>();
|
|
List<ExpressOrder> insertExpressOrderList = new List<ExpressOrder>();
|
|
|
|
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<ApiResponse<JToken>>(serviceOrderDeliveryResult.Content);
|
|
if (!serviceOrderDeliveryResponse.Success)
|
|
throw new Exception($"获取服务单运单详情失败 {serviceOrderDeliveryResponse.Msg}");
|
|
|
|
if (serviceOrderDeliveryResponse.Data != null)
|
|
{
|
|
serviceOrder.WayBillNo = serviceOrderDeliveryResponse.Data.Value<string>("expressCode");
|
|
serviceOrder.ExpressName = serviceOrderDeliveryResponse.Data.Value<string>("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 = "http://bbwytest.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<KuaiDi100Response>(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>(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<ExpressOrder>().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<string>("nu");
|
|
var state = jobject["lastResult"].Value<int>("state");
|
|
if (!kuaiDi100PushStateList_lanshou.Contains(state) &&
|
|
!kuaiDi100PushStateList_zaitu.Contains(state) &&
|
|
!kuaiDi100PushStateList_paijian.Contains(state) &&
|
|
!kuaiDi100PushStateList_qianshou.Contains(state))
|
|
return;
|
|
|
|
var serviceOrderList = fsql.Select<ServiceOrder>().Where(s => s.WayBillNo == waybillNo).ToList();
|
|
if (serviceOrderList.Count() == 0)
|
|
throw new Exception($"快递单号{waybillNo} 未找到对应的服务单");
|
|
|
|
var expressOrder = fsql.Select<ExpressOrder>().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>(expressOrder.Id).Set(e => e.SignTime, signTime)
|
|
.Set(e => e.UpdateTime, DateTime.Now)
|
|
.ExecuteAffrows();
|
|
}
|
|
return;
|
|
}
|
|
|
|
var isUpdate = false;
|
|
Enums.TransportState? newStatus = null;
|
|
IUpdate<ExpressOrder> updateExpressOrder = null;
|
|
List<IUpdate<ServiceOrder>> updateServiceOrderList = new List<IUpdate<ServiceOrder>>();
|
|
|
|
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>(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>(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<int>("statusCode")));
|
|
if (data != null)
|
|
signTime = DateTime.Parse(data.Value<string>("ftime"));
|
|
return signTime;
|
|
}
|
|
}
|
|
}
|
|
|