From b59a48168005fc6626a6862b88d6ba41d7a1ae20 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Thu, 11 Apr 2024 08:51:06 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=9C=BA=E7=AB=99=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E5=BC=95=E5=85=A5=E5=AD=97=E6=AE=B5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/BookingOrder/BookingOrderService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 5d51617d..48031d07 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -9254,13 +9254,13 @@ namespace Myshipping.Application } // 赋值联系人信息 - item.contact_tel = contact?.contact_tel1; + item.contact_tel = contact?.contact_tel1?.Trim(); if (!string.IsNullOrWhiteSpace(contact?.contact_tel2)) { - item.contact_tel += (" " + contact.contact_tel2); + item.contact_tel += " " + contact.contact_tel2.Trim(); } - item.contact_name = contact?.contact_name; - item.contact_email = contact?.contact_email; + item.contact_name = contact?.contact_name?.Trim(); + item.contact_email = contact?.contact_email?.Trim(); } return listRtn; From 4333340f0aa1637fd204ae91b3404cac6248b2d9 Mon Sep 17 00:00:00 2001 From: wanghaomei <86whm@163.com> Date: Thu, 11 Apr 2024 09:06:42 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E7=A7=9F=E6=88=B7=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/DjyTenantParam/Dto/DjyTenantParamValueOutput.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Myshipping.Core/Service/DjyTenantParam/Dto/DjyTenantParamValueOutput.cs b/Myshipping.Core/Service/DjyTenantParam/Dto/DjyTenantParamValueOutput.cs index 1a33b8cb..debe9aeb 100644 --- a/Myshipping.Core/Service/DjyTenantParam/Dto/DjyTenantParamValueOutput.cs +++ b/Myshipping.Core/Service/DjyTenantParam/Dto/DjyTenantParamValueOutput.cs @@ -13,6 +13,11 @@ /// public class DjyTenantParamValueListOutput { + /// + /// id + /// + public long Id { get; set; } + /// /// 参数类别 /// From f6b402e0eb3d06276ac490ecae8c8fb290e96b04 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Thu, 11 Apr 2024 14:15:03 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=9C=BA=E7=AB=99?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8C=85=E8=A3=85=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookingOrder/BookingOrderService.cs | 18 ++++++++++++++++++ Myshipping.Core/Myshipping.Core.xml | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 4f2c0274..73fd8830 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -9239,11 +9239,15 @@ namespace Myshipping.Application var ctnList = await _cache.GetAllCodeCtn(); var mapCtn = await _cache.GetAllMappingCtn(); + var packageList = await _cache.GetAllCodePackage(); + var mapPackageList = await _cache.GetAllMappingPackage(); + var listRtn = JsonConvert.DeserializeObject>(rtn.data); var contact = JsonConvert.DeserializeObject>(rtn.contact)?.FirstOrDefault(); foreach (var item in listRtn) { + // 箱型 var ctnall = item.CTNALL; var findMap = mapCtn.FirstOrDefault(x => x.Module == "YardData" && x.MapCode == ctnall); var findCtn = ctnList.FirstOrDefault(x => x.Name == ctnall); @@ -9264,6 +9268,20 @@ namespace Myshipping.Application throw Oops.Bah($"未找到箱型{ctnall}的场站引入配置"); } + // 包装 + if (!string.IsNullOrWhiteSpace(item.KINDPKGS)) + { + var findMapPkg = mapPackageList.FirstOrDefault(x => x.Module == "YardData" && x.MapCode == item.KINDPKGS.Trim()); + if (findMapPkg != null) + { + var findPkg = packageList.FirstOrDefault(x => x.Code == findMapPkg.Code); + if (findPkg != null) + { + item.KINDPKGS = findPkg.Name; + } + } + } + // 赋值联系人信息 item.contact_tel = contact?.contact_tel1?.Trim(); if (!string.IsNullOrWhiteSpace(contact?.contact_tel2)) diff --git a/Myshipping.Core/Myshipping.Core.xml b/Myshipping.Core/Myshipping.Core.xml index b072c839..820e1fbb 100644 --- a/Myshipping.Core/Myshipping.Core.xml +++ b/Myshipping.Core/Myshipping.Core.xml @@ -12802,6 +12802,11 @@ 列表输出 + + + id + + 参数类别 From a9178b8329b40c8773d54abfc0bb3b95c02e46af Mon Sep 17 00:00:00 2001 From: wanghaomei <86whm@163.com> Date: Thu, 11 Apr 2024 17:52:50 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=B8=AD=E8=BF=9C=E8=AE=A2=E8=88=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EDI/ZhongYuanSoApiHelper.cs | 344 +++++++++++++++++- .../BookingOrder/BookingOrderService.cs | 18 + Myshipping.Core/Entity/DJY/DjyCustomer.cs | 10 + .../Entity/DJY/DjyCustomerContact.cs | 10 + 4 files changed, 374 insertions(+), 8 deletions(-) diff --git a/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs b/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs index f249bb88..bc63c1c1 100644 --- a/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs +++ b/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs @@ -1,7 +1,9 @@ using Furion; using Myshipping.Application.Entity; using Myshipping.Core; +using Myshipping.Core.Entity; using Myshipping.Core.Service; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -20,21 +22,239 @@ namespace Myshipping.Application.EDI var repCustOrder = App.GetService>(); var repOrder = App.GetService>(); var repCtn = App.GetService>(); + var repCustomer = App.GetService>(); + var repContact = App.GetService>(); + var repTemplate = App.GetService>(); + var cache = App.GetService(); var cacheService = App.GetService(); - var order = repOrder.FirstOrDefault(o => o.Id == bookingId); + var order = await repOrder.AsQueryable().Filter(null, true).FirstAsync(o => o.Id == bookingId); if (order == null) { return new KeyValuePair(false, "订舱信息未找到"); } + var custOrder = await repCustOrder.AsQueryable().Filter(null, true).FirstAsync(x => x.BookingId == order.Id); + if (custOrder == null) + { + return new KeyValuePair(false, "客户订舱信息未找到"); + } + + var sysConfigList = await cache.GetAllSysConfig(); + var sCfgUserKey = sysConfigList.FirstOrDefault(x => x.Code == "ZhongYuanApiSpiderKey" && x.GroupCode == "DJY_CONST"); + var sCfgUserSecret = sysConfigList.FirstOrDefault(x => x.Code == "ZhongYuanApiSpiderSecret" && x.GroupCode == "DJY_CONST"); + if (sCfgUserKey == null || sCfgUserSecret == null) + { + return new KeyValuePair(false, "中远订舱API的KEY和密钥为配置,请联系管理员"); + } + + + BookingSoTemplate template = null; + DjyCustomerContact custContact = null; + //查找模板: + //1.根据客户订舱信息中的BookingUserId和BookingTenantId,去客户信息中根据CustSysId查找客户(公司)及联系人(员工)信息 + //2.根据找到的客户及联系人信息,查找中远订舱模板 + if (custOrder.BookingUserId > 0 && custOrder.BookingTenantId > 0) + { + custContact = await repCustomer.AsQueryable() + .InnerJoin((cust, contact) => cust.Id == contact.CustomerId) + .Where((cust, contact) => cust.CustSysId == custOrder.TenantId && contact.CustSysId == custOrder.BookingUserId) + .Select((cust, contact) => contact) + .SingleAsync(); + if (custContact == null) + { + return new KeyValuePair(false, "未找到客户及联系人信息"); + } + + template = await repTemplate.AsQueryable().FirstAsync(x => x.CarrierId == order.CARRIERID && x.UserId == custContact.Id && x.IsEnable); + if (template == null) + { + return new KeyValuePair(false, "未找到订舱模板"); + } + } + + var mappingCtn = await cache.GetAllMappingCtn(); + var mappingFrt = await cache.GetAllMappingFrt(); + var mappingPortLoad = await cache.GetAllMappingPortLoad(); + var mappingPort = await cache.GetAllMappingPort(); + + var postModel = new ZhongYuanSoApiModel(); + postModel.userKey = sCfgUserKey.Value; + postModel.userSecret = sCfgUserSecret.Value; + + if (!string.IsNullOrEmpty(custOrder.ExtendData)) + { + var extObj = JObject.Parse(custOrder.ExtendData); + postModel.webAccount = extObj.GetStringValue("Account"); + postModel.webPassword = extObj.GetStringValue("Password"); + } + else + { + return new KeyValuePair(false, "未找到订舱账号信息"); + } + + postModel.uploadType = "DRAFT"; //DRAFT, TEMPLATE, BOOKING分别对应:草稿, 模板, 订舱 + postModel.saveName = template.TemplateName; + + var mapPortLoad = mappingPortLoad.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTLOADCODE); + var mapPort = mappingPort.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTDISCHARGECODE); + if (mapPortLoad == null) + { + return new KeyValuePair(false, $"未找到起运港映射信息:{custOrder.PORTLOADCODE}"); + } + + if (mapPort == null) + { + return new KeyValuePair(false, $"未找到目的港映射信息:{custOrder.PORTDISCHARGECODE}"); + } + + postModel.routes = new ZhongYuanSoApiRoute() + { + originCity = mapPortLoad.MapCode, + destinationCity = mapPort.MapCode, + vesselName = custOrder.VESSEL, + voyageNumber = custOrder.VOYNO, + serviceCode = custOrder.LANECODE, + sailSchedulePriority = template.Priority.Split(',').ToList(), + }; + + #region 收发通及货代 + postModel.shipperInfo = new ZhongYuanSoApiSFT() + { + firstName = template.ShipperFirstName, + lastName = template.ShipperLastName, + country = template.ShipperCountry, + state = template.ShipperProvince, + city = template.ShipperCity, + partyName = template.ShipperName, + addressDes = template.ShipperAddress, + phone = new ZhongYuanSoApiPhone() { countryCode = template.ShipperPhoneCountryCode, areaCode = template.ShipperPhoneCode, number = template.ShipperPhone }, + postalCode = template.ShipperPostCode + }; + + postModel.consigneeInfo = new ZhongYuanSoApiSFT() + { + firstName = template.ConsigneeFirstName, + lastName = template.ConsigneeLastName, + country = template.ConsigneeCountry, + state = template.ConsigneeProvince, + city = template.ConsigneeCity, + partyName = template.ConsigneeName, + addressDes = template.ConsigneeAddress, + phone = new ZhongYuanSoApiPhone() { countryCode = template.ConsigneePhoneCountryCode, areaCode = template.ConsigneePhoneCode, number = template.ConsigneePhone }, + postalCode = template.ConsigneePostCode + }; + + postModel.notifyInfo = new ZhongYuanSoApiSFT() + { + firstName = template.NotifypartFirstName, + lastName = template.NotifypartLastName, + country = template.NotifypartCountry, + state = template.NotifypartProvince, + city = template.NotifypartCity, + partyName = template.NotifypartName, + addressDes = template.NotifypartAddress, + phone = new ZhongYuanSoApiPhone() { countryCode = template.NotifypartPhoneCountryCode, areaCode = template.NotifypartPhoneCode, number = template.NotifypartPhone }, + postalCode = template.NotifypartPostCode + }; + + postModel.forwarderInfo = new ZhongYuanSoApiSFT() + { + firstName = template.BookingFirstName, + lastName = template.BookingLastName, + country = template.BookingCountry, + state = template.BookingProvince, + city = template.BookingCity, + partyName = template.BookingName, + addressDes = template.BookingAddress, + phone = new ZhongYuanSoApiPhone() { countryCode = template.BookingPhoneCountryCode, areaCode = template.BookingPhoneCode, number = template.BookingPhone }, + postalCode = template.BookingPostCode + }; + #endregion + + postModel.cargoInfo = new ZhongYuanSoApiCargoInfo() + { + cargoName = CargoIdZhongyuan(custOrder.CARGOID), + cargoDes = custOrder.DESCRIPTION, + hsCode = custOrder.HSCODE, + }; + + var ctns = await repCtn.AsQueryable().Where(x => x.BILLID == custOrder.Id).ToListAsync(); + postModel.boxInfos = new List(); + foreach (var ctn in ctns) + { + if (!ctn.CTNNUM.HasValue || !ctn.KGS.HasValue) + { + return new KeyValuePair(false, $"所有箱的箱量和毛重都不能为空"); + } + + var mapCtn = mappingCtn.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == ctn.CTNCODE); + if (mapCtn == null) + { + return new KeyValuePair(false, $"未找箱型映射信息:{ctn.CTNCODE}"); + } + + var apiBox = new ZhongYuanSoApiBoxInfo() + { + boxType = mapCtn.MapCode, + boxNum = ctn.CTNNUM.Value, + weight = ctn.KGS.Value.ToString(), + weightUnit = "KGS" + }; + + postModel.boxInfos.Add(apiBox); + } + + + var mapFrt = mappingFrt.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.FRTCODE); + if (mapFrt == null) + { + return new KeyValuePair(false, $"未找到付款方式映射信息:{custOrder.FRTCODE}"); + } + + postModel.rateInfos = new ZhongYuanSoApiRateInfo() + { + paymentMethod = mapFrt.MapCode + }; + postModel.special = new ZhongYuanSoApiSpecial() + { + emailAddresses = custContact.Email, + remarksForEntireBooking = custOrder.SOREMARK + }; return new KeyValuePair(); } + + /// + /// 获取中远货物类型 + /// + /// + /// + private static string CargoIdZhongyuan(string cargoId) + { + if (cargoId is "S") + { + return "General"; + } + else if (cargoId is "R") + { + return "Reefer"; + } + else if (cargoId is "D") + { + return "Dangerous"; + } + + return null; + } } + + /// + /// 中远API订舱传输对象 + /// public class ZhongYuanSoApiModel { /// @@ -50,7 +270,7 @@ namespace Myshipping.Application.EDI /// /// 网站账户 /// - public string webAccount { get; set; } + public string webAccount { get; set; } /// /// 网站密码 @@ -80,30 +300,53 @@ namespace Myshipping.Application.EDI /// /// 发货人信息 /// - public string shipperInfo { get; set; } + public ZhongYuanSoApiSFT shipperInfo { get; set; } /// /// 收货人信息 /// - public string consigneeInfo { get; set; } + public ZhongYuanSoApiSFT consigneeInfo { get; set; } /// /// 通知人信息 /// - public string notifyInfo { get; set; } + public ZhongYuanSoApiSFT notifyInfo { get; set; } /// /// 货代信息 /// - public string forwarderInfo { get; set; } + public ZhongYuanSoApiSFT forwarderInfo { get; set; } + + /// + /// 货物信息 + /// + public ZhongYuanSoApiCargoInfo cargoInfo { get; set; } + + /// + /// 箱信息 + /// + public List boxInfos { get; set; } + + /// + /// 费率相关信息 + /// + public ZhongYuanSoApiRateInfo rateInfos { get; set; } + + /// + /// 特殊要求及备注 + /// + public ZhongYuanSoApiSpecial special { get; set; } } + /// + /// 路线信息 + /// public class ZhongYuanSoApiRoute { /// /// 出发城市 /// - public string originCity { get; set; } + public string originCity { get; set; } /// /// 目的城市 @@ -124,8 +367,16 @@ namespace Myshipping.Application.EDI /// 航线代码 /// public string serviceCode { get; set; } + + /// + /// 船期选择优先级 + /// + public List sailSchedulePriority { get; set; } } + /// + /// 收发通信息 + /// public class ZhongYuanSoApiSFT { /// @@ -179,9 +430,11 @@ namespace Myshipping.Application.EDI public ZhongYuanSoApiPhone phone { get; set; } } + /// + /// 收发通电话 + /// public class ZhongYuanSoApiPhone { - /// /// 国家代码 /// @@ -197,4 +450,79 @@ namespace Myshipping.Application.EDI /// public string number { get; set; } } + + /// + /// 货物信息 + /// + public class ZhongYuanSoApiCargoInfo + { + /// + /// 货物类型 + /// + public string cargoName { get; set; } + + /// + /// 货物描述 + /// + public string cargoDes { get; set; } + + /// + /// HS代码 + /// + public string hsCode { get; set; } + + } + + /// + /// 箱信息 + /// + public class ZhongYuanSoApiBoxInfo + { + /// + /// 箱量 + /// + public int boxNum { get; set; } + + /// + /// 箱型 + /// + public string boxType { get; set; } + + /// + /// 毛重 + /// + public string weight { get; set; } + + /// + /// 重量单位 + /// + public string weightUnit { get; set; } + + } + + public class ZhongYuanSoApiRateInfo + { + /// + /// 付款方式 + /// + public string paymentMethod { get; set; } + + } + + /// + /// 特殊要求及备注 + /// + public class ZhongYuanSoApiSpecial + { + /// + /// 备注信息 + /// + public string remarksForEntireBooking { get; set; } + + + /// + /// 邮箱地址 + /// + public string emailAddresses { get; set; } + } } diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 73fd8830..8cb40886 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -12475,5 +12475,23 @@ namespace Myshipping.Application return result; } #endregion + + #region 发送订舱 + + /// + /// 发送Api订舱,目前只有中远 + /// + /// + /// + [HttpPost("/BookingOrder/PostApiSO")] + public async Task PostApiSO(long id) + { + var rtn = await ZhongYuanSoApiHelper.DoPost(id); + if (!rtn.Key) + { + throw Oops.Bah(rtn.Value); + } + } + #endregion } } diff --git a/Myshipping.Core/Entity/DJY/DjyCustomer.cs b/Myshipping.Core/Entity/DJY/DjyCustomer.cs index 87e66363..df42ab4c 100644 --- a/Myshipping.Core/Entity/DJY/DjyCustomer.cs +++ b/Myshipping.Core/Entity/DJY/DjyCustomer.cs @@ -152,5 +152,15 @@ namespace Myshipping.Core.Entity /// 等级 /// public string Level { get; set; } + + /// + /// 客户端系统ID + /// + public long CustSysId { get; set; } + + /// + /// 大简云GID + /// + public string DjyGid { get; set; } } } \ No newline at end of file diff --git a/Myshipping.Core/Entity/DJY/DjyCustomerContact.cs b/Myshipping.Core/Entity/DJY/DjyCustomerContact.cs index 06d73bad..73881f8a 100644 --- a/Myshipping.Core/Entity/DJY/DjyCustomerContact.cs +++ b/Myshipping.Core/Entity/DJY/DjyCustomerContact.cs @@ -47,5 +47,15 @@ namespace Myshipping.Core.Entity /// 备注 /// public string Remark { get; set; } + + /// + /// 客户端系统ID + /// + public long CustSysId { get; set; } + + /// + /// 大简云GID + /// + public string DjyGid { get; set; } } } \ No newline at end of file