using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Globalization; using System.IO; using System.Net; using System.Text; using QM.Data.DBProvider.SqlServer; using QMAPP.FJC.Entity; using QMAPP.FJC.Entity.ProcessParameter; using QMAPP.FJC.Entity.FileCopy; using QMAPP.FJC.BLL.FileCopy; using QMAPP.FJC.Entity.Basic; using QMAPP.FJC.BLL.Basic; using QMAPP.FJC.BLL.Process; using System.Linq; using QMFrameWork.Log; namespace AutoFileCopyNet.EngelFileAnalytic { public class Engel { public void Run() { try { //取恩格尔设备编号 StringBuilder sb1 = new StringBuilder(); string engeltype = ConfigurationManager.AppSettings["DCS_ET_START_TYPE"].ToString(); List listMachine = new MachineInfoBLL().GetAllList(new MachineInfo { EQUIPMENT_TYPE_CODE = engeltype }); foreach (MachineInfo dr in listMachine) { //复制文件 LogFileAccess.WriteLogFile("服务开始复制" + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); CopyFile(dr); //解析文件 LogFileAccess.WriteLogFile("服务开始解析" + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ExpFile(dr); //定时删除文件 if ("1".Equals(ConfigurationManager.AppSettings["NEEDDEL"].ToString())) { AutoFileCopy.AutoFileDelete(dr, ConfigurationManager.AppSettings["SHARESERVER_IP"].ToString() , ConfigurationManager.AppSettings["DCSLocalDriverPath"].ToString() , DirHandler.GetNewPrefix() , ConstParam.ERROR_MESSAGE_HEAD , ConfigurationManager.AppSettings["CONWAY"].ToString() , ConfigurationManager.AppSettings["DELDAY"].ToString() , ConfigurationManager.AppSettings["STARTTIME"].ToString() , ConfigurationManager.AppSettings["ENDTIME"].ToString() , ConfigurationManager.AppSettings["DELTIME"].ToString() , ConfigurationManager.AppSettings["DCS_FILEPATH_BAK"].ToString()+ dr.MACHINECODDE +"\\"); } } } catch (Exception e) { LogFileAccess.WriteLogFile("恩格尔数据文件解析失败" + e.Message + e.Source + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } /// /// 复制文件 /// /// /// private bool CopyFile(MachineInfo info) { bool result = false; try { String equipmentType = ConfigurationManager.AppSettings["DCS_ET_START_TYPE"].ToString(); String toDir = ConfigurationManager.AppSettings["DCS_FILEPATH"].ToString();//目标目录 String localDriverPath = ConfigurationManager.AppSettings["DCSLocalDriverPath"].ToString();//磁盘映射名 String fileRenamePrefix = DirHandler.GetNewPrefix();//随机数 String errorMessageHead = ConstParam.ERROR_MESSAGE_HEAD;//错误信息 string server_ip = ConfigurationManager.AppSettings["SHARESERVER_IP"].ToString();//服务IP string conn_way = ConfigurationManager.AppSettings["CONWAY"].ToString();//打开连接方式 AutoFileCopy.AutoFileCopyFromEquipmentByType(info, equipmentType, server_ip, toDir, localDriverPath, fileRenamePrefix, errorMessageHead, conn_way); } catch (Exception ex) { LogFileAccess.WriteLogFile("恩格尔网络共享文件抓取失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } return result; } /// /// 解析文件 /// /// /// private bool ExpFile(MachineInfo dr) { bool result = false; string ekey = dr.PID.ToString(); List listFile = new FileCopyRecordBLL().GetAllList(new FileCopyRecord { EQUIPMENT_INFO_KEY = ekey, FILE_HOSTNAME = Dns.GetHostName(), IsOperation = true }); foreach (FileCopyRecord row in listFile) { string filepath = row.RECORD_EQUIPMENT_DIRECTORY.ToString(); string filename = row.RECORD_FILENAME.ToString(); filepath = filepath + filename; if (File.Exists(filepath)) { //修改为使用西欧字符集 System.IO.StreamReader b = new System.IO.StreamReader(filepath, System.Text.Encoding.GetEncoding("iso-8859-1")); string s = string.Empty; string modelType = "";//定义当前注塑机加工产品类型 string[] modelTypes = ConfigurationManager.AppSettings["PRODUCT_TYPES"].Split(','); while ((s = b.ReadLine()) != null) { if (s.Trim().Length > 0) { string[] st = modelTypes.Intersect(s.Trim().Split(';')).ToArray(); if (st.Length > 0) { modelType = st[0]; } } //s就是 取到的每行的值 if (!string.IsNullOrEmpty(modelType) && s.Contains("ASZ") && s.Length > 50) { string strtitle = GetExcelTitle(s); string opDate = new InjectionProcess().GetMaxEDate(new InJectionParameter() { MACHINECODDE = dr.MACHINECODDE }); //读下一行 string dataline = string.Empty; while ((dataline = b.ReadLine()) != null) { string insertdata = GetExcelValues(dataline.Replace(",", ".")); if (insertdata != "0") { if (string.IsNullOrEmpty(insertdata)) { break; } try { if (insertdata.Split(',').Length < strtitle.Split(',').Length)//列头与数据数量不匹配 { continue; } SaveImpor(ekey, strtitle, insertdata, dr, modelType, opDate); } catch (Exception ex) { LogFileAccess.WriteLogFile("恩格尔解析行数据失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); continue; } } } modelType = ""; } } b.Close(); updateFile(ekey, filename, Dns.GetHostName()); } } return result; } private void updatecopyfile(string fromDir, string EQUIPMENT_INFO_KEY, string EQUIPMENT_Code, string EQUIPMENT_Type_Code, string toDir) { FileCopyRecordBLL bll = new FileCopyRecordBLL(); FileCopyRecord record = new FileCopyRecord(); if (!System.IO.Directory.Exists(fromDir)) { //创建磁盘映射Y return; } if (toDir[toDir.Length - 1] != System.IO.Path.DirectorySeparatorChar) { toDir += System.IO.Path.DirectorySeparatorChar; } if (!System.IO.Directory.Exists(toDir)) { System.IO.Directory.CreateDirectory(toDir); } DirectoryInfo Dir = new DirectoryInfo(fromDir); try { foreach (FileInfo f in Dir.GetFiles()) //查找文件 { string hostname = Dns.GetHostName(); string lastwritetime = f.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo); //查询该文件是否复制过,如果没有复制过,则开始复制该文件 List list = bll.GetAllList(new FileCopyRecord { RECORD_FILENAME =f.Name, EQUIPMENT_INFO_KEY = EQUIPMENT_INFO_KEY, FILE_HOSTNAME =hostname}); //判断数据库中是否有记录,如果没有则插入数据 string templastwrit = ""; if (list.Count > 0) { templastwrit = list[0].FILE_LASTWRITETIME.ToString(); } if (list.Count <= 0) { File.Copy(f.FullName, toDir + f.Name, true); #region "把文件复制记录写入数据库" record.RECORD_KEY = Guid.NewGuid().ToString(); record.RECORD_EQUIPMENT_CODE = EQUIPMENT_Code; record.RECORD_EQUIPMENT_TYPE_CODE = EQUIPMENT_Type_Code; record.RECORD_EQUIPMENT_DIRECTORY = toDir; record.RECORD_KEYWORDS = EQUIPMENT_Code; record.RECORD_COPY_DATETIME = DateTime.Now; record.RECORD_READFLAG = "0"; record.RECORD_FILENAME = f.Name; record.EQUIPMENT_INFO_KEY = EQUIPMENT_INFO_KEY; //record.FILE_LASTWRITETIME = lastwritetime; record.FILE_HOSTNAME = hostname; bll.Insert(record); #endregion } else if (lastwritetime != templastwrit) { File.Copy(f.FullName, toDir + f.Name, true);//复制后覆盖原文件 #region "把修改数据库中文件复制时间" record = list[0]; record.RECORD_COPY_DATETIME = DateTime.Now; //record.FILE_LASTWRITETIME = lastwritetime; record.RECORD_FILENAME = f.Name; record.FILE_HOSTNAME = Dns.GetHostName(); bll.Update(record); #endregion } else if (!File.Exists(@toDir + f.Name)) { File.Copy(f.FullName, toDir + f.Name, true); } } } catch (Exception e) { LogFileAccess.WriteLogFile("恩格尔数据复制文件失败" + e.Message + e.Source + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } private void updateFile(string ekey, string filename, string file_hostname) { string strdatatime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo); try { new FileCopyRecordBLL().UpdateForTime(ekey, filename, file_hostname, strdatatime); } catch (Exception ex) { LogFileAccess.WriteLogFile("恩格尔更新数据失败" + ex.Message + ex.Source + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } /// /// 保存解析后的数据。 /// /// /// private void SaveImpor(string eqkey, string strtitle, string insertdata,MachineInfo machine,string productType,string opDate) { InJectionParameter injectPara = new InJectionParameter(); string tempbarcode = productType;//设置当前零件类别 //有日期取出来和数据库最大时间比较,小的不插 bool insertflg = false; //insertflg = new InjectionProcess().CheckParameter(tempbarcode, barcode);//判断数据库是否存在相同条码的零件 if (insertflg == false) { //插入数据库 ////把日期和时间两列手动加入到序列中,最后拼写sql插入数据时,根据datetime拆分为日期和时间 string[] strtitles = strtitle.Split(','); string[] insertdatas = insertdata.Split(','); int index = -1; index = Array.IndexOf(strtitles, "SZX");//产品序列号 //if (index >= 0) // injectPara.SZX = insertdatas[index]; index = Array.IndexOf(strtitles, "");//生成日期 //if (index >= 0 && index < strtitles.Length - 3) //{ // DateTime dtGet = new DateTime(); // if (DateTime.TryParse(insertdatas[index],out dtGet)) // { // injectPara.EDATE = insertdatas[index]; // //LogFileAccess.WriteLogFile("恩格尔解析行数据-------opdate:" + opDate + "---injectPara.EDATE:" + injectPara.EDATE); // if (!string.IsNullOrEmpty(opDate) && Convert.ToDateTime(opDate) >= Convert.ToDateTime(injectPara.EDATE))//如果加工日期小于数据库存储最大日期则不执行 // { // return; // } // injectPara.EMACHINECODE = insertdatas[index + 1];//机器设备号 // injectPara.EOPERATORCODE = insertdatas[index + 2];//操作人员号 // } // else // { // int newCode = 0; // if (int.TryParse(insertdatas[index],out newCode)) // { // injectPara.SZX = insertdatas[index]; // } // injectPara.EDATE = insertdatas[index+1]; // //LogFileAccess.WriteLogFile("恩格尔解析行数据-------opdate:" + opDate + "---injectPara.EDATE:" + injectPara.EDATE); // if (!string.IsNullOrEmpty(opDate) && Convert.ToDateTime(opDate) >= Convert.ToDateTime(injectPara.EDATE))//如果加工日期小于数据库存储最大日期则不执行 // { // return; // } // injectPara.EMACHINECODE = insertdatas[index +2];//机器设备号 // injectPara.EOPERATORCODE = insertdatas[index + 3];//操作人员号 // } //} //index = Array.IndexOf(strtitles, "SFS");// //if (index >= 0) // injectPara.SFS = insertdatas[index]; //index = Array.IndexOf(strtitles, "PNS");// //if (index >= 0) // injectPara.PNS = insertdatas[index]; //index = Array.IndexOf(strtitles, "PVS");// //if (index >= 0) // injectPara.PVS = insertdatas[index]; //index = Array.IndexOf(strtitles, "PSS");// //if (index >= 0) // injectPara.PSS = insertdatas[index]; //index = Array.IndexOf(strtitles, "ZDX");// //if (index >= 0) // injectPara.ZDX = insertdatas[index]; //index = Array.IndexOf(strtitles, "ZSX");// //if (index >= 0) // injectPara.ZSX = insertdatas[index]; //index = Array.IndexOf(strtitles, "ZNACH"); //if (index >= 0) // injectPara.ZNACH = insertdatas[index]; //index = Array.IndexOf(strtitles, "SSX"); //if (index >= 0) // injectPara.SSX = insertdatas[index]; //index = Array.IndexOf(strtitles, "C3U"); //if (index >= 0) // injectPara.C3U = insertdatas[index]; //index = Array.IndexOf(strtitles, "CPX"); //if (index >= 0) // injectPara.CPX = insertdatas[index]; //index = Array.IndexOf(strtitles, "PSCFX"); //if (index >= 0) // injectPara.PSCFX = insertdatas[index]; //index = Array.IndexOf(strtitles, "PSCFDROP"); //if (index >= 0) // injectPara.PSCFDROP = insertdatas[index]; //index = Array.IndexOf(strtitles, "H2X"); //if (index >= 0) // injectPara.H2X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H12X"); //if (index >= 0) // injectPara.H12X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H3X"); //if (index >= 0) // injectPara.H3X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H4X"); //if (index >= 0) // injectPara.H4X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H5X"); //if (index >= 0) // injectPara.H5X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H6X"); //if (index >= 0) // injectPara.H6X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H7X"); //if (index >= 0) // injectPara.H7X = insertdatas[index]; //index = Array.IndexOf(strtitles, "H9X"); //if (index >= 0) // injectPara.H9X = insertdatas[index]; //if (string.IsNullOrEmpty(injectPara.EDATE)) //{ // injectPara.OPERATEDATE = Convert.ToDateTime(DateTime.Now, DateTimeFormatInfo.InvariantInfo); //} //else //{ // injectPara.OPERATEDATE = Convert.ToDateTime(injectPara.EDATE, DateTimeFormatInfo.InvariantInfo); //} //tempbarcode += injectPara.OPERATEDATE.ToString("yyMMddHHmm"); //tempbarcode += injectPara.EMACHINECODE;//前面是设备码, //tempbarcode += injectPara.EOPERATORCODE.Length == 1 ? "0" + injectPara.EOPERATORCODE : injectPara.EOPERATORCODE;//如果是一位数则转为2位数 //tempbarcode += injectPara.SZX.Substring(injectPara.SZX.Length - 4); //injectPara.PRODUCTCODE = tempbarcode; //injectPara.MACHINECODDE = machine.MACHINECODDE; //injectPara.MACHINENAME = machine.MACHINENAME; try { new InjectionProcess().ProcessAuto(machine, injectPara); } catch (Exception ex) { LogFileAccess.WriteLogFile("恩格尔数据文件拷贝复制文件服务启动失败" + ex.Message + ex.Source + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } } /// /// 判断是否可以添加 /// /// /// public bool CheckEngelpar(string sql) { DataTable dt = SqlHelper.QueryReturnDataTable(sql.ToString()); if (dt.Rows.Count == 0) { return true; } else { return false; } } Dictionary dir; int titlecount = 0; //条码索引 int indexbarcode = -1; string barcode = string.Empty; //设备编号 string KEY_FORIMPORT = string.Empty; //生产加工时间 string tempdatetime = string.Empty; /// /// 获取要解析EXCEL的列头 /// /// /// private string GetExcelTitle(string readlines) { indexbarcode = -1; dir = new Dictionary(); StringBuilder sqlTitle = new StringBuilder(); string[] titleline = readlines.Split(';'); titlecount = titleline.Length; for (int i = 0; i < titleline.Length; i++) { string[] col = titleline[i].Split('['); string colName = col[0].Trim().Replace(" ", "").ToUpper(); sqlTitle.Append(colName); sqlTitle.Append(","); } string strtitle = sqlTitle.ToString().Substring(0, sqlTitle.Length - 1); return strtitle; } string qidate = ""; string qitime = ""; /// /// 获取EXCEL要解析值 /// /// /// private string GetExcelValues(string readlines) { try { qidate = ""; qitime = ""; string[] strdata = readlines.Split(';'); ////当解析的列头和列的值不一致时。直接返回null. //if (titlecount != strdata.Length) //{ // return ""; //} //StringBuilder sqlData = new StringBuilder(); //foreach (KeyValuePair a in dir) //{ // //处理日期列 // if (a.Key == "date&time") // { // //获取日期列的值 // tempdatetime = Convert.ToDateTime(strdata[a.Value], DateTimeFormatInfo.InvariantInfo).ToString("yyyy-MM-dd HH:mm:ss"); // sqlData.Append("" + tempdatetime + ","); // } // else // { // if (a.Key == "DATUM") // { // qidate = strdata[a.Value]; // } // if (a.Key == "ZEIT") // { // qitime = strdata[a.Value]; // } // sqlData.Append("" + strdata[a.Value] + ","); // } //} //if (indexbarcode != -1) //{ // //获取条码列所在值 // barcode = strdata[indexbarcode]; //} //else //{ // barcode = "No Barcode"; //} //if (qidate != "" && qitime != "") //{ // tempdatetime = qidate + " " + qitime; //} //返回去掉最后一个,号值。 //return sqlData.ToString().Substring(0, sqlData.Length - 1); return string.Join(",", strdata); } catch (Exception e) { LogFileAccess.WriteLogFile("恩格尔数据文件数值解析失败" + e.Message + e.Source + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); return "0"; } } } }