diff --git a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs
index 6b4551d..5d1ffb9 100644
--- a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs
+++ b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs
@@ -115,6 +115,7 @@ namespace BBWYB.Server.API.Controllers
[Consumes("application/x-www-form-urlencoded")]
[HttpPost]
+ [AllowAnonymous]
public IActionResult KuaiDi100Publish([FromForm] string sign, [FromForm] string param)
{
#region 去掉本次请求的DTO格式
diff --git a/BBWYB.Server.Business/DingDingBusiness.cs b/BBWYB.Server.Business/DingDingBusiness.cs
new file mode 100644
index 0000000..8d53c0b
--- /dev/null
+++ b/BBWYB.Server.Business/DingDingBusiness.cs
@@ -0,0 +1,62 @@
+using BBWYB.Common.Extensions;
+using BBWYB.Common.Http;
+using BBWYB.Common.Models;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace BBWYB.Server.Business
+{
+ public class DingDingBusiness : IDenpendency
+ {
+ private RestApiService restApiService;
+
+ public DingDingBusiness(RestApiService restApiService)
+ {
+ this.restApiService = restApiService;
+ }
+
+ public void SendDingDingBotMessage(string secret, string webHook, string content)
+ {
+ var timestamp = DateTime.Now.DateTimeToStamp();
+ var stringToSign = timestamp + "\n" + secret;
+ var sign = EncryptWithSHA256(stringToSign, secret);
+ var url = $"{webHook}×tamp={timestamp}&sign={sign}";
+ var result = restApiService.SendRequest(url, string.Empty, new
+ {
+ msgtype = "text",
+ text = new
+ {
+ content = content
+ }
+ }, null, HttpMethod.Post);
+ if (result.StatusCode != System.Net.HttpStatusCode.OK)
+ throw new Exception($"发送钉钉机器人消息失败 {result.Content}");
+ }
+
+ ///
+ /// Base64 SHA256
+ ///
+ /// 待加密数据
+ /// 密钥
+ ///
+ private string EncryptWithSHA256(string data, string secret)
+ {
+ secret = secret ?? "";
+
+ // 1、string 转换成 utf-8 的byte[]
+ var encoding = Encoding.UTF8;
+ byte[] keyByte = encoding.GetBytes(secret);
+ byte[] dataBytes = encoding.GetBytes(data);
+
+ // 2、 HMACSHA256加密
+ using (var hmac256 = new HMACSHA256(keyByte))
+ {
+ byte[] hashData = hmac256.ComputeHash(dataBytes);
+ // 3、转换成base64
+ var base64Str = Convert.ToBase64String(hashData);
+ // 4、urlEncode编码
+ return System.Web.HttpUtility.UrlEncode(base64Str, Encoding.UTF8);
+ }
+ }
+ }
+}
diff --git a/BBWYB.Server.Business/KuaiDi100Manager.cs b/BBWYB.Server.Business/KuaiDi100Manager.cs
index c4b3f7b..0ef93af 100644
--- a/BBWYB.Server.Business/KuaiDi100Manager.cs
+++ b/BBWYB.Server.Business/KuaiDi100Manager.cs
@@ -37,10 +37,6 @@ namespace BBWYB.Server.Business
}
}
- private void ThrowSubscribeError(string waybillno, string kuaidi100CompanyCode, string error)
- {
- throw new Exception($"订阅快递100失败 waybillno:{waybillno} kuaidi100CompanyCode:{kuaidi100CompanyCode} error:{error}");
- }
///
/// 订阅快递100
@@ -51,7 +47,7 @@ namespace BBWYB.Server.Business
public void SubscribeKuaiDi100(string waybillno, string kuaidi100CompanyCode, string callbackUrl)
{
if (string.IsNullOrEmpty(kuaidi100CompanyCode))
- ThrowSubscribeError(waybillno, kuaidi100CompanyCode, "缺少快递100公司编码");
+ throw new Exception("缺少快递100公司编码");
var paramStr = JsonConvert.SerializeObject(new
{
@@ -67,10 +63,10 @@ namespace BBWYB.Server.Business
});
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)
- ThrowSubscribeError(waybillno, kuaidi100CompanyCode, subscribeResult.Content);
+ throw new Exception(subscribeResult.Content);
var subscribeResponse = JsonConvert.DeserializeObject(subscribeResult.Content);
if (!subscribeResponse.result)
- ThrowSubscribeError(waybillno, kuaidi100CompanyCode, subscribeResponse.message);
+ throw new Exception(subscribeResponse.message);
}
///
diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
index 6e4ccd5..97c23eb 100644
--- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
+++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
@@ -15,45 +15,42 @@ using SDKAdapter.PurchasePlatform.Models;
using System.Text;
using Yitter.IdGenerator;
using BBWYB.Server.Business.Extensions;
+using Microsoft.Extensions.DependencyInjection;
namespace BBWYB.Server.Business
{
public class PurchaseOrderBusiness : BaseBusiness, IDenpendency
{
- private PP_PlatformClientFactory ppPlatformClientFactory;
- private TaskSchedulerManager taskSchedulerManager;
- private FreeSqlMultiDBManager fsqlManager;
- private OrderBusiness orderBusiness;
- private VenderBusiness venderBusiness;
- private PurchaseSchemeBusiness purchaseSchemeBusiness;
- private ExpressCompanyNameConverter expressCompanyNameConverter;
- private RestApiService restApiService;
+ private Lazy pplatformClientFactoryLazy;
+ private Lazy taskSchedulerManagerLazy;
+ private Lazy fsqlManagerLazy;
+ private Lazy expressCompanyNameConverterLazy;
+ private Lazy kuaiDi100ManagerLazy;
+ private Lazy dingDingBusinessLazy;
+ private Lazy qiKuManagerLazy;
+
+ private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value;
+ private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value;
+ private FreeSqlMultiDBManager fsqlManager => fsqlManagerLazy.Value;
+ private ExpressCompanyNameConverter expressCompanyNameConverter => expressCompanyNameConverterLazy.Value;
+ private KuaiDi100Manager kuaiDi100Manager => kuaiDi100ManagerLazy.Value;
+ private DingDingBusiness dingDingBusiness => dingDingBusinessLazy.Value;
+ private QiKuManager qiKuManager => qiKuManagerLazy.Value;
private IList cantPurchaseOrderStateList;
- private KuaiDi100Manager kuaiDi100Manager;
- private QiKuManager qiKuManager;
public PurchaseOrderBusiness(IFreeSql fsql,
NLogManager nLogManager,
IIdGenerator idGenerator,
- PP_PlatformClientFactory ppPlatformClientFactory,
- TaskSchedulerManager taskSchedulerManager,
- FreeSqlMultiDBManager fsqlManager,
- OrderBusiness orderBusiness,
- VenderBusiness venderBusiness,
- PurchaseSchemeBusiness purchaseSchemeBusiness,
- ExpressCompanyNameConverter expressCompanyNameConverter,
- RestApiService restApiService,
- KuaiDi100Manager kuaiDi100Manager,
- QiKuManager qiKuManager) : base(fsql, nLogManager, idGenerator)
+ IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator)
{
- this.ppPlatformClientFactory = ppPlatformClientFactory;
- this.taskSchedulerManager = taskSchedulerManager;
- this.fsqlManager = fsqlManager;
- this.orderBusiness = orderBusiness;
- this.venderBusiness = venderBusiness;
- this.expressCompanyNameConverter = expressCompanyNameConverter;
- this.restApiService = restApiService;
- this.purchaseSchemeBusiness = purchaseSchemeBusiness;
+ pplatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService());
+ taskSchedulerManagerLazy = new Lazy(() => serviceProvider.GetService());
+ fsqlManagerLazy = new Lazy(() => serviceProvider.GetService());
+ expressCompanyNameConverterLazy = new Lazy(() => serviceProvider.GetService());
+ kuaiDi100ManagerLazy = new Lazy(() => serviceProvider.GetService());
+ dingDingBusinessLazy = new Lazy(() => serviceProvider.GetService());
+ qiKuManagerLazy = new Lazy(() => serviceProvider.GetService());
+
cantPurchaseOrderStateList = new List()
{
Enums.OrderState.已取消,
@@ -61,8 +58,6 @@ namespace BBWYB.Server.Business
Enums.OrderState.待付款,
Enums.OrderState.待完结
};
- this.kuaiDi100Manager = kuaiDi100Manager;
- this.qiKuManager = qiKuManager;
}
///
@@ -1223,18 +1218,37 @@ namespace BBWYB.Server.Business
#region 找出新发货的快递单
foreach (var logisticsInfo in logisticsList)
{
- if (purchaseExpressOrderList.Any(po => po.WaybillNo == logisticsInfo.WayBillNo))
+ if (string.IsNullOrEmpty(logisticsInfo.WayBillNo) ||
+ purchaseExpressOrderList.Any(po => po.WaybillNo == logisticsInfo.WayBillNo))
continue;
- #region 快递1688物流公司为快递100物流公司
- var kuaidi100Company = expressCompanyNameConverter.ConverterToKuaiDi100Company(logisticsInfo.ExpressName);
- if (kuaidi100Company == null)
- throw new Exception($"快递100公司翻译失败 SourceExpressName:{logisticsInfo.ExpressName}");
- #endregion
-
#region 订阅快递100
currentProgress = "订阅快递100";
- kuaiDi100Manager.SubscribeKuaiDi100(logisticsInfo.WayBillNo, kuaidi100Company.TargetCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish");
+ LogisticsCompanyRelationship kuaidi100Company = null;
+ bool isSubscribeKD100 = false;
+ try
+ {
+ kuaidi100Company = expressCompanyNameConverter.ConverterToKuaiDi100Company(logisticsInfo.ExpressName);
+ if (kuaidi100Company == null)
+ throw new Exception($"快递100公司翻译失败 SourceExpressName:{logisticsInfo.ExpressName} 无翻译结果");
+ kuaiDi100Manager.SubscribeKuaiDi100(logisticsInfo.WayBillNo, kuaidi100Company.TargetCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish");
+ isSubscribeKD100 = true;
+ }
+ catch (Exception ex)
+ {
+ nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}");
+
+ #region 订阅失败发送钉钉通知
+ var dingdingMsg = new StringBuilder();
+ dingdingMsg.AppendLine($"错误:{ex.Message}");
+ dingdingMsg.AppendLine($"1688订单号:{purchaseOrderId}");
+ dingdingMsg.AppendLine($"拳探订单号:{orderId}");
+ dingdingMsg.AppendLine($"源物流公司:{logisticsInfo.ExpressName}");
+ dingdingMsg.AppendLine($"目标物流公司:{kuaidi100Company?.TargetName} {kuaidi100Company?.TargetCode}");
+ dingdingMsg.Append($"快递单号:${logisticsInfo.WayBillNo}");
+ SendDingDingOnKD100SubscribeFail(dingdingMsg.ToString());
+ #endregion
+ }
#endregion
#region 创建快递单
@@ -1247,9 +1261,10 @@ namespace BBWYB.Server.Business
SourceExpressId = logisticsInfo.ExpressId,
SourceExpressName = logisticsInfo.ExpressName,
WaybillNo = logisticsInfo.WayBillNo,
- TargetExpressId = kuaidi100Company.TargetCode,
- TargetExpressName = kuaidi100Company.TargetName,
- ExpressState = kuaiDi100Manager.GetExpressState(1) //快递100发货状态值 默认揽收
+ TargetExpressId = kuaidi100Company?.TargetCode,
+ TargetExpressName = kuaidi100Company?.TargetName,
+ ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收
+ IsSubscribeKD100 = isSubscribeKD100
};
insertPurchaseExpressOrderList.Add(purchaseExpressOrder);
#endregion
@@ -1778,5 +1793,16 @@ namespace BBWYB.Server.Business
nLogManager.GetLogger("快递100").Error(ex, waybillNo);
}
}
+
+ private void SendDingDingOnKD100SubscribeFail(string content)
+ {
+ try
+ {
+ dingDingBusiness.SendDingDingBotMessage("SEC5f08a3dd6813e50bf9a3b81350ec12a8086c64b9e29ef858a17f5cc7887906d7",
+ "https://oapi.dingtalk.com/robot/send?access_token=7ce472411bb8dde0c3ff503fcca9ead84d39950ee3c4c65c808dbc58981eb929",
+ content);
+ }
+ catch { }
+ }
}
}
diff --git a/BBWYB.Server.Model/Db/Order/PurchaseExpressOrder.cs b/BBWYB.Server.Model/Db/Order/PurchaseExpressOrder.cs
index 289bfb8..46f0d8e 100644
--- a/BBWYB.Server.Model/Db/Order/PurchaseExpressOrder.cs
+++ b/BBWYB.Server.Model/Db/Order/PurchaseExpressOrder.cs
@@ -73,6 +73,12 @@ namespace BBWYB.Server.Model.Db
[Column(StringLength = 100)]
public string TargetExpressName { get; set; }
+ ///
+ /// 是否订阅快递100
+ ///
+ [Column(DbType = "bit")]
+ public bool IsSubscribeKD100 { get; set; } = false;
+
}
}