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/YTEdiHelper.cs

1208 lines
56 KiB
C#

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using MySqlX.XDevAPI.Common;
namespace Myshipping.Application.EDI.YT
{
public class YTEdiHelper
{
public YTEdiHelper()
{
}
#region 基本函数
public static string GetBillNum2(string str)
{
if (str == "ZERO") return "00";
if (str == "ONE") return "01";
if (str == "TWO") return "02";
if (str == "THREE") return "03";
if (str == "FOUR") return "04";
if (str == "FIVE") return "05";
if (str == "SIX") return "06";
if (str == "SERVEN") return "07";
if (str == "EIGHT") return "08";
if (str == "NINE") return "09";
if (str == "TEN") return "10";
else return "";
}
public static string GetDateStr(string datestr, string dateformat)
{
var result = "";
if (datestr == null || datestr == "")
{
result = "";
}
else
{
result = Convert.ToDateTime(datestr).ToString(dateformat);
}
return result;
}
#region 判断中文字符
public static bool IsChinese(char c)
{
return (int)c > 0x80;
}
public static bool StringIsChinese(string str)
{
var result = false;
for (int i = 1; i < str.Length; i++)
{
if (IsChinese(str[i]))
{
result = true;
return result;
}
}
for (int i = 0; i < str.Length; i++)
{
string stemp = str.Substring(i, 1);
int ilen = System.Text.Encoding.Default.GetByteCount(stemp);
if (ilen == 2)
{
result = true;
return result;
}
}
return result;
}
#endregion
public static string formatListStr(List<System.String> DestList, int lineCount, bool isformat = false)
{
var result = "";
for (var i = 0; i < lineCount; i++)
{
if (DestList.Count > i)
{
if (isformat)
result = result + formatEdiStr("txt", DestList[i]);
else
result = result + DestList[i];
}
if (i != (lineCount - 1))
result = result + ":";
}
return result;
}
#region 文本字段判断每行是否符合
/// <summary>
/// edi 文本格式处理判断例如1行35个字符不超过5行
/// </summary>
/// <param name="fileType">文件类型例如txt、xml</param>
/// <param name="str">要处理的数据</param>
/// <param name="length">每行长度</param>
/// <param name="sMBLNO">主提单号</param>
/// <param name="sType">数据类型(例如:发货人内容、货描等)</param>
/// <param name="rowNum">限制录入的行数“0”代表不限制</param>
/// <param name="sSymbol">限录后多出的放到货描中的数据的连接符(例如:“*”发货人内容、“**”收件人等)</param>
/// <returns></returns>
public static System.String formatlengthError(string fileType, string str, int length, string sMBLNO, string sType, int rowNum, string sSymbol, bool isHuoMiao)
{
string error = "";
string Shipping = str;
if (fileType == "txt")
{
Shipping = formatEdiStr("txt", str);
}
else if (fileType == "xml")
{
Shipping = formatEdiStr("txt", str);
}
string[] argAGENT = Shipping.Split(new string[] { "\r\n" }, StringSplitOptions.None);
if (argAGENT.Length > 0)
{
if (argAGENT.Length == 1)
{
argAGENT = Shipping.Split(new string[] { "\n" }, StringSplitOptions.None);
if (argAGENT.Length > 0)
{
if (argAGENT.Length > rowNum && rowNum != 0)
{
if (isHuoMiao)
{
error = error + "<br />提单号:" + sMBLNO + " " + sType + " 不允许录入超过" + rowNum + "行数据!";
}
else
{
error = error + "<br />提单号:" + sMBLNO + " " + sType + " 不允许录入超过" + rowNum + "行数据,多余信息请手动以“" + sSymbol + "”号开头放到货物描述中!(例如:“货描内容" + sSymbol + "超出部分”)";
}
}
for (int j = 0; j < argAGENT.Length; j++)
{
//List<System.String> AgentList = formatlengthStr(argAGENT[j].ToString(), 35);
if (argAGENT[j].ToString().Length > length)
{
error = error + "<br />提单号:" + sMBLNO + " " + sType + " 第" + (j + 1) + "行超过" + length + "个字符";
}
}
}
}
else
{
if (argAGENT.Length > rowNum && rowNum != 0)
{
if (isHuoMiao)
{
error = error + "<br />提单号:" + sMBLNO + " " + sType + " 不允许录入超过" + rowNum + "行数据!";
}
else
{
error = error + "<br />提单号:" + sMBLNO + " " + sType + " 不允许录入超过" + rowNum + "行数据,多余信息请手动以“" + sSymbol + "”号开头放到货物描述中!(例如:“货描内容" + sSymbol + "超出部分”)";
}
}
for (int j = 0; j < argAGENT.Length; j++)
{
//List<System.String> AgentList = formatlengthStr(argAGENT[j].ToString(), 35);
if (argAGENT[j].ToString().Length > length)
{
error = error + "<br />提单号:" + sMBLNO + " " + sType + " 第" + (j + 1) + "行超过" + length + "个字符";
}
}
}
}
return error;
}
#endregion
#region 字符转义
/// <summary>
/// 各种文本转义字符
/// </summary>
/// <param name="fileType">文件类型例如txt、xml</param>
/// <param name="str">文本字符串</param>
/// <returns></returns>
public static string formatEdiStr(string fileType, string str)
{
if (str == null)
str = string.Empty;
if (fileType == "txt")
{
return str.Replace("?", "??").Replace(":", "?:").Replace("+", "?+").Replace("'", "?'");
}
else if (fileType == "xml")
{
return str.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;").Replace("'", "&apos;");
}
else if (fileType == "sitc")
{
return str.Replace("?", "??").Replace(":", "?:").Replace("'", "?'");
}
else
{
return str;
}
}
#endregion
#region 格式化每行
public static List<System.String> formatlengthStr(string str, int length, bool formatstr = false, bool nodelsp = false)
{
//2022-12-28 JHQ 传的字段是null会导致报错这里改为如果是NULL则默认赋空字符串。
if (str == null)
str = "";
str = str.Replace("\r\n", "\\");
str = str.Replace("\n", "\\");
str = str.Replace("\r", " ");
string[] StrList = str.Split('\\');
var strtemp = "";
var strnewline = "";
var strtempnewline = "";
char[] spstring = { ' ', ';', ',', '.', ':', '/', '(', ')', '?', '+', '-' };
List<System.String> DestList = new List<System.String>();
for (var i = 0; i <= StrList.Length - 1; i++)
{
if (StrList[i].Length <= length)
{
if (formatstr)
DestList.Add(formatEdiStr("txt", StrList[i]));
else
DestList.Add(StrList[i]);
}
else
{
strtemp = StrList[i] + " ";
strtempnewline = "";
strnewline = "";
for (var j = 0; j < strtemp.Length; j++)
{
strtempnewline = strtempnewline + strtemp[j];
if (strtemp[j] == ' ' || strtemp[j] == ':' || strtemp[j] == ',' || strtemp[j] == '.' || strtemp[j] == ':' || strtemp[j] == '/'
|| strtemp[j] == '?' || strtemp[j] == ')' || strtemp[j] == '}' || strtemp[j] == '+' || strtemp[j] == '-')
{
if ((strnewline.Length + strtempnewline.Length) <= length)
strnewline = strnewline + strtempnewline;
else
{
if (formatstr)
DestList.Add(formatEdiStr("txt", strnewline));
else
DestList.Add(strnewline);
strnewline = strtempnewline;
}
strtempnewline = "";
}
}
if (nodelsp)
{
if (formatstr)
DestList.Add(formatEdiStr("txt", strnewline));
else DestList.Add(strnewline);
}
else if (strnewline.Trim() != "")
{
if (formatstr)
DestList.Add(formatEdiStr("txt", strnewline));
else DestList.Add(strnewline);
}
}
}
return DestList;
}
#endregion
#endregion
#region 检查
public static string IsCreateYTEDI(EDIBaseModel InttrEdi)
{
var error = "";
if (string.IsNullOrEmpty(InttrEdi.SENDCODE))
{ error = error + "<br />发送方代码不能为空"; }
if (string.IsNullOrEmpty(InttrEdi.SENDNAME))
{ error = error + "<br />发送方名称不能为空"; }
if (string.IsNullOrEmpty(InttrEdi.RECEIVECODE))
{ error = error + "<br />接收方代码不能为空"; }
//if (InttrEdi.filetype == "B")
//{
// if (InttrEdi.UseForWarderCode)
// {
// if (string.IsNullOrEmpty(InttrEdi.ForWarderCode))
// { error = error + "<br />货代代码不能为空"; }
// if (string.IsNullOrEmpty(InttrEdi.ForWarderName))
// { error = error + "<br />货代称呼不能为空"; }
// }
//}
foreach (var headData in InttrEdi.BSLIST)
{
if (string.IsNullOrEmpty(headData.MBLNO))
{ error = error + "<br />主提单号不能为空"; }
if (string.IsNullOrEmpty(headData.BLFRT))
{ error = error + "<br />提单号:" + headData.MBLNO + " 付费方式不能为空"; }
if (InttrEdi.filetype == "E")
{
if (string.IsNullOrEmpty(headData.VESSEL))
{ error = error + "<br />提单号:" + headData.MBLNO + " 船名不能为空"; }
if (string.IsNullOrEmpty(headData.VOYNO))
{ error = error + "<br />提单号:" + headData.MBLNO + " 航次不能为空"; }
if (InttrEdi.filetype != "B" || headData.CARRIEREDICODE == "YML")
{
if (string.IsNullOrEmpty(headData.ETD))
{
error = error + "<br />提单号:" + headData.MBLNO + " 开船日期不能为空";
return error;
}
}
}
if (headData.CARRIEREDICODE != "ZIM")
{
if (string.IsNullOrEmpty(headData.PLACERECEIPTID) || headData.PLACERECEIPTID.Length != 5)
{ error = error + "<br />提单号:" + headData.MBLNO + " 收货地代码不能为空或录入不正确(必须是5位代码)"; }
if (string.IsNullOrEmpty(headData.PLACERECEIPT))
{ error = error + "<br />提单号:" + headData.MBLNO + " 收货地不能为空"; }
}
if (string.IsNullOrEmpty(headData.PORTLOADID) || headData.PORTLOADID.Length != 5)
{ error = error + "<br />提单号:" + headData.MBLNO + " 装货港代码不能为空或录入不正确(必须是5位代码)"; }
if (string.IsNullOrEmpty(headData.PORTLOAD))
{ error = error + "<br />提单号:" + headData.MBLNO + " 装货港不能为空"; }
if (string.IsNullOrEmpty(headData.PORTDISCHARGEID) || headData.PORTDISCHARGEID.Length != 5)
{ error = error + "<br />提单号:" + headData.MBLNO + " 卸货港代码不能为空或录入不正确(必须是5位代码)"; }
if (string.IsNullOrEmpty(headData.PORTDISCHARGE))
{ error = error + "<br />提单号:" + headData.MBLNO + " 卸货港不能为空"; }
if (string.IsNullOrEmpty(headData.PLACEDELIVERY) || headData.PLACEDELIVERYID.Length != 5)
{ error = error + "<br />提单号:" + headData.MBLNO + " 交货地代码不能为空或录入不正确(必须是5位代码)"; }
if (string.IsNullOrEmpty(headData.PLACEDELIVERY))
{ error = error + "<br />提单号:" + headData.MBLNO + " 交货地不能为空"; }
if (string.IsNullOrEmpty(headData.DESTINATION))
{
if (string.IsNullOrEmpty(headData.DESTINATIONID) || headData.DESTINATIONID.Length != 5)
{ error = error + "<br />提单号:" + headData.MBLNO + " 目的地代码不能为空或录入不正确(必须是5位代码)"; }
}
if (string.IsNullOrEmpty(headData.KINDPKGS_EDI_CODE))
{ error = error + "<br />提单号:" + headData.MBLNO + " 包装EDI代码不能为空"; }
if (headData.PKGS == 0)
{ error = error + "<br />提单号:" + headData.MBLNO + " 件数不能为0"; }
if (headData.KGS == 0)
{ error = error + "<br />提单号:" + headData.MBLNO + " 毛重不能为0"; }
if (headData.CBM == 0)
{ error = error + "<br />提单号:" + headData.MBLNO + " 尺码不能为0"; }
if (string.IsNullOrEmpty(headData.CARGOID))
{ error = error + "<br />提单号:" + headData.MBLNO + " 货物标识不能为空"; }
if (headData.CARGOID == "D")
{
if (string.IsNullOrEmpty(headData.DCLASS))
{ error = error + "<br />提单号:" + headData.MBLNO + " 危险品分类不能为空"; }
if (string.IsNullOrEmpty(headData.DUNNO))
{ error = error + "<br />提单号:" + headData.MBLNO + " 危险品编号不能为空"; }
}
if (headData.CARGOID == "R")
{
if (headData.TEMPSET == null || headData.TEMPSET == "")
{ error = error + "<br />提单号:" + headData.MBLNO + " 设置温度不能为空"; }
if (headData.REEFERF == null || headData.REEFERF == "")
{ error = error + "<br />提单号:" + headData.MBLNO + " 通风度不能为空"; }
}
if (headData.ISSUEPLACE == null || headData.ISSUEPLACE == "")
{ error = error + "<br />提单号:" + headData.MBLNO + "签单地点不能为空"; }
if (headData.CARRIEREDICODE == "APL")
if (headData.ISSUETYPE == null || headData.ISSUETYPE == "")
{ error = error + "<br />提单号:" + headData.MBLNO + "签单方式不能为空"; }
if (headData.SERVICE == "" || headData.SERVICE == null)
{ error = error + "<br />提单号:" + headData.MBLNO + "运输条款不能为空"; }
if (string.IsNullOrEmpty(headData.MARKS))
{
error = error + "<br />提单号:" + headData.MBLNO + " 唛头不能为空";
}
else
{
if (StringIsChinese(headData.MARKS))
{
error = error + "<br />提单号:" + headData.MBLNO + " 唛头含有中文或双字节字符";
}
else
{
error += formatlengthError("txt", headData.MARKS, 35, headData.MBLNO, "唛头", 0, "", false);
}
}
if (string.IsNullOrEmpty(headData.DESCRIPTION))
{
error = error + "<br />提单号:" + headData.MBLNO + " 货物描述不能为空";
}
else
{
if (StringIsChinese(headData.DESCRIPTION))
{
error = error + "<br />提单号:" + headData.MBLNO + " 货物描述含有中文或双字节字符";
}
else
{
//error += formatlengthError("txt", bill.DESCRIPTION, 35, bill.MBLNO, "货物描述", 0, "");
}
}
if (string.IsNullOrEmpty(headData.SHIPPER))
{
error = error + "<br />提单号:" + headData.MBLNO + " 发货人不能为空";
}
else
{
if (StringIsChinese(headData.SHIPPER))
{
error = error + "<br />提单号:" + headData.MBLNO + " 发货人含有中文或双字节字符";
}
else
{
if (headData.CARRIEREDICODE == "HLCU")
{
error += formatlengthError("txt", headData.SHIPPER, 35, headData.MBLNO, "发货人", 6, "-", false);
}
else
{
error += formatlengthError("txt", headData.SHIPPER, 35, headData.MBLNO, "发货人", 6, "*", false);
}
}
}
//}
if (string.IsNullOrEmpty(headData.CONSIGNEE))
{
error = error + "<br />提单号:" + headData.MBLNO + " 收货人不能为空";
}
else
{
if (StringIsChinese(headData.CONSIGNEE))
{
error = error + "<br />提单号:" + headData.MBLNO + " 收货人含有中文或双字节字符";
}
else
{
if (headData.CARRIEREDICODE == "HLCU")
{
error += formatlengthError("txt", headData.CONSIGNEE, 35, headData.MBLNO, "收货人", 6, "--", false);
}
else
{
error += formatlengthError("txt", headData.CONSIGNEE, 35, headData.MBLNO, "收货人", 6, "**", false);
}
}
}
if (string.IsNullOrEmpty(headData.NOTIFYPARTY))
{
error = error + "<br />提单号:" + headData.MBLNO + " 通知人不能为空";
}
else
{
if (StringIsChinese(headData.NOTIFYPARTY))
{
error = error + "<br />提单号:" + headData.MBLNO + " 通知人含有中文或双字节字符";
}
else
{
if (headData.CARRIEREDICODE == "HLCU")
{
error += formatlengthError("txt", headData.NOTIFYPARTY, 35, headData.MBLNO, "通知人", 6, "---", false);
}
else
{
error += formatlengthError("txt", headData.NOTIFYPARTY, 35, headData.MBLNO, "通知人", 6, "***", false);
}
}
}
if (!string.IsNullOrEmpty(headData.NOTIFYPARTY2))
{
error += formatlengthError("txt", headData.NOTIFYPARTY2, 35, headData.MBLNO, "第二通知人", 5, "", false);
}
var ctnlist = headData.CTNLIST;
if (ctnlist.Count == 0) { error = error + "<br />提单号:" + headData.MBLNO + " 集装箱信息不能为空"; };
#region 集装箱判断检查
if (ctnlist.Count != 0)
{
Decimal dlPKGS = 0;
Decimal dlKGS = 0;
Decimal dlCBM = 0;
foreach (var ctn in ctnlist)
{
if (string.IsNullOrEmpty(ctn.CTNALLCODE))
{ error = error + "<br />提单号:" + headData.MBLNO + " 集装箱箱型EDI代码不能为空"; }
if ((ctn.CTNALLCODE.IndexOf("RH") > 0 || ctn.CTNALLCODE.IndexOf("RF") > 0) && (headData.CARGOID != "R"))
{
{ error = error + "<br />提单号:" + headData.MBLNO + " 集装箱箱型为冻柜,货类代码请选择冻柜"; }
}
if (InttrEdi.filetype == "E")
{
if (string.IsNullOrEmpty(ctn.CNTRNO))
{ error = error + "<br />提单号:" + headData.MBLNO + " 箱号不能为空"; }
if (string.IsNullOrEmpty(ctn.SEALNO))
{ error = error + "<br />提单号:" + headData.MBLNO + " 封号不能为空"; }
if (ctn.KINDPKGS != headData.KINDPKGS)
{ error = error + "<br />提单号:" + headData.MBLNO + " 中的包装类型与集装箱的包装类型不同"; }
dlPKGS += Convert.ToDecimal(ctn.PKGS);
dlKGS += Convert.ToDecimal(ctn.KGS);
dlCBM += Convert.ToDecimal(ctn.CBM);
}
}
if (InttrEdi.filetype == "E")
{
if (dlPKGS != Convert.ToDecimal(headData.PKGS))
{ error = error + "<br />提单号:" + headData.MBLNO + " 集装箱件数合计数必须等于委托单总件数"; }
if (dlKGS != Convert.ToDecimal(headData.KGS))
{ error = error + "<br />提单号:" + headData.MBLNO + " 集装箱重量合计数必须等于委托单总重量数"; }
if (dlCBM != Convert.ToDecimal(headData.CBM))
{ error = error + "<br />提单号:" + headData.MBLNO + " 集装箱尺码合计数必须等于委托单总尺码数"; }
}
}
if (InttrEdi.filetype == "E")
{
if (headData.CTNGOODSLIST != null && headData.CTNGOODSLIST.Count > 0)
{
foreach (var ctn in ctnlist)
{
var isfind = false;
Int32 ctngoodssumpkgs = 0;
decimal ctngoodssumkgs = 0;
decimal ctngoodssumcbm = 0;
headData.CTNGOODSLIST.ForEach(i =>
{
if (i.CNTRNO == ctn.CNTRNO)
{
isfind = true;
ctngoodssumpkgs = ctngoodssumpkgs + i.PKGS;
ctngoodssumkgs = ctngoodssumkgs + i.KGS;
ctngoodssumcbm = ctngoodssumcbm + i.CBM;
}
});
if (!isfind)
{
error = error + "<br />提单号:" + headData.MBLNO + "的“" + ctn.CNTRNO + "”未添加分箱明细!";
}
else
{
if (ctngoodssumpkgs != Convert.ToDecimal(ctn.PKGS))
{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctn.CNTRNO + " 分箱明细件数合计数不等于集装箱件数"; }
if (ctngoodssumkgs != Convert.ToDecimal(ctn.KGS))
{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctn.CNTRNO + " 分箱明细毛重合计数不等于集装箱毛重"; }
if (ctngoodssumcbm != Convert.ToDecimal(ctn.CBM))
{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctn.CNTRNO + " 分箱明细尺码合计数不等于集装箱毛重"; }
}
}
foreach (var ctngood in headData.CTNGOODSLIST)
{
if (string.IsNullOrEmpty(ctngood.KINDPKGS))
{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctngood.CNTRNO + " 中的分箱明细包装类型不能为空"; }
if (string.IsNullOrEmpty(ctngood.DESCRIPTION))
{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctngood.CNTRNO + " 中的分箱货物描述不能为空"; }
else
{
error += formatlengthError("txt", ctngood.DESCRIPTION, 70, headData.MBLNO, "的“" + ctngood.CNTRNO + "”箱号的分箱货物描述", 0, "", false);
}
//if (string.IsNullOrEmpty(ctngood.HSCODE))
//{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctngood.CNTRNO + " 中的分箱HS编码不能为空"; }
if (string.IsNullOrEmpty(ctngood.KINDPKGS_EDI_CODE))
{ error = error + "<br />提单号:" + headData.MBLNO + ",箱号:" + ctngood.CNTRNO + " 中的分箱明细包装类型代码不能为空"; }
}
}
#endregion
}
//2023-03-03 经过测试东胜的EDI根据付费方式区分 到付-需要填到付地点不能填预付地点,预付只能填预付地点不能填到付地点
//跟韩工确认增加判断
if (!string.IsNullOrWhiteSpace(headData.BLFRT) && headData.BLFRT.IndexOf("PREPAID") >= 0)
{
if (string.IsNullOrWhiteSpace(headData.PREPARDAT))
{
error = error + "<br />提单号:" + headData.MBLNO + " 付费方式是预付,预付地点不能为空";
}
if (!string.IsNullOrWhiteSpace(headData.PAYABLEAT))
{
error = error + "<br />提单号:" + headData.MBLNO + " 付费方式是预付,到付地点不能填写";
}
}
else if (!string.IsNullOrWhiteSpace(headData.BLFRT) && headData.BLFRT.IndexOf("COLLECT") >= 0)
{
if (string.IsNullOrWhiteSpace(headData.PAYABLEAT))
{
error = error + "<br />提单号:" + headData.MBLNO + " 付费方式是到付,到付地点不能为空";
}
if (!string.IsNullOrWhiteSpace(headData.PREPARDAT))
{
error = error + "<br />提单号:" + headData.MBLNO + " 付费方式是到付,预付地点不能填写";
}
}
}
return error;
}
#endregion
#region 生成报文(订舱(filetype=="B"),截单(filetype=="E"))
public static CommonWebApiResult CreateEdiYT(EDIBaseModel InttrEdi)
{
CommonWebApiResult result = new CommonWebApiResult { succ = false };
var filetype = "IFTMIN";
if (InttrEdi.filetype != "E") filetype = "IFTMBF";
string filename = InttrEdi.filerpath + "\\" + filetype + "_" + InttrEdi.BSLIST[0].MBLNO + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".txt";
//如果是部署linux需要修改路径
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
filename = filename.Replace("\\", "/");
//if (System.IO.File.Exists(filename))
//{
// System.IO.File.Delete(filename);
//}
FileStream f = new FileStream(filename, FileMode.Create);
StreamWriter r = new StreamWriter(f, Encoding.Default);
var icount = 0;
var bsno = "";
var isfirst = true;
foreach (var bill in InttrEdi.BSLIST)
{
if (isfirst)
{
if (InttrEdi.filetype == "E")
r.WriteLine("00:IFTMIN:BOOKING:" + InttrEdi.filerole + ":" + InttrEdi.SENDCODE + ":" + InttrEdi.RECEIVECODE + ":" + DateTime.Now.ToString("yyyyMMddHHmm") + "'");
else
r.WriteLine("00:IFTMBF:BOOKING:" + InttrEdi.filerole + ":" + InttrEdi.SENDCODE + ":" + InttrEdi.RECEIVECODE + ":" + DateTime.Now.ToString("yyyyMMddHHmm") + "'");
isfirst = false;
icount++;
}
if (bill.CARRIEREDICODE == "ONEY")
{
var sendno = bill.EDIATTNEMAIL;
if (filetype == "E") sendno = bill.AMSCODE;
var MBLNO = bill.MBLNO;
if (MBLNO.Substring(0, 4) == "ONEY")
{
MBLNO = MBLNO.Substring(4, MBLNO.Length - 4);
}
//2023-02-28 ONE的逻辑是去掉了提单号的前4位跟韩工已确认与东胜7相同
//2023-03-03 韩工给提供了新的02行的处理SENDNAME改为读取FTP配置的
/*
r.WriteLine("02"
+ ":" + MBLNO//2 REFERENCE NO. 运编号 X(35) 一般为流水号 M
+ ":" + MBLNO//3 B\L NO. 提单号 X(20) 船公司的提单号 C
+ ":" + bill.SERVICE//4 DELIVERY TERM 交货条款 X(9) CY-CY(pier-pier/port):30CY-CFS(pier/port-door):29CFS-CY(door-pier/port):28CFS-CFS(door-door):27 M
+ ":" + InttrEdi.SENDNAME//5 BOOKING PARTY 订舱人说明 X(70) 货代方企业名称或代码 C
+ ":ONEY" //6 ISSUE PARTY CODE 签单人代码 X(13) 即接受订舱的人的代码 M
+ ":"//7 ISSUE PARTY 签单人说明 X(35)   C
+ ":"//8 APPLICANT 询价单位 X(13) 向船公司询价的单位代码 C
+ ":"//9 FOB BK PARTY 国外订舱单位 X(13) 国外FOB货订舱单位的代码 C
+ ":"//10 B/L TRANSHIP ID 转船标识 X(1) Y/N C
+ ":"//11 BATCH ID 分批 X(1) Y/N C
+ ":"//12 SHIPMENT DATE 装期 9(8) CCYYMMDD C
+ ":"//13 EXPIRY DATE 效期 9(8) CCYYMMDD C
+ ":" + bill.CONTRACTNO//14 QUOTATION NO. 运费协议号 X(30) MAERSK为必选 C
+ ":"//15 CHARGE TYPE 费率本代码 X(1)   C
+ ":" + bill.CONTRACTNO//16 S/C NO. 合约号 X(30)   C
+ ":"//17 BOOKING NO. 船公司订舱编号 X(20) 船公司系统内部订舱编号 C
+ ":"//18 SLOT CHARTER ID 舱位互用标识 X(1)   C
+ ":" + sendno//19 AMS CODE AMS代码 X(15)   C
//注QUOTATION NO.项填本票订舱货的运价是通过向中集询价后定下的特殊运价编号。
+ "'");
*/
//2023-03-03 修改运输条款SERVICE改为EDI的映射值经过韩工确认
r.WriteLine("02"
+ ":" + MBLNO//2 REFERENCE NO. 运编号 X(35) 一般为流水号 M
+ ":" + MBLNO//3 B\L NO. 提单号 X(20) 船公司的提单号 C
+ ":" + bill.SERVICEEDICODE//4 DELIVERY TERM 交货条款 X(9) CY-CY(pier-pier/port):30CY-CFS(pier/port-door):29CFS-CY(door-pier/port):28CFS-CFS(door-door):27 M
+ ":" + formatEdiStr("txt", InttrEdi.SENDCOMPANYCODE) //5 BOOKING PARTY 订舱人说明 X(70) 货代方企业名称或代码 C
+ ":ONEY" //6 ISSUE PARTY CODE 签单人代码 X(13) 即接受订舱的人的代码 M
+ ":"//7 ISSUE PARTY 签单人说明 X(35)   C
+ ":"//8 APPLICANT 询价单位 X(13) 向船公司询价的单位代码 C
+ ":"//9 FOB BK PARTY 国外订舱单位 X(13) 国外FOB货订舱单位的代码 C
+ ":"//10 B/L TRANSHIP ID 转船标识 X(1) Y/N C
+ ":"//11 BATCH ID 分批 X(1) Y/N C
+ ":"//12 SHIPMENT DATE 装期 9(8) CCYYMMDD C
+ ":"//13 EXPIRY DATE 效期 9(8) CCYYMMDD C
+ ":" + bill.CONTRACTNO//14 QUOTATION NO. 运费协议号 X(30) MAERSK为必选 C
+ ":"//15 CHARGE TYPE 费率本代码 X(1)   C
+ ":" + bill.CONTRACTNO//16 S/C NO. 合约号 X(30)   C
+ ":"//17 BOOKING NO. 船公司订舱编号 X(20) 船公司系统内部订舱编号 C
+ ":"//18 SLOT CHARTER ID 舱位互用标识 X(1)   C
+ ":" + sendno//19 AMS CODE AMS代码 X(15)   C
//注QUOTATION NO.项填本票订舱货的运价是通过向中集询价后定下的特殊运价编号。
+ "'");
}
else
if (InttrEdi.filetype == "E")
{
//2023-03-03 修改运输条款SERVICE改为EDI的映射值经过韩工确认
r.WriteLine("02"
+ ":" + bill.ORDERNO//2 REFERENCE NO. 运编号 X(35) 一般为流水号 M
+ ":" + bill.MBLNO//3 B\L NO. 提单号 X(20) 船公司的提单号 C
+ ":" + bill.SERVICEEDICODE//4 DELIVERY TERM 交货条款 X(9) CY-CY(pier-pier/port):30CY-CFS(pier/port-door):29CFS-CY(door-pier/port):28CFS-CFS(door-door):27 M
+ ":" + formatEdiStr("txt", !string.IsNullOrWhiteSpace(InttrEdi.ForWarderName)?InttrEdi.ForWarderName.Replace("\n", " ").Replace("\r", " "):"")//5 BOOKING PARTY 订舱人说明 X(70) 货代方企业名称或代码 C
+ ":" + InttrEdi.RECEIVECODE//6 ISSUE PARTY CODE 签单人代码 X(13) 即接受订舱的人的代码 M
+ ":"//7 ISSUE PARTY 签单人说明 X(35)   C
+ ":"//8 APPLICANT 询价单位 X(13) 向船公司询价的单位代码 C
+ ":"//9 FOB BK PARTY 国外订舱单位 X(13) 国外FOB货订舱单位的代码 C
+ ":"//10 B/L TRANSHIP ID 转船标识 X(1) Y/N C
+ ":"//11 BATCH ID 分批 X(1) Y/N C
+ ":"//12 SHIPMENT DATE 装期 9(8) CCYYMMDD C
+ ":"//13 EXPIRY DATE 效期 9(8) CCYYMMDD C
+ ":" + bill.CONTRACTNO//14 QUOTATION NO. 运费协议号 X(30) MAERSK为必选 C
+ ":"//15 CHARGE TYPE 费率本代码 X(1)   C
+ ":" + bill.SERVICECONTRACTNO//16 S/C NO. 合约号 X(30)   C
+ ":" + bill.ORDERNO//17 BOOKING NO. 船公司订舱编号 X(20) 船公司系统内部订舱编号 C
+ ":::"//18 SLOT CHARTER ID 舱位互用标识 X(1)   C
+ ":" + bill.EDIATTNEMAIL//21 AMS CODE AMS代码 X(15)   C
+ ":" + bill.EDIATTN//22 AMS CODE AMS代码 X(15)   C
+ ":" + bill.EDIATTNTEL//23 AMS CODE AMS代码 X(15)   C
//注QUOTATION NO.项填本票订舱货的运价是通过向中集询价后定下的特殊运价编号。
+ "'");
}
else
{
//2023-03-03 修改运输条款SERVICE改为EDI的映射值经过韩工确认
r.WriteLine("02"
+ ":" + bill.ORDERNO//2 REFERENCE NO. 运编号 X(35) 一般为流水号 M
+ ":" + bill.MBLNO//3 B\L NO. 提单号 X(20) 船公司的提单号 C
+ ":" + bill.SERVICEEDICODE//4 DELIVERY TERM 交货条款 X(9) CY-CY(pier-pier/port):30CY-CFS(pier/port-door):29CFS-CY(door-pier/port):28CFS-CFS(door-door):27 M
+ ":" + formatEdiStr("txt", !string.IsNullOrWhiteSpace(InttrEdi.ForWarderName)?InttrEdi.ForWarderName.Replace("\n", " ").Replace("\r", " "):"")//5 BOOKING PARTY 订舱人说明 X(70) 货代方企业名称或代码 C
+ ":" + InttrEdi.RECEIVECODE//6 ISSUE PARTY CODE 签单人代码 X(13) 即接受订舱的人的代码 M
+ ":"//7 ISSUE PARTY 签单人说明 X(35)   C
+ ":"//8 APPLICANT 询价单位 X(13) 向船公司询价的单位代码 C
+ ":"//9 FOB BK PARTY 国外订舱单位 X(13) 国外FOB货订舱单位的代码 C
+ ":"//10 B/L TRANSHIP ID 转船标识 X(1) Y/N C
+ ":"//11 BATCH ID 分批 X(1) Y/N C
+ ":"//12 SHIPMENT DATE 装期 9(8) CCYYMMDD C
+ ":"//13 EXPIRY DATE 效期 9(8) CCYYMMDD C
+ ":" + bill.CONTRACTNO//14 QUOTATION NO. 运费协议号 X(30) MAERSK为必选 C
+ ":"//15 CHARGE TYPE 费率本代码 X(1)   C
+ ":" + bill.SERVICECONTRACTNO//16 S/C NO. 合约号 X(30)   C
+ ":" + bill.ORDERNO//17 BOOKING NO. 船公司订舱编号 X(20) 船公司系统内部订舱编号 C
+ ":"//18 SLOT CHARTER ID 舱位互用标识 X(1)   C
+ ":" + bill.EDIATTNEMAIL//21 AMS CODE AMS代码 X(15)   C
+ ":" + bill.EDIATTN//22 AMS CODE AMS代码 X(15)   C
+ ":" + bill.EDIATTNTEL//23 AMS CODE AMS代码 X(15)   C
//注QUOTATION NO.项填本票订舱货的运价是通过向中集询价后定下的特殊运价编号。
+ "'");
}
icount++;
var ISSUETYPE = "";
//2023-03-02 测试这里有问题,签单方式用的中文,要改成英文正本-ORIGINAL 电放-TELEX
/*
if (bill.ISSUETYPE == "正本")
{
ISSUETYPE = "ORI";
}
else if (bill.ISSUETYPE == "电放")
{
ISSUETYPE = "TER";
}
else ISSUETYPE = "EXP";
*/
if (bill.ISSUETYPE == "ORIGINAL")
{
ISSUETYPE = "ORI";
}
else if (bill.ISSUETYPE == "TELEX")
{
ISSUETYPE = "TER";
}
else ISSUETYPE = "EXP";
r.WriteLine("03:" + ISSUETYPE + ":" + bill.ISSUEPLACEID.Trim() + ":" + bill.ISSUEPLACE.Trim() + ":" + GetDateStr(bill.ISSUEDATE, "yyyyMMdd") + ":" + GetBillNum2(bill.NOBILL) + ":" + bill.PREPARDAT + ":" + bill.PAYABLEAT + "'");
icount++;
r.WriteLine("11:" + bill.VESSELID + ":" + bill.VESSEL + ":" + bill.VOYNO + ":::::" + GetDateStr(bill.ETD, "yyyyMMdd") + ":::::'");
icount++;
var DESTINATIONID = bill.DESTINATIONID;
var DESTINATION = bill.DESTINATION;
if (bill.CARRIEREDICODE == "ONEY" || bill.CARRIEREDICODE == "ZIM")
{
DESTINATIONID = "";
DESTINATION = "";
}
r.WriteLine("12"
+ ":" + bill.PLACERECEIPTID//2 PLACE CODE OF RECEIPT 收货地代码 X(5) OOCL、HLC的订舱要求必选 O
+ ":" + bill.PLACERECEIPT//3 PLACE OF RECEIPT 收货地 X(35)   C
+ ":" + bill.PORTLOADID//4 LOAD PORT CODE 装货港代码 X(5) OOCL的订舱要求必选 O
+ ":" + bill.PORTLOAD//5 LOAD PORT 装货港 X(35)   C
+ ":" + bill.PORTDISCHARGEID//6 DISCHARGE PORT CODE 卸货港代码 X(5) OOCL的订舱要求必选 M
+ ":" + bill.PORTDISCHARGE//7 DISCHARGE PORT 卸货港 X(35)   C
+ ":" + bill.TRANSPORTID //8 TRANSFER PORT CODE 中转港代码 X(5)   C
+ ":" + bill.TRANSPORT//9 TRANSFER PORT 中转港 X(35)   C
+ ":" + bill.PLACEDELIVERYID//10 PLACE OF DELIVERY CODE 交货地代码 X(5) OOCL的订舱要求必选 O
+ ":" + bill.PLACEDELIVERY//11 PLACE OF DELIVERY 交货地 X(35)   C
+ ":" + DESTINATIONID//12 FINAL DESTINATION CODE 目的地代码 X(5)   C
+ ":" + DESTINATION//13 FINAL DESTINATION CODE 目的地 X(35)   C
+ "'");
icount = icount + 1;
r.WriteLine("14:" + bill.BLFRTEDICODE + ":" + bill.BLFRT + "'");
if (InttrEdi.filetype == "E")
r.WriteLine("15:::" + bill.BLFRTEDICODE + ":" + bill.PAYABLEATID + ":::::'");
else
r.WriteLine("15:::" + bill.BLFRTEDICODE + "::::::'");
icount = icount + 2;
var Shipping = "";
if (InttrEdi.filetype == "E")
Shipping = formatEdiStr("txt", bill.SIREMARK);
else
Shipping = formatEdiStr("txt", bill.EDIREMARK);
List<System.String> ShippingList = formatlengthStr(Shipping, 70);
if (!string.IsNullOrWhiteSpace(Shipping))
{
r.WriteLine("17:" + formatListStr(ShippingList, 5) + "'");
icount++;
}
if (InttrEdi.filetype != "E" && !string.IsNullOrEmpty(bill.NVONO))
{
r.WriteLine("18:NVO:" + bill.NVONO + "'");
}
Shipping = formatEdiStr("txt", bill.SHIPPER);
ShippingList = formatlengthStr(Shipping, 35);
if (ShippingList.Count != 0 && Shipping.Length > 0)
{
r.WriteLine("20::" + formatListStr(ShippingList, 6) + "'");
icount = icount + 1;
}
Shipping = formatEdiStr("txt", bill.CONSIGNEE);
ShippingList = formatlengthStr(Shipping, 35);
if (ShippingList.Count != 0 && Shipping.Length > 0)
{
r.WriteLine("21::" + formatListStr(ShippingList, 6) + "'");
icount = icount + 1;
}
Shipping = formatEdiStr("txt", bill.NOTIFYPARTY);
ShippingList = formatlengthStr(Shipping, 35);
if (ShippingList.Count != 0 && Shipping.Length > 0)
{
r.WriteLine("22::" + formatListStr(ShippingList, 6) + "'");
icount = icount + 1;
}
Shipping = formatEdiStr("txt", !string.IsNullOrWhiteSpace(bill.NOTIFYPARTY2) ? bill.NOTIFYPARTY2 : "");
ShippingList = formatlengthStr(Shipping, 35);
if (!string.IsNullOrWhiteSpace(Shipping))
{
r.WriteLine("23::" + formatListStr(ShippingList, 6) + "'");
icount = icount + 1;
}
Shipping = bill.AMSCONSIGNEE;
ShippingList = formatlengthStr(Shipping, 35);
if (!string.IsNullOrWhiteSpace(Shipping))
{
r.WriteLine("24::" + formatListStr(ShippingList, 6, true) + "'");
icount = icount + 1;
}
Shipping = bill.AMSNOTIFYPARTY;
ShippingList = formatlengthStr(Shipping, 35);
if (!string.IsNullOrWhiteSpace(Shipping))
{
r.WriteLine("25::" + formatListStr(ShippingList, 6, true) + "'");
icount = icount + 1;
}
var cargoid = bill.CARGOID;
if (cargoid == "" || cargoid == " ") cargoid = "S";
var kingweight = bill.KINGTAREWEIGHT;
if (kingweight == 0)
kingweight = 100;
r.WriteLine("41:1:" + bill.HSCODE + ":" + cargoid + ":" + bill.PKGS.ToString() + ":" + bill.KINDPKGS_EDI_CODE + ":" + bill.KINDPKGS + ":" + kingweight.ToString() + ":"
+ bill.CBM.ToString() + "::::::" + bill.KGS.ToString() + ":::'");
icount = icount + 1;
if (cargoid == "R")
r.WriteLine("43::::::::::" + bill.REEFERF + ":C:" + bill.TEMPSET + ":" + bill.TEMPMIN + ":" + bill.TEMPMAX + ":::::'");
else if (cargoid == "D")
r.WriteLine("43:" + bill.DCLASS + ":" + bill.DPAGE + ":" + bill.DUNNO + ":" + bill.DLABEL + "::::::::::::'");
icount = icount + 1;
Shipping = formatEdiStr("txt", bill.MARKS);
ShippingList = formatlengthStr(Shipping, 35);
for (var i = 0; i < Math.Ceiling(Convert.ToDecimal(Convert.ToDecimal(ShippingList.Count) / Convert.ToDecimal(10))); i++)
{
var tempstr = "44:";
for (var z = 0; z < 10; z++)
{
if ((i * 10 + z) < ShippingList.Count)
tempstr = tempstr + ShippingList[i * 10 + z];
if (z < 9) tempstr = tempstr + ":";
}
if (tempstr != "44:")
{
r.WriteLine(tempstr + "'");
icount++;
}
}
Shipping = formatEdiStr("txt", bill.DESCRIPTION);
ShippingList = formatlengthStr(Shipping, 70);
var m = 1;
var strtemp = "";
if (ShippingList.Count != 0 && Shipping.Length > 0)
{
for (var i = 0; i < ShippingList.Count; i++)
{
if (ShippingList[i] != "")
{
if (m <= 5)
{
if (m == 1) strtemp = "47:" + ShippingList[i] + ":";
else
{
if (m == 5)
strtemp = strtemp + ShippingList[i];
else
strtemp = strtemp + ShippingList[i] + ":";
}
}
else
{
m = 1;
r.WriteLine(strtemp + "'");
strtemp = "47:" + ShippingList[i] + ":";
icount = icount + 1;
}
m = m + 1;
}
}
}
if (!string.IsNullOrWhiteSpace(strtemp))
{
r.WriteLine(strtemp + "'");
icount = icount + 1;
}
var ISSOC = "N";
if (bill.ISCONTAINERSOC) ISSOC = "Y";
var ctnsumlist = new List<MsOpSeaeCtnEDIBaseModel>();
foreach (var ctn in bill.CTNLIST)
{
var newctnsum = ctnsumlist.Find(x => x.CTNALLCODE == ctn.CTNALLCODE);
if (newctnsum == null)
{
var ctnsum = new MsOpSeaeCtnEDIBaseModel();
ctnsum.CTNALLCODE = ctn.CTNALLCODE;
ctnsum.CTNNUM = ctn.CTNNUM;
if (bill.ISCONTAINERSOC && !string.IsNullOrEmpty(ctn.CNTRNO))
{
if (!string.IsNullOrEmpty(ctnsum.CNTRNO))
{
ctnsum.CNTRNO = ctn.CNTRNO;
}
else
{
ctnsum.CNTRNO = ctnsum.CNTRNO + "," + ctn.CNTRNO;
}
}
ctnsumlist.Add(ctnsum);
}
else
{
newctnsum.CTNNUM = newctnsum.CTNNUM + ctn.CTNNUM;
if (bill.ISCONTAINERSOC && !string.IsNullOrEmpty(ctn.CNTRNO))
{
if (!string.IsNullOrEmpty(newctnsum.CNTRNO))
{
newctnsum.CNTRNO = ctn.CNTRNO;
}
else
{
newctnsum.CNTRNO = newctnsum.CNTRNO + "," + ctn.CNTRNO;
}
}
}
}
foreach (var ctnsum in ctnsumlist)
{
if (InttrEdi.filetype == "E")
{
r.WriteLine("48:" + ctnsum.CTNALLCODE + ":" + ctnsum.CTNNUM + ":F:::::" + ISSOC + "'");
icount = icount + 1;
}
else
{
var cntrnostr = "";
var isrstr = "N";
if (cargoid == "R") isrstr = "Y";
r.WriteLine("48:" + ctnsum.CTNALLCODE + ":" + ctnsum.CTNNUM + ":F:::::" + ISSOC + ":" + cntrnostr + ":::" + isrstr + "'");
icount = icount + 1;
}
}
foreach (var ctn in bill.CTNLIST)
{
if (InttrEdi.filetype == "E")
{
r.WriteLine("51:" + ctn.CNTRNO + ":" + ctn.CTNALLCODE + ":"
+ ctn.SEALNO + ":" + ctn.PKGS.ToString() + ":" + ctn.KGS.ToString() + "::" + ctn.CBM.ToString() + ":" + bill.EDIATTNEMAIL + "'");
icount = icount + 1;
if (bill.CTNGOODSLIST != null && bill.CTNGOODSLIST.Count != 0)
{
foreach (var ctnhs in bill.CTNGOODSLIST)
{
r.WriteLine("53:" + ctnhs.HSCODE + ":" + ctnhs.PKGS.ToString() + ":"
+ ctnhs.KGS.ToString() + ":" + ctnhs.CBM.ToString() + ":" + ctnhs.KINDPKGS_EDI_CODE + ":" + ctnhs.KINDPKGS + "'");
icount = icount + 1;
Shipping = formatEdiStr("txt", ctnhs.DESCRIPTION);
ShippingList = formatlengthStr(Shipping, 70);
m = 1;
strtemp = "";
if (ShippingList.Count != 0 && Shipping.Length > 0)
{
for (var i = 0; i < ShippingList.Count; i++)
{
if (!string.IsNullOrWhiteSpace(ShippingList[i]))
{
if (m <= 5)
{
if (m == 1) strtemp = "54:" + ShippingList[i] + ":";
else
{
if (m == 5)
strtemp = strtemp + ShippingList[i];
else
strtemp = strtemp + ShippingList[i] + ":";
}
}
else
{
m = 1;
r.WriteLine(strtemp + "'");
strtemp = "54:" + ShippingList[i] + ":";
icount = icount + 1;
}
m = m + 1;
}
}
}
if (!string.IsNullOrWhiteSpace(strtemp))
{
r.WriteLine(strtemp + "'");
icount = icount + 1;
}
}
}
}
else
{
if (!string.IsNullOrEmpty(ctn.CNTRNO))
{
r.WriteLine("51:" + ctn.CNTRNO + ":" + ctn.CTNALLCODE + ":"
+ ctn.SEALNO + ":" + ctn.PKGS.ToString() + ":" + ctn.KGS.ToString() + ":'");
icount = icount + 1;
}
}
//}
}
}
icount = icount + 1;
r.WriteLine("99:" + icount.ToString() + "'");
r.Close();
f.Close();
result.succ = true;
result.extra = filename;
return result;
}
#endregion
}
}