using System; using System.Collections.Generic; using System.Text; using Stone.Common; using System.IO; using Gm_WMS.DataAccess.DataService; using Stone.Entity; using System.Data; using System.Threading; using System.Data.SqlClient; using System.Linq; namespace Stone.WinBiz.JISAdmin { public class F_EDI_JIS5000Sequence { public static bool IsRun = false; public static string Path_Receive = string.Empty; public static string Path_Error = string.Empty; public static string Path_Bak = string.Empty; static F_EDI_JIS5000Sequence() { Path_Receive = MyAppconfig.ReadValue("接收路径"); Path_Error = MyAppconfig.ReadValue("错误路径"); Path_Bak = MyAppconfig.ReadValue("备份路径"); } public static void Run() { int UpdateTime = Convert.ToInt32(MyAppconfig.ReadValue("解析刷新时间(秒)")) * 1000; while (IsRun) { try { ProcessData(); } catch (Exception ex) { MyLogger.Write(ex.Message); } System.Threading.Thread.Sleep(UpdateTime); } } public static void ProcessData() { DirectoryInfo dir = new DirectoryInfo(Path_Receive); FileInfo[] files = dir.GetFiles("*.*", SearchOption.TopDirectoryOnly); //Array.Sort(files, new MyFileSort(FileOrder.LastWriteTime)); //按修改日期升序排列 Array.Sort(files, new MyFileSort(FileOrder.Name)); //按文件名升序排列 foreach (FileInfo file in files) { Entity_t_JIS_Log t_JIS_Log = new Entity_t_JIS_Log(); DataRow drJIS_Log = t_JIS_Log.Table.NewRow(); StreamReader sr = null; try { drJIS_Log["FileType"] = GetFileType(file.Name); drJIS_Log["FileName"] = file.Name; drJIS_Log["StartTime"] = MyDateTime.GetServerDateTime(); drJIS_Log = t_JIS_Log.Add(drJIS_Log); sr = file.OpenText(); string text = sr.ReadToEnd(); sr.Close(); string fileType = ""; if (file.Name.ToUpper().IndexOf("SY78") >= 0) { fileType = "SY78"; } if (file.Name.ToUpper().IndexOf("SY88") >= 0) { fileType = "SY88"; } if (fileType == "") { throw new Exception(file.Name + " 中不包含 SY78 或 SY88"); } //判断文件格式是否正式 IsFileOK(text, file.Name); DateTime StartTime = DateTime.Now; var partMsg = ""; if (file.Name.ToUpper().IndexOf("DEL") >= 0) { ProcessDataLab(text, fileType, file.Name, out partMsg); //解析LAB数据 } TimeSpan TimeOut = DateTime.Now - StartTime; MyLogger.Write(file.Name + " 处理成功,用时[" + TimeOut.TotalSeconds + "]秒"); string Path_Bak_New = Path_Bak + "\\" + MyDateTime.Format(MyDateTimeType.Date); if (!Directory.Exists(Path_Bak_New)) { Directory.CreateDirectory(Path_Bak_New); } MoveFile(file, Path_Bak_New); drJIS_Log["EndTime"] = MyDateTime.GetServerDateTime(); drJIS_Log["ProcessState"] = "Success"; drJIS_Log["Memo"] = partMsg; t_JIS_Log.Edit(drJIS_Log); } catch (Exception ex) { // MyLogger.Write(file.Name + " 处理失败,原因为:" + ex.Message); MyLogger.Write(file.Name + " 处理失败,原因为:报文异常解析失败!"); if (sr != null) sr.Close(); drJIS_Log["EndTime"] = MyDateTime.GetServerDateTime(); drJIS_Log["ProcessState"] = "Failed"; drJIS_Log["Memo"] = MyStrings.GetString(ex.Message); t_JIS_Log.Edit(drJIS_Log); MoveFile(file, Path_Error); //F_SMS.SendSMS(file.Name + " 处理失败,原因为:" + ex.Message); LocalDBService db = new LocalDBService(); var strErrTypeCode = "01"; var strsql = "select top 1 * from t_ErrTypeLevel" + " where Code = '" + strErrTypeCode + "'" + " order by id desc"; var dsErrMail = db.Exec_DataSet(strsql); if (dsErrMail.Tables[0].Rows.Count > 0) { //获取收件人 var mailTo = dsErrMail.Tables[0].Rows[0]["ToPerson"].ToString(); var errLvevl = dsErrMail.Tables[0].Rows[0]["ErrLevel"].ToString(); var errTypeDesc = dsErrMail.Tables[0].Rows[0]["ErrTypeDesc"].ToString(); //设置邮件标题 var title = ""; title = "LAB解析异常:错误级别-" + errLvevl + "-" + errTypeDesc; F_Mail.Send(file.Name + "解析失败", title, mailTo); } // F_Mail.Send(file.Name + " 处理失败,原因为:" + ex.Message); //如果文件有问题,不移动文件,等待一分钟后再处理 Thread.Sleep(60 * 1000); } } try { #region 监控ASN报文是否成功生成 var db = new LocalDBService(); var strAsnUpLoadsql = "select top 1 * from t_ASN_UPLOAD where isCreate = 0 order by uid "; var dsAsnUpLoad = db.Exec_DataSet(strAsnUpLoadsql); if (dsAsnUpLoad.Tables[0].Rows.Count > 0) { //获取 ASN报文上传的时间 var alertTime = DateTime.Parse(dsAsnUpLoad.Tables[0].Rows[0]["AlertTime"].ToString()); var nowTime = DateTime.Now; TimeSpan timeSpan = nowTime - alertTime; var min = timeSpan.TotalMinutes; //超出10分钟 报文未生成,则进行预警预警 if (min > 10) { var strErrTypeCode = "08"; var strsql = "select top 1 * from t_ErrTypeLevel" + " where Code = '" + strErrTypeCode + "'" + " order by id desc"; var dsErrMail = db.Exec_DataSet(strsql); if (dsErrMail.Tables[0].Rows.Count > 0) { //获取收件人 var mailTo = dsErrMail.Tables[0].Rows[0]["ToPerson"].ToString(); var errLvevl = dsErrMail.Tables[0].Rows[0]["ErrLevel"].ToString(); var errTypeDesc = dsErrMail.Tables[0].Rows[0]["ErrTypeDesc"].ToString(); //设置邮件标题 var title = ""; title = "服务器器ASN报文生成失败-错误级别-" + errLvevl + "-" + errTypeDesc; var strDetails = ""; var asnNum = dsAsnUpLoad.Tables[0].Rows[0]["AsnNum"].ToString(); strDetails = "ASN【" + asnNum + "】已超出10分钟未生成报文!"; F_Mail.Send(title, strDetails, mailTo); } //更新报警时间 strsql = "Update t_ASN_UPLOAD set AlertTime = getdate() " + " where isCreate = 0"; db.Exec_NonQuery(strsql); } } #endregion } catch (Exception e) { F_Mail.Send("ASN报文生成监控异常", "监控ASN报文是否生成失败 " + e.ToString(), "JLi50@lear.com"); } } private static void ProcessDataLab(string text, string fileType, string filename,out string Msg) { Entity_t_JIS_Lab t_JIS_Lab = new Entity_t_JIS_Lab(); Entity_t_Product t_Product = new Entity_t_Product(); LocalDBService db = new LocalDBService(); text = text.Replace("\r\n", "").Replace("\r", "").Replace("\n", ""); string[] sp_text = text.Split('\''); string version = string.Empty; string releaseId = string.Empty; string partNumber = string.Empty; string orderNumber = string.Empty; string status = string.Empty; string startDate = string.Empty; string endDate = string.Empty; string quantity = string.Empty; string cumulativeQuantity = string.Empty; string location = string.Empty; string LocationCode = string.Empty; string time = ""; StringBuilder sqls = new StringBuilder(); string sql = ""; List items = new List(); //获取零件对应的版本号 add by jinh 20220419 //版本号在需求日期之后,目前是在需求日期处进行的数据插入 var lstPartRelease = new List(); var partRelese = new PartRelease(); //定义预警级别 var errType = 0; foreach (var line_text in sp_text) { if (line_text.Trim() == "") continue; string[] sp_line = line_text.Split('+'); var partCode = ""; var release = ""; if (sp_line[0] == "ARD") { partRelese.PartCode = sp_line[1].Split(':')[0]; } if (sp_line[0] == "ADI") { partRelese.Release = sp_line[1].Trim(); lstPartRelease.Add(partRelese); partRelese = new PartRelease(); } } foreach (string line_text in sp_text) { if (line_text.Trim() == "") continue; string[] sp_line = line_text.Split('+'); if (sp_line[0] == "ARD") { partNumber = sp_line[1].Split(':')[0]; sql = $"delete from t_JIS_Lab where [fileType]='{fileType}' and [partNumber]='{partNumber}'"; sqls.AppendLine(sql); if (sqls.Length > 20000) { db.Exec_NonQuery(sqls.ToString()); sqls = new StringBuilder(); } } } var strPartMsg = ""; foreach (string line_text in sp_text) { if (line_text.Trim() == "") continue; string[] sp_line = line_text.Split('+'); if (sp_line[0] == "UNB") { version = sp_line[5]; time = "20" + sp_line[4].Split(':')[0] + sp_line[4].Split(':')[1]; } //if (sp_line[0] == "MID") //{ // releaseId = sp_line[1]; // releaseIdNew = releaseId.Replace("S", "").Replace("/", "").Replace("-", "").Replace(" ", "0"); //} // if (sp_line[0] == "PDI") // if (sp_line[0] == "ADI") // { // releaseId = sp_line[1].Trim(); // } if (sp_line[0] == "SAD") { status = sp_line[1]; } if (sp_line[0] == "ARD") { partNumber = sp_line[1].Split(':')[0]; orderNumber = sp_line[3]; //add by jinh 20220419 从list获取该零件的版本号 releaseId = lstPartRelease.FirstOrDefault(p => p.PartCode == partNumber).Release; //校验零件号是否失效 var strsql = ""; strsql = "select top 1 * from t_Product where Code = '" + partNumber + "' order by id desc"; var dsProd = db.Exec_DataSet(strsql); if (dsProd.Tables[0].Rows.Count > 0) { var strState = dsProd.Tables[0].Rows[0]["State"].ToString(); if (strState == "0" || string.IsNullOrEmpty(strState)) { strPartMsg += "零件号 " + partNumber + " 已失效!" + Environment.NewLine; if (errType == 0 || errType > 6) { errType = 6; } } } else { strPartMsg += "零件号 " + partNumber + " 未定义!" + Environment.NewLine; if (errType == 0 || errType > 5) { errType = 5; } } } if (sp_line[0] == "CSG") { LocationCode = sp_line[1].Split(':')[0]; location = sp_line[3]; //校验卸货点是否失效 var strsql = ""; strsql = "select top 1 * from t_Location where Code = '" + location + "' order by id desc"; var dsLoc = db.Exec_DataSet(strsql); if (dsLoc.Tables[0].Rows.Count > 0) { var strState = dsLoc.Tables[0].Rows[0]["State"].ToString(); if (strState == "0" || string.IsNullOrEmpty(strState)) { strPartMsg += "卸货点 " + location + " 已失效!" + Environment.NewLine; if (errType == 0 || errType > 4) { errType = 4; } } } else { strPartMsg += "卸货点 " + location + " 未在系统中定义!" + Environment.NewLine; if (errType == 0 || errType > 2) { errType = 2; } } //校验卸货点、卸货点代码是否匹配 strsql = "select top 1 * from t_Location" + " where Code = '" + location + "'" + //" and (LocCode1 = '" + LocationCode + "' or LocCode2 = '" + LocationCode + "' or LocCode3 = '" + LocationCode + "' or LocCode4 = '" + LocationCode + "')"+ " and (LocCode1 = '" + LocationCode + "')" + " order by id desc"; dsLoc = db.Exec_DataSet(strsql); if (dsLoc.Tables[0].Rows.Count == 0) { strPartMsg += "卸货点 " + location + " 对应的代码 " + LocationCode + " 未在系统中定义!" + Environment.NewLine; if (errType == 0 || errType > 3) { errType = 3; } } } if(sp_line[0] == "DST") { cumulativeQuantity = sp_line[2].Split(':')[1]; } if (sp_line[0] == "DEL") { startDate = sp_line[1].Split(':')[0]; endDate = sp_line[1].Split(':')[2]; quantity = sp_line[2].Split(':')[0]; //cumulativeQuantity = sp_line[2].Split(':')[4]; startDate = GetDateTimeStyle5(startDate, MyDateTimeType.Date); endDate = GetDateTimeStyle5(endDate, MyDateTimeType.Date); object[] obj = new object[14]; obj[0] = partNumber; obj[1] = startDate; obj[2] = endDate; obj[3] = GetDateTimeStyle1(time, MyDateTimeType.DateTime); obj[4] = releaseId; obj[5] = location; obj[6] = orderNumber; obj[7] = cumulativeQuantity; obj[8] = quantity; obj[9] = status; obj[10] = fileType; obj[11] = version; obj[12] = LocationCode; obj[13] = filename; //sql = "delete from t_JIS_Lab where partNumber='{0}' and startDate<='{1}' and endDate>='{2}'"; //sql = string.Format(sql, obj); //sqls.AppendLine(sql); //插入新的数据(当前数据) sql = @" insert into t_JIS_Lab(partNumber, startDate, endDate, [time], releaseId, location, orderNumber, cumulativeQuantity, quantity, [status], [fileType], [version], [LocationCode], [filename]) values('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', {7}, {8}, {9}, '{10}', '{11}', '{12}', '{13}') "; sql = string.Format(sql, obj); sqls.AppendLine(sql); //插入新的数据(版本对比) sql = @" insert into t_JIS_Lab_All(partNumber, startDate, endDate, [time], releaseId, location, orderNumber, cumulativeQuantity, quantity, [status], [fileType], [version], [LocationCode], [filename]) values('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', {7}, {8}, {9}, '{10}', '{11}', '{12}', '{13}') "; sql = string.Format(sql, obj); sqls.AppendLine(sql); //更新采购订单号 //sql = $"update t_Product set [StandardNo]='{orderNumber}' where [Code]='{partNumber}'"; //sqls.AppendLine(sql); if (sqls.Length > 20000) { db.Exec_NonQuery(sqls.ToString()); sqls = new StringBuilder(); } } } if (sqls.ToString() != "") { db.Exec_NonQuery(sqls.ToString()); sqls = new StringBuilder(); } if (strPartMsg != "") { strPartMsg = filename + " " + strPartMsg; var strErrTypeCode = errType.ToString("00"); var strsql = "select top 1 * from t_ErrTypeLevel" + " where Code = '" + strErrTypeCode + "'" + " order by id desc"; var dsErrMail = db.Exec_DataSet(strsql); if (dsErrMail.Tables[0].Rows.Count > 0) { //获取收件人 var mailTo = dsErrMail.Tables[0].Rows[0]["ToPerson"].ToString(); var errLvevl = dsErrMail.Tables[0].Rows[0]["ErrLevel"].ToString(); var errTypeDesc = dsErrMail.Tables[0].Rows[0]["ErrTypeDesc"].ToString(); //设置邮件标题 var title = ""; title = "LAB解析异常-错误级别-" + errLvevl + "-" + errTypeDesc; F_Mail.Send(title, strPartMsg, mailTo); } } Msg = strPartMsg; } private static void MoveFile(FileInfo file, string MovePath) { string filename1 = Path_Receive + "\\" + file.Name; string filename2 = MovePath + "\\" + file.Name; try { if (File.Exists(filename2)) File.Delete(filename2); File.Move(filename1, filename2); } catch (Exception ex) { MyLogger.Write("移动文件错误 " + filename1 + "->" + filename2 + ",原因为:" + ex.Message); } } private static string GetFileType(string filename) { string ret = ""; if (filename.ToUpper().IndexOf("ASA") >= 0) { ret = "ASA"; } if (filename.ToUpper().IndexOf("ATC") >= 0) { ret = "ATC"; } if (filename.ToUpper().IndexOf("ATP") >= 0) { ret = "ATP"; } if (filename.ToUpper().IndexOf("DEL") >= 0) { ret = "解析LAB文件"; } if (filename.ToUpper().IndexOf("ANB") >= 0) { ret = "ANB"; } return ret; } private static void IsFileOK(string text, string filename) { text = text.Replace("\r\n", "").Replace("\r", "").Replace("\n", ""); string[] sp_text = text.Split('\''); if (sp_text[0].Substring(0, 3) != "UNB") { throw new Exception(filename + " 不以UNB开头"); } if (sp_text[sp_text.Length - 2].Substring(0, 3) != "UNZ") { throw new Exception(filename + " 不以UNZ结尾"); } if (sp_text[sp_text.Length - 3].Substring(0, 3) != "UNT") { throw new Exception(filename + " 未找到UNT"); } int segment_count = Convert.ToInt32(sp_text[sp_text.Length - 3].Split('+')[1]); if (segment_count != sp_text.Length - 3) { throw new Exception(filename + " Segment 数量不正确"); } } #region 日期时间转换 /// /// 201401160939 和 20140116093911 将这种字符串转换为日期 /// /// /// /// public static string GetDateTimeStyle1(string sDateTime, MyDateTimeType dType) { if (sDateTime.Length != 12 && sDateTime.Length != 14) { throw new Exception("[" + sDateTime + "]日期时间格式错误!"); } string Result = ""; string year = sDateTime.Substring(0, 4); string month = sDateTime.Substring(4, 2); string day = sDateTime.Substring(6, 2); string h = sDateTime.Substring(8, 2); string m = sDateTime.Substring(10, 2); string s = sDateTime.Length == 14 ? sDateTime.Substring(12, 2) : "0"; string mi = "0"; if (month.Length == 1) month = "0" + month; if (day.Length == 1) day = "0" + day; if (h.Length == 1) h = "0" + h; if (m.Length == 1) m = "0" + m; if (s.Length == 1) s = "0" + s; if (mi.Length == 1) mi = "00" + mi; if (mi.Length == 2) mi = "0" + mi; if (dType == MyDateTimeType.DateTime) { Result = year + "-" + month + "-" + day + " " + h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Date) { Result = year + "-" + month + "-" + day; } if (dType == MyDateTimeType.Time) { Result = h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Batch) { Result = year.Substring(2, 2) + month + day; } if (dType == MyDateTimeType.BillNo) { Result = year + month + day + h + m + s + mi; } return Result; } //12.04.2014 09:07:00 public static string GetDateTimeStyle2(string sDateTime, MyDateTimeType dType) { if (sDateTime.Length != 19) throw new Exception("[" + sDateTime + "]日期时间格式错误!"); string Result = ""; string year = sDateTime.Substring(6, 4); string month = sDateTime.Substring(3, 2); string day = sDateTime.Substring(0, 2); string h = sDateTime.Substring(11, 2); string m = sDateTime.Substring(14, 2); string s = sDateTime.Substring(17, 2); string mi = "0"; if (month.Length == 1) month = "0" + month; if (day.Length == 1) day = "0" + day; if (h.Length == 1) h = "0" + h; if (m.Length == 1) m = "0" + m; if (s.Length == 1) s = "0" + s; if (mi.Length == 1) mi = "00" + mi; if (mi.Length == 2) mi = "0" + mi; if (dType == MyDateTimeType.DateTime) { Result = year + "-" + month + "-" + day + " " + h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Date) { Result = year + "-" + month + "-" + day; } if (dType == MyDateTimeType.Time) { Result = h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Batch) { Result = year.Substring(2, 2) + month + day; } if (dType == MyDateTimeType.BillNo) { Result = year + month + day + h + m + s + mi; } return Result; } /// /// 20140116093900 将这种字符串转换为日期 /// /// /// /// public static string GetDateTimeStyle3(string sDateTime, MyDateTimeType dType) { if (sDateTime.Length != 12 && sDateTime.Length != 14) throw new Exception("[" + sDateTime + "]日期时间格式错误!"); string Result = ""; string year = sDateTime.Substring(0, 4); string month = sDateTime.Substring(4, 2); string day = sDateTime.Substring(6, 2); string h = sDateTime.Substring(8, 2); string m = sDateTime.Substring(10, 2); string s = sDateTime.Length == 14 ? sDateTime.Substring(12, 2) : "0"; string mi = "0"; if (month.Length == 1) month = "0" + month; if (day.Length == 1) day = "0" + day; if (h.Length == 1) h = "0" + h; if (m.Length == 1) m = "0" + m; if (s.Length == 1) s = "0" + s; if (mi.Length == 1) mi = "00" + mi; if (mi.Length == 2) mi = "0" + mi; if (dType == MyDateTimeType.DateTime) { Result = year + "-" + month + "-" + day + " " + h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Date) { Result = year + "-" + month + "-" + day; } if (dType == MyDateTimeType.Time) { Result = h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Batch) { Result = year.Substring(2, 2) + month + day; } if (dType == MyDateTimeType.BillNo) { Result = year + month + day + h + m + s + mi; } return Result; } /// /// 20140808 将这种字符串转换为日期 /// /// /// /// public static string GetDateTimeStyle4(string sDateTime, MyDateTimeType dType) { if (sDateTime.Length != 8) throw new Exception("[" + sDateTime + "]日期时间格式错误!"); string Result = ""; string year = sDateTime.Substring(0, 4); string month = sDateTime.Substring(4, 2); string day = sDateTime.Substring(6, 2); string h = "0"; string m = "0"; string s = "0"; string mi = "0"; if (month.Length == 1) month = "0" + month; if (day.Length == 1) day = "0" + day; if (h.Length == 1) h = "0" + h; if (m.Length == 1) m = "0" + m; if (s.Length == 1) s = "0" + s; if (mi.Length == 1) mi = "00" + mi; if (mi.Length == 2) mi = "0" + mi; if (dType == MyDateTimeType.DateTime) { Result = year + "-" + month + "-" + day + " " + h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Date) { Result = year + "-" + month + "-" + day; } if (dType == MyDateTimeType.Time) { Result = h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Batch) { Result = year.Substring(2, 2) + month + day; } if (dType == MyDateTimeType.BillNo) { Result = year + month + day + h + m + s + mi; } return Result; } /// /// 140808 将这种字符串转换为日期 /// /// /// /// public static string GetDateTimeStyle5(string sDateTime, MyDateTimeType dType) { if (sDateTime.Length != 6) throw new Exception("[" + sDateTime + "]日期时间格式错误!"); string Result = ""; string year = "20" + sDateTime.Substring(0, 2); string month = sDateTime.Substring(2, 2); string day = sDateTime.Substring(4, 2); string h = "0"; string m = "0"; string s = "0"; string mi = "0"; if (month.Length == 1) month = "0" + month; if (day.Length == 1) day = "0" + day; if (h.Length == 1) h = "0" + h; if (m.Length == 1) m = "0" + m; if (s.Length == 1) s = "0" + s; if (mi.Length == 1) mi = "00" + mi; if (mi.Length == 2) mi = "0" + mi; if (dType == MyDateTimeType.DateTime) { Result = year + "-" + month + "-" + day + " " + h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Date) { Result = year + "-" + month + "-" + day; } if (dType == MyDateTimeType.Time) { Result = h + ":" + m + ":" + s; } if (dType == MyDateTimeType.Batch) { Result = year.Substring(2, 2) + month + day; } if (dType == MyDateTimeType.BillNo) { Result = year + month + day + h + m + s + mi; } return Result; } #endregion public partial class PartRelease { public string PartCode { get; set;} public string Release { get; set; } } } }