using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Data; using System.Collections; using NPOIReport; using System.Diagnostics; using System.Runtime.InteropServices; using Estsh.Client.Base; using System.Windows.Forms; using Com.Estsh.MES.App; using ApServerProvider; using MainProgram; using MainProgram.BLL; using ZPLPrinter; using Esi.Mes.LabelPrinter; using LabelManager2; namespace Estsh.Client.StepLibrary { public class PrintQA : StepBase { //计数器数量 private string _PrdCount = string.Empty; private static string BarTenderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\Bartend\bartend.exe"); private static string LabelPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\LabelFile"); private static object _lock_print_object = new object(); private const char TAB = '\t'; private const string NEW_LINE = "\r\n"; private List dtLabel = null; private static int terminal_id; private static CodesoftPrinter m_csPrinter = null; public static bool PrintSerialNumber(List snData, string templateFile, string txtDataFile, List CustPartNoList, List dtpartPrint, bool iffalse) { string LabelTemplatePath = Path.Combine(LabelPath, templateFile); string LabelTextPath = Path.Combine(LabelPath, "QA" + ".txt"); string LabelFilePathQA = Path.Combine(LabelPath, "QA.Lab"); string LabelTextPathBZ = Path.Combine(LabelPath, "BZ.txt"); string LabelFilePathBZ = Path.Combine(LabelPath, "BZ.Lab"); string LabelFilePathBZTWO = Path.Combine(LabelPath, "BZTWO.Lab"); if (!CommonListData.CheckDataValid(snData)) return false; StringBuilder PrintContent = new StringBuilder(); foreach (DataRow dr in snData) { PrintContent.Append(dr["csn"].ToString()); PrintContent.Append(TAB); //1 PrintContent.Append(dr["type_desc"].ToString()); PrintContent.Append(TAB); //2 PrintContent.Append(dr["model_name"].ToString()); PrintContent.Append(TAB); //3 PrintContent.Append(dr["part_spec"].ToString()); PrintContent.Append(TAB); //4 PrintContent.Append(dr["serial_number"].ToString()); PrintContent.Append(TAB); //5 PrintContent.Append(dr["create_time"].ToString()); PrintContent.Append(TAB); //6 PrintContent.Append(dr["model_alias"].ToString()); PrintContent.Append(TAB); //7 PrintContent.Append(dr["number_T"].ToString()); PrintContent.Append(TAB); PrintContent.Append(dr["part_T"].ToString()); PrintContent.Append(TAB); //盐城改过8 PrintContent.Append(dr["part_no"].ToString()); PrintContent.Append(TAB); //8 PrintContent.Append(dr["car_no"].ToString()); PrintContent.Append(TAB); //9 PrintContent.Append(dr["part_no"].ToString()); PrintContent.Append(TAB); //10 //PrintContent.Append(dr["part_spec2"].ToString()); PrintContent.Append(TAB); //11 //PrintContent.Append(dr["part_location"].ToString()); PrintContent.Append(TAB); //12 #region 湘潭麦格纳特殊处理 try { if (dr["part_location"].ToString() != "01" || dr["part_location"].ToString() != "02") { PrintContent.Append(CustPartNoList[0]["cust_part_no"].ToString()); PrintContent.Append(TAB); //13 PrintContent.Append(CustPartNoList[1]["cust_part_no"].ToString()); PrintContent.Append(TAB); //14 PrintContent.Append(CustPartNoList[2]["cust_part_no"].ToString()); PrintContent.Append(TAB); //15 } else { PrintContent.Append(dr["cust_part_no"].ToString()); PrintContent.Append(TAB); //13 PrintContent.Append(""); PrintContent.Append(TAB); //14 PrintContent.Append(""); PrintContent.Append(TAB); //15 } } catch { PrintContent.Append(dr["cust_part_no"].ToString()); PrintContent.Append(TAB); //13 PrintContent.Append(""); PrintContent.Append(TAB); //14 PrintContent.Append(""); PrintContent.Append(TAB); //15 } #endregion PrintContent.Append(dr["part_class"].ToString()); PrintContent.Append(TAB); //14 PrintContent.Append(dr["label_type"].ToString()); PrintContent.Append(TAB); //15 PrintContent.Append(dr["part_no_3c"].ToString()); PrintContent.Append(TAB); //16 PrintContent.Append(dr["model_code"].ToString()); PrintContent.Append(TAB); //17 PrintContent.Append(dr["model_alias"].ToString()); PrintContent.Append(TAB); //18 PrintContent.Append(dr["enum_desc"].ToString()); PrintContent.Append(TAB); //19 PrintContent.Append(dr["prod_type"].ToString()); PrintContent.Append(TAB); //20 PrintContent.Append(dr["model_name"].ToString()); PrintContent.Append(TAB); //21 PrintContent.Append(dr["type_name"].ToString()); PrintContent.Append(TAB); //22 PrintContent.Append(Environment.NewLine); lock (_lock_print_object) { WritePrintLog(PrintContent.ToString()); if (iffalse) { if (dtpartPrint.Count > 0) { string printName = dtpartPrint[0]["print_name"].ToString(); string port = dtpartPrint[0]["print_port"].ToString(); string strFile = LabelFilePathBZTWO; ApplicationClass lbl = new LabelManager2.ApplicationClass(); LabelManager2.Document doc = lbl.ActiveDocument; lbl.Documents.Open(strFile, false);//调用设好的lbl标签 doc = lbl.ActiveDocument; doc.Printer.SwitchTo(printName, port, true); //codesoft模板中标签变量 doc.Variables.FreeVariables.Item("car_no").Value = dr["car_no"].ToString(); doc.Variables.FreeVariables.Item("create_time").Value = dr["create_time"].ToString(); doc.Variables.FreeVariables.Item("csn").Value = dr["csn"].ToString(); doc.Variables.FreeVariables.Item("enum_desc").Value = dr["enum_desc"].ToString(); doc.Variables.FreeVariables.Item("label_type").Value = dr["label_type"].ToString(); doc.Variables.FreeVariables.Item("model_alias").Value = dr["model_alias"].ToString(); doc.Variables.FreeVariables.Item("model_code").Value = dr["model_code"].ToString(); doc.Variables.FreeVariables.Item("model_name").Value = dr["model_name"].ToString(); doc.Variables.FreeVariables.Item("number_T").Value = dr["number_T"].ToString(); doc.Variables.FreeVariables.Item("part_class").Value = dr["part_class"].ToString(); doc.Variables.FreeVariables.Item("part_no").Value = dr["part_no"].ToString(); doc.Variables.FreeVariables.Item("part_no_3c").Value = dr["part_no_3c"].ToString(); doc.Variables.FreeVariables.Item("part_spec").Value = dr["part_spec"].ToString(); doc.Variables.FreeVariables.Item("part_T").Value = dr["part_T"].ToString(); doc.Variables.FreeVariables.Item("prod_type").Value = dr["prod_type"].ToString(); doc.Variables.FreeVariables.Item("serial_number").Value = dr["serial_number"].ToString(); doc.Variables.FreeVariables.Item("type_desc").Value = dr["type_desc"].ToString(); doc.Variables.FreeVariables.Item("type_name").Value = dr["type_name"].ToString(); doc.PrintLabel(1, 1, 1, 1, 1, strFile); //标签批量连续打印。FormFeed()必须等参数变量输出后才执行,输出给打印机。 doc.FormFeed(); lbl.Quit(); doc = null; } else { //2.使用CodeSoft打印 PrintCodeSoftSerialNumber(dr, LabelFilePathBZ, m_csPrinter, CustPartNoList); } } else { PrintCodeSoftSerialNumber(dr, LabelFilePathQA, m_csPrinter, CustPartNoList); //1.使用BarTender打印 //BarTenderPrinter.WriteFile(LabelTextPath, PrintContent.ToString(), Encoding.UTF8, false); //BarTenderPrinter.Print(BarTenderPath, LabelFilePath); //BarTenderPrinter.WriteFile(LabelTextPathBZ, PrintContent.ToString(), Encoding.UTF8, false); //BarTenderPrinter.Print(BarTenderPath, LabelFilePathBZ); //2.使用CodeSoft打印 PrintCodeSoftSerialNumber(dr, LabelFilePathBZ, m_csPrinter, CustPartNoList); } } return true; } return true; } public static bool PrintCodeSoftSerialNumber(DataRow snData, string LabelTextPath, CodesoftPrinter csPrinter,List CustPartNoList) { //string LabelTemplatePath = Path.Combine(LabelPath, labelFileName); //m_csPrinter = csPrinter; Dictionary printData = new Dictionary(); printData.Add("car_no", snData["car_no"].ToString()); printData.Add("create_time", snData["create_time"].ToString()); printData.Add("csn", snData["csn"].ToString()); if (snData["part_location"].ToString() != "01" || snData["part_location"].ToString() != "02") { printData.Add("cust_part_no1", CustPartNoList[0]["cust_part_no"].ToString()); printData.Add("cust_part_no2", CustPartNoList[1]["cust_part_no"].ToString()); printData.Add("cust_part_no3", CustPartNoList[2]["cust_part_no"].ToString()); } else { printData.Add("cust_part_no1", snData["cust_part_no"].ToString()); printData.Add("cust_part_no2", ""); printData.Add("cust_part_no3", ""); } printData.Add("enum_desc", snData["enum_desc"].ToString()); printData.Add("label_type", snData["label_type"].ToString()); printData.Add("model_alias", snData["model_alias"].ToString()); printData.Add("model_code", snData["model_code"].ToString()); printData.Add("model_name", snData["model_name"].ToString()); printData.Add("number_T", snData["number_T"].ToString()); printData.Add("part_class", snData["part_class"].ToString()); printData.Add("part_no", snData["part_no"].ToString()); printData.Add("part_no_3c", snData["part_no_3c"].ToString()); printData.Add("part_spec", snData["part_spec"].ToString()); printData.Add("part_T", snData["part_T"].ToString()); printData.Add("prod_type", snData["prod_type"].ToString()); printData.Add("serial_number", snData["serial_number"].ToString()); printData.Add("type_desc", snData["type_desc"].ToString()); printData.Add("type_name", snData["type_name"].ToString()); csPrinter.DoPrint(LabelTextPath, printData, 1); return true; } private static void WritePrintLog(string msgText) { string logPath = AppDomain.CurrentDomain.BaseDirectory + @"\\PrintLog"; try { if (!System.IO.Directory.Exists(logPath)) { System.IO.Directory.CreateDirectory(logPath); } string txtMsgPath = logPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; string timeStamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss-->"); using (StreamWriter sw = new StreamWriter(txtMsgPath, true)) { sw.WriteLine(timeStamp + msgText.ToString()); sw.Flush(); sw.Close(); } } catch (System.Exception ex) { } } /// /// 输入到打印机 /// /// BarTender.exe 的路径 /// *.btw 文件的路径 public static void Print(string bartendPath, string labelPath) { Process process = new Process(); process.StartInfo = new ProcessStartInfo(ToShortPathName(bartendPath), @" /F=" + ToShortPathName(labelPath) + " /p /x"); process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.RedirectStandardOutput = true; try { process.Start(); //process.WaitForExit(100*1000); //等待上述进程执行完毕 process.WaitForExit(100*10); //等待上述进程执行完毕 if (process.HasExited == false) //程序停止响应处理 { process.Kill(); process.Dispose(); } } catch { process.Kill(); process.Dispose(); } } /// /// 获取短路径 /// /// 长路径 /// 短路径 /// 短路径的长度 /// 执行结果 [DllImport("kernel32.dll ", CharSet = CharSet.Auto)] public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath, int shortPathLength); /// /// 把长路径转化为短路径(兼容 WIN 98 格式) /// /// 长路径 /// 短路径 public static string ToShortPathName(string longName) { StringBuilder shortNameBuffer = new StringBuilder(256); int bufferSize = shortNameBuffer.Capacity; int result = GetShortPathName(longName, shortNameBuffer, bufferSize); return shortNameBuffer.ToString(); } /// /// 执行工步操作 /// /// 执行结果 public override bool Do() { //本地计数器 CountRead(); MESPrintSN _app = new MESPrintSN(App); Action(this, new EventArgs()); string inputSN = Context["serial_number"].ToString(); terminal_id = Convert.ToInt32(Context["terminal_id"].ToString()); bool useJupStep = Context.Contains("useJupStep"); //从临时表(g_sn_keydata_temp)中转移扭矩数据到(g_sn_keydata) //bool moveKeyData = _app.moveKeyData(inputSN); ////跳工步不打印合格证条码 //if (!useJupStep) //{ if (m_csPrinter == null) { try { m_csPrinter = new CodesoftPrinter(); } catch { ShowMessage(this, "red|请检查打印软件是否安装!"); return false; } } m_csPrinter = (CodesoftPrinter)Context["m_csPrinter"]; dtLabel = _app.GetPrintSN(inputSN); //查询该零件是否需要指定打印机 List dtpartPrint = _app.getPartPrintList(terminal_id, dtLabel[0]["part_no"].ToString()); bool iffalse = _app.ifTerminalPrint(terminal_id); List CustPartNoList = new DataTable(); if (dtLabel.Count > 0) { string modelName = dtLabel[0]["model_name"].ToString(); CustPartNoList = _app.getCustPartNoList(modelName); } ShowMessage(this, "green|条码正在打印中,条码: " + dtLabel[0]["csn"].ToString()); #region //string rule = dtLabel[0]["label_type"].ToString(); ////解决2SV部分总成的3C零件号在不同配置中是不一样的 //if (rule.ToUpper() == "RULE04") //{ // string PartNo3c = dtLabel[0]["part_no_3c"].ToString(); // string modelID = dtLabel[0]["model_id"].ToString(); // string partID = dtLabel[0]["part_id"].ToString(); // string ReplacePartNo3c = _app.GetPartNO3c(PartNo3c, modelID, partID); // dtLabel[0]["part_no_3c"] = ReplacePartNo3c; //} ////只有一个客户零件号的总成是不需要维护在对应表中的 ////(如果查出对应表中的客户零件号则以查出的为准,否则使用总成信息表中维护的客户零件号) //if (rule.ToUpper() == "RULE03") //{ // string custPartNo = dtLabel[0]["cust_partno"].ToString(); // string custPartNo2 = dtLabel[0]["cust_part_no"].ToString(); // if (string.IsNullOrEmpty(custPartNo)) // { // dtLabel[0]["cust_partno"] = custPartNo2; // } //} #endregion PrintSerialNumber(dtLabel, LabelPath, "", CustPartNoList, dtpartPrint, iffalse); _app.UpdatePrintCount(inputSN); //本地计数器 CountAdd(); Context.Remove("useJupStep"); //更新条码状态为下线 _app.updateStatus(inputSN); string stationType = _app.stationType(Context["terminal_id"].ToString()); try { string tres = _app.ProdTrans(0, Context["serial_number"].ToString(), Convert.ToInt32(Context["terminal_id"].ToString()), 0, stationType); if (tres.ToUpper() != "OK") { ShowMessage(this, "red|" + tres + ""); return false; } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter("ProdTrans-" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", true)) { sw.WriteLine(string.Format("{0} {1} {2}", "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ProdTrans", Context["serial_number"].ToString(), ex)); sw.Flush(); sw.Close(); } } Complate(this, new EventArgs()); return base.Do(); } private void InitializeComponent() { this.SuspendLayout(); // // PrintQA // this.Name = "PrintQA"; this.Size = new System.Drawing.Size(223, 129); this.ResumeLayout(false); } private void CountAdd() { string value = _PrdCount; int count = 0; try { count = Convert.ToInt32(value); count++; _PrdCount = count.ToString(); } catch { _PrdCount = "1"; } try { StreamWriter sw = new StreamWriter("InPdlineCount.txt"); sw.Write(count.ToString()); sw.Flush(); sw.Close(); } catch { ShowMessage(this, "计数器更新错误,未知!"); } } private void CountRead() { try { if (File.Exists("InPdlineCount.txt")) { FileStream fs = new FileStream(@"InPdlineCount.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); string content = sr.ReadToEnd(); //一次性读取全部数据 _PrdCount = content; fs.Close(); sr.Close(); } else { _PrdCount = "0"; } } catch { _PrdCount = "0"; ShowMessage(this, "计数器更新错误,未知!"); } } } }