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; + } }