You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingHeChuan/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs

529 lines
20 KiB
C#

8 months ago
using Furion;
using Myshipping.Application.Entity;
using Myshipping.Core;
8 months ago
using Myshipping.Core.Entity;
8 months ago
using Myshipping.Core.Service;
8 months ago
using Newtonsoft.Json.Linq;
8 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Myshipping.Application.EDI
{
/// <summary>
/// 中远API订舱
/// </summary>
public static class ZhongYuanSoApiHelper
{
7 months ago
public async static Task<KeyValuePair<bool, string>> DoPost(long custOrderId)
8 months ago
{
var repCustOrder = App.GetService<SqlSugarRepository<BookingCustomerOrder>>();
var repOrder = App.GetService<SqlSugarRepository<BookingOrder>>();
var repCtn = App.GetService<SqlSugarRepository<BookingCtn>>();
8 months ago
var repCustomer = App.GetService<SqlSugarRepository<DjyCustomer>>();
var repContact = App.GetService<SqlSugarRepository<DjyCustomerContact>>();
var repTemplate = App.GetService<SqlSugarRepository<BookingSoTemplate>>();
var cache = App.GetService<ISysCacheService>();
8 months ago
var cacheService = App.GetService<ISysCacheService>();
7 months ago
//var order = await repOrder.AsQueryable().Filter(null, true).FirstAsync(o => o.Id == bookingId);
//if (order == null)
//{
// return new KeyValuePair<bool, string>(false, "订舱信息未找到");
//}
8 months ago
7 months ago
var custOrder = await repCustOrder.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == custOrderId);
8 months ago
if (custOrder == null)
{
return new KeyValuePair<bool, string>(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<bool, string>(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<DjyCustomerContact>((cust, contact) => cust.Id == contact.CustomerId)
.Where((cust, contact) => cust.CustSysId == custOrder.BookingTenantId && contact.CustSysId == custOrder.BookingUserId)
8 months ago
.Select((cust, contact) => contact)
.SingleAsync();
if (custContact == null)
{
return new KeyValuePair<bool, string>(false, "未找到客户及联系人信息");
}
7 months ago
template = await repTemplate.AsQueryable().FirstAsync(x => x.CarrierId == custOrder.CARRIERID && x.UserId == custContact.Id && x.IsEnable);
8 months ago
if (template == null)
{
return new KeyValuePair<bool, string>(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<bool, string>(false, "未找到订舱账号信息");
}
7 months ago
postModel.uploadType = template.Category; //DRAFT, TEMPLATE, BOOKING分别对应草稿, 模板, 订舱
8 months ago
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<bool, string>(false, $"未找到起运港映射信息:{custOrder.PORTLOADCODE}");
}
if (mapPort == null)
{
return new KeyValuePair<bool, string>(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()
{
7 months ago
firstName = string.IsNullOrEmpty(template.ShipperName) ? custOrder.ShipperFirstName : template.ShipperFirstName,
lastName = string.IsNullOrEmpty(template.ShipperLastName) ? custOrder.ShipperLastName : template.ShipperLastName,
country = string.IsNullOrEmpty(template.ShipperCountry) ? custOrder.ShipperCountry : template.ShipperCountry,
state = string.IsNullOrEmpty(template.ShipperProvince) ? custOrder.ShipperProvince : template.ShipperProvince,
city = string.IsNullOrEmpty(template.ShipperCity) ? custOrder.ShipperCity : template.ShipperCity,
partyName = string.IsNullOrEmpty(template.ShipperName) ? custOrder.ShipperName : template.ShipperName,
addressDes = string.IsNullOrEmpty(template.ShipperAddress) ? custOrder.ShipperAddress : template.ShipperAddress,
phone = string.IsNullOrEmpty(template.ShipperName) ? new ZhongYuanSoApiPhone() { countryCode = custOrder.ShipperPhoneCountryCode, areaCode = custOrder.ShipperPhoneCode, number = custOrder.ShipperPhone } : new ZhongYuanSoApiPhone() { countryCode = template.ShipperPhoneCountryCode, areaCode = template.ShipperPhoneCode, number = template.ShipperPhone },
postalCode = string.IsNullOrEmpty(template.ShipperPostCode) ? custOrder.ShipperPostCode : template.ShipperPostCode
8 months ago
};
postModel.consigneeInfo = new ZhongYuanSoApiSFT()
{
7 months ago
firstName = string.IsNullOrEmpty(template.ConsigneeFirstName) ? custOrder.ConsigneeFirstName : template.ConsigneeFirstName,
lastName = string.IsNullOrEmpty(template.ConsigneeLastName) ? custOrder.ConsigneeLastName : template.ConsigneeLastName,
country = string.IsNullOrEmpty(template.ConsigneeCountry) ? custOrder.ConsigneeCountry : template.ConsigneeCountry,
state = string.IsNullOrEmpty(template.ConsigneeProvince) ? custOrder.ConsigneeProvince : template.ConsigneeProvince,
city = string.IsNullOrEmpty(template.ConsigneeCity) ? custOrder.ConsigneeCity : template.ConsigneeCity,
partyName = string.IsNullOrEmpty(template.ConsigneeName) ? custOrder.ConsigneeName : template.ConsigneeName,
addressDes = string.IsNullOrEmpty(template.ConsigneeAddress) ? custOrder.ConsigneeAddress : template.ConsigneeAddress,
phone = string.IsNullOrEmpty(template.ConsigneeName) ? new ZhongYuanSoApiPhone() { countryCode = custOrder.ConsigneePhoneCountryCode, areaCode = custOrder.ConsigneePhoneCode, number = custOrder.ConsigneePhone } : new ZhongYuanSoApiPhone() { countryCode = template.ConsigneePhoneCountryCode, areaCode = template.ConsigneePhoneCode, number = template.ConsigneePhone },
postalCode = string.IsNullOrEmpty(template.ConsigneePostCode) ? custOrder.ConsigneePostCode : template.ConsigneePostCode
8 months ago
};
postModel.notifyInfo = new ZhongYuanSoApiSFT()
{
7 months ago
firstName = string.IsNullOrEmpty(template.NotifypartFirstName) ? custOrder.NotifypartFirstName : template.NotifypartFirstName,
lastName = string.IsNullOrEmpty(template.NotifypartLastName) ? custOrder.NotifypartLastName : template.NotifypartLastName,
country = string.IsNullOrEmpty(template.NotifypartCountry) ? custOrder.NotifypartCountry : template.NotifypartCountry,
state = string.IsNullOrEmpty(template.NotifypartProvince) ? custOrder.NotifypartProvince : template.NotifypartProvince,
city = string.IsNullOrEmpty(template.NotifypartCity) ? custOrder.NotifypartCity : template.NotifypartCity,
partyName = string.IsNullOrEmpty(template.NotifypartName) ? custOrder.NotifypartName : template.NotifypartName,
addressDes = string.IsNullOrEmpty(template.NotifypartAddress) ? custOrder.NotifypartAddress : template.NotifypartAddress,
phone = string.IsNullOrEmpty(template.NotifypartName) ? new ZhongYuanSoApiPhone() { countryCode = custOrder.NotifypartPhoneCountryCode, areaCode = custOrder.NotifypartPhoneCode, number = custOrder.NotifypartPhone } : new ZhongYuanSoApiPhone() { countryCode = template.NotifypartPhoneCountryCode, areaCode = template.NotifypartPhoneCode, number = template.NotifypartPhone },
postalCode = string.IsNullOrEmpty(template.NotifypartPostCode) ? custOrder.NotifypartPostCode : template.NotifypartPostCode
8 months ago
};
postModel.forwarderInfo = new ZhongYuanSoApiSFT()
{
7 months ago
firstName = string.IsNullOrEmpty(template.BookingFirstName) ? custOrder.BookingFirstName : template.BookingFirstName,
lastName = string.IsNullOrEmpty(template.BookingLastName) ? custOrder.BookingLastName : template.BookingLastName,
country = string.IsNullOrEmpty(template.BookingCountry) ? custOrder.BookingCountry : template.BookingCountry,
state = string.IsNullOrEmpty(template.BookingProvince) ? custOrder.BookingProvince : template.BookingProvince,
city = string.IsNullOrEmpty(template.BookingCity) ? custOrder.BookingCity : template.BookingCity,
partyName = string.IsNullOrEmpty(template.BookingName) ? custOrder.BookingName : template.BookingName,
addressDes = string.IsNullOrEmpty(template.BookingAddress) ? custOrder.BookingAddress : template.BookingAddress,
phone = string.IsNullOrEmpty(template.BookingName) ? new ZhongYuanSoApiPhone() { countryCode = custOrder.BookingPhoneCountryCode, areaCode = custOrder.BookingPhoneCode, number = custOrder.BookingPhone } : new ZhongYuanSoApiPhone() { countryCode = template.BookingPhoneCountryCode, areaCode = template.BookingPhoneCode, number = template.BookingPhone },
postalCode = string.IsNullOrEmpty(template.BookingPostCode) ? custOrder.BookingPostCode : template.BookingPostCode
8 months ago
};
#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<ZhongYuanSoApiBoxInfo>();
foreach (var ctn in ctns)
{
if (!ctn.CTNNUM.HasValue || !ctn.KGS.HasValue)
{
return new KeyValuePair<bool, string>(false, $"所有箱的箱量和毛重都不能为空");
}
var mapCtn = mappingCtn.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == ctn.CTNCODE);
if (mapCtn == null)
{
return new KeyValuePair<bool, string>(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<bool, string>(false, $"未找到付款方式映射信息:{custOrder.FRTCODE}");
}
postModel.rateInfos = new ZhongYuanSoApiRateInfo()
{
paymentMethod = mapFrt.MapCode
};
8 months ago
8 months ago
postModel.special = new ZhongYuanSoApiSpecial()
{
emailAddresses = custContact.Email,
remarksForEntireBooking = custOrder.SOREMARK
};
8 months ago
return new KeyValuePair<bool, string>();
}
8 months ago
/// <summary>
/// 获取中远货物类型
/// </summary>
/// <param name="cargoId"></param>
/// <returns></returns>
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;
}
8 months ago
}
8 months ago
/// <summary>
/// 中远API订舱传输对象
/// </summary>
8 months ago
public class ZhongYuanSoApiModel
{
/// <summary>
/// 用户key
/// </summary>
public string userKey { get; set; }
/// <summary>
/// 用户secret
/// </summary>
public string userSecret { get; set; }
/// <summary>
/// 网站账户
/// </summary>
8 months ago
public string webAccount { get; set; }
8 months ago
/// <summary>
/// 网站密码
/// </summary>
public string webPassword { get; set; }
/// <summary>
/// 上传类型
/// </summary>
public string uploadType { get; set; }
/// <summary>
/// 在选择草稿及模板时, 保存时填写的名称
/// </summary>
public string saveName { get; set; }
/// <summary>
/// 在选择草稿及模板时的描述
/// </summary>
public string saveDes { get; set; }
/// <summary>
/// 路线信息
/// </summary>
public ZhongYuanSoApiRoute routes { get; set; }
/// <summary>
/// 发货人信息
/// </summary>
8 months ago
public ZhongYuanSoApiSFT shipperInfo { get; set; }
8 months ago
/// <summary>
/// 收货人信息
/// </summary>
8 months ago
public ZhongYuanSoApiSFT consigneeInfo { get; set; }
8 months ago
/// <summary>
/// 通知人信息
/// </summary>
8 months ago
public ZhongYuanSoApiSFT notifyInfo { get; set; }
8 months ago
/// <summary>
/// 货代信息
/// </summary>
8 months ago
public ZhongYuanSoApiSFT forwarderInfo { get; set; }
/// <summary>
/// 货物信息
/// </summary>
public ZhongYuanSoApiCargoInfo cargoInfo { get; set; }
/// <summary>
/// 箱信息
/// </summary>
public List<ZhongYuanSoApiBoxInfo> boxInfos { get; set; }
/// <summary>
/// 费率相关信息
/// </summary>
public ZhongYuanSoApiRateInfo rateInfos { get; set; }
/// <summary>
/// 特殊要求及备注
/// </summary>
public ZhongYuanSoApiSpecial special { get; set; }
8 months ago
}
8 months ago
/// <summary>
/// 路线信息
/// </summary>
8 months ago
public class ZhongYuanSoApiRoute
{
/// <summary>
/// 出发城市
/// </summary>
8 months ago
public string originCity { get; set; }
8 months ago
/// <summary>
/// 目的城市
/// </summary>
public string destinationCity { get; set; }
/// <summary>
/// 船名
/// </summary>
public string vesselName { get; set; }
/// <summary>
/// 航次
/// </summary>
public string voyageNumber { get; set; }
/// <summary>
/// 航线代码
/// </summary>
public string serviceCode { get; set; }
8 months ago
/// <summary>
/// 船期选择优先级
/// </summary>
public List<string> sailSchedulePriority { get; set; }
8 months ago
}
8 months ago
/// <summary>
/// 收发通信息
/// </summary>
8 months ago
public class ZhongYuanSoApiSFT
{
/// <summary>
/// 名字
/// </summary>
public string partyName { get; set; }
/// <summary>
/// 国家
/// </summary>
public string country { get; set; }
/// <summary>
/// 省
/// </summary>
public string state { get; set; }
/// <summary>
/// 城市名
/// </summary>
public string city { get; set; }
/// <summary>
/// 区
/// </summary>
public string county { get; set; }
/// <summary>
/// 详细地址
/// </summary>
public string addressDes { get; set; }
/// <summary>
/// 邮编
/// </summary>
public string postalCode { get; set; }
/// <summary>
/// 姓
/// </summary>
public string firstName { get; set; }
/// <summary>
/// 名
/// </summary>
public string lastName { get; set; }
/// <summary>
/// 电话
/// </summary>
public ZhongYuanSoApiPhone phone { get; set; }
}
8 months ago
/// <summary>
/// 收发通电话
/// </summary>
8 months ago
public class ZhongYuanSoApiPhone
{
/// <summary>
/// 国家代码
/// </summary>
public string countryCode { get; set; }
/// <summary>
/// 区号
/// </summary>
public string areaCode { get; set; }
/// <summary>
/// 电话号码
/// </summary>
public string number { get; set; }
}
8 months ago
/// <summary>
/// 货物信息
/// </summary>
public class ZhongYuanSoApiCargoInfo
{
/// <summary>
/// 货物类型
/// </summary>
public string cargoName { get; set; }
/// <summary>
/// 货物描述
/// </summary>
public string cargoDes { get; set; }
/// <summary>
/// HS代码
/// </summary>
public string hsCode { get; set; }
}
/// <summary>
/// 箱信息
/// </summary>
public class ZhongYuanSoApiBoxInfo
{
/// <summary>
/// 箱量
/// </summary>
public int boxNum { get; set; }
/// <summary>
/// 箱型
/// </summary>
public string boxType { get; set; }
/// <summary>
/// 毛重
/// </summary>
public string weight { get; set; }
/// <summary>
/// 重量单位
/// </summary>
public string weightUnit { get; set; }
}
public class ZhongYuanSoApiRateInfo
{
/// <summary>
/// 付款方式
/// </summary>
public string paymentMethod { get; set; }
}
/// <summary>
/// 特殊要求及备注
/// </summary>
public class ZhongYuanSoApiSpecial
{
/// <summary>
/// 备注信息
/// </summary>
public string remarksForEntireBooking { get; set; }
/// <summary>
/// 邮箱地址
/// </summary>
public string emailAddresses { get; set; }
}
8 months ago
}