Browse Source

调整1688发货回调

yijia
shanji 2 years ago
parent
commit
f3d87a1e52
  1. 1
      BBWYB.Server.API/Program.cs
  2. 12
      BBWYB.Server.Business/Extensions/PurchaseOrderStateExtension.cs
  3. 93
      BBWYB.Server.Business/KuaiDi100Manager.cs
  4. 127
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  5. 5
      SDKAdapter/ExpressCompanyNameConverter.cs
  6. 2
      SDKAdapter/PurchasePlatform/Client/Base/PP_PlatformClient.cs
  7. 22
      SDKAdapter/PurchasePlatform/Client/Impl/PP_1688Client.cs
  8. 4
      SDKAdapter/PurchasePlatform/Models/Response/Order/PP_QueryOrderLogisticsResponse.cs

1
BBWYB.Server.API/Program.cs

@ -62,6 +62,7 @@ services.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWYB.Server.Busi
services.AddSingleton<OP_PlatformClientFactory>();
services.AddSingleton<PP_PlatformClientFactory>();
services.AddSingleton<ExpressCompanyNameConverter>();
services.AddSingleton<KuaiDi100Manager>();
services.AddMapper(new MappingProfiles());
services.Configure<List<ClientVersionValidationModel>>(configuration.GetSection("ApiVersionRequirements"));

12
BBWYB.Server.Business/Extensions/PurchaseOrderStateExtension.cs

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BBWYB.Server.Business.Extensions
{
internal class PurchaseOrderStateExtension
{
}
}

93
BBWYB.Server.Business/KuaiDi100Manager.cs

@ -0,0 +1,93 @@
using BBWYB.Common.Http;
using BBWYB.Common.Models;
using Newtonsoft.Json;
using SDKAdapter;
namespace BBWYB.Server.Business
{
public class KuaiDi100Manager : IDenpendency
{
private RestApiService restApiService;
private ExpressCompanyNameConverter expressCompanyNameConverter;
public IList<int> KuaiDi100PushStateList_ZaiTu = new List<int>() { 0, 1001, 1002, 1003 };
public IList<int> KuaiDi100PushStateList_LanShou = new List<int>() { 1, 101, 102, 103 };
public IList<int> KuaiDi100PushStateList_QianShou = new List<int>() { 3, 301, 302, 303, 304 };
public IList<int> KuaiDi100PushStateList_PaiJian = new List<int>() { 5, 501 };
public KuaiDi100Manager(RestApiService restApiService, ExpressCompanyNameConverter expressCompanyNameConverter)
{
this.restApiService = restApiService;
this.expressCompanyNameConverter = expressCompanyNameConverter;
}
private void ThrowSubscribeError(string waybillno, string sourceExpressName, string kuaidi100CompanyCode, string error)
{
throw new Exception($"订阅快递100失败 waybillno:{waybillno} sourceExpressName:{sourceExpressName} kuaidi100CompanyCode:{kuaidi100CompanyCode} error:{error}");
}
/// <summary>
/// 订阅快递100
/// </summary>
/// <param name="waybillno"></param>
/// <param name="sourceExpressName"></param>
/// <param name="kuaidi100CompanyCode"></param>
/// <param name="callbackUrl"></param>
public void SubscribeKuaiDi100(string waybillno, string sourceExpressName, string kuaidi100CompanyCode,string callbackUrl)
{
if (string.IsNullOrEmpty(sourceExpressName) && string.IsNullOrEmpty(kuaidi100CompanyCode))
ThrowSubscribeError(waybillno, sourceExpressName, kuaidi100CompanyCode, "原始快递公司名称和快递100公司编码必须任意一个有值");
if (string.IsNullOrEmpty(kuaidi100CompanyCode))
kuaidi100CompanyCode = expressCompanyNameConverter.ConverterToKuaiDi100CompanyCode(sourceExpressName);
if (string.IsNullOrEmpty(kuaidi100CompanyCode))
ThrowSubscribeError(waybillno, sourceExpressName, kuaidi100CompanyCode, "无翻译结果");
var paramStr = JsonConvert.SerializeObject(new
{
company = kuaidi100CompanyCode,
number = waybillno,
key = "SdcRPzxo8802",
parameters = new
{
callbackurl = callbackUrl,
salt = Guid.NewGuid(),
resultv2 = "4"
}
});
var subscribeResult = restApiService.SendRequest("https://poll.kuaidi100.com", "poll", $"schema=json&param={paramStr}", null, HttpMethod.Post, RestApiService.ContentType_Form);
if (subscribeResult.StatusCode != System.Net.HttpStatusCode.OK)
ThrowSubscribeError(waybillno, sourceExpressName, kuaidi100CompanyCode, subscribeResult.Content);
var subscribeResponse = JsonConvert.DeserializeObject<KuaiDi100Response>(subscribeResult.Content);
if (!subscribeResponse.result)
ThrowSubscribeError(waybillno, sourceExpressName, kuaidi100CompanyCode, subscribeResponse.message);
}
/// <summary>
/// 获取物流状态 ZaiTu LanShou QianShou PaiJian Unknow
/// </summary>
/// <param name="kuaidi100State"></param>
/// <returns></returns>
public string GetExpressState(int kuaidi100State)
{
if (KuaiDi100PushStateList_ZaiTu.Contains(kuaidi100State))
return "ZaiTu";
if (KuaiDi100PushStateList_LanShou.Contains(kuaidi100State))
return "LanShou";
if (KuaiDi100PushStateList_QianShou.Contains(kuaidi100State))
return "QianShou";
if (KuaiDi100PushStateList_PaiJian.Contains(kuaidi100State))
return "PaiJian";
return "Unknow";
}
}
public class KuaiDi100Response
{
public bool result { get; set; }
public int returnCode { get; set; }
public string message { get; set; }
}
}

127
BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -29,6 +29,7 @@ namespace BBWYB.Server.Business
private ExpressCompanyNameConverter expressCompanyNameConverter;
private RestApiService restApiService;
private IList<Enums.OrderState> cantPurchaseOrderStateList;
private KuaiDi100Manager kuaiDi100Manager;
public PurchaseOrderBusiness(IFreeSql fsql,
NLogManager nLogManager,
IIdGenerator idGenerator,
@ -39,7 +40,8 @@ namespace BBWYB.Server.Business
VenderBusiness venderBusiness,
PurchaseSchemeBusiness purchaseSchemeBusiness,
ExpressCompanyNameConverter expressCompanyNameConverter,
RestApiService restApiService) : base(fsql, nLogManager, idGenerator)
RestApiService restApiService,
KuaiDi100Manager kuaiDi100Manager) : base(fsql, nLogManager, idGenerator)
{
this.ppPlatformClientFactory = ppPlatformClientFactory;
this.taskSchedulerManager = taskSchedulerManager;
@ -56,6 +58,7 @@ namespace BBWYB.Server.Business
Enums.OrderState.,
Enums.OrderState.
};
this.kuaiDi100Manager = kuaiDi100Manager;
}
/// <summary>
@ -916,7 +919,127 @@ namespace BBWYB.Server.Business
private void DeliveryCallbackFrom1688(JObject jObject)
{
var purchaseOrderId = jObject["data"].Value<string>("orderId");
Task.Factory.StartNew(() => DeliveryCallback(purchaseOrderId, null, Enums.Platform.), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
}
/// <summary>
/// 1688发货回调
/// </summary>
/// <param name="purchaseOrderId">采购单</param>
private void DeliveryCallbackFrom1688(string purchaseOrderId)
{
string orderId = string.Empty;
long? shopId = null;
string currentProgress = string.Empty;
string wayBillNoResponseInfo = string.Empty;
try
{
List<PurchaseExpressOrder> insertPurchaseExpressOrderList = new List<PurchaseExpressOrder>();
IList<IUpdate<OrderPurchaseSkuInfo>> updateOrderPurchaseSkuList = new List<IUpdate<OrderPurchaseSkuInfo>>();
IUpdate<OrderPurchaseInfo> updateOrderPurchase = null;
IUpdate<Order> updateOrder = null;
#region 查询采购单信息
currentProgress = "查询采购单信息";
var orderPurchaseInfo = fsql.Select<OrderPurchaseInfo>().Where(o => o.PurchaseOrderId == purchaseOrderId && o.IsEnabled == true).ToOne();
if (orderPurchaseInfo == null)
throw new Exception("未查询到采购单信息");
orderId = orderPurchaseInfo.OrderId;
shopId = orderPurchaseInfo.ShopId;
#endregion
#region 查询采购账号
currentProgress = "查询采购账号";
var purchaseAccount = fsqlManager.MDSfsql.Select<Purchaseaccount>().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne();
if (purchaseAccount == null)
throw new Exception($"未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}");
#endregion
#region 获取采购单的物流信息
currentProgress = "获取采购单的物流信息";
var client = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.);
var ppQueryOrderLogisticsRequest = new PP_QueryOrderLogisticsRequest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
OrderId = purchaseOrderId,
Platform = AdapterEnums.PlatformType.
};
var logisticsList = client.QueryOrderLogistics(ppQueryOrderLogisticsRequest);
wayBillNoResponseInfo = JsonConvert.SerializeObject(new { purchaseOrderId, logisticsList });
#endregion
#region 查询该笔采购单的sku信息和已有快递单信息
currentProgress = "查询该笔采购单的sku信息和已有快递单信息";
var orderPurchaseSkuList = fsql.Select<OrderPurchaseSkuInfo>().Where(x => x.PurchaseOrderId == purchaseOrderId).ToList();
var purchaseExpressOrderList = fsql.Select<PurchaseExpressOrder>().Where(x => x.PurchaseOrderId == purchaseOrderId).ToList();
#endregion
#region 找出新发货的快递单
foreach (var logisticsInfo in logisticsList)
{
if (purchaseExpressOrderList.Any(po => po.WaybillNo == logisticsInfo.WayBillNo))
continue;
#region 创建快递单
var purchaseExpressOrder = new PurchaseExpressOrder()
{
OrderId = orderId,
CreateTime = DateTime.Now,
PurchaseOrderId = purchaseOrderId,
ShopId = shopId ?? 0,
SourceExpressId = logisticsInfo.ExpressId,
SourceExpressName = logisticsInfo.ExpressName,
WaybillNo = logisticsInfo.WayBillNo,
ExpressState = kuaiDi100Manager.GetExpressState(1) //快递100发货状态值 默认揽收
};
insertPurchaseExpressOrderList.Add(purchaseExpressOrder);
#endregion
#region 更新采购sku的快递单号
foreach (var orderEntryId in logisticsInfo.OrderEntryIds)
{
var purchaseSku = orderPurchaseSkuList.FirstOrDefault(x => x.Id == orderEntryId);
if (purchaseSku == null)
continue;
purchaseSku.WaybillNo = logisticsInfo.WayBillNo;
updateOrderPurchaseSkuList.Add(fsql.Update<OrderPurchaseSkuInfo>(orderEntryId).Set(ps => ps.WaybillNo, logisticsInfo.WayBillNo));
}
#endregion
#region 订阅快递100
currentProgress = "订阅快递100";
kuaiDi100Manager.SubscribeKuaiDi100(logisticsInfo.WayBillNo, logisticsInfo.ExpressName, string.Empty,"");
#endregion
}
#endregion
#region 计算采购单状态
#endregion
#region 计算订单状态
#endregion
#region 通知C端订单状态
#endregion
fsql.Transaction(() =>
{
fsql.Insert(insertPurchaseExpressOrderList).ExecuteAffrows();
foreach (var update in updateOrderPurchaseSkuList)
update.ExecuteAffrows();
updateOrderPurchase?.ExecuteAffrows();
updateOrder?.ExecuteAffrows();
});
}
catch (Exception ex)
{
nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}");
}
}
/// <summary>

5
SDKAdapter/ExpressCompanyNameConverter.cs

@ -127,6 +127,11 @@ namespace SDKAdapter
}
return expressCompany;
}
public string ConverterToKuaiDi100CompanyCode(string sourceName)
{
return string.Empty;
}
}
public class LogisticsCompanyRelationship

2
SDKAdapter/PurchasePlatform/Client/Base/PP_PlatformClient.cs

@ -53,7 +53,7 @@ namespace SDKAdapter.PurchasePlatform.Client
/// <param name="request"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public virtual PP_QueryOrderLogisticsResponse QueryOrderLogistics(PP_QueryOrderLogisticsRequest request)
public virtual IList<PP_QueryOrderLogisticsResponse> QueryOrderLogistics(PP_QueryOrderLogisticsRequest request)
{
throw new NotImplementedException();
}

22
SDKAdapter/PurchasePlatform/Client/Impl/PP_1688Client.cs

@ -251,7 +251,7 @@ namespace SDKAdapter.PurchasePlatform.Client
};
}
public override PP_QueryOrderLogisticsResponse QueryOrderLogistics(PP_QueryOrderLogisticsRequest request)
public override IList<PP_QueryOrderLogisticsResponse> QueryOrderLogistics(PP_QueryOrderLogisticsRequest request)
{
var client = GetSyncAPIClient(request.AppKey, request.AppSecret);
RequestPolicy reqPolicy = new RequestPolicy();
@ -278,14 +278,22 @@ namespace SDKAdapter.PurchasePlatform.Client
throw new Exception(result.Value<string>("errorMessage"));
//nLogManager.Default().Info($"GetWayBillNoByOrderId QueryOrderWayBillNoRequest {JsonConvert.SerializeObject(queryOrderWayBillNoRequest)} Result {result}");
/*
new PP_QueryOrderLogisticsResponse()
{
ExpressId = logisticsOrderJToken.Value<string>("logisticsCompanyId"),
ExpressName = logisticsOrderJToken.Value<string>("logisticsCompanyName"),
WayBillNo = logisticsOrderJToken.Value<string>("logisticsBillNo")
}
*/
var firstJToken = result["result"].FirstOrDefault();
return new PP_QueryOrderLogisticsResponse()
return result["result"].Children().Select(logisticsOrderJToken => new PP_QueryOrderLogisticsResponse()
{
ExpressId = firstJToken.Value<string>("logisticsCompanyId"),
ExpressName = firstJToken.Value<string>("logisticsCompanyName"),
WayBillNo = firstJToken.Value<string>("logisticsBillNo")
};
ExpressId = logisticsOrderJToken.Value<string>("logisticsCompanyId"),
ExpressName = logisticsOrderJToken.Value<string>("logisticsCompanyName"),
WayBillNo = logisticsOrderJToken.Value<string>("logisticsBillNo"),
OrderEntryIds = logisticsOrderJToken.Value<string>("orderEntryIds").Split(',', StringSplitOptions.RemoveEmptyEntries)
}).ToList();
}
}

4
SDKAdapter/PurchasePlatform/Models/Response/Order/PP_QueryOrderLogisticsResponse.cs

@ -7,5 +7,9 @@
public string ExpressId { get; set; }
public string ExpressName { get; set; }
public IList<string> OrderEntryIds { get; set; }
public IList<string> SkuIds { get; set; }
}
}

Loading…
Cancel
Save