using DocumentFormat.OpenXml.ExtendedProperties; using Google.Protobuf.WellKnownTypes; using Mapster.Utils; using MathNet.Numerics.LinearAlgebra.Factorization; using Myshipping.Application.EDI.ESL; using MySqlX.XDevAPI.Common; using Newtonsoft.Json; using NPOI.Util; using StackExchange.Profiling.Internal; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace Myshipping.Application.EDI.SITC { public class SITCEdiHelper { public SITCEdiHelper() { } #region 基本函数 #endregion #region 检查 public static string IsCreateSITCEDI(EDIBaseModel InttrEdi) { var error = ""; if (InttrEdi.filerole == "E") { error = error + "
SITC接口只支持订舱,不能截单"; } foreach (var bill in InttrEdi.BSLIST) { } return error; } #endregion #region 生成报文(订舱(filetype=="B"),截单(filetype=="E")) public static CommonWebApiResult CreateEdiSITC(EDIBaseModel InttrEdi) { CommonWebApiResult result = new CommonWebApiResult { succ = false }; string dir = InttrEdi.filerpath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\\"; //如果是部署linux需要修改路径 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) dir = dir.Replace("\\", "/"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } string filename = dir + InttrEdi.BSLIST[0].ORDERNO + ".json"; FileStream f = new FileStream(filename, FileMode.Create); StreamWriter r = new StreamWriter(f, Encoding.Default); SitcApiPostModel postModel = new SitcApiPostModel(); postModel.consignorCustName = InttrEdi.SENDCODE; postModel.polId = InttrEdi.BSLIST[0].PORTLOADID; postModel.polName = InttrEdi.BSLIST[0].PORTLOAD; postModel.podId = InttrEdi.BSLIST[0].PORTDISCHARGEID; postModel.podName = InttrEdi.BSLIST[0].PORTDISCHARGE; postModel.deliveryId = InttrEdi.BSLIST[0].PLACEDELIVERYID; postModel.deliveryName = InttrEdi.BSLIST[0].PLACEDELIVERY; postModel.porId = InttrEdi.BSLIST[0].PLACERECEIPTID; postModel.porName = InttrEdi.BSLIST[0].PLACERECEIPT; postModel.poWtatName = InttrEdi.BSLIST[0].TRANSPORT; postModel.vesselName = InttrEdi.BSLIST[0].VESSEL; postModel.lineCode = InttrEdi.BSLIST[0].ESLLINECODE; postModel.voyNo = InttrEdi.BSLIST[0].VOYNO; postModel.etd = InttrEdi.BSLIST[0].ETD; postModel.eta = InttrEdi.BSLIST[0].ETA; postModel.consigneeName = InttrEdi.BSLIST[0].CONSIGNEE; postModel.consigneeAddr = InttrEdi.BSLIST[0].CONSIGNEEADDR; //postModel.consigneeFax = InttrEdi.BSLIST[0].CONSIGNEEFAX; //postModel.consigneeTel = InttrEdi.BSLIST[0].CONSIGNEETEL; //postModel.consigneeBsCode = InttrEdi.BSLIST[0].CONSIGNEEBSCODE; //postModel.consigneeEmail = InttrEdi.BSLIST[0].CONSIGNEEEMAIL; postModel.consignorName = InttrEdi.BSLIST[0].SHIPPER; postModel.consignorAddr = InttrEdi.BSLIST[0].SHIPPERADDR; //postModel.consignorFax = InttrEdi.BSLIST[0].CONSIGNORFAX; //postModel.consignorTel = InttrEdi.BSLIST[0].CONSIGNORTEL; //postModel.consignorBsCode = InttrEdi.BSLIST[0].CONSIGNORBSCODE; //postModel.consignorEmail = InttrEdi.BSLIST[0].CONSIGNOREMAIL; postModel.notifyName = InttrEdi.BSLIST[0].NOTIFYPARTY; postModel.notifyAddr = InttrEdi.BSLIST[0].NOTIFYPARTYADDR; //postModel.notifyFax = InttrEdi.BSLIST[0].NOTIFYFAX; //postModel.notifyTel = InttrEdi.BSLIST[0].NOTIFYTEL; //postModel.notifyBsCode = InttrEdi.BSLIST[0].NOTIFYBSCODE; //postModel.notifyEmail = InttrEdi.BSLIST[0].NOTIFYEMAIL; postModel.movementType = InttrEdi.BSLIST[0].SERVICE; postModel.weight = InttrEdi.BSLIST[0].KGS; postModel.cube = InttrEdi.BSLIST[0].CBM; postModel.packages = InttrEdi.BSLIST[0].PKGS; postModel.packingType = InttrEdi.BSLIST[0].KINDPKGS; postModel.packageDesc = InttrEdi.BSLIST[0].KINDPKGS; postModel.marks = InttrEdi.BSLIST[0].MARKS; postModel.cargoDesc = InttrEdi.BSLIST[0].DESCRIPTION; postModel.cargoType = CargoIdStr(InttrEdi.BSLIST[0].CARGOID); postModel.isDanger = InttrEdi.BSLIST[0].CARGOID == "D" ? true : false; postModel.isRf = InttrEdi.BSLIST[0].CARGOID == "R" ? true : false; postModel.contactInfo = InttrEdi.BSLIST[0].OpEmail; postModel.remark = InttrEdi.BSLIST[0].EDIREMARK; postModel.payTerm = InttrEdi.BSLIST[0].BLFRT; postModel.containers = new List(); foreach (var container in InttrEdi.BSLIST[0].CTNLIST) { SitcApiPostModelContainer c = new SitcApiPostModelContainer(); c.ctnSize = container.CTNALLCODE.Substring(0, 2); c.ctnType = container.CTNALLCODE.Substring(2, 2); c.ctnNum = container.CTNNUM; postModel.containers.Add(c); } if (InttrEdi.BSLIST[0].CARGOID == "R") { postModel.extras = new List(); SitcApiPostModelExtra e = new SitcApiPostModelExtra(); e.ctype = "RF"; e.tempMin = InttrEdi.BSLIST[0].TEMPMIN; e.tempMax = InttrEdi.BSLIST[0].TEMPMAX; e.tempSetting = InttrEdi.BSLIST[0].TEMPSET; e.unit = "C"; if (!string.IsNullOrWhiteSpace(InttrEdi.BSLIST[0].HUMIDITY)) { //湿度等于0时,湿度空着不传值 if (InttrEdi.BSLIST[0].HUMIDITY.Trim() != "0") { e.humdity = $"{InttrEdi.BSLIST[0].HUMIDITY}%"; } else { e.humdity = ""; } } if(!string.IsNullOrWhiteSpace(InttrEdi.BSLIST[0].REEFERF)) { //通风等于0时,通风传CLOSED if (InttrEdi.BSLIST[0].REEFERF.Trim() != "0") { e.vent = $"{InttrEdi.BSLIST[0].REEFERF}CBM/H"; } else { e.vent = "CLOSED"; } } postModel.extras.Add(e); } if (InttrEdi.BSLIST[0].CARGOID == "D") { postModel.dangerInfo = new List(); SitcApiPostModelDangerInfo d = new SitcApiPostModelDangerInfo(); d.classNo = InttrEdi.BSLIST[0].DCLASS; //d.commodityChem = danger.COMMODITYCHEM; //d.commodityTran = danger.COMMODITYTRAN; //d.emergencyContact = danger.EMERGENCYCONTACT; //d.emsNo = danger.EMSNO; //d.flashPoint = danger.FLASHPOINT; //d.flashUnit = danger.FLASHUNIT; //d.grossWeight = danger.GROSSWEIGHT; //d.isMpt = danger.ISMPT; //d.labels = danger.LABELS; //d.netWeight = danger.NETWEIGHT; //d.nums = danger.NUMS; //d.packageClass = danger.PACKAGECLASS; //d.packageType = danger.PACKAGETYPE; //d.packageName = danger.PACKAGENAME; d.page = InttrEdi.BSLIST[0].DPAGE; d.undgNo = InttrEdi.BSLIST[0].DUNNO; //d.contactName = InttrEdi.BSLIST[0].; //d.contactNum = InttrEdi.BSLIST[0].; //d.packagingCode = danger.PACKAGINGCODE; postModel.dangerInfo.Add(d); } if (!string.IsNullOrWhiteSpace(InttrEdi.BSLIST[0].PAYABLEEXT)) { postModel.extras.Add(new SitcApiPostModelExtra { ctype = "FRT", unit = InttrEdi.BSLIST[0].FEETYPE, tempSetting = InttrEdi.BSLIST[0].PAYABLEEXT }); } /* 1.直达无需处理 OUT特殊设置TRA 2.若有中转,根据一程 二程 三程 处理 json中 clen的值‘1-3’ 3.干线支线的选择,如接口文档中 支线:0 干线:1 4.港口及代码的处理,均按照映射中 船公司为SITC的港口代码进行处理 5.运输类型 cCommodity 默认为0 */ if (InttrEdi.SITCExt != null && !string.IsNullOrWhiteSpace(InttrEdi.SITCExt.TransferType) && !InttrEdi.SITCExt.TransferType.Equals("DIRECT",StringComparison.OrdinalIgnoreCase)) { if (InttrEdi.SITCExt.TransferType.Equals("SECOND", StringComparison.OrdinalIgnoreCase)) { postModel.extras.Add(new SitcApiPostModelExtra { ctype = "TRA", clen = 1, cnum = InttrEdi.SITCExt.FstShipCapacity == "MAIN" ? 1 : 0, vent = InttrEdi.SITCExt.FstVessel?.Trim(), humdity = InttrEdi.SITCExt.FstVoyno?.Trim(), soc = InttrEdi.SITCExt.FstLaneName?.Trim(), unit = InttrEdi.SITCExt.FstPortLoad, tempSetting = InttrEdi.SITCExt.FstPortDischarge, tempMax = InttrEdi.SITCExt.FstPortLoadCode, tempMin = InttrEdi.SITCExt.FstPortDischargeCode, etd = InttrEdi.SITCExt.FstETD.HasValue? InttrEdi.SITCExt.FstETD.Value.ToString("yyyy-MM-dd"):"", cCommodity = "0" }); postModel.extras.Add(new SitcApiPostModelExtra { ctype = "TRA", clen = 2, cnum = InttrEdi.SITCExt.SecShipCapacity == "MAIN" ? 1 : 0, vent = InttrEdi.SITCExt.SecVessel?.Trim(), humdity = InttrEdi.SITCExt.SecVoyno?.Trim(), soc = InttrEdi.SITCExt.SecLaneName?.Trim(), unit = InttrEdi.SITCExt.SecPortLoad, tempSetting = InttrEdi.SITCExt.SecPortDischarge, tempMax = InttrEdi.SITCExt.SecPortLoadCode, tempMin = InttrEdi.SITCExt.SecPortDischargeCode, etd = InttrEdi.SITCExt.SecETD.HasValue ? InttrEdi.SITCExt.SecETD.Value.ToString("yyyy-MM-dd") : "", cCommodity = "0" }); } else if (InttrEdi.SITCExt.TransferType.Equals("THIRD", StringComparison.OrdinalIgnoreCase)) { postModel.extras.Add(new SitcApiPostModelExtra { ctype = "TRA", clen = 1, cnum = InttrEdi.SITCExt.FstShipCapacity == "MAIN" ? 1 : 0, vent = InttrEdi.SITCExt.FstVessel?.Trim(), humdity = InttrEdi.SITCExt.FstVoyno?.Trim(), soc = InttrEdi.SITCExt.FstLaneName?.Trim(), unit = InttrEdi.SITCExt.FstPortLoad, tempSetting = InttrEdi.SITCExt.FstPortDischarge, tempMax = InttrEdi.SITCExt.FstPortLoadCode, tempMin = InttrEdi.SITCExt.FstPortDischargeCode, etd = InttrEdi.SITCExt.FstETD.HasValue ? InttrEdi.SITCExt.FstETD.Value.ToString("yyyy-MM-dd") : "", cCommodity = "0" }); postModel.extras.Add(new SitcApiPostModelExtra { ctype = "TRA", clen = 2, cnum = InttrEdi.SITCExt.SecShipCapacity == "MAIN" ? 1 : 0, vent = InttrEdi.SITCExt.SecVessel?.Trim(), humdity = InttrEdi.SITCExt.SecVoyno?.Trim(), soc = InttrEdi.SITCExt.SecLaneName?.Trim(), unit = InttrEdi.SITCExt.SecPortLoad, tempSetting = InttrEdi.SITCExt.SecPortDischarge, tempMax = InttrEdi.SITCExt.SecPortLoadCode, tempMin = InttrEdi.SITCExt.SecPortDischargeCode, etd = InttrEdi.SITCExt.SecETD.HasValue ? InttrEdi.SITCExt.SecETD.Value.ToString("yyyy-MM-dd") : "", cCommodity = "0" }); postModel.extras.Add(new SitcApiPostModelExtra { ctype = "TRA", clen = 3, cnum = InttrEdi.SITCExt.ThdShipCapacity == "MAIN" ? 1 : 0, vent = InttrEdi.SITCExt.ThdVessel?.Trim(), humdity = InttrEdi.SITCExt.ThdVoyno?.Trim(), soc = InttrEdi.SITCExt.ThdLaneName?.Trim(), unit = InttrEdi.SITCExt.ThdPortLoad, tempSetting = InttrEdi.SITCExt.ThdPortDischarge, tempMax = InttrEdi.SITCExt.ThdPortLoadCode, tempMin = InttrEdi.SITCExt.ThdPortDischargeCode, etd = InttrEdi.SITCExt.ThdETD.HasValue ? InttrEdi.SITCExt.ThdETD.Value.ToString("yyyy-MM-dd") : "", cCommodity = "0" }); } } string json = JsonConvert.SerializeObject(postModel, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); r.Write(json); r.Flush(); r.Close(); f.Close(); result.succ = true; result.extra = filename; result.extra2 = postModel; return result; } #endregion /// /// 货物类型翻译 /// /// /// private static string CargoIdStr(string cargoId) { if (cargoId == "S") { return "ORDI"; } else if (cargoId == "R") { return "REEF"; } else if (cargoId == "D") { return "DNGR"; } return ""; } } public class SitcApiPostModel { /// /// 客户名称 /// public string consignorCustName { get; set; } /// /// 启运港代码 /// public string polId { get; set; } /// /// 启运港名称 /// public string polName { get; set; } /// /// 目的港代码 /// public string podId { get; set; } /// /// 目的港名称 /// public string podName { get; set; } /// /// 交货地代码 /// public string deliveryId { get; set; } /// /// 交货地名称 /// public string deliveryName { get; set; } /// /// 收货地代码 /// public string porId { get; set; } /// /// 收货地名称 /// public string porName { get; set; } /// /// 中转港名称 /// public string poWtatName { get; set; } /// /// 船名 /// public string vesselName { get; set; } /// /// 航线 /// public string lineCode { get; set; } /// /// 航次 /// public string voyNo { get; set; } /// /// 离港时间 /// public string etd { get; set; } /// /// 到港时间 /// public string eta { get; set; } /// /// 收货人名称 /// public string consigneeName { get; set; } ///// ///// 收货人地址 ///// public string consigneeAddr { get; set; } ///// ///// 传真 ///// //public string consigneeFax { get; set; } ///// ///// 电话 ///// //public string consigneeTel { get; set; } ///// ///// 企业代码 ///// //public string consigneeBsCode { get; set; } ///// ///// 邮件 ///// //public string consigneeEmail { get; set; } /// /// 发货人名称 /// public string consignorName { get; set; } ///// ///// 发货人地址 ///// public string consignorAddr { get; set; } ///// ///// 传真 ///// //public string consignorFax { get; set; } ///// ///// 电话 ///// //public string consignorTel { get; set; } ///// ///// 企业代码 ///// //public string consignorBsCode { get; set; } ///// ///// 邮件 ///// //public string consignorEmail { get; set; } /// /// 通知人名称 /// public string notifyName { get; set; } ///// ///// 通知人地址 ///// public string notifyAddr { get; set; } ///// ///// 传真 ///// //public string notifyFax { get; set; } ///// ///// 电话 ///// //public string notifyTel { get; set; } ///// ///// 企业代码 ///// //public string notifyBsCode { get; set; } ///// ///// 邮件 ///// //public string notifyEmail { get; set; } /// /// 运输条款 /// public string movementType { get; set; } /// /// 毛重 /// public decimal weight { get; set; } /// /// 体积 /// public decimal cube { get; set; } /// /// 件数 /// public int packages { get; set; } /// /// 包装类型 /// public string packingType { get; set; } /// /// 包装类型 /// public string packageDesc { get; set; } /// /// 唛头 /// public string marks { get; set; } /// /// 货物描述 /// public string cargoDesc { get; set; } /// /// 货物类型 /// public string cargoType { get; set; } /// /// 是否危险品 /// public bool isDanger { get; set; } /// /// 是否冻柜 /// public bool isRf { get; set; } /// /// 是否特种箱 /// public bool isSpec { get; set; } /// /// 是否挂衣箱 /// public bool isGoh { get; set; } /// /// 是否SOC /// public bool isSoc { get; set; } /// /// 联系信息 /// public string contactInfo { get; set; } /// /// 委托备注 /// public string remark { get; set; } /// /// 支付方式 /// public string payTerm { get; set; } /// /// 委托类型 /// public string blType { get; set; } /// /// 放单方式 /// public string releaseModeMbl { get; set; } /// /// 箱信息 /// public List containers { get; set; } /// /// 其它特殊货物信息 /// public List extras { get; set; } /// /// 危险品信息 /// public List dangerInfo { get; set; } } public class SitcApiPostModelContainer { /// /// 尺寸 /// public string ctnSize { get; set; } /// /// 类型 /// public string ctnType { get; set; } /// /// 数量 /// public int ctnNum { get; set; } } public class SitcApiPostModelExtra { /// /// 最高温度 /// public string tempMax { get; set; } /// /// 最低温度 /// public string tempMin { get; set; } /// /// 温度设置 /// public string tempSetting { get; set; } /// /// 温度单位 /// public string unit { get; set; } /// /// 湿度 /// public string humdity { get; set; } /// /// 通风口 /// public string vent { get; set; } /// /// 类型 /// public string ctype { get; set; } /// /// 程次(TRA) /// public Nullable clen { get; set; } /// /// 支线:0;干线:1(TRA) /// public Nullable cnum { get; set; } /// /// 航线代码 /// public string soc { get; set; } /// /// 开航日 /// public string etd { get; set; } /// /// 运输类型 /// public string cCommodity { get; set; } } public class SitcApiPostModelDangerInfo { /// /// 危险品等级 /// public string classNo { get; set; } /// /// 化学品名 /// public string commodityChem { get; set; } /// /// 运输品名 /// public string commodityTran { get; set; } /// /// /// public string emergencyContact { get; set; } /// /// 应急措施号 /// public string emsNo { get; set; } /// /// 闪点 /// public string flashPoint { get; set; } /// /// 闪电单位 /// public string flashUnit { get; set; } /// /// 毛重 /// public int grossWeight { get; set; } /// /// 是否海污 /// public string isMpt { get; set; } /// /// 危险品标签 /// public string labels { get; set; } /// /// 净重 /// public int netWeight { get; set; } /// /// 件数 /// public int nums { get; set; } /// /// 包装等级 /// public string packageClass { get; set; } /// /// 包装类型 /// public string packageType { get; set; } /// /// 包装名称 /// public string packageName { get; set; } /// /// 危险品页号 /// public string page { get; set; } /// /// 联合国编号 /// public string undgNo { get; set; } /// /// 紧急联系人 /// public string contactName { get; set; } /// /// 联系号码 /// public string contactNum { get; set; } /// /// /// public string packagingCode { get; set; } } }