using DS.Module.Core; using DS.Module.Core.Helpers; using DS.WMS.Core.Code.Entity; using DS.WMS.Core.Map.Entity; using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Sys.Entity; using Masuit.Tools.Hardware; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json.Linq; using NPOI.HSSF.UserModel; using NPOI.SS.Formula.Functions; using SqlSugar; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace DS.WMS.Core.Op.EDI { /// /// 下货纸辅助类 /// public static class XiahuozhiHelpler { private static readonly string EdiFilePath = "XHZ"; private static readonly string TEMP_REGEX = "(TEMP\\b\\s?\\:.*?\\n)|(TEMP\\b\\s?\\:.*)|(TEMP\\b\\s?\\;.*?\\n)|(TEMP\\b\\s?\\;.*)|(TEMPERATURE\\b\\s?\\:.*?\\n)|(TEMPERATURE\\b\\s?\\:.*)|(TEMPERATURE\\b\\s?\\;.*?\\n)|(TEMPERATURE\\b\\s?\\;.*)|(TEMP\\b\\sSETTING\\sAT\\:.*)|(TEM\\b\\s?\\:.*)|(TEMPERATURE\\s+OF\\n.*)|(TEMP\\s+.*)"; private static readonly string TEMP_TAKE_REGEX = "((?<=TEMP\\s\\:).*?(?=\\n))|((?<=TEMP\\s\\:).*)|((?<=TEMP\\:).*?(?=\\n))|((?<=TEMP\\:).*)|((?<=TEMP\\s\\;).*?(?=\\n))|((?<=TEMP\\s\\;).*?)|((?<=TEMP\\;).*?(?=\\n))|((?<=TEMP\\;).*)|((?<=TEMPERATURE\\s\\:).*?(?=\\n))|((?<=TEMPERATURE\\s\\:).*?)|((?<=TEMPERATURE\\:).*?(?=\\n))|((?<=TEMPERATURE\\:).*)|((?<=TEMPERATURE\\s\\;).*?(?=\\n))|((?<=TEMPERATURE\\s\\;).*?)|((?<=TEMPERATURE\\;).*?(?=\\n))|((?<=TEMPERATURE\\;).*)|((?<=TEMP\\s+SETTING\\s+AT\\:).*)|((?<=TEM\\:).*)|((?<=TEMPERATURE\\sOF\\n).*(?=DEGREES))|((?<=TEMP\\s\\:).*)|((?<=TEMP\\s+).*)"; private static readonly string VENT_REGEX = "(VENT\\b\\s?\\:.*?\\n)|(VENT\\b\\s?\\:.*)|(VENT\\b\\s?\\;.*?\\n)|(VENT\\b\\s?\\;.*)|(VENTILATION\\s+HOLE\\b\\s?\\:.*)|(VENTILATION\\b\\s?\\:.*)|(VENT\\s+.*)"; private static readonly string VENT_TAKE_REGEX = "((?<=VENT\\s\\:).*?(?=\\n))|((?<=VENT\\s\\:).*?)|((?<=VENT\\:).*?(?=\\n))|((?<=VENT\\:).*)|((?<=VENT\\s\\;).*?(?=\\n))|((?<=VENT\\s\\;).*?)|((?<=VENT\\;).*?(?=\\n))|((?<=VENT\\;).*)|((?<=VENTILATION\\s+HOLE\\:).*)|((?<=VENTILATION\\:).*)|((?<=VENT\\s+).*)"; private static readonly string HUMI_REGEX = "(HUMI\\b\\s?\\:.*?\\n)|(HUMI\\b\\s?\\:.*)|(HUMI\\b\\s?\\;.*?\\n)|(HUMI\\b\\s?\\;.*)|(HDMI\\b\\s?\\:.*?\\n)|(HDMI\\b\\s?\\:.*)|(HDMI\\b\\s?\\;.*?\\n)|(HDMI\\b\\s?\\;.*)|(HDIM\\b\\s?\\:.*?\\n)|(HDIM\\b\\s?\\:.*)|(HDIM\\b\\s?\\;.*?\\n)|(HDIM\\b\\s?\\;.*)|(HUM\\b\\s?\\:.*?\\n)|(HUM\\b\\s?\\:.*)|(HUM\\b\\s?\\;.*?\\n)|(HUM\\b\\s?\\;.*)|(HUMIDITY\\b\\s?\\:.*)|(HUMD\\b\\:.*)"; private static readonly string HUMI_TAKE_REGEX = "((?<=HUMI\\s\\:).*?(?=\\n))|((?<=HUMI\\s\\:).*?)|((?<=HUMI\\:).*?(?=\\n))|((?<=HUMI\\:).*)|((?<=HUMI\\s\\;).*?(?=\\n))|((?<=HUMI\\s\\;).*?)|((?<=HUMI\\;).*?(?=\\n))|((?<=HUMI\\;).*)|((?<=HDMI\\s\\:).*?(?=\\n))|((?<=HDMI\\s\\:).*?)|((?<=HDMI\\:).*?(?=\\n))|((?<=HDMI\\:).*)|((?<=HDMI\\s\\;).*?(?=\\n))|((?<=HDMI\\s\\;).*?)|((?<=HDMI\\;).*?(?=\\n))|((?<=HDMI\\;).*)|((?<=HDIM\\s\\:).*?(?=\\n))|((?<=HDIM\\s\\:).*?)|((?<=HDIM\\:).*?(?=\\n))|((?<=HDIM\\:).*)|((?<=HDIM\\s\\;).*?(?=\\n))|((?<=HDIM\\s\\;).*?)|((?<=HDIM\\;).*?(?=\\n))|((?<=HDIM\\;).*)|((?<=HUM\\s\\:).*?(?=\\n))|((?<=HUM\\s\\:).*?)|((?<=HUM\\:).*?(?=\\n))|((?<=HUM\\:).*)|((?<=HUM\\s\\;).*?(?=\\n))|((?<=HUM\\s\\;).*?)|((?<=HUM\\;).*?(?=\\n))|((?<=HUM\\;).*)|((?<=HUMIDITY\\:).*)|((?<=HUMD\\:).*)"; //转义处理字符串中的特殊字符 public static string ExchangeStr(string str) { if (string.IsNullOrEmpty(str)) { return string.Empty; } return str.Replace("?", "??").Replace("'", "?'").Replace("+", "?+").Replace(":", "?:"); } //获取时间字符串 public static string GetDateStr(DateTime? dt, string dateformat) { var result = ""; if (!dt.HasValue) { result = ""; } else { result = dt.Value.ToString(dateformat); } return result; } ///// ///// 获取箱属船司代码 ///// ///// //public static string GetCtnForCarrier(string carrid, string EDINAME, List dictData) //{ // var xiaHuoZhiCarrierBelongMapping = dictData.Where(x => x.TypeCode == "XiaHuoZhiCarrierBelongMapping").ToList();//港联捷、港联欣下货纸的箱属映射配置 // var map = xiaHuoZhiCarrierBelongMapping.FirstOrDefault(x => x.Code == carrid); // if (map != null) // { // return map.Value; // } // else // { // return GetCarrierEDICode(carrid, EDINAME); // } //} #region 辅助类 //获取edi代码(根据东胜7同功能模块移植) 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 ""; } /// /// 各种文本转义字符(东胜7移植) /// /// 文件类型(例如:txt、xml) /// 文本字符串 /// public static string formatEdiStr(string fileType, string str) { if (str == null) str = string.Empty; if (str == null) { return string.Empty; } if (fileType == "txt") { return str.Replace("?", "??").Replace(":", "?:").Replace("+", "?+").Replace("'", "?'"); } else if (fileType == "xml") { return str.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'"); } else if (fileType == "sitc") { return str.Replace("?", "??").Replace(":", "?:").Replace("'", "?'"); } else { return str; } } //东胜7移植 public static List formatlengthStr(string str, int length, bool formatstr = false, bool nodelsp = false) { str = str.Replace("\r\n", "\\"); str = str.Replace("\n", "\\"); str = str.Replace("\r", " "); string[] StrList = str.Split('\\'); //List StrListtmp = new List(); //for (var i = StrList.Length - 1; i >=0; i--) //{ //} var strtemp = ""; var strnewline = ""; var strtempnewline = ""; char[] spstring = { ' ', ';', ',', '.', ':', '/', '(', ')', '?', '+', '-' }; List DestList = new List(); 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; } //东胜7移植 public static string formatListStr(List DestList, int lineCount) { var result = ""; for (var i = 0; i < lineCount; i++) { if (DestList.Count > i) { result = result + DestList[i]; } if (i != (lineCount - 1)) result = result + ":"; } return result; } /// /// 分割ftp服务器地址和端口 /// /// public static void SplitFtpServerAndPort(string str, out string server, out int port) { if (str.IndexOf(':') > -1) { var arr = str.Split(':'); server = arr[0]; port = Convert.ToInt32(arr[1]); } else { server = str; port = 21; } } #endregion #region 校验货描里的温度、湿度、通风与单个填写项进行比对 /// /// 校验货描里的温度、湿度、通风与单个填写项进行比对 /// /// 订舱详情 public static DataResult CheckGoodsDescriptionWithInput(SeaExport order) { /* 1、先从货描提取温度、湿度、通风。 2、判断录入框的温度、湿度、通风与货描提取的是否一致,不一致报错。 */ //温度 string tempSet = string.Empty; //通风 string reeferf = string.Empty; //湿度 string humidity = string.Empty; if (!string.IsNullOrWhiteSpace(order.Description)) { if (Regex.IsMatch(order.Description, TEMP_REGEX)) { var currStr = Regex.Match(order.Description, TEMP_TAKE_REGEX).Value; if (!string.IsNullOrWhiteSpace(currStr)) currStr = Regex.Replace(currStr, "\\:", ""); if (!string.IsNullOrWhiteSpace(currStr)) tempSet = currStr.Replace("#", ""); } if (Regex.IsMatch(order.Description, VENT_REGEX)) { var currStr = Regex.Match(order.Description, VENT_TAKE_REGEX).Value; if (!string.IsNullOrWhiteSpace(currStr)) { reeferf = currStr.Replace("#", ""); } } if (Regex.IsMatch(order.Description, HUMI_REGEX)) { var currStr = Regex.Match(order.Description, HUMI_TAKE_REGEX).Value; if (!string.IsNullOrWhiteSpace(currStr)) { if (Regex.IsMatch(currStr, "\\(NO\\s+SHOW\\)")) currStr = Regex.Replace(currStr, "\\(NO\\s+SHOW\\)", ""); humidity = currStr.Replace("#", ""); } } } if (!string.IsNullOrWhiteSpace(order.TemperatureSet) && !string.IsNullOrWhiteSpace(tempSet)) { string strA = string.Empty; string strB = string.Empty; strA = Regex.Match(order.TemperatureSet, "(\\+|\\-)?\\s?[0-9]+(\\.[0-9]+)?").Value?.Trim(); if (Regex.IsMatch(tempSet, "(\\+|\\-)?\\s?[0-9]+(\\.[0-9]+)?.('C|'\\s+C|℃|ºC|C)?")) { strB = Regex.Match(tempSet, "(\\+|\\-)?\\s?[0-9]+(\\.[0-9]+)?(?=.('C|'\\s+C|℃|ºC|C)?)").Value?.Trim(); } if (!Regex.IsMatch(strA, "^\\+") && Regex.IsMatch(strB, "^\\+")) { strB = Regex.Match(strB, "(?<=\\+).*").Value?.Trim(); } if (!strA.Equals(strB)) { return DataResult.Failed($"货描温度 {tempSet} 与请求设定温度 {order.TemperatureSet} 不一致"); } } if (!string.IsNullOrWhiteSpace(order.ReeferQuantity) && !string.IsNullOrWhiteSpace(reeferf)) { string strA = string.Empty; string strB = string.Empty; strA = Regex.Match(order.ReeferQuantity, "[0-9]+(\\.[0-9]+)?").Value?.Trim(); if (Regex.IsMatch(reeferf, "[0-9]+(\\.[0-9]+)?\\s?(CBM\\/H)?")) { strB = Regex.Match(reeferf, "[0-9]+(\\.[0-9]+)?\\s?(?=(CBM\\/HR|CBM\\/HOUR|CBM\\s+\\/\\s+H|CBM\\/H|CMH|CBMH)?)").Value?.Trim(); } else { strB = Regex.Match(reeferf, "[0-9]+(\\.[0-9]+)?").Value?.Trim(); } if (!strA.Equals(strB)) { if (!(Regex.IsMatch(reeferf, "(CLOSE(D)?|OFF)") && Regex.IsMatch(order.ReeferQuantity?.Trim(), "^0(\\.0)?"))) { //如果货描通风显示英文 CLOSE、CLOSED、OFF,并且录入通风是 0或者0.0可以认为一致 return DataResult.Failed($"货描通风 {reeferf} 与请求冷藏通风量 {order.ReeferQuantity} 不一致"); } } } if (!string.IsNullOrWhiteSpace(order.Humidity) && !string.IsNullOrWhiteSpace(humidity)) { string strA = Regex.Match(order.Humidity, "[0-9]+(\\.[0-9]+)?(\\%)?").Value?.Trim(); string strB = Regex.Match(humidity, "[0-9]+(\\.[0-9]+)?(\\%)?").Value?.Trim(); if (order.Humidity.Contains("%") && !humidity.Contains("%")) { strA = Regex.Match(order.Humidity, "[0-9]+(\\.[0-9]+)?").Value?.Trim(); } if (!order.Humidity.Contains("%") && humidity.Contains("%")) { strB = Regex.Match(humidity, "[0-9]+(\\.[0-9]+)?").Value?.Trim(); } if (!strA.Equals(strB)) { return DataResult.Failed($"货描湿度 {humidity} 与请求湿度 {order.Humidity} 不一致"); } } return DataResult.Successed("货描提取温度、湿度、通风校验通过"); } #endregion } }