diff --git a/BBWY.Server.API/Controllers/ServiceOrderSyncController.cs b/BBWY.Server.API/Controllers/ServiceOrderSyncController.cs new file mode 100644 index 00000000..2749824b --- /dev/null +++ b/BBWY.Server.API/Controllers/ServiceOrderSyncController.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace BBWY.Server.API.Controllers +{ + + public class ServiceOrderSyncController : BaseApiController + { + public ServiceOrderSyncController(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor) + { + } + + [Consumes("application/x-www-form-urlencoded")] + [HttpPost] + public void KuaiDi100Callback() + { + + } + } +} diff --git a/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs b/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs index a6cd235f..e5d4a93a 100644 --- a/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs +++ b/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs @@ -114,6 +114,10 @@ namespace BBWY.Server.Business public string TargetName { get; set; } + public string TargetCode { get; set; } + public string SecondTargetName { get; set; } + + public string SecondTargetCode { get; set; } } } diff --git a/BBWY.Server.Business/Sync/JD/JDServiceOrderSyncBusiness.cs b/BBWY.Server.Business/Sync/JD/JDServiceOrderSyncBusiness.cs index f5c6298b..814b62f3 100644 --- a/BBWY.Server.Business/Sync/JD/JDServiceOrderSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/JD/JDServiceOrderSyncBusiness.cs @@ -22,9 +22,55 @@ namespace BBWY.Server.Business.Sync 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 百世快递 + + */ + jd_kd100_logisticsCompanyDictionary = new List() { - new LogisticsCompanyRelationship(){ SourceName="",TargetName="",SecondTargetName="" } + 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"}, }; } @@ -71,6 +117,7 @@ namespace BBWY.Server.Business.Sync }); List insertServiceOrderList = new List(); + List insertExpressOrderList = new List(); List> updateServiceOrderList = new List>(); foreach (var serviceOrderJToken in jtokenList) @@ -136,11 +183,27 @@ namespace BBWY.Server.Business.Sync StatusUpdateTime = statusUpdateTime, IsSubscribeKuaiDi100 = false, IsNeedSubscribeKuaiDi100 = isNeedSubscribeKuaiDi100, - WaybillNo = string.Empty, - ExpressName = string.Empty, - ApplyTime = serviceOrderJToken.Value("applyTime") + ApplyTime = serviceOrderJToken.Value("applyTime"), + TransportDetails = 0 }; insertServiceOrderList.Add(dbServiceOrder); + if (isNeedSubscribeKuaiDi100) + { + var expressOrder = new ExpressOrder() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + ExpressName = string.Empty, + WayBillNo = string.Empty, + OrderId = serviceOrderId, + PackageType = 1, + ServiceId = serviceId, + UpdateTime = DateTime.Now, + PurchaseOrderId = string.Empty, + TransportStatus = 0 + }; + insertExpressOrderList.Add(expressOrder); + } } else if (dbServiceOrder.Status != status) { @@ -154,6 +217,8 @@ namespace BBWY.Server.Business.Sync { if (insertServiceOrderList.Count() > 0) fsql.Insert(insertServiceOrderList).ExecuteAffrows(); + if (insertExpressOrderList.Count() > 0) + fsql.Insert(insertExpressOrderList).ExecuteAffrows(); if (updateServiceOrderList.Count() > 0) foreach (var update in updateServiceOrderList) update.ExecuteAffrows(); @@ -254,19 +319,30 @@ namespace BBWY.Server.Business.Sync try { var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); - var serviceOrderList = fsql.Select().Where(s => s.ShopId == shop.Id && - s.IsNeedSubscribeKuaiDi100 == true && - s.IsSubscribeKuaiDi100 == false) - .OrderByDescending(s => s.StatusUpdateTime) + var serviceOrderList = fsql.Select().InnerJoin((s, e) => s.ServiceId == e.ServiceId) + .Where((s, e) => s.ShopId == shop.Id && + s.IsNeedSubscribeKuaiDi100 == true && + s.IsSubscribeKuaiDi100 == false) + .OrderByDescending((s, e) => s.StatusUpdateTime) .Page(1, 50) - .ToList(); + .ToList((s, e) => new + { + ServiceOrderPId = s.Id, + ExpressOrderPId = e.Id, + OrderId = s.OrderId, + ServiceId = s.ServiceId, + WaybillNo = e.WayBillNo, + ExpressName = e.ExpressName + }); List> updateSerivceOrderList = new List>(); - + List> updateExpressOrderList = new List>(); foreach (var serviceOrder in serviceOrderList) { bool isUpdateDelivery = false, isUpdateSubscribe = false; - if (string.IsNullOrEmpty(serviceOrder.WaybillNo) || string.IsNullOrEmpty(serviceOrder.ExpressName)) + string waybillNo = serviceOrder.WaybillNo; + string expressName = serviceOrder.ExpressName; + if (string.IsNullOrEmpty(waybillNo) || string.IsNullOrEmpty(expressName)) { try @@ -291,17 +367,10 @@ namespace BBWY.Server.Business.Sync if (serviceOrderDeliveryResponse.Data != null) { - var wayBillNo = serviceOrderDeliveryResponse.Data.Value("expressCode"); - var expressName = serviceOrderDeliveryResponse.Data.Value("expressCompany"); + waybillNo = serviceOrderDeliveryResponse.Data.Value("expressCode"); + expressName = serviceOrderDeliveryResponse.Data.Value("expressCompany"); - if (!string.IsNullOrEmpty(wayBillNo) && !string.IsNullOrEmpty(expressName)) - { - serviceOrder.WaybillNo = wayBillNo; - serviceOrder.ExpressName = expressName; - isUpdateDelivery = true; - //var update = fsql.Update(serviceOrder.Id).Set(s => s.WaybillNo, wayBillNo) - // .Set(s => s.ExpressName, expressName); - } + isUpdateDelivery = !string.IsNullOrEmpty(waybillNo) && !string.IsNullOrEmpty(expressName); } #endregion } @@ -316,14 +385,29 @@ namespace BBWY.Server.Business.Sync #region 订阅快递100 try { + var kuaidi100CompanyCode = ConvertToKuaiDi100CompanyCode(expressName); var subscribeResult = restApiService.SendRequest("https://poll.kuaidi100.com", "poll", JsonConvert.SerializeObject(new { schema = "json", param = new { - + company = kuaidi100CompanyCode, + number = waybillNo, + key = "SdcRPzxo8802", + parameters = new + { + callbackurl = "https://bbwy.qiyue666.com/api/ServiceOrderSync/KuaiDi100Callback", + salt = Guid.NewGuid(), + resultv2 = "4" + } } }), 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) @@ -332,29 +416,46 @@ namespace BBWY.Server.Business.Sync } #endregion } - - if (isUpdateDelivery || isUpdateSubscribe) + if (isUpdateDelivery) { - var update = fsql.Update(serviceOrder.Id).SetIf(isUpdateDelivery, s => s.WaybillNo, serviceOrder.WaybillNo) - .SetIf(isUpdateDelivery, s => s.ExpressName, serviceOrder.ExpressName) - .SetIf(isUpdateSubscribe, s => s.IsSubscribeKuaiDi100, true); + var update = fsql.Update(serviceOrder.ExpressOrderPId).SetIf(isUpdateDelivery, e => e.WayBillNo, waybillNo) + .SetIf(isUpdateDelivery, e => e.ExpressName, expressName); + updateExpressOrderList.Add(update); + } + if (isUpdateSubscribe) + { + var update = fsql.Update(serviceOrder.ServiceOrderPId).SetIf(isUpdateSubscribe, s => s.IsSubscribeKuaiDi100, true); updateSerivceOrderList.Add(update); } } - if (updateSerivceOrderList.Count() > 0) + + fsql.Transaction(() => { - fsql.Transaction(() => + if (updateExpressOrderList.Count() > 0) + { + foreach (var update in updateExpressOrderList) + update.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; + } } } diff --git a/BBWY.Server.Model/Db/Order/ExpressOrder.cs b/BBWY.Server.Model/Db/Order/ExpressOrder.cs new file mode 100644 index 00000000..a5d2791e --- /dev/null +++ b/BBWY.Server.Model/Db/Order/ExpressOrder.cs @@ -0,0 +1,67 @@ +using FreeSql.DataAnnotations; +using System; + +namespace BBWY.Server.Model.Db +{ + + /// + /// 快递单表 + /// + [Table(Name = "expressorder", DisableSyncStructure = true)] + public partial class ExpressOrder + { + + [Column(IsPrimary = true, IsIdentity = true)] + public long Id { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + /// + /// 快递公司名称 + /// + [Column(StringLength = 100)] + public string ExpressName { get; set; } + + /// + /// 订单Id + /// + [Column(StringLength = 100)] + public string OrderId { get; set; } + + /// + /// 包裹类型(采购包裹=0 退货包裹=1) + /// + + public int? PackageType { get; set; } + + /// + /// 采购单Id;可空 + /// + + public string PurchaseOrderId { get; set; } + + /// + /// 服务单Id;可空 + /// + [Column(StringLength = 100)] + public string ServiceId { get; set; } + + /// + /// 物流状态(0=待入库,1=已入库,2=派送中,3=运输中) + /// + + public int? TransportStatus { get; set; } + + [Column(DbType = "datetime")] + public DateTime? UpdateTime { get; set; } + + /// + /// 快递单号 + /// + [Column(StringLength = 100)] + public string WayBillNo { get; set; } + + } + +} diff --git a/BBWY.Server.Model/Db/Order/Serviceorder.cs b/BBWY.Server.Model/Db/Order/Serviceorder.cs index 9c15f9a2..231310b1 100644 --- a/BBWY.Server.Model/Db/Order/Serviceorder.cs +++ b/BBWY.Server.Model/Db/Order/Serviceorder.cs @@ -45,12 +45,6 @@ namespace BBWY.Server.Model.Db { [Column(DbType = "decimal(18,2)")] public decimal? DeliveryExpressFreight { get; set; } = 0.00M; - /// - /// 快递公司名称 - /// - [Column(StringLength = 100)] - public string ExpressName { get; set; } - /// /// 头程费 /// @@ -278,11 +272,6 @@ namespace BBWY.Server.Model.Db { [Column(StringLength = 100)] public string WareHouseGrounpRemark { get; set; } - /// - /// 退货运单号 - /// - [Column(StringLength = 100)] - public string WaybillNo { get; set; } } diff --git a/BBWY.Server.Model/Dto/Response/KuaiDi100Response.cs b/BBWY.Server.Model/Dto/Response/KuaiDi100Response.cs new file mode 100644 index 00000000..0a36c420 --- /dev/null +++ b/BBWY.Server.Model/Dto/Response/KuaiDi100Response.cs @@ -0,0 +1,11 @@ +namespace BBWY.Server.Model.Dto +{ + public class KuaiDi100Response + { + public bool result { get; set; } + + public int returnCode { get; set; } + + public string message { get; set; } + } +} diff --git a/BBWY.Test/Program.cs b/BBWY.Test/Program.cs index 81fb46d9..ac47a094 100644 --- a/BBWY.Test/Program.cs +++ b/BBWY.Test/Program.cs @@ -45,16 +45,16 @@ namespace BBWY.Test //var token = "44c19a1c1fbd4641957e6e8985ed1358jmtl"; //森王玩具 //var token = "4a0ddc095e054c7aa90adcaccb14f83cwzgr"; //可比车品 - //var dt1 = DateTime.Now; - //List list = new List(); - //for (var i = 1; i <= 5000000; i++) - //{ - // var md5 = tomMd5(Guid.NewGuid().ToString()); - // list.Add(md5); - // Console.WriteLine($"生成第{i}位指纹,{md5}"); - //} - //var dt2 = DateTime.Now; - //Console.WriteLine($"总数量{list.Count},总耗时{(dt2 - dt1).TotalSeconds}秒"); + var dt1 = DateTime.Now; + List list = new List(); + for (var i = 1; i <= 5000000; i++) + { + var str = tomMd5($"Mozilla/5.0 (Linux; Android 12; 21121210C Build/SKQ1.211006.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/13.8 SP-engine/2.46.0 baiduboxapp/13.8.1.10 (Baidu; P1 12) NABar/1.0 Edg/102.0.5005.63_{i}_192.158.241.{i}_28726526517321"); + Console.WriteLine($"生成第{i}位指纹,长度{str.Length},{str}"); + list.Add(str); + } + var dt2 = DateTime.Now; + Console.WriteLine($"总数量{list.Count},总耗时{(dt2 - dt1).TotalSeconds}秒"); @@ -97,21 +97,21 @@ namespace BBWY.Test var res = jdClient.Execute(req, token, DateTime.Now.ToLocalTime()); */ - var req = new AscQueryViewRequest(); - - req.buId = "10598776"; - req.operatePin = "开发测试"; - req.operateNick = "开发测试"; - req.serviceId = 1688379598; - req.orderId = 262837096353; + //var req = new AscQueryViewRequest(); + //req.buId = "10598776"; + //req.operatePin = "开发测试"; + //req.operateNick = "开发测试"; + //req.serviceId = 1688379598; + //req.orderId = 262837096353; - var res = jdClient.Execute(req, token, DateTime.Now.ToLocalTime()); //var res = jdClient.Execute(req, token, DateTime.Now.ToLocalTime()); - Console.WriteLine(JsonConvert.SerializeObject(res)); + ////var res = jdClient.Execute(req, token, DateTime.Now.ToLocalTime()); + + //Console.WriteLine(JsonConvert.SerializeObject(res)); Console.ReadKey(); }