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.

3071 lines
131 KiB
C#

This file contains ambiguous Unicode 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 DSWeb.Common.DB;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
namespace DSWeb.Helper
{
/// <summary>
/// 大简云舱单导入报文解析
/// </summary>
public static class AnalyzeNew
{
private static Dictionary<string, Tuple<int, string>> dicEdiChkLen = new Dictionary<string, Tuple<int, string>>();
static AnalyzeNew()
{
//dicEdiChkLen.Add("MFNO", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("BSNO", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("MASTERNO", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("EDITYPE", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("EDISTATUS", new Tuple<int, string>(12, ""));
//dicEdiChkLen.Add("INPUTBY", new Tuple<int, string>(12, ""));
//dicEdiChkLen.Add("CUSTNO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("MBLNO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("HBLNO", new Tuple<int, string>(20, ""));
dicEdiChkLen.Add("SHIPPERNAME", new Tuple<int, string>(200, "发货人名称"));
dicEdiChkLen.Add("SHIPPERADDR1", new Tuple<int, string>(200, "发货人地址"));
//dicEdiChkLen.Add("SHIPPERADDR2", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("SHIPPERADDR3", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("SHIPPERCITY", new Tuple<int, string>(30, ""));
//dicEdiChkLen.Add("SHIPPERPROVINCE", new Tuple<int, string>(3, ""));
//dicEdiChkLen.Add("SHIPPERPOSTCODE", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("SHIPPERCOUNTRY", new Tuple<int, string>(2, ""));
//dicEdiChkLen.Add("SHIPPERATTN", new Tuple<int, string>(25, ""));
//dicEdiChkLen.Add("SHIPPERTEL", new Tuple<int, string>(50, ""));
dicEdiChkLen.Add("CONSIGNEENAME", new Tuple<int, string>(200, "收货人名称"));
dicEdiChkLen.Add("CONSIGNEEADDR1", new Tuple<int, string>(200, "收货人地址"));
//dicEdiChkLen.Add("CONSIGNEEADDR2", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("CONSIGNEEADDR3", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("CONSIGNEECITY", new Tuple<int, string>(30, ""));
//dicEdiChkLen.Add("CONSIGNEEPROVINCE", new Tuple<int, string>(3, ""));
//dicEdiChkLen.Add("CONSIGNEEPOSTCODE", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("CONSIGNEECOUNTRY", new Tuple<int, string>(2, ""));
//dicEdiChkLen.Add("CONSIGNEEATTN", new Tuple<int, string>(25, ""));
//dicEdiChkLen.Add("CONSIGNEETEL", new Tuple<int, string>(50, ""));
dicEdiChkLen.Add("NOTIFYPARTYNAME", new Tuple<int, string>(200, "通知人名称"));
dicEdiChkLen.Add("NOTIFYPARTYADDR1", new Tuple<int, string>(200, "通知人地址"));
//dicEdiChkLen.Add("NOTIFYPARTYADDR2", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("NOTIFYPARTYADDR3", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("NOTIFYPARTYCITY", new Tuple<int, string>(30, ""));
//dicEdiChkLen.Add("NOTIFYPARTYPROVINCE", new Tuple<int, string>(3, ""));
//dicEdiChkLen.Add("NOTIFYPARTYPOSTCODE", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("NOTIFYPARTYCOUNTRY", new Tuple<int, string>(2, ""));
//dicEdiChkLen.Add("NOTIFYPARTYATTN", new Tuple<int, string>(25, ""));
//dicEdiChkLen.Add("NOTIFYPARTYTEL", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2NAME", new Tuple<int, string>(40, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2ADDR1", new Tuple<int, string>(35, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2ADDR2", new Tuple<int, string>(35, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2ADDR3", new Tuple<int, string>(35, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2CITY", new Tuple<int, string>(30, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2PROVINCE", new Tuple<int, string>(3, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2POSTCODE", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2COUNTRY", new Tuple<int, string>(2, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2ATTN", new Tuple<int, string>(25, ""));
//dicEdiChkLen.Add("NOTIFYPARTY2TEL", new Tuple<int, string>(23, ""));
dicEdiChkLen.Add("SHIPPER", new Tuple<int, string>(600, "发货人"));
dicEdiChkLen.Add("CONSIGNEE", new Tuple<int, string>(600, "收货人"));
dicEdiChkLen.Add("NOTIFYPARTY", new Tuple<int, string>(600, "通知人"));
dicEdiChkLen.Add("VESSEL", new Tuple<int, string>(60, "船名"));
dicEdiChkLen.Add("VOYNO", new Tuple<int, string>(12, "航次"));
//dicEdiChkLen.Add("PORTLOADID", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("PORTLOAD", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("PORTDISCHARGEID", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("PORTDISCHARGE", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("PLACEDELIVERYID", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("PLACEDELIVERY", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("DESTINATIONID", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("DESTINATION", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("SERVICE", new Tuple<int, string>(50, ""));
dicEdiChkLen.Add("MARKS", new Tuple<int, string>(2000, "唛头"));
dicEdiChkLen.Add("DESCRIPTION", new Tuple<int, string>(2000, "货物描述"));
//dicEdiChkLen.Add("KINDPKGS", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("CARGOID", new Tuple<int, string>(1, ""));
//dicEdiChkLen.Add("DCLASS", new Tuple<int, string>(5, ""));
//dicEdiChkLen.Add("DUNNO", new Tuple<int, string>(16, ""));
//dicEdiChkLen.Add("REEFERF", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("TEMPID", new Tuple<int, string>(1, ""));
//dicEdiChkLen.Add("TEMPSET", new Tuple<int, string>(5, ""));
//dicEdiChkLen.Add("TEMPMAX", new Tuple<int, string>(5, ""));
//dicEdiChkLen.Add("TEMPMIN", new Tuple<int, string>(5, ""));
//dicEdiChkLen.Add("FREIGHTAGMNO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("HUMIDITY", new Tuple<int, string>(5, ""));
//dicEdiChkLen.Add("SHIPIMO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("CARRIERID", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("ORDERNO", new Tuple<int, string>(35, ""));
//dicEdiChkLen.Add("FILEROLE", new Tuple<int, string>(1, ""));
//dicEdiChkLen.Add("PACKINGTYPE", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("SHIPSERVICENO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("TRANSTYPE", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("FILETYPE", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("BLFRT", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("ISSUEPLACE", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("ETDTIME", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("AGENTID", new Tuple<int, string>(10, ""));
//dicEdiChkLen.Add("CNTRSEALNO", new Tuple<int, string>(500, ""));
//dicEdiChkLen.Add("STATUS", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("YARD", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("CHANGERESON", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("FORWARD", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("CARRIER", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("REMARKS", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("CNTRNO", new Tuple<int, string>(200, ""));
//dicEdiChkLen.Add("CORPID", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("DPAGE", new Tuple<int, string>(7, ""));
//dicEdiChkLen.Add("DLABEL", new Tuple<int, string>(32, ""));
//dicEdiChkLen.Add("LINKMAN", new Tuple<int, string>(35, ""));
//dicEdiChkLen.Add("FORWARDER", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("DCARRIER", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("ARVESSEL", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("ARVOYNO", new Tuple<int, string>(12, ""));
//dicEdiChkLen.Add("ARSHIPIMO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("ARSHIPSERVICENO", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("FIRSTPORTOFCALLID", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("FIRSTPORTOFCALLDATE", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("LASTPORTOFCALLID", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("LASTPORTOFCALLDATE", new Tuple<int, string>(20, ""));
//dicEdiChkLen.Add("MANIFESTSTATUS", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("PLACERECEIPTID", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("PLACERECEIPT", new Tuple<int, string>(60, ""));
//dicEdiChkLen.Add("SHIPPERCODE", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("SHIPPEREMAIL", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("CONSIGNEECODE", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("CONSIGNEEEMAIL", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("NOTIFYPARTYCODE", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("NOTIFYPARTYEMAIL", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("LeiXingFa", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("LeiXingShou", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("LeiXingTong", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("DaiMaFa", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("DaiMaShou", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("DaiMaTong", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("CreateUser", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("JiZhuangXiang", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("WeiTuoFaSongFang", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("INPUTBYID", new Tuple<int, string>(100, ""));
//dicEdiChkLen.Add("ZhiFaText", new Tuple<int, string>(5000, ""));
//dicEdiChkLen.Add("comname", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("DTEL", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("DATTN", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("DATEL", new Tuple<int, string>(50, ""));
//dicEdiChkLen.Add("DeleteUser", new Tuple<int, string>(50, ""));
}
#region txt报文解析
/// <summary>
/// 解析导入EDI的TXT报文
/// </summary>
public static bool AnalyzeContent(string content, out OpSeaeEdi edi, out List<OpSeaeEdiCtn> ctnList, out string msg)
{
var lines = content.Replace("?'", "し").Split('\'').ToList(); //特殊符号处理
for (var idx = 0; idx < lines.Count; idx++)
{
lines[idx] = lines[idx].Replace("\r\n", "");
}
CommonDataContext commonData = new CommonDataContext();
EdiDataContext ediData = new EdiDataContext();
edi = new OpSeaeEdi();
edi.MFNO = Guid.NewGuid().ToString();
//edi.BSNO todo:分单需查询主单的MFNO
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
//edi.INPUTBY todo:当前用户
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.PORTLOAD = "QINGDAO,CHINA";
edi.PORTLOADID = "CNTAO";
edi.PLACEDELIVERY = "QINGDAO,CHINA";
edi.PLACEDELIVERYID = "CNTAO";
edi.LeiXingFa = string.Empty;
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
ctnList = new List<OpSeaeEdiCtn>();
var succ = DealPrefix12(lines, edi, out msg);
OpSeaeEdi parentEdi;
if (!string.IsNullOrEmpty(edi.MBLNO) && !string.IsNullOrEmpty(edi.HBLNO))
{
var mblno = edi.MBLNO;
var hblno = edi.HBLNO;
var existEdi = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == mblno && x.HBLNO == hblno);
if (existEdi != null)
{
msg = "提单号重复 ";
return false;
}
parentEdi = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == mblno && (x.HBLNO == null || x.HBLNO == ""));
if (parentEdi != null)
{
edi.BSNO = parentEdi.MFNO;
edi.ETD = parentEdi.ETD;
edi.FORWARDER = parentEdi.FORWARDER;
edi.CARRIER = parentEdi.CARRIER;
edi.CARRIERID = parentEdi.CARRIERID;
edi.KINDPKGS = parentEdi.KINDPKGS;
edi.BLFRT = parentEdi.BLFRT;
edi.SERVICE = parentEdi.SERVICE;
edi.CARGOID = parentEdi.CARGOID;
edi.TEMPID = parentEdi.TEMPID;
edi.TEMPSET = parentEdi.TEMPSET;
edi.DCLASS = parentEdi.DCLASS;
edi.DUNNO = parentEdi.DUNNO;
}
else
{
msg = "未找到主单信息";
return false;
}
}
else
{
msg = "提单号解析失败";
return false;
}
succ = DealPrefix10(lines, edi, out msg);
if (!succ)
{
return false;
}
//succ = DealPrefix11(lines, edi, out msg);
//if (!succ)
//{
// return false;
//}
succ = DealPrefix13(lines, edi, parentEdi, out msg);
if (!succ)
{
return false;
}
succ = DealPrefix16(lines, edi, parentEdi, out msg);
if (!succ)
{
return false;
}
succ = DealPrefix17(lines, edi, parentEdi, out msg);
if (!succ)
{
return false;
}
succ = DealPrefix18(lines, edi, parentEdi, out msg);
if (!succ)
{
return false;
}
succ = DealPrefix41(lines, edi, out msg);
if (!succ)
{
return false;
}
//succ = DealPrefix43(lines, edi, out msg);
//if (!succ)
//{
// return false;
//}
succ = DealPrefix44(lines, edi, out msg);
if (!succ)
{
return false;
}
succ = DealPrefix47(lines, edi, out msg);
if (!succ)
{
return false;
}
succ = DealPrefix51(lines, edi, ctnList, out msg);
//将整票件重尺放到第一个箱子里
if (ctnList.Count > 0)
{
ctnList[0].KGS = edi.KGS;
ctnList[0].PKGS = edi.PKGS;
ctnList[0].CBM = edi.CBM;
}
return succ;
}
/// <summary>
/// 提单的第一个记录
/// </summary>
private static bool DealPrefix12(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "12");
if (items == null)
{
msg = "缺少12标记无法解析提单号";
return false;
}
model.MBLNO = GetPosString(items, 1); //提单号
model.HBLNO = GetPosString(items, 16);
model.CBM = GetPosDecimal(items, 20);
msg = null;
return true;
}
/// <summary>
/// 船舶有关的基本信息
/// </summary>
private static bool DealPrefix10(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "10");
if (items == null)
{
msg = "缺少10标记无法解析船名航次";
return false;
}
model.VESSEL = GetPosString(items, 2);
model.VOYNO = GetPosString(items, 4);
model.ETA = DateTime.ParseExact(GetPosString(items, 8).Substring(0, 8), "yyyyMMdd", CultureInfo.CurrentCulture); //eta
msg = null;
return true;
}
/// <summary>
/// 船舶有关的补充信息
/// </summary>
private static bool DealPrefix11(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "11");
model.CARRIERID = GetPosString(items, 1); //船公司代号
model.CARRIER = GetPosString(items, 2); //船公司
msg = null;
return true;
}
/// <summary>
/// 提单的地点信息
/// </summary>
private static bool DealPrefix13(List<string> lines, OpSeaeEdi model, OpSeaeEdi parent, out string msg)
{
var items = GetFirstItemByFixNo(lines, "13");
CommonDataContext commonData = new CommonDataContext();
model.PORTDISCHARGEID = GetPosString(items, 1); //卸货地代码
model.PORTDISCHARGE = GetPosString(items, 2); //卸货地
var objPort = commonData.Disports.AsNoTracking().FirstOrDefault(d => d.EDICODE == model.PORTDISCHARGEID);
if (objPort != null)
{
model.PORTDISCHARGE = objPort.PORT;
}
else //2021-8-10 报文导入时,分单的港口默认取分单报文里的港口,如果该港口代码大简云平台不存在,则取主单的港口。
{
model.PORTDISCHARGEID = parent.PORTDISCHARGEID;
model.PORTDISCHARGE = parent.PORTDISCHARGE;
}
model.DESTINATIONID = GetPosString(items, 3); //交货地代码
model.DESTINATION = GetPosString(items, 4); //交货地
if (string.IsNullOrEmpty(model.DESTINATIONID))
{
model.DESTINATIONID = model.PORTDISCHARGEID;
model.DESTINATION = model.PORTDISCHARGE;
}
else
{
objPort = commonData.Disports.AsNoTracking().FirstOrDefault(d => d.EDICODE == model.DESTINATIONID);
if (objPort != null)
{
model.DESTINATION = objPort.PORT;
}
else //2021-8-10 报文导入时,分单的港口默认取分单报文里的港口,如果该港口代码大简云平台不存在,则取主单的港口。
{
model.DESTINATIONID = parent.DESTINATIONID;
model.DESTINATION = parent.DESTINATION;
}
}
msg = null;
return true;
}
/// <summary>
/// 发货人信息
/// </summary>
private static bool DealPrefix16(List<string> lines, OpSeaeEdi model, OpSeaeEdi parent, out string msg)
{
var items = GetFirstItemByFixNo(lines, "16");
/* 2021-8-11
1.导入报文时如果报文中的发货人名称或收货人名称或通知人名称是PERSONAL EFFECTS则该分票信息的收发通取主单的。
2.如果报文中的收发通电话或国家代码为空,则取主单的。
3.取消导入报文时,根据前两个单词调用舱单收发通的设置。
*/
var shipper = GetPosString(items, 2);
if (shipper == "PERSONAL EFFECTS")
{
model.SHIPPER = parent.SHIPPER;
model.SHIPPERNAME = parent.SHIPPERNAME;
model.SHIPPERADDR1 = parent.SHIPPERADDR1;
model.SHIPPERCOUNTRY = parent.SHIPPERCOUNTRY;
model.SHIPPERTEL = parent.SHIPPERTEL;
}
else
{
model.SHIPPER = shipper; //发货人
model.SHIPPERNAME = model.SHIPPER;
model.SHIPPERADDR1 = GetPosString(items, 3); //发货人地址
model.SHIPPERCOUNTRY = GetPosString(items, 11); //发货人国家代码
model.SHIPPERTEL = Regex.Replace(GetPosString(items, 4), @"[^\d]*", ""); //发货人电话
if (string.IsNullOrEmpty(model.SHIPPERCOUNTRY))
{
model.SHIPPERCOUNTRY = parent.SHIPPERCOUNTRY;
}
if (string.IsNullOrEmpty(model.SHIPPERTEL))
{
model.SHIPPERTEL = parent.SHIPPERTEL;
}
}
msg = null;
return true;
}
/// <summary>
/// 收货人信息
/// </summary>
private static bool DealPrefix17(List<string> lines, OpSeaeEdi model, OpSeaeEdi parent, out string msg)
{
var items = GetFirstItemByFixNo(lines, "17");
/* 2021-8-11
1.导入报文时如果报文中的发货人名称或收货人名称或通知人名称是PERSONAL EFFECTS则该分票信息的收发通取主单的。
2.如果报文中的收发通电话或国家代码为空,则取主单的。
3.取消导入报文时,根据前两个单词调用舱单收发通的设置。
*/
var CONSIGNEE = GetPosString(items, 2);
if (CONSIGNEE == "PERSONAL EFFECTS")
{
model.CONSIGNEE = parent.CONSIGNEE;
model.CONSIGNEENAME = parent.CONSIGNEENAME;
model.CONSIGNEEADDR1 = parent.CONSIGNEEADDR1;
model.CONSIGNEECOUNTRY = parent.CONSIGNEECOUNTRY;
model.CONSIGNEETEL = parent.CONSIGNEETEL;
}
else
{
model.CONSIGNEE = CONSIGNEE; //收货人
model.CONSIGNEENAME = model.CONSIGNEE;
model.CONSIGNEEADDR1 = GetPosString(items, 3); //收货人地址
model.CONSIGNEECOUNTRY = GetPosString(items, 11); //收货人国家代码
model.CONSIGNEETEL = Regex.Replace(GetPosString(items, 4), @"[^\d]*", ""); //收货人电话
if (string.IsNullOrEmpty(model.CONSIGNEECOUNTRY))
{
model.CONSIGNEECOUNTRY = parent.CONSIGNEECOUNTRY;
}
if (string.IsNullOrEmpty(model.CONSIGNEETEL))
{
model.CONSIGNEETEL = parent.CONSIGNEETEL;
}
}
msg = null;
return true;
}
/// <summary>
/// 通知人信息
/// </summary>
private static bool DealPrefix18(List<string> lines, OpSeaeEdi model, OpSeaeEdi parent, out string msg)
{
var items = GetFirstItemByFixNo(lines, "18");
/* 2021-8-11
1.导入报文时如果报文中的发货人名称或收货人名称或通知人名称是PERSONAL EFFECTS则该分票信息的收发通取主单的。
2.如果报文中的收发通电话或国家代码为空,则取主单的。
3.取消导入报文时,根据前两个单词调用舱单收发通的设置。
*/
var NOTIFYPARTY = GetPosString(items, 2);
if (NOTIFYPARTY == "PERSONAL EFFECTS")
{
model.NOTIFYPARTY = parent.NOTIFYPARTY;
model.NOTIFYPARTYNAME = parent.NOTIFYPARTYNAME;
model.NOTIFYPARTYADDR1 = parent.NOTIFYPARTYADDR1;
model.NOTIFYPARTYCOUNTRY = parent.NOTIFYPARTYCOUNTRY;
model.NOTIFYPARTYTEL = parent.NOTIFYPARTYTEL;
}
else
{
model.NOTIFYPARTY = NOTIFYPARTY; //通知人
model.NOTIFYPARTYNAME = model.NOTIFYPARTY;
model.NOTIFYPARTYADDR1 = GetPosString(items, 3); //通知人地址
model.NOTIFYPARTYCOUNTRY = GetPosString(items, 11); //通知人国家代码
model.NOTIFYPARTYTEL = Regex.Replace(GetPosString(items, 4), @"[^\d]*", ""); //通知人电话
if (string.IsNullOrEmpty(model.NOTIFYPARTYCOUNTRY))
{
model.NOTIFYPARTYCOUNTRY = parent.NOTIFYPARTYCOUNTRY;
}
if (string.IsNullOrEmpty(model.NOTIFYPARTYTEL))
{
model.NOTIFYPARTYTEL = parent.NOTIFYPARTYTEL;
}
}
msg = null;
return true;
}
/// <summary>
/// 货物信息
/// </summary>
private static bool DealPrefix41(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "41");
model.PKGS = GetPosInt(items, 3); //件数
model.KGS = GetPosDecimal(items, 6); //重量
//model.KINDPKGS = GetPosString(items, 5); //包装 2021-7-12修改为取主单包装
//model.CBM = GetPosDecimal(items, 8); //尺码
msg = null;
return true;
}
/// <summary>
/// 危险品和冷藏信息
/// </summary>
private static bool DealPrefix43(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "43");
model.CARGOID = "S";
if (items != null && items.Count > 1 && !string.IsNullOrEmpty(GetPosString(items, 10)))
{
model.CARGOID = "R";
model.TEMPID = GetPosString(items, 9); //?需要验证
model.TEMPSET = GetPosString(items, 10); //?需要验证
}
else if (items != null && items.Count > 4 && !string.IsNullOrEmpty(GetPosString(items, 2)))
{
model.CARGOID = "D";
model.DCLASS = GetPosString(items, 1); //?需要验证
model.DUNNO = GetPosString(items, 3); //?需要验证
}
msg = null;
return true;
}
/// <summary>
/// 唛头信息
/// </summary>
/// <returns></returns>
private static bool DealPrefix44(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "44");
if (items.Count >= 2)
{
StringBuilder bld = new StringBuilder();
for (int i = 1; i < items.Count; i++)
bld.AppendLine(GetPosString(items, i));
model.MARKS = bld.ToString();
}
else
{
model.MARKS = "";
}
if (model.MARKS.EndsWith("\r\n"))
{
model.MARKS = model.MARKS.Substring(0, model.MARKS.Length - 2);
}
msg = null;
return true;
}
/// <summary>
/// 货物描述
/// </summary>
private static bool DealPrefix47(List<string> lines, OpSeaeEdi model, out string msg)
{
var items = GetFirstItemByFixNo(lines, "47");
if (items.Count >= 2)
{
StringBuilder bld = new StringBuilder();
for (int i = 1; i < items.Count; i++)
{
string ms = GetPosString(items, i);
if (!string.IsNullOrEmpty(ms))
{
bld.AppendLine(ms);
}
}
model.DESCRIPTION = bld.ToString().TrimEnd('\n').TrimEnd('\r');
}
else
{
model.DESCRIPTION = "";
}
msg = null;
return true;
}
/// <summary>
/// 集装箱信息
/// </summary>
private static bool DealPrefix51(List<string> lines, OpSeaeEdi model, List<OpSeaeEdiCtn> ctnList, out string msg)
{
var lstItem = GetItemsByFixNo2(lines, "51");
CommonDataContext commonData = new CommonDataContext();
int idx = 1;
foreach (var ctn_line in lstItem)
{
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = model.MFNO;
ctn.CNTRNO = GetPosString(ctn_line, 1);
ctn.SEALNO = GetPosString(ctn_line, 2);
ctn.CTNCODE = idx++.ToString().PadLeft(2, '0');
var ediCode = GetPosString(ctn_line, 3);
var objCtn = commonData.Ctns.AsNoTracking().FirstOrDefault(c => c.EDICODE == ediCode);
ctn.CTNALL = objCtn?.CTN;
ctn.KINDPKGS = model.KINDPKGS;
ctn.ZhongKongBiaoShi = GetPosInt(ctn_line, 4);
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctnList.Add(ctn);
}
msg = null;
return true;
}
/// <summary>
/// 根据行的header序号得到行内容
/// </summary>
/// <param name="fixno"></param>
/// <returns></returns>
private static List<string> GetFirstItemByFixNo(List<string> lines, string fixno)
{
fixno += ":";
var line = lines.FirstOrDefault(l => l.StartsWith(fixno));
if (string.IsNullOrEmpty(line))
{
return null;
}
//处理?:的转义功能
List<string> items = line.TrimEnd('\'').Replace("し", "'").Replace("?:", "△").Split(':').ToList();
for (int i = 0; i < items.Count; i++)
{
items[i] = items[i].Replace("△", ":").TrimEnd();
}
return items;
}
/// <summary>
/// 根据行的header序号得到行内容箱信息
/// </summary>
/// <param name="fixno"></param>
/// <returns></returns>
private static List<List<string>> GetItemsByFixNo2(List<string> lines, string fixno)
{
List<List<string>> lstList = new List<List<string>>();
fixno += ":";
lines
.Where(r => r.Length > 3 && r.Substring(0, 3) == fixno)
.ToList().ForEach(r =>
{
List<string> items = r.TrimEnd('\'').Replace("し", "'").Replace("?:", "△").Split(':').ToList<string>();
for (int i = 0; i < items.Count; i++)
{
items[i] = items[i].Replace("△", ":").TrimEnd();
}
lstList.Add(items);
});
return lstList;
}
private static string GetPosString(List<string> list, int idx)
{
if (list == null)
{
return "";
}
return list.Count > idx ? list[idx] : "";
}
private static int GetPosInt(List<string> list, int idx)
{
if (list == null)
{
return 0;
}
if (list.Count <= idx)
{
return 0;
}
var succ = int.TryParse(list[idx], out int rtn);
if (succ)
{
return rtn;
}
return 0;
}
private static decimal GetPosDecimal(List<string> list, int idx)
{
if (list == null)
{
return 0;
}
if (list.Count <= idx)
{
return 0;
}
var succ = decimal.TryParse(list[idx], out decimal rtn);
if (succ)
{
return rtn;
}
return 0;
}
#endregion
#region xls解析
public static bool AnalyzeXls(string filePath, out List<OpSeaeEdi> ediList, out List<OpSeaeEdiCtn> ctnList, out string msg)
{
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);
HSSFSheet sheet = hssfworkbook.GetSheetAt(0) as HSSFSheet;
var mblno = sheet.GetRow(5).GetCell(0).StringCellValue;
ediList = new List<OpSeaeEdi>();
ctnList = new List<OpSeaeEdiCtn>();
if (mblno.StartsWith("MB/L NO. :"))
{
mblno = mblno.Replace("MB/L NO. :", "").Trim();
EdiDataContext ediData = new EdiDataContext();
var parentEdi = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == mblno && (x.HBLNO == null || x.HBLNO == ""));
if (parentEdi == null)
{
msg = "未找到主单信息";
return false;
}
for (int r = 8; r < sheet.LastRowNum; r++)
{
var firstValue = sheet.GetRow(r).GetCell(0).StringCellValue;
if (firstValue == "TOTAL :")
{
break;
}
OpSeaeEdi edi = new OpSeaeEdi();
edi.MFNO = Guid.NewGuid().ToString();
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.PORTLOAD = "QINGDAO,CHINA";
edi.PORTLOADID = "CNTAO";
edi.PLACEDELIVERY = "QINGDAO,CHINA";
edi.PLACEDELIVERYID = "CNTAO";
edi.MBLNO = mblno;
edi.HBLNO = firstValue;
//部分不能为null的字段
edi.LeiXingFa = string.Empty;
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
//部分信息跟主单一致
edi.BSNO = parentEdi.MFNO;
edi.ETD = parentEdi.ETD;
edi.FORWARDER = parentEdi.FORWARDER;
edi.CARRIER = parentEdi.CARRIER;
edi.CARRIERID = parentEdi.CARRIERID;
edi.KINDPKGS = parentEdi.KINDPKGS;
edi.BLFRT = parentEdi.BLFRT;
edi.SERVICE = parentEdi.SERVICE;
edi.CARGOID = parentEdi.CARGOID;
edi.TEMPID = parentEdi.TEMPID;
edi.TEMPSET = parentEdi.TEMPSET;
edi.DCLASS = parentEdi.DCLASS;
edi.DUNNO = parentEdi.DUNNO;
edi.VESSEL = parentEdi.VESSEL;
edi.VOYNO = parentEdi.VOYNO;
edi.PORTDISCHARGE = parentEdi.PORTDISCHARGE;
edi.PORTDISCHARGEID = parentEdi.PORTDISCHARGEID;
edi.DESTINATION = parentEdi.DESTINATION;
edi.DESTINATIONID = parentEdi.DESTINATIONID;
ediList.Add(edi);
var strPKGS = sheet.GetRow(r).GetCell(5).StringCellValue;
var arrPKGS = strPKGS.Split('\n');
if (arrPKGS.Length == 2)
{
if (int.TryParse(arrPKGS[0], out int pkgs))
{
edi.PKGS = pkgs;
}
else
{
msg = "格式有误";
return false;
}
edi.KINDPKGS = arrPKGS[1];
}
else
{
msg = "格式有误";
return false;
}
//货描
var strDESP = sheet.GetRow(r).GetCell(9).StringCellValue;
edi.DESCRIPTION = strDESP;
//kgs
var numKGS = sheet.GetRow(r).GetCell(12).NumericCellValue;
edi.KGS = Convert.ToDecimal(numKGS);
//cbm
var numCBM = sheet.GetRow(r).GetCell(13).NumericCellValue;
edi.CBM = Convert.ToDecimal(numCBM);
//箱信息
var strCTN = sheet.GetRow(r).GetCell(10).StringCellValue;
var arrCTN = strCTN.Split('/');
if (arrCTN.Length == 3)
{
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = edi.MFNO;
ctn.CNTRNO = arrCTN[0];
ctn.SEALNO = arrCTN[1];
ctn.CTNCODE = "01";
ctn.CTNALL = arrCTN[2];
ctn.KINDPKGS = edi.KINDPKGS;
ctn.ZhongKongBiaoShi = 5;
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctnList.Add(ctn);
//将整票件重尺放到第一个箱子里
ctn.KGS = edi.KGS;
ctn.PKGS = edi.PKGS;
ctn.CBM = edi.CBM;
}
}
msg = "解析成功";
return true;
}
else
{
msg = "格式有误";
return false;
}
}
}
#endregion
#region 荣圣达报文
public static bool AnalyzeZhongYuanXLS(string filePath, out List<OpSeaeEdi> ediList, out List<OpSeaeEdiCtn> ctnList, out string msg)
{
EdiDataContext ediData = new EdiDataContext();
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook hssfworkbook = null;
ISheet sheet = null;
if (Path.GetExtension(filePath).Equals(".xls"))
{
hssfworkbook = new HSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0) as HSSFSheet;
}
else
{
hssfworkbook = new XSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0) as XSSFSheet;
}
ediList = new List<OpSeaeEdi>();
ctnList = new List<OpSeaeEdiCtn>();
CommonDataContext commonData = new CommonDataContext();
var codeCtnList = commonData.Ctns.AsNoTracking().ToList();
List<dynamic> parseList = new List<dynamic>();
var vessel = string.Empty;
var voyno = string.Empty;
var portdischarge = string.Empty;
var portdischargeId = string.Empty;
var destination = string.Empty;
var destinationId = string.Empty;
var forwarder = string.Empty;
var colCount = sheet.GetRow(2).Cells.Count;
if (colCount != 42)
{
msg = "excel文件格式有误";
return false;
}
for (int r = 3; r <= sheet.LastRowNum; r++)
{
var sheetRow = sheet.GetRow(r);
if (sheetRow == null)
{
break;
}
var bookNO = sheetRow.GetCell(0).GetStringValue(string.Empty);
if (string.IsNullOrEmpty(bookNO))
{
break;
}
//船名、航次、卸货港、目的港、船代,只在第一行有
if (r == 3)
{
vessel = sheetRow.GetCell(37).GetStringValue(string.Empty);
var cellVoyno = sheetRow.GetCell(38);
if (cellVoyno.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
voyno = cellVoyno.NumericCellValue.ToString();
}
else
{
voyno = cellVoyno.GetStringValue(string.Empty);
}
portdischarge = sheetRow.GetCell(39).GetStringValue(string.Empty);
destination = sheetRow.GetCell(40).GetStringValue(string.Empty);
forwarder = sheetRow.GetCell(41).GetStringValue(string.Empty);
var dis = commonData.Disports.AsNoTracking().FirstOrDefault(x => x.PORT.Contains(destination));
if (dis != null)
{
portdischarge = dis.PORT;
portdischargeId = dis.EDICODE;
}
dis = commonData.Disports.AsNoTracking().FirstOrDefault(x => x.PORT.Contains(destination));
if (dis != null)
{
destination = dis.PORT;
destinationId = dis.EDICODE;
}
}
var cargoid = sheetRow.GetCell(35).GetStringValue(string.Empty).Trim();
if (cargoid == "GC-General")
{
cargoid = "S";
}
else if (cargoid == "RF-Reefer")
{
cargoid = "R";
}
else if (cargoid == "DG-Dangerous")
{
cargoid = "D";
}
var cellPKGS = sheetRow.GetCell(31);
var cellKGS = sheetRow.GetCell(32);
var cellCBM = sheetRow.GetCell(33);
int pkgs = cellPKGS.GetIntValue();
decimal kgs = cellKGS.GetDecimalValue();
decimal cbm = cellCBM.GetDecimalValue();
//if (cellPKGS.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
//{
// pkgs = Convert.ToInt32(cellPKGS.NumericCellValue);
//}
//else
//{
// var strVal = cellPKGS.GetStringValue(string.Empty);
// int.TryParse(strVal, out pkgs);
//}
//if (cellKGS.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
//{
// kgs = Convert.ToDecimal(cellKGS.NumericCellValue);
//}
//else
//{
// var strVal = cellKGS.GetStringValue(string.Empty);
// decimal.TryParse(strVal, out kgs);
//}
//if (cellCBM.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
//{
// cbm = Convert.ToDecimal(cellCBM.NumericCellValue);
//}
//else
//{
// var strVal = cellCBM.GetStringValue(string.Empty);
// decimal.TryParse(strVal, out cbm);
//}
var cellMBLNO = sheetRow.GetCell(26);
var mblno = cellMBLNO.GetStringValue(string.Empty);
//if (cellMBLNO.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
//{
// mblno = Convert.ToString(cellMBLNO.NumericCellValue);
//}
//else
//{
// mblno = cellMBLNO.GetStringValue(string.Empty)?.Trim();
//}
var cellHBLNO = sheetRow.GetCell(27);
var hblno = cellHBLNO.GetStringValue(string.Empty);
//if (cellHBLNO != null)
//{
// if (cellHBLNO.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
// {
// hblno = Convert.ToString(cellHBLNO.NumericCellValue);
// }
// else
// {
// hblno = cellHBLNO.GetStringValue(string.Empty)?.Trim();
// }
//}
parseList.Add(new
{
SHIPPERNAME = sheetRow.GetCell(1).GetStringValue(string.Empty),
SHIPPERADDR1 = sheetRow.GetCell(2).GetStringValue(string.Empty),
SHIPPERCOUNTRY = sheetRow.GetCell(3).GetStringValue(string.Empty),
SHIPPERTEL = sheetRow.GetCell(7).GetStringValue(string.Empty),
CONSIGNEENAME = sheetRow.GetCell(10).GetStringValue(string.Empty),
CONSIGNEEADDR1 = sheetRow.GetCell(11).GetStringValue(string.Empty),
CONSIGNEECOUNTRY = sheetRow.GetCell(12).GetStringValue(string.Empty),
CONSIGNEETEL = sheetRow.GetCell(16).GetStringValue(string.Empty),
NOTIFYPARTYNAME = sheetRow.GetCell(18).GetStringValue(string.Empty),
NOTIFYPARTYADDR1 = sheetRow.GetCell(19).GetStringValue(string.Empty),
NOTIFYPARTYCOUNTRY = sheetRow.GetCell(20).GetStringValue(string.Empty),
NOTIFYPARTYTEL = sheetRow.GetCell(24).GetStringValue(string.Empty),
MBLNO = mblno,
HBLNO = hblno,
CNTRNO = sheetRow.GetCell(28).GetStringValue(string.Empty)?.Trim(),
SEALNO = sheetRow.GetCell(29).GetStringValue(string.Empty)?.Trim(),
CTNALL = sheetRow.GetCell(30).GetStringValue(string.Empty),
PKGS = pkgs,
KGS = kgs,
CBM = cbm,
DESCRIPTION = sheetRow.GetCell(34).GetStringValue(string.Empty),
CARGOID = cargoid,
KINDPKGS = sheetRow.GetCell(36).GetStringValue(string.Empty),
});
}
var blList = parseList.Select(x => new { x.MBLNO, x.HBLNO }).Distinct().ToList();
//处理主单
foreach (var bl in blList)
{
var dataList = parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == bl.HBLNO).ToList();
OpSeaeEdi edi = new OpSeaeEdi();
edi.MFNO = Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(bl.HBLNO))
{
edi.BSNO = string.Empty;
}
else
{
var zhudan = ediList.FirstOrDefault(x => x.MBLNO == bl.MBLNO && x.HBLNO == "");
if (zhudan == null)
{
string blno = bl.MBLNO;
zhudan = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == blno && x.HBLNO == "");
}
if (zhudan == null)
{
msg = $"找不到主单信息 {bl.MBLNO},分单号:{bl.HBLNO}";
return false;
}
edi.BSNO = zhudan.MFNO;
}
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.PORTLOAD = "QINGDAO,CHINA";
edi.PORTLOADID = "CNTAO";
edi.PLACEDELIVERY = "QINGDAO,CHINA";
edi.PLACEDELIVERYID = "CNTAO";
edi.MBLNO = bl.MBLNO;
edi.HBLNO = bl.HBLNO;
edi.MARKS = "N/M";
//部分不能为null的字段
edi.LeiXingFa = string.Empty;
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
edi.PORTDISCHARGE = portdischarge;
edi.PORTDISCHARGEID = portdischargeId;
edi.DESTINATION = destination;
edi.DESTINATIONID = destinationId;
edi.VESSEL = vessel;
edi.VOYNO = voyno;
edi.FORWARDER = forwarder;
edi.ETD = DateTime.Today.AddDays(5); //ETD默认当前日期加5天
edi.SHIPPER = dataList[0].SHIPPERNAME;
edi.SHIPPERNAME = dataList[0].SHIPPERNAME;
edi.SHIPPERADDR1 = dataList[0].SHIPPERADDR1;
edi.SHIPPERCOUNTRY = dataList[0].SHIPPERCOUNTRY;
edi.SHIPPERTEL = dataList[0].SHIPPERTEL;
edi.CONSIGNEE = dataList[0].CONSIGNEENAME;
edi.CONSIGNEENAME = dataList[0].CONSIGNEENAME;
edi.CONSIGNEEADDR1 = dataList[0].CONSIGNEEADDR1;
edi.CONSIGNEECOUNTRY = dataList[0].CONSIGNEECOUNTRY;
edi.CONSIGNEETEL = dataList[0].CONSIGNEETEL;
edi.NOTIFYPARTY = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYNAME = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYADDR1 = dataList[0].NOTIFYPARTYADDR1;
edi.NOTIFYPARTYCOUNTRY = dataList[0].NOTIFYPARTYCOUNTRY;
edi.NOTIFYPARTYTEL = dataList[0].NOTIFYPARTYTEL;
edi.CARGOID = dataList[0].CARGOID;
edi.DESCRIPTION = string.Join("\r\n", dataList.Select(x => x.DESCRIPTION).Distinct());
edi.SERVICE = "CY-CY";
edi.BLFRT = "FREIGHT PREPAID";
edi.KGS = 0;
edi.PKGS = 0;
edi.CBM = 0;
ediList.Add(edi);
//箱信息
for (int i = 0; i < dataList.Count; i++)
{
var item = dataList[i];
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = edi.MFNO;
ctn.CNTRNO = item.CNTRNO;
ctn.SEALNO = item.SEALNO;
ctn.CTNCODE = i.ToString().PadLeft(2, '0');
ctn.CTNALL = item.CTNALL;
ctn.ZhongKongBiaoShi = 5;
string kindPkgsSrc = item.KINDPKGS;
var codePkg = commonData.Packages.AsNoTracking().FirstOrDefault(p => p.cosco == kindPkgsSrc);
if (codePkg != null)
{
ctn.KINDPKGS = codePkg.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkg.PKGS;
}
}
else
{
msg = $"包装种类未找到:{kindPkgsSrc}";
return false;
}
var codeCtn = codeCtnList.FirstOrDefault(cc => cc.EDICODE == item.CTNALL);
if (codeCtn == null)
{
ctn.CTN = string.Empty;
ctn.SIZE = string.Empty;
}
else
{
ctn.CTN = codeCtn.CTN;
ctn.SIZE = codeCtn.CTNSIZE;
}
if (ctn.CTNALL == "45G0")
{
ctn.CTNALL = "40HC";
ctn.CTN = "HC";
ctn.SIZE = "40";
}
else if (ctn.CTNALL == "22G0")
{
ctn.CTNALL = "20GP";
ctn.CTN = "GP";
ctn.SIZE = "20";
}
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctn.KGS = item.KGS;
ctn.PKGS = item.PKGS;
ctn.CBM = item.CBM;
//合计主单件重尺
edi.KGS += ctn.KGS;
edi.PKGS += ctn.PKGS;
edi.CBM += ctn.CBM;
ctnList.Add(ctn);
}
}
msg = "解析成功";
return true;
}
}
/// <summary>
/// OLEDB方式读取Excel
/// </summary>
/// <param name="pathName">Excel路径</param>
/// <returns></returns>
public static bool AnalyzeZhongYuanXlsOledb(string pathName, out List<OpSeaeEdi> ediList, out List<OpSeaeEdiCtn> ctnList, out string msg)
{
EdiDataContext ediData = new EdiDataContext();
System.Data.DataTable dt = new System.Data.DataTable();
string ConnectionString = string.Empty;
FileInfo file = new FileInfo(pathName);
if (!file.Exists)
{
msg = "文件不存在";
ediList = null;
ctnList = null;
return false;
}
ediList = new List<OpSeaeEdi>();
ctnList = new List<OpSeaeEdiCtn>();
string extension = file.Extension;
switch (extension) // 连接字符串
{
case ".xls":
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=no;IMEX=1;'";
break;
case ".xlsx":
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=no;IMEX=1;'";
break;
default:
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=no;IMEX=1;'";
break;
}
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(ConnectionString);
try
{
con.Open();
{
//默认读取第一个有数据的工作表
var tables = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { });
if (tables.Rows.Count == 0)
{
msg = "没有sheet页";
return false;
}
string strSheetTableName = tables.Rows[0]["TABLE_NAME"].ToString();
//过滤无效SheetName
if (strSheetTableName.Contains("$") && strSheetTableName.Replace("'", "").EndsWith("$"))
{
System.Data.DataTable tableColumns = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns, new object[] { null, null, strSheetTableName, null });
if (tableColumns.Rows.Count < 42) //工作表列数
{
msg = "格式有误";
return false;
}
System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand("select * from [" + strSheetTableName + "]", con);
System.Data.OleDb.OleDbDataAdapter apt = new System.Data.OleDb.OleDbDataAdapter(cmd);
apt.Fill(dt);
dt.TableName = strSheetTableName.Replace("$", "").Replace("'", "");
}
}
if (dt.Rows.Count <= 3 || dt.Columns.Count < 42)
{
msg = "格式有误";
return false;
}
else
{
CommonDataContext commonData = new CommonDataContext();
List<dynamic> parseList = new List<dynamic>();
var vessel = string.Empty;
var voyno = string.Empty;
var portdischarge = string.Empty;
var portdischargeId = string.Empty;
var destination = string.Empty;
var destinationId = string.Empty;
var forwarder = string.Empty;
for (int r = 3; r < dt.Rows.Count; r++)
{
var sheetRow = dt.Rows[r];
var bookNO = sheetRow[0].ToString();
if (string.IsNullOrEmpty(bookNO))
{
break;
}
//船名、航次、卸货港、目的港、船代,只在第一行有
if (r == 3)
{
vessel = sheetRow[37].ToString();
voyno = sheetRow[38].ToString();
portdischarge = sheetRow[39].ToString();
destination = sheetRow[40].ToString();
forwarder = sheetRow[41].ToString();
var dis = commonData.Disports.AsNoTracking().FirstOrDefault(x => x.PORT.Contains(destination));
if (dis != null)
{
portdischarge = dis.PORT;
portdischargeId = dis.EDICODE;
}
dis = commonData.Disports.AsNoTracking().FirstOrDefault(x => x.PORT.Contains(destination));
if (dis != null)
{
destination = dis.PORT;
destinationId = dis.EDICODE;
}
}
var cargoid = sheetRow[35].ToString().Trim();
if (cargoid == "GC-General")
{
cargoid = "S";
}
else if (cargoid == "RF-Reefer")
{
cargoid = "R";
}
else if (cargoid == "DG-Dangerous")
{
cargoid = "D";
}
var cellPKGS = sheetRow[31].ToString();
var cellKGS = sheetRow[32].ToString();
var cellCBM = sheetRow[33].ToString();
int pkgs = 0;
decimal kgs = 0;
decimal cbm = 0;
int.TryParse(cellPKGS, out pkgs);
decimal.TryParse(cellKGS, out kgs);
decimal.TryParse(cellCBM, out cbm);
parseList.Add(new
{
SHIPPERNAME = sheetRow[1].ToString(),
SHIPPERADDR1 = sheetRow[2].ToString(),
SHIPPERCOUNTRY = sheetRow[3].ToString(),
SHIPPERTEL = sheetRow[7].ToString(),
CONSIGNEENAME = sheetRow[10].ToString(),
CONSIGNEEADDR1 = sheetRow[11].ToString(),
CONSIGNEECOUNTRY = sheetRow[12].ToString(),
CONSIGNEETEL = sheetRow[16].ToString(),
NOTIFYPARTYNAME = sheetRow[18].ToString(),
NOTIFYPARTYADDR1 = sheetRow[19].ToString(),
NOTIFYPARTYCOUNTRY = sheetRow[20].ToString(),
NOTIFYPARTYTEL = sheetRow[24].ToString(),
MBLNO = sheetRow[26].ToString(),
HBLNO = sheetRow[27].ToString(),
CNTRNO = sheetRow[28].ToString(),
SEALNO = sheetRow[29].ToString(),
CTNALL = sheetRow[30].ToString(),
PKGS = pkgs,
KGS = kgs,
CBM = cbm,
DESCRIPTION = sheetRow[34].ToString(),
CARGOID = cargoid,
KINDPKGS = sheetRow[36].ToString(),
});
}
var blList = parseList.Select(x => new { x.MBLNO, x.HBLNO }).Distinct().ToList();
//处理主单
foreach (var bl in blList)
{
var dataList = parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == bl.HBLNO).ToList();
OpSeaeEdi edi = new OpSeaeEdi();
edi.MFNO = Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(bl.HBLNO))
{
edi.BSNO = string.Empty;
}
else
{
//edi.BSNO = ediList.First(x => x.MBLNO == bl.MBLNO && x.HBLNO == "").MFNO;
//2022-8-1excel里找不到主单从数据库中找
var zhudan = ediList.FirstOrDefault(x => x.MBLNO == bl.MBLNO && x.HBLNO == "");
if (zhudan == null)
{
string blno = bl.MBLNO;
zhudan = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == blno && x.HBLNO == "");
}
if (zhudan == null)
{
msg = $"找不到主单信息 {bl.MBLNO},分单号:{bl.HBLNO}";
return false;
}
edi.BSNO = zhudan.MFNO;
}
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.PORTLOAD = "QINGDAO,CHINA";
edi.PORTLOADID = "CNTAO";
edi.PLACEDELIVERY = "QINGDAO,CHINA";
edi.PLACEDELIVERYID = "CNTAO";
edi.MBLNO = bl.MBLNO;
edi.HBLNO = bl.HBLNO;
edi.MARKS = "N/M";
//部分不能为null的字段
edi.LeiXingFa = string.Empty;
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
edi.PORTDISCHARGE = portdischarge;
edi.PORTDISCHARGEID = portdischargeId;
edi.DESTINATION = destination;
edi.DESTINATIONID = destinationId;
edi.VESSEL = vessel;
edi.VOYNO = voyno;
edi.FORWARDER = forwarder;
edi.ETD = DateTime.Today.AddDays(5); //ETD默认当前日期加5天
edi.SHIPPER = dataList[0].SHIPPERNAME;
edi.SHIPPERNAME = dataList[0].SHIPPERNAME;
edi.SHIPPERADDR1 = dataList[0].SHIPPERADDR1;
edi.SHIPPERCOUNTRY = dataList[0].SHIPPERCOUNTRY;
edi.SHIPPERTEL = dataList[0].SHIPPERTEL;
edi.CONSIGNEE = dataList[0].CONSIGNEENAME;
edi.CONSIGNEENAME = dataList[0].CONSIGNEENAME;
edi.CONSIGNEEADDR1 = dataList[0].CONSIGNEEADDR1;
edi.CONSIGNEECOUNTRY = dataList[0].CONSIGNEECOUNTRY;
edi.CONSIGNEETEL = dataList[0].CONSIGNEETEL;
edi.NOTIFYPARTY = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYNAME = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYADDR1 = dataList[0].NOTIFYPARTYADDR1;
edi.NOTIFYPARTYCOUNTRY = dataList[0].NOTIFYPARTYCOUNTRY;
edi.NOTIFYPARTYTEL = dataList[0].NOTIFYPARTYTEL;
edi.CARGOID = dataList[0].CARGOID;
edi.DESCRIPTION = string.Join("\r\n", dataList.Select(x => x.DESCRIPTION).Distinct());
edi.SERVICE = "CY-CY";
edi.BLFRT = "FREIGHT PREPAID";
edi.KGS = 0;
edi.PKGS = 0;
edi.CBM = 0;
ediList.Add(edi);
//箱信息
for (int i = 0; i < dataList.Count; i++)
{
var item = dataList[i];
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = edi.MFNO;
ctn.CNTRNO = item.CNTRNO;
ctn.SEALNO = item.SEALNO;
ctn.CTNCODE = i.ToString().PadLeft(2, '0');
ctn.CTNALL = item.CTNALL;
ctn.ZhongKongBiaoShi = 5;
string kindPkgsSrc = item.KINDPKGS;
var codePkg = commonData.Packages.AsNoTracking().FirstOrDefault(p => p.cosco == kindPkgsSrc);
if (codePkg != null)
{
ctn.KINDPKGS = codePkg.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkg.PKGS;
}
}
else
{
msg = $"包装种类未找到:{kindPkgsSrc}";
return false;
}
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctn.KGS = item.KGS;
ctn.PKGS = item.PKGS;
ctn.CBM = item.CBM;
//合计主单件重尺
edi.KGS += ctn.KGS;
edi.PKGS += ctn.PKGS;
edi.CBM += ctn.CBM;
ctnList.Add(ctn);
}
}
}
msg = "";
return true;
}
catch (Exception ee)
{
msg = ee.Message;
ediList = null;
ctnList = null;
return false;
}
finally
{
con.Close();
}
}
#endregion
#region 导入海关XML
public static bool AnalyzeCustomsXML(string xmlFile, out List<OpSeaeEdi> ediList, out List<OpSeaeEdiCtn> ctnList, out string msg)
{
List<OpSeaeEdi> listEdi = new List<OpSeaeEdi>();
List<OpSeaeEdiCtn> listEdiCtn = new List<OpSeaeEdiCtn>();
CommonDataContext commonData = new CommonDataContext();
EdiDataContext ediData = new EdiDataContext();
var codeCtnList = commonData.Ctns.AsNoTracking().ToList();
var codePkgList = commonData.Packages.AsNoTracking().ToList();
var disPortList = commonData.Disports.AsNoTracking().ToList();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlFile);
var nodeFirst = xmlDoc.GetElementsByTagName("Manifest")[0];
var propXmlns = nodeFirst.Attributes.GetNamedItem("xmlns");
var xmlns = propXmlns == null ? string.Empty : propXmlns.Value;
XmlNamespaceManager xnm = new XmlNamespaceManager(xmlDoc.NameTable);
xnm.AddNamespace("x", xmlns);
var nodeDeclaration = nodeFirst.SelectSingleNode("x:Declaration", xnm);
var nodeCarrierId = nodeDeclaration.SelectSingleNode("x:Carrier/x:ID", xnm); //船公司
var nodeBorderTransportMeansJourneyID = nodeDeclaration.SelectSingleNode("x:BorderTransportMeans/x:JourneyID", xnm);//航次 BorderTransportMeans JourneyID
var nodeBorderTransportMeansName = nodeDeclaration.SelectSingleNode("x:BorderTransportMeans/x:Name", xnm);//船名 BorderTransportMeans Name
var listConsignment = nodeDeclaration.SelectNodes("x:Consignment", xnm);
foreach (XmlNode nd in listConsignment)
{
var nodeMBLNO = nd.SelectSingleNode("x:TransportContractDocument/x:ID", xnm); //主提单号
var nodeHBLNO = nd.SelectSingleNode("x:AssociatedTransportDocument/x:ID", xnm); //分提单号
var nodeLoadingLocation = nd.SelectSingleNode("x:LoadingLocation/x:ID", xnm);//装货地
var nodeUnloadingLocation = nd.SelectSingleNode("x:UnloadingLocation/x:ID", xnm);//卸货地
var nodeGoodsReceiptPlace = nd.SelectSingleNode("x:GoodsReceiptPlace/x:ID", xnm);//收货地
var nodeFreightPayment = nd.SelectSingleNode("x:FreightPayment/x:MethodCode", xnm);//支付方式 FreightPayment MethodCode
var nodeConsignmentPackagingQuantityQuantity = nd.SelectSingleNode("x:ConsignmentPackaging/x:QuantityQuantity", xnm);//总件数 ConsignmentPackaging QuantityQuantity
var nodeConsignmentPackagingTypeCode = nd.SelectSingleNode("x:ConsignmentPackaging/x:TypeCode", xnm);//包装种类 ConsignmentPackaging TypeCode
var nodeTotalGrossMassMeasure = nd.SelectSingleNode("x:TotalGrossMassMeasure", xnm);//总毛重 TotalGrossMassMeasure
var nodeConsignee = nd.SelectSingleNode("x:Consignee", xnm);//收货人 Consignee
var nodeConsigneeName = nodeConsignee.SelectSingleNode("x:Name", xnm);//名称 Name
var nodeConsigneeAddress = nodeConsignee.SelectSingleNode("x:Address/x:Line", xnm);//地址 Address Line
var nodeConsigneeAddressCountryCode = nodeConsignee.SelectSingleNode("x:Address/x:CountryCode", xnm);//国家代码 Address CountryCode
var nodeConsigneeCommunicationID = nodeConsignee.SelectSingleNode("x:Communication/x:ID", xnm);//联系人通讯方式号码 Communication ID
var nodeConsigneeCommunicationTypeID = nodeConsignee.SelectSingleNode("x:Communication/x:TypeID", xnm);//联系人通讯方式类别代码 Communication TypeID
var nodeConsignor = nd.SelectSingleNode("x:Consignor", xnm);//发货人 Consignor
var nodeConsignorName = nodeConsignor.SelectSingleNode("x:Name", xnm);//名称 Name
var nodeConsignorAddress = nodeConsignor.SelectSingleNode("x:Address/x:Line", xnm);//地址 Address Line
var nodeConsignorAddressCountryCode = nodeConsignor.SelectSingleNode("x:Address/x:CountryCode", xnm);//国家代码 Address CountryCode
var nodeConsignorCommunicationID = nodeConsignor.SelectSingleNode("x:Communication/x:ID", xnm);//联系人通讯方式号码 Communication ID
var nodeConsignorCommunicationTypeID = nodeConsignor.SelectSingleNode("x:Communication/x:TypeID", xnm);//联系人通讯方式类别代码 Communication TypeID
var nodeNotifyParty = nd.SelectSingleNode("x:NotifyParty", xnm);//通知人 NotifyParty
var nodeNotifyPartyName = nodeNotifyParty.SelectSingleNode("x:Name", xnm);//名称 Name
var nodeNotifyPartyAddress = nodeNotifyParty.SelectSingleNode("x:Address/x:Line", xnm);//地址 Address Line
var nodeNotifyPartyAddressCountryCode = nodeNotifyParty.SelectSingleNode("x:Address/x:CountryCode", xnm);//国家代码 Address CountryCode
var nodeNotifyPartyCommunicationID = nodeNotifyParty.SelectSingleNode("x:Communication/x:ID", xnm);//联系人通讯方式号码 Communication ID
var nodeNotifyPartyCommunicationTypeID = nodeNotifyParty.SelectSingleNode("x:Communication/x:TypeID", xnm);//联系人通讯方式类别代码 Communication TypeID
var nodeUNDGContact = nd.SelectSingleNode("x:UNDGContact", xnm);//危险品联系人信息 UNDGContact
var nodeUNDGContactName = nodeUNDGContact?.SelectSingleNode("x:Name", xnm);//危险品联系人姓名 Name
var nodeUNDGContactCommunicationID = nodeUNDGContact?.SelectSingleNode("x:Communication/x:ID", xnm);//危险品联系人通讯方式号码 Communication ID
var nodeUNDGContactCommunicationTypeID = nodeUNDGContact?.SelectSingleNode("x:Communication/x:TypeID", xnm);//危险品联系人通讯方式类别代码 Communication TypeID
#region 数据对象构建
OpSeaeEdi edi = new OpSeaeEdi();
edi.MFNO = Guid.NewGuid().ToString();
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.MBLNO = nodeMBLNO.InnerText;
edi.HBLNO = nodeHBLNO.InnerText;
edi.MARKS = "N/M";
//查找主单
var zhudan = ediData.Edis.AsNoTracking().FirstOrDefault(z => z.MBLNO == nodeMBLNO.InnerText && (z.HBLNO == null || z.HBLNO == ""));
if (zhudan == null)
{
msg = $"未找到主单信息({nodeMBLNO.InnerText}):分单号{nodeHBLNO.InnerText}";
ediList = null;
ctnList = null;
return false;
}
edi.BSNO = zhudan.MFNO;
//部分不能为null的字段
edi.LeiXingFa = string.Empty;
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
//var codeDisport = disPortList.FirstOrDefault(x => x.EDICODE == nodeUnloadingLocation.InnerText);
//if (codeDisport == null)
//{
// msg = $"卸货港未找到:{nodeUnloadingLocation.InnerText}";
// ediList = null;
// ctnList = null;
// return false;
//}
// 导入后,船代,船公司,装货港,装货港代码,卸货港,卸货港代码,收货地,收货地代码,目的地,目的地代码,默认取主单的信息。
edi.CARRIER = zhudan.CARRIER;
edi.CARRIERID = zhudan.CARRIERID;
edi.FORWARDER = zhudan.FORWARDER;
edi.PORTLOAD = zhudan.PORTLOAD;
edi.PORTLOADID = zhudan.PORTLOADID;
edi.PLACEDELIVERY = zhudan.PLACEDELIVERY;
edi.PLACEDELIVERYID = zhudan.PLACEDELIVERYID;
edi.PORTDISCHARGE = zhudan.PORTDISCHARGE;
edi.PORTDISCHARGEID = zhudan.PORTDISCHARGEID;
edi.DESTINATION = zhudan.DESTINATION;
edi.DESTINATIONID = zhudan.DESTINATIONID;
edi.VESSEL = nodeBorderTransportMeansName == null || string.IsNullOrEmpty(nodeBorderTransportMeansName.InnerText) ? zhudan.VESSEL : nodeBorderTransportMeansName.InnerText;
edi.VOYNO = nodeBorderTransportMeansJourneyID == null || string.IsNullOrEmpty(nodeBorderTransportMeansJourneyID.InnerText) ? zhudan.VOYNO : nodeBorderTransportMeansJourneyID.InnerText;
edi.ETD = DateTime.Today.AddDays(5); //ETD默认当前日期加5天
edi.SHIPPER = nodeConsignorName.InnerText;
edi.SHIPPERNAME = nodeConsignorName.InnerText;
edi.SHIPPERADDR1 = nodeConsignorAddress.InnerText;
edi.SHIPPERCOUNTRY = nodeConsignorAddressCountryCode==null? zhudan.SHIPPERCOUNTRY : nodeConsignorAddressCountryCode.InnerText;
edi.SHIPPERTEL = nodeConsignorCommunicationID==null ? zhudan.SHIPPERTEL : nodeConsignorCommunicationID?.InnerText;
edi.CONSIGNEE = nodeConsigneeName.InnerText;
edi.CONSIGNEENAME = nodeConsigneeName.InnerText;
edi.CONSIGNEEADDR1 = nodeConsigneeAddress.InnerText;
edi.CONSIGNEECOUNTRY = nodeConsigneeAddressCountryCode==null? zhudan.CONSIGNEECOUNTRY : nodeConsigneeAddressCountryCode.InnerText;
edi.CONSIGNEETEL = nodeConsigneeCommunicationID==null? zhudan.CONSIGNEETEL : nodeConsigneeCommunicationID?.InnerText;
edi.NOTIFYPARTY = nodeNotifyPartyName.InnerText;
edi.NOTIFYPARTYNAME = nodeNotifyPartyName.InnerText;
edi.NOTIFYPARTYADDR1 = nodeNotifyPartyAddress.InnerText;
edi.NOTIFYPARTYCOUNTRY = nodeNotifyPartyAddressCountryCode==null? zhudan.NOTIFYPARTYCOUNTRY : nodeNotifyPartyAddressCountryCode.InnerText;
edi.NOTIFYPARTYTEL = nodeNotifyPartyCommunicationID==null ? zhudan.NOTIFYPARTYTEL: nodeNotifyPartyCommunicationID?.InnerText;
if (nodeUNDGContactName == null || string.IsNullOrEmpty(nodeUNDGContactName.InnerText))
{
edi.CARGOID = "S";
}
else
{
edi.CARGOID = "D";
edi.LINKMAN = nodeUNDGContactName.InnerText;
edi.DTEL = nodeUNDGContactCommunicationID?.InnerText;
}
//edi.DESCRIPTION = string.Join("\r\n", dataList.Select(x => x.DESCRIPTION).Distinct());
edi.SERVICE = "CY-CY";
edi.BLFRT = "FREIGHT PREPAID";
edi.KGS = 0;
edi.PKGS = 0;
edi.CBM = 0;
listEdi.Add(edi);
#endregion
var listTransportEquipment = nd.SelectNodes("x:TransportEquipment", xnm);//集装箱(器)信息 TransportEquipment
var i = 1;
foreach (XmlNode item in listTransportEquipment)
{
var nodeEquipmentIdentificationID = item.SelectSingleNode("x:EquipmentIdentification/x:ID", xnm);//集装箱(器)编 EquipmentIdentification ID
var nodeEquipmentCharacteristicCode = item.SelectSingleNode("x:CharacteristicCode", xnm);//集装箱(器)箱型 CharacteristicCode
var nodeEquipmentSealID = item.SelectSingleNode("x:SealID", xnm);//封号 SealID
var nodeEquipmentFullnessCode = item.SelectSingleNode("x:FullnessCode", xnm);//重箱或者空箱标识代码
var CNTRNO = nodeEquipmentIdentificationID.InnerText;
#region 构建数据对象 箱信息
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = edi.MFNO;
ctn.CNTRNO = nodeEquipmentIdentificationID.InnerText;
ctn.SEALNO = nodeEquipmentSealID.InnerText.StartsWith("M/") ? nodeEquipmentSealID.InnerText.Substring(2) : nodeEquipmentSealID.InnerText;
ctn.CTNCODE = i++.ToString().PadLeft(2, '0');
//EDICODE找不到就用原始报文里的code
var codeCtn = codeCtnList.FirstOrDefault(cc => cc.EDICODE == nodeEquipmentCharacteristicCode.InnerText);
if (codeCtn == null)
{
ctn.CTNALL = nodeEquipmentCharacteristicCode.InnerText;
ctn.CTN = string.Empty;
ctn.SIZE = string.Empty;
}
else
{
ctn.CTNALL = codeCtn.CTN;
//ctn.CTN = codeCtn.CTN;
ctn.SIZE = codeCtn.CTNSIZE;
}
//45G0转40HC22G0转20GP
if (ctn.CTNALL == "45G0")
{
ctn.CTNALL = "40HC";
ctn.CTN = "HC";
ctn.SIZE = "40";
}
else if (ctn.CTNALL == "22G0")
{
ctn.CTNALL = "20GP";
ctn.CTN = "GP";
ctn.SIZE = "20";
}
if (string.IsNullOrEmpty(nodeEquipmentFullnessCode.InnerText))
{
ctn.ZhongKongBiaoShi = 5; //默认重箱
}
else
{
ctn.ZhongKongBiaoShi = Convert.ToInt32(nodeEquipmentFullnessCode.InnerText);
}
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctn.ChengZhongFangShi = "累加";
ctn.ChengZhongShiJian = DateTime.Today.AddDays(5).ToString("yyyy-MM-dd");
listEdiCtn.Add(ctn);
#endregion
}
i = 0;
var listConsignmentItem = nd.SelectNodes("x:ConsignmentItem", xnm);//商品项信息 ConsignmentItem
foreach (XmlNode item in listConsignmentItem)
{
var nodeSequenceNumeric = item.SelectSingleNode("x:SequenceNumeric", xnm);//商品项序号 SequenceNumeric
var nodeConsignmentItemPackaging = item.SelectSingleNode("x:ConsignmentItemPackaging", xnm);//商品项包装信息 ConsignmentItemPackaging
var nodeConsignmentItemPackagingQuantityQuantity = nodeConsignmentItemPackaging.SelectSingleNode("x:QuantityQuantity", xnm);//商品项货物件数 QuantityQuantity
var nodeConsignmentItemPackagingQuantityTypeCode = nodeConsignmentItemPackaging.SelectSingleNode("x:TypeCode", xnm);//包装种类代码 TypeCode
var nodeConsignmentItemPackagingQuantityMarksNumbers = nodeConsignmentItemPackaging.SelectSingleNode("x:MarksNumbers", xnm);//唛头 MarksNumbers
var nodeConsignmentItemCommodity = item.SelectSingleNode("x:Commodity", xnm);//商品项简要描述 Commodity
var nodeConsignmentItemCommodityCargoDescription = nodeConsignmentItemCommodity.SelectSingleNode("x:CargoDescription", xnm);//商品项简要描述 CargoDescription
var nodeConsignmentItemCommodityUNDGCode = nodeConsignmentItemCommodity.SelectSingleNode("x:UNDGCode", xnm);//危险品编号 UNDGCode
var nodeConsignmentItemAdditionalInformationContent = item.SelectSingleNode("x:AdditionalInformation/x:Content", xnm);//商品项补充描述 备注 AdditionalInformation Content
var nodeConsignmentItemGoodsMeasureGrossMassMeasure = item.SelectSingleNode("x:GoodsMeasure/x:GrossMassMeasure", xnm);//商品项货物毛重 GoodsMeasure GrossMassMeasure
var nodeConsignmentItemEquipmentIdentificationID = item.SelectSingleNode("x:EquipmentIdentification/x:ID", xnm);//集装箱(器)编号信息 集装箱(器)编号 EquipmentIdentification ID
edi.DESCRIPTION += nodeConsignmentItemCommodity.InnerText;
#region 构建数据对象 箱信息
if (nodeConsignmentItemEquipmentIdentificationID != null && !string.IsNullOrEmpty(nodeConsignmentItemEquipmentIdentificationID.InnerText))
{
var ctn = listEdiCtn.FirstOrDefault(c => c.CNTRNO == nodeConsignmentItemEquipmentIdentificationID.InnerText && c.MFNO == edi.MFNO);
if (ctn != null)
{
string kindPkgsSrc = nodeConsignmentItemPackagingQuantityTypeCode.InnerText;
var codePkgBG = codePkgList.First(p => p.EDICODE == "BG");
if (!string.IsNullOrEmpty(kindPkgsSrc))
{
var codePkg = codePkgList.FirstOrDefault(p => p.EDICODE == kindPkgsSrc);
if (codePkg != null)
{
ctn.KINDPKGS = codePkg.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkg.PKGS;
}
}
else
{
//2022-7-25衣国豪找不到包装的默认写BAGSBG
ctn.KINDPKGS = codePkgBG.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkgBG.PKGS;
}
}
}
else
{
//2022-7-25衣国豪找不到包装的默认写BAGSBG
ctn.KINDPKGS = codePkgBG.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkgBG.PKGS;
}
}
ctn.ShiFengRen = "SH";
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctn.KGS = Convert.ToDecimal(nodeConsignmentItemGoodsMeasureGrossMassMeasure.InnerText);
ctn.PKGS = Convert.ToInt32(nodeConsignmentItemPackagingQuantityQuantity.InnerText);
ctn.ChengZhongZhongLiang = ctn.KGS + ctn.PIZHONG;
ctn.CBM = 0;
ctn.GOODVALUE = 0;
//合计主单件重尺
edi.KGS += ctn.KGS;
edi.PKGS += ctn.PKGS;
//edi.CBM += ctn.CBM;
}
}
#endregion
i++;
}
if (!CheckEdiDataLength(edi, out string mm))
{
msg = mm;
ediList = null;
ctnList = null;
return false;
}
}
////处理主分单关系
//var fendanList = listEdi.Where(x => !string.IsNullOrEmpty(x.HBLNO)).ToList();
//foreach (var fendan in fendanList)
//{
// var zhudan = listEdi.FirstOrDefault(y => y.MBLNO == fendan.MBLNO && string.IsNullOrEmpty(y.HBLNO));
// if (zhudan == null)
// {
// zhudan = ediData.Edis.AsNoTracking().FirstOrDefault(z => z.MBLNO == fendan.MBLNO && (z.HBLNO == null || z.HBLNO == ""));
// if (zhudan == null)
// {
// msg = $"未找到主单信息:{fendan.MBLNO}";
// ediList = null;
// ctnList = null;
// return false;
// }
// }
// fendan.BSNO = zhudan.MFNO;
//}
ediList = listEdi;
ctnList = listEdiCtn;
msg = "处理完成";
return true;
}
#endregion
#region 导入大简云excel
public static bool AnalyzeDJYXLS(string filePath, out List<OpSeaeEdi> ediList, out List<OpSeaeEdiCtn> ctnList, out string msg, out bool flag , bool merge)
{
EdiDataContext ediData = new EdiDataContext();
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook hssfworkbook = null;
ISheet sheet = null;
if (Path.GetExtension(filePath).Equals(".xls"))
{
hssfworkbook = new HSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0) as HSSFSheet;
}
else
{
hssfworkbook = new XSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0) as XSSFSheet;
}
ediList = new List<OpSeaeEdi>();
ctnList = new List<OpSeaeEdiCtn>();
CommonDataContext commonData = new CommonDataContext();
var codeCtnList = commonData.Ctns.AsNoTracking().ToList();
List<dynamic> parseList = new List<dynamic>();
var vessel = string.Empty;//船名
var voyno = string.Empty;//航次
var portdischarge = string.Empty;////卸货港
var portdischargeId = string.Empty;////卸货港
var destination = string.Empty;//目的地
var destinationId = string.Empty;//目的地
var forwarder = string.Empty;//船代
var carrier = string.Empty;//船公司
var colCount = sheet.GetRow(0).Cells.Count;
if (colCount != 35)
{
msg = "excel文件格式有误";
flag = false;
return false;
}
for (int r = 1; r <= sheet.LastRowNum; r++)
{
var sheetRow = sheet.GetRow(r);
if (sheetRow == null)
{
break;
}
if (string.IsNullOrWhiteSpace(sheetRow.GetCell(24).GetStringValue(string.Empty)))
{
break;
}
vessel = sheetRow.GetCell(24).GetStringValue(string.Empty);
var cellVoyno = sheetRow.GetCell(25);
if (cellVoyno.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
voyno = cellVoyno.NumericCellValue.ToString();
}
else
{
voyno = cellVoyno.GetStringValue(string.Empty);
}
portdischarge = sheetRow.GetCell(26).GetStringValue(string.Empty);
destination = sheetRow.GetCell(27).GetStringValue(string.Empty);
forwarder = sheetRow.GetCell(28).GetStringValue(string.Empty);
var dis = commonData.Disports.AsNoTracking().FirstOrDefault(x => x.PORT.Contains(destination));
if (dis != null)
{
portdischarge = dis.PORT;
portdischargeId = dis.EDICODE;
}
dis = commonData.Disports.AsNoTracking().FirstOrDefault(x => x.PORT.Contains(destination));
if (dis != null)
{
destination = dis.PORT;
destinationId = dis.EDICODE;
}
var cargoid = sheetRow.GetCell(22).GetStringValue(string.Empty).Trim();
if (cargoid == "GC-General" || cargoid == "普通货")
{
cargoid = "S";
}
else if (cargoid == "RF-Reefer" || cargoid == "冻柜")
{
cargoid = "R";
}
else if (cargoid == "DG-Dangerous" || cargoid == "危险品")
{
cargoid = "D";
}
else if (cargoid == "超限箱")
{
cargoid = "O";
}
var cellPKGS = sheetRow.GetCell(18);
var cellKGS = sheetRow.GetCell(19);
var cellCBM = sheetRow.GetCell(20);
int pkgs = 0;
if (cellPKGS.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
pkgs = cellPKGS.GetIntValue();
}
else if (cellPKGS.CellType == NPOI.SS.UserModel.CellType.STRING)
{
var p = cellPKGS.GetStringValue(string.Empty);
pkgs = Convert.ToInt16(p.Trim());
}
else {
pkgs = 0;
}
decimal kgs = 0;
if (cellKGS.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
kgs = cellKGS.GetDecimalValue();
}
else if (cellKGS.CellType == NPOI.SS.UserModel.CellType.STRING)
{
kgs = Convert.ToDecimal(cellKGS.GetStringValue(string.Empty).Trim());
}
else {
kgs = 0;
}
decimal cbm = 0;
if (cellCBM.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
cbm = cellCBM.GetDecimalValue();
}
else if (cellCBM.CellType == NPOI.SS.UserModel.CellType.STRING)
{
cbm = Convert.ToDecimal(cellCBM.GetStringValue(string.Empty).Trim());
}
else {
cbm = 0;
}
var cellMBLNO = sheetRow.GetCell(12);
var mblno = cellMBLNO.GetStringValue(string.Empty);
var cellHBLNO = sheetRow.GetCell(13);
var hblno = "";
if (cellHBLNO != null)
{
if (cellHBLNO.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
hblno = Convert.ToString(cellHBLNO.NumericCellValue);
}
else
{
hblno = cellHBLNO.GetStringValue(string.Empty)?.Trim();
}
}
parseList.Add(new
{
MFNO = Guid.NewGuid().ToString(),
SHIPPERNAME = sheetRow.GetCell(0).GetStringValue(string.Empty),
SHIPPERADDR1 = sheetRow.GetCell(1).GetStringValue(string.Empty),
SHIPPERCOUNTRY = sheetRow.GetCell(2).GetStringValue(string.Empty),
SHIPPERTEL = sheetRow.GetCell(3).GetStringValue(string.Empty),
CONSIGNEENAME = sheetRow.GetCell(4).GetStringValue(string.Empty),
CONSIGNEEADDR1 = sheetRow.GetCell(5).GetStringValue(string.Empty),
CONSIGNEECOUNTRY = sheetRow.GetCell(6).GetStringValue(string.Empty),
CONSIGNEETEL = sheetRow.GetCell(7).GetStringValue(string.Empty),
NOTIFYPARTYNAME = sheetRow.GetCell(8).GetStringValue(string.Empty),
NOTIFYPARTYADDR1 = sheetRow.GetCell(9).GetStringValue(string.Empty),
NOTIFYPARTYCOUNTRY = sheetRow.GetCell(10).GetStringValue(string.Empty),
NOTIFYPARTYTEL = sheetRow.GetCell(11).GetStringValue(string.Empty),
MBLNO = mblno,
HBLNO = hblno,
CARRIER = sheetRow.GetCell(14).GetStringValue(string.Empty)?.Trim(),
CNTRNO = sheetRow.GetCell(15).GetStringValue(string.Empty)?.Trim(),
SEALNO = sheetRow.GetCell(16).GetStringValue(string.Empty)?.Trim(),
CTNALL = sheetRow.GetCell(17).GetStringValue(string.Empty),
PKGS = pkgs,
KGS = kgs,
CBM = cbm,
DESCRIPTION = sheetRow.GetCell(21).GetStringValue(string.Empty),
CARGOID = cargoid,
KINDPKGS = sheetRow.GetCell(23).GetStringValue(string.Empty),
DCLASS= sheetRow.GetCell(31).GetStringValue(string.Empty),
DUNNO = sheetRow.GetCell(32).GetStringValue(string.Empty),
DATTN = sheetRow.GetCell(33).GetStringValue(string.Empty),
DTEL = sheetRow.GetCell(34).GetStringValue(string.Empty),
});
}
var blList = parseList.Select(x => new { x.MBLNO, x.HBLNO }).Distinct().ToList();
//处理主单
foreach (var bl in blList)
{
var dataList = parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == bl.HBLNO).ToList();
OpSeaeEdi edi = new OpSeaeEdi();
edi.MFNO = dataList[0].MFNO;
if (string.IsNullOrEmpty(bl.HBLNO))
{
edi.BSNO = string.Empty;
}
else
{
var zhudan = ediList.FirstOrDefault(x => x.MBLNO == bl.MBLNO && x.HBLNO == "");
if (zhudan == null)
{
string blno = bl.MBLNO;
zhudan = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == blno && x.HBLNO == "");
if (zhudan==null) {
if (parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == "").Count()>0) {
zhudan = new OpSeaeEdi();
zhudan.MFNO = parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == "").Select(x=>x.MFNO).FirstOrDefault();
}
}
}
if (zhudan == null)
{
if (!merge)
{
msg = $"找不到主单信息 {bl.MBLNO},分单号:{bl.HBLNO}";
flag = true;
return false;
}
}
if (merge)
{
edi.BSNO = "";
}
else
{
edi.BSNO = zhudan.MFNO;
}
}
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.PORTLOAD = "QINGDAO,CHINA";
edi.PORTLOADID = "CNTAO";
edi.PLACEDELIVERY = "QINGDAO,CHINA";
edi.PLACEDELIVERYID = "CNTAO";
edi.MBLNO = bl.MBLNO;
edi.HBLNO = bl.HBLNO;
edi.MARKS = "N/M";
//部分不能为null的字段
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
edi.PORTDISCHARGE = portdischarge;
edi.PORTDISCHARGEID = portdischargeId;
edi.DESTINATION = destination;
edi.DESTINATIONID = destinationId;
edi.VESSEL = vessel;
edi.VOYNO = voyno;
edi.CARRIER = dataList[0].CARRIER;
edi.FORWARDER = forwarder;
edi.ETD = DateTime.Today.AddDays(5); //ETD默认当前日期加5天
edi.SHIPPER = dataList[0].SHIPPERNAME;
edi.SHIPPERNAME = dataList[0].SHIPPERNAME;
edi.SHIPPERADDR1 = dataList[0].SHIPPERADDR1;
edi.SHIPPERCOUNTRY = dataList[0].SHIPPERCOUNTRY;
edi.SHIPPERTEL = dataList[0].SHIPPERTEL;
edi.CONSIGNEE = dataList[0].CONSIGNEENAME;
edi.CONSIGNEENAME = dataList[0].CONSIGNEENAME;
edi.CONSIGNEEADDR1 = dataList[0].CONSIGNEEADDR1;
edi.CONSIGNEECOUNTRY = dataList[0].CONSIGNEECOUNTRY;
edi.CONSIGNEETEL = dataList[0].CONSIGNEETEL;
edi.NOTIFYPARTY = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYNAME = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYADDR1 = dataList[0].NOTIFYPARTYADDR1;
edi.NOTIFYPARTYCOUNTRY = dataList[0].NOTIFYPARTYCOUNTRY;
edi.NOTIFYPARTYTEL = dataList[0].NOTIFYPARTYTEL;
edi.CARGOID = dataList[0].CARGOID;
edi.DESCRIPTION = string.Join("\r\n", dataList.Select(x => x.DESCRIPTION).Distinct());
edi.SERVICE = "CY-CY";
edi.BLFRT = "FREIGHT PREPAID";
edi.DCLASS = dataList[0].DCLASS;
edi.DUNNO = dataList[0].DUNNO;
edi.DTEL = dataList[0].DTEL;
edi.DATTN = dataList[0].DATTN;
edi.KGS = 0;
edi.PKGS = 0;
edi.CBM = 0;
//edi.SHIPPERADDR2 = "";
//edi.SHIPPERADDR3 = "";
//edi.SHIPPERCITY = "";
//edi.SHIPPERPROVINCE = "";
//edi.SHIPPERPOSTCODE = "";
//edi.SHIPPERATTN = "";
//edi.CONSIGNEEADDR2 = "";
//edi.CONSIGNEEADDR3 = "";
//edi.CONSIGNEECITY = "";
//edi.CONSIGNEEPROVINCE= "";
//edi.CONSIGNEECODE = "";
//edi.CONSIGNEEATTN = "";
//edi.NOTIFYPARTYADDR2 = "";
//edi.NOTIFYPARTYADDR3 = "";
//edi.NOTIFYPARTYCITY = "";
//edi.NOTIFYPARTYPROVINCE = "";
//edi.NOTIFYPARTYCODE = "";
//edi.NOTIFYPARTYATTN = "";
//edi.NOTIFYPARTY2NAME = "";
//edi.NOTIFYPARTY2ADDR1 = "";
//edi.NOTIFYPARTY2ADDR2 = "";
//edi.NOTIFYPARTY2ADDR3 = "";
//edi.NOTIFYPARTY2CITY = "";
//edi.NOTIFYPARTY2POSTCODE = "";
//edi.NOTIFYPARTY2COUNTRY = "";
//edi.NOTIFYPARTY2ATTN = "";
//edi.NOTIFYPARTY2TEL = "";
//edi.REEFERF = "0";
//edi.TEMPID = "C";
//edi.TEMPSET = "0";
//edi.TEMPMAX = "0";
//edi.TEMPMIN = "0";
//edi.FREIGHTAGMNO = "0";
//edi.HUMIDITY = "0";
//edi.SHIPIMO = "";
//edi.CARRIERID = "";
//edi.ORDERNO = "";
//edi.FILEROLE = "";
//edi.PACKINGTYPE = "";
//edi.SHIPSERVICENO = "";
//edi.TRANSTYPE = "";
//edi.FILETYPE = "";
//edi.ISSUEPLACE = "";
//edi.ETDTIME = "";
//edi.AGENTID = "";
//edi.CNTRSEALNO = "";
//edi.YARD = "";
//edi.STATUS = "";
//edi.CHANGERESON = "";
//edi.FORWARD = "";
//edi.REMARKS = "";
//edi.CNTRNO = "";
//edi.DPAGE = "";
//edi.DLABEL = "";
//edi.LINKMAN = "";
ediList.Add(edi);
//箱信息
for (int i = 0; i < dataList.Count; i++)
{
var item = dataList[i];
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = edi.MFNO;
ctn.CNTRNO = item.CNTRNO;
ctn.SEALNO = item.SEALNO;
ctn.CTNCODE = i.ToString().PadLeft(2, '0');
ctn.CTNALL = item.CTNALL;
ctn.ZhongKongBiaoShi = 5;
string kindPkgsSrc = item.KINDPKGS;
var codePkg = commonData.Packages.AsNoTracking().FirstOrDefault(p => p.PKGS == kindPkgsSrc);
if (codePkg != null)
{
ctn.KINDPKGS = codePkg.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkg.PKGS;
}
}
else
{
msg = $"包装种类未找到:{kindPkgsSrc}";
flag = false;
return false;
}
var codeCtn = codeCtnList.FirstOrDefault(cc => cc.EDICODE == item.CTNALL);
if (codeCtn == null)
{
ctn.CTN = string.Empty;
ctn.SIZE = string.Empty;
}
else
{
ctn.CTN = codeCtn.CTN;
ctn.SIZE = codeCtn.CTNSIZE;
}
if (ctn.CTNALL == "45G0")
{
ctn.CTNALL = "40HC";
ctn.CTN = "HC";
ctn.SIZE = "40";
}
else if (ctn.CTNALL == "22G0")
{
ctn.CTNALL = "20GP";
ctn.CTN = "GP";
ctn.SIZE = "20";
}
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctn.KGS = item.KGS;
ctn.PKGS = item.PKGS;
ctn.CBM = item.CBM;
//合计主单件重尺
edi.KGS += ctn.KGS;
edi.PKGS += ctn.PKGS;
edi.CBM += ctn.CBM;
ctnList.Add(ctn);
}
}
msg = "解析成功";
flag = false;
return true;
}
}
#endregion
#region 导入CUSTEXCEL
public static bool AnalyzeCUSTEXCEL(string filePath, out List<OpSeaeEdi> ediList, out List<OpSeaeEdiCtn> ctnList, out string msg, out bool flag, bool merge)
{
EdiDataContext ediData = new EdiDataContext();
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook hssfworkbook = null;
ISheet sheet = null;
if (Path.GetExtension(filePath).Equals(".xls"))
{
hssfworkbook = new HSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0) as HSSFSheet;
}
else
{
hssfworkbook = new XSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0) as XSSFSheet;
}
ediList = new List<OpSeaeEdi>();
ctnList = new List<OpSeaeEdiCtn>();
CommonDataContext commonData = new CommonDataContext();
var codeCtnList = commonData.Ctns.AsNoTracking().ToList();
List<dynamic> parseList = new List<dynamic>();
var vessel = string.Empty;//船名
var voyno = string.Empty;//航次
var portdischarge = string.Empty;////卸货港
var portdischargeId = string.Empty;////卸货港
var destination = string.Empty;//目的地
var destinationId = string.Empty;//目的地
var forwarder = string.Empty;//船代
var carrier = string.Empty;//船公司
var MARKS = string.Empty;//唛头
var COUNTRY = string.Empty;//国家代码
var colCount = sheet.GetRow(0).Cells.Count;
if (colCount < 34)
{
msg = "excel文件格式有误";
flag = false;
return false;
}
for (int r = 1; r <= sheet.LastRowNum; r++)
{
var sheetRow = sheet.GetRow(r);
if (sheetRow == null)
{
break;
}
if (string.IsNullOrWhiteSpace(sheetRow.GetCell(1).GetStringValue(string.Empty)))
{
break;
}
vessel = sheetRow.GetCell(1).GetStringValue(string.Empty);
var cellVoyno = sheetRow.GetCell(2);
if (cellVoyno.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
voyno = cellVoyno.NumericCellValue.ToString();
}
else
{
voyno = cellVoyno.GetStringValue(string.Empty);
}
portdischarge = sheetRow.GetCell(10).GetStringValue(string.Empty);
portdischargeId=sheetRow.GetCell(11).GetStringValue(string.Empty);
destination = sheetRow.GetCell(12).GetStringValue(string.Empty);
destinationId = sheetRow.GetCell(13).GetStringValue(string.Empty);
forwarder = sheetRow.GetCell(0).GetStringValue(string.Empty);
COUNTRY = sheetRow.GetCell(20).GetStringValue(string.Empty);
var cargoid ="S";
var cellPKGS = sheetRow.GetCell(30);
var cellKGS = sheetRow.GetCell(31);
var cellCBM = sheetRow.GetCell(32);
int pkgs = 0;
if (cellPKGS.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
pkgs = cellPKGS.GetIntValue();
}
else if (cellPKGS.CellType == NPOI.SS.UserModel.CellType.STRING)
{
pkgs = Convert.ToInt16(cellPKGS.GetStringValue(string.Empty).Trim());
}
else {
pkgs = 0;
}
decimal kgs = 0;
if (cellKGS.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
kgs = cellKGS.GetDecimalValue();
}
else if (cellKGS.CellType == NPOI.SS.UserModel.CellType.STRING)
{
kgs = Convert.ToDecimal(cellKGS.GetStringValue(string.Empty).Trim());
}
else {
kgs = 0;
}
decimal cbm = 0;
if (cellCBM.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
cbm = cellCBM.GetDecimalValue();
}
else if (cellCBM.CellType == NPOI.SS.UserModel.CellType.STRING)
{
cbm = Convert.ToDecimal(cellCBM.GetStringValue(string.Empty).Trim());
}
else {
cbm = 0;
}
var mblno = sheetRow.GetCell(3).GetStringValue(string.Empty);
var cellHBLNO = sheetRow.GetCell(4);
var hblno = "";
if (cellHBLNO != null)
{
if (cellHBLNO.CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
hblno = Convert.ToString(cellHBLNO.NumericCellValue);
}
else
{
hblno = cellHBLNO.GetStringValue(string.Empty)?.Trim();
}
}
parseList.Add(new
{
MFNO = Guid.NewGuid().ToString(),
SHIPPERNAME = sheetRow.GetCell(14).GetStringValue(string.Empty),
SHIPPERADDR1 = sheetRow.GetCell(15).GetStringValue(string.Empty),
SHIPPERCOUNTRY = "CN",
SHIPPERTEL = sheetRow.GetCell(17).GetStringValue(string.Empty),
CONSIGNEENAME = sheetRow.GetCell(18).GetStringValue(string.Empty),
CONSIGNEEADDR1 = sheetRow.GetCell(19).GetStringValue(string.Empty),
CONSIGNEECOUNTRY = COUNTRY,
CONSIGNEETEL = sheetRow.GetCell(21).GetStringValue(string.Empty),
NOTIFYPARTYNAME = sheetRow.GetCell(22).GetStringValue(string.Empty),
NOTIFYPARTYADDR1 = sheetRow.GetCell(23).GetStringValue(string.Empty),
NOTIFYPARTYCOUNTRY = COUNTRY,
NOTIFYPARTYTEL = sheetRow.GetCell(25).GetStringValue(string.Empty),
MBLNO = mblno,
HBLNO = hblno,
CARRIER = sheetRow.GetCell(5).GetStringValue(string.Empty)?.Trim(),
CNTRNO = sheetRow.GetCell(27).GetStringValue(string.Empty)?.Trim(),
SEALNO = sheetRow.GetCell(28).GetStringValue(string.Empty)?.Trim(),
CTNALL = sheetRow.GetCell(26).GetStringValue(string.Empty),
PKGS = pkgs,
KGS = kgs,
CBM = cbm,
DESCRIPTION = sheetRow.GetCell(33).GetStringValue(string.Empty),
CARGOID = cargoid,
KINDPKGS = sheetRow.GetCell(29).GetStringValue(string.Empty),
MARKS = sheetRow.GetCell(34).GetStringValue(string.Empty),
});
}
var blList = parseList.Select(x => new { x.MBLNO, x.HBLNO }).Distinct().ToList();
//处理主单
foreach (var bl in blList)
{
var dataList = parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == bl.HBLNO).ToList();
OpSeaeEdi edi = new OpSeaeEdi();
edi.MFNO = dataList[0].MFNO;
if (string.IsNullOrEmpty(bl.HBLNO))
{
edi.BSNO = string.Empty;
}
else
{
var zhudan = ediList.FirstOrDefault(x => x.MBLNO == bl.MBLNO && x.HBLNO == "");
if (zhudan == null)
{
string blno = bl.MBLNO;
zhudan = ediData.Edis.AsNoTracking().FirstOrDefault(x => x.MBLNO == blno && x.HBLNO == "");
if (zhudan == null)
{
if (parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == "").Count()>0)
{
zhudan = new OpSeaeEdi();
zhudan.MFNO = parseList.Where(x => x.MBLNO == bl.MBLNO && x.HBLNO == "").Select(x => x.MFNO).FirstOrDefault();
}
}
}
if (zhudan == null)
{
if (!merge)
{
msg = $"找不到主单信息 {bl.MBLNO},分单号:{bl.HBLNO}";
flag = true;
return false;
}
}
if (merge)
{
edi.BSNO = "";
}
else
{
edi.BSNO = zhudan.MFNO;
}
}
edi.MASTERNO = string.Empty;
edi.EDITYPE = string.Empty;
edi.EDISTATUS = "已录入";
edi.INPUTDATE = DateTime.Now;
edi.CUSTNO = string.Empty;
edi.PORTLOAD = "QINGDAO,CHINA";
edi.PORTLOADID = "CNTAO";
edi.PLACEDELIVERY = "QINGDAO,CHINA";
edi.PLACEDELIVERYID = "CNTAO";
edi.MBLNO = bl.MBLNO;
edi.HBLNO = bl.HBLNO;
edi.MARKS = "N/M";
//部分不能为null的字段
edi.LeiXingShou = string.Empty;
edi.LeiXingTong = string.Empty;
edi.DaiMaFa = string.Empty;
edi.DaiMaShou = string.Empty;
edi.DaiMaTong = string.Empty;
edi.CreateUser = string.Empty;
edi.WeiTuoFaSongFang = string.Empty;
edi.ZhiFaText = string.Empty;
edi.comname = string.Empty;
edi.PORTDISCHARGE = portdischarge;
edi.PORTDISCHARGEID = portdischargeId;
edi.DESTINATION = destination;
edi.DESTINATIONID = destinationId;
edi.VESSEL = vessel;
edi.VOYNO = voyno;
edi.CARRIER = dataList[0].CARRIER;
edi.FORWARDER = forwarder;
edi.ETD = DateTime.Today.AddDays(5); //ETD默认当前日期加5天
edi.SHIPPER = dataList[0].SHIPPERNAME;
edi.SHIPPERNAME = dataList[0].SHIPPERNAME;
edi.SHIPPERADDR1 = dataList[0].SHIPPERADDR1;
edi.SHIPPERCOUNTRY = dataList[0].SHIPPERCOUNTRY;
edi.SHIPPERTEL = dataList[0].SHIPPERTEL;
edi.CONSIGNEE = dataList[0].CONSIGNEENAME;
edi.CONSIGNEENAME = dataList[0].CONSIGNEENAME;
edi.CONSIGNEEADDR1 = dataList[0].CONSIGNEEADDR1;
edi.CONSIGNEECOUNTRY = dataList[0].CONSIGNEECOUNTRY;
edi.CONSIGNEETEL = dataList[0].CONSIGNEETEL;
edi.NOTIFYPARTY = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYNAME = dataList[0].NOTIFYPARTYNAME;
edi.NOTIFYPARTYADDR1 = dataList[0].NOTIFYPARTYADDR1;
edi.NOTIFYPARTYCOUNTRY = dataList[0].NOTIFYPARTYCOUNTRY;
edi.NOTIFYPARTYTEL = dataList[0].NOTIFYPARTYTEL;
edi.CARGOID = dataList[0].CARGOID;
edi.DESCRIPTION = string.Join("\r\n", dataList.Select(x => x.DESCRIPTION).Distinct());
edi.SERVICE = "CY-CY";
edi.BLFRT = "FREIGHT PREPAID";
edi.MARKS= dataList[0].MARKS;
edi.KGS = 0;
edi.PKGS = 0;
edi.CBM = 0;
ediList.Add(edi);
//箱信息
for (int i = 0; i < dataList.Count; i++)
{
var item = dataList[i];
var ctn = new OpSeaeEdiCtn();
ctn.ctn_id = Guid.NewGuid().ToString();
ctn.MFNO = edi.MFNO;
ctn.CNTRNO = item.CNTRNO;
ctn.SEALNO = item.SEALNO;
ctn.CTNCODE = i.ToString().PadLeft(2, '0');
ctn.CTNALL = item.CTNALL;
ctn.ZhongKongBiaoShi = 5;
string kindPkgsSrc = item.KINDPKGS;
var codePkg = commonData.Packages.AsNoTracking().FirstOrDefault(p => p.PKGS == kindPkgsSrc);
if (codePkg != null)
{
ctn.KINDPKGS = codePkg.PKGS;
//整票
if (i == 0)
{
edi.KINDPKGS = codePkg.PKGS;
}
}
else
{
msg = $"包装种类未找到:{kindPkgsSrc}";
flag = false;
return false;
}
var codeCtn = codeCtnList.FirstOrDefault(cc => cc.EDICODE == item.CTNALL);
if (codeCtn == null)
{
ctn.CTN = string.Empty;
ctn.SIZE = string.Empty;
}
else
{
ctn.CTN = codeCtn.CTN;
ctn.SIZE = codeCtn.CTNSIZE;
}
if (ctn.CTNALL == "45G0")
{
ctn.CTNALL = "40HC";
ctn.CTN = "HC";
ctn.SIZE = "40";
}
else if (ctn.CTNALL == "22G0")
{
ctn.CTNALL = "20GP";
ctn.CTN = "GP";
ctn.SIZE = "20";
}
ctn.ShiFengRen = string.Empty;
ctn.LeiXingFa = string.Empty;
ctn.LeiXingShou = string.Empty;
ctn.LeiXingTong = string.Empty;
ctn.KGS = item.KGS;
ctn.PKGS = item.PKGS;
ctn.CBM = item.CBM;
//合计主单件重尺
edi.KGS += ctn.KGS;
edi.PKGS += ctn.PKGS;
edi.CBM += ctn.CBM;
ctnList.Add(ctn);
}
}
msg = "解析成功";
flag = false;
return true;
}
}
#endregion
private static bool CheckEdiDataLength(OpSeaeEdi edi, out string msg)
{
var errList = new List<string>();
var props = edi.GetType().GetProperties();
foreach (var key in dicEdiChkLen.Keys)
{
var p = props.FirstOrDefault(pp => pp.Name == key);
if (p != null)
{
var valObj = p.GetValue(edi);
if (valObj != null)
{
var len = valObj.ToString().Length;
if (len > dicEdiChkLen[key].Item1)
{
errList.Add($"{dicEdiChkLen[key].Item2}长度超过限制({dicEdiChkLen[key].Item1}");
}
}
}
}
if (errList.Count > 0)
{
msg = string.Join("<br/>", errList);
return false;
}
else
{
msg = string.Empty;
return true;
}
}
}
public static class ICellExtent
{
public static int? GetIntValueNull(this ICell cell)
{
if (cell == null)
{
return null;
}
if (cell.CellType == CellType.NUMERIC)
{
return Convert.ToInt32(cell.NumericCellValue);
}
if (cell.CellType == CellType.STRING)
{
return Convert.ToInt32(cell.StringCellValue);
}
HSSFFormulaEvaluator evalor = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
if (cell.CellType == CellType.FORMULA)
{
var cellVal = evalor.Evaluate(cell);
if (cellVal.CellType == CellType.NUMERIC)
{
return Convert.ToInt32(cellVal.NumberValue);
}
else if (cellVal.CellType == CellType.STRING)
{
return Convert.ToInt32(cell.StringCellValue);
}
}
return null;
}
public static int GetIntValue(this ICell cell)
{
var val = GetIntValueNull(cell);
return val.HasValue ? val.Value : 0;
}
public static decimal? GetDecimalValueNull(this ICell cell)
{
if (cell == null)
{
return null;
}
if (cell.CellType == CellType.NUMERIC)
{
return Convert.ToDecimal(cell.NumericCellValue);
}
if (cell.CellType == CellType.STRING)
{
return Convert.ToDecimal(cell.StringCellValue);
}
HSSFFormulaEvaluator evalor = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
if (cell.CellType == CellType.FORMULA)
{
var cellVal = evalor.Evaluate(cell);
if (cellVal.CellType == CellType.NUMERIC)
{
return Convert.ToDecimal(cellVal.NumberValue);
}
else if (cellVal.CellType == CellType.STRING)
{
return Convert.ToDecimal(cell.StringCellValue);
}
}
return null;
}
public static decimal GetDecimalValue(this ICell cell)
{
var val = GetDecimalValueNull(cell);
return val.HasValue ? val.Value : 0;
}
public static string GetStringValue(this ICell cell, string defVal = null)
{
if (cell == null)
{
return defVal;
}
if (cell.CellType == CellType.NUMERIC)
{
return cell.NumericCellValue.ToString();
}
if (cell.CellType == CellType.STRING)
{
return cell.StringCellValue;
}
HSSFFormulaEvaluator evalor = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
if (cell.CellType == CellType.FORMULA)
{
var cellVal = evalor.Evaluate(cell);
if (cellVal.CellType == CellType.NUMERIC)
{
return cellVal.NumberValue.ToString();
}
else if (cellVal.CellType == CellType.STRING)
{
return cell.StringCellValue;
}
}
return defVal;
}
}
}