using LabelManager2; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using UAS_MES_NEW.DataOperate; using UAS_MES_NEW.Entity; namespace UAS_MES_NEW.PublicMethod { internal static class COMObjManage { private static readonly object _lock = new object(); private static ApplicationClass _lblApp; private static BarTender.Application _btApp; private static bool _isInitialized = false; static DataHelper dh = SystemInf.dh; static Document doc; static FileInfo info; static BarTender.Format doc2; public static void Initialize() { lock (_lock) { if (!_isInitialized) { try { _btApp = new BarTender.Application(); _lblApp = new ApplicationClass(); BaseUtil.WriteLbl(); _isInitialized = true; } catch (Exception ex) { Cleanup(); throw new Exception("初始化COM资源失败: " + ex.Message, ex); } } } } public static BarTender.Application GetBarTenderApplication() { lock (_lock) { if (!_isInitialized) { Initialize(); } if (_btApp == null) { throw new InvalidOperationException("BarTender应用程序未初始化"); } return _btApp; } } public static ApplicationClass GetLabelManagerApplication() { lock (_lock) { if (!_isInitialized) { Initialize(); } if (_lblApp == null) { throw new InvalidOperationException("LabelManager应用程序未初始化"); } return _lblApp; } } public static void Cleanup() { lock (_lock) { try { if (_btApp != null) { _btApp.Quit(BarTender.BtSaveOptions.btDoNotSaveChanges); Marshal.ReleaseComObject(_btApp); _btApp = null; } if (_lblApp != null) { _lblApp.Quit(); Marshal.ReleaseComObject(_lblApp); _lblApp = null; } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("清理COM资源时出错: " + ex.Message); } finally { _isInitialized = false; } } } public static void SafePrint(Action printAction) { lock (_lock) { if (!_isInitialized) { Initialize(); } try { printAction(_btApp, _lblApp); } catch (Exception ex) { throw new Exception("执行打印操作时出错: " + ex.Message, ex); } finally { // 根据需求决定是否在每次操作后清理资源, 如果频繁打印,不需要每次清理 // Cleanup(); } } } public static bool CodeSoft(string iCaller, string LabelName, string LaID, string PrinterName, string SnCode, int PrintNum, string MakeCode, string ProdCode, string LabelType, string IfRePrint, out string ErrorMessage) { ErrorMessage = ""; DataTable dt = new DataTable(); if (IfRePrint != "-1") { if (LabelType == "卡通箱标" || LabelType == "大箱标" || LabelType == "栈板标") { dt = (DataTable)dh.ExecuteSql("select lpl_id from labelprintlog where lpl_value='" + SnCode + "' and lpl_type='" + LabelType + "' and lpl_stepcode='" + User.CurrentStepCode + "'", "select"); } else { dt = (DataTable)dh.ExecuteSql("select lpl_id from labelprintlog where lpl_value='" + SnCode + "' and lpl_makecode='" + MakeCode + "' and lpl_type='" + LabelType + "' and lpl_stepcode='" + User.CurrentStepCode + "'", "select"); } if (dh.getFieldDataByCondition("employee", "em_type", "em_code = '" + User.UserCode + "'").ToString() != "admin") { //如果已经打印过了,则不允许再打印 if (dt.Rows.Count > 0) { ErrorMessage = SnCode + LabelType + "已打印"; return false; } } } string filelastwritetime = dh.getFieldDataByCondition("label", "la_lastwritetime", "la_id = '" + LaID + "'").ToString(); FileInfo PrintFile = new FileInfo(LabelName); //打开模板路径 //查询模板对应的取值SQL和参数名称 dt = (DataTable)dh.ExecuteSql("select lp_name,lp_sql from label left join LABELPARAMETER on la_id=lp_laid where la_id='" + LaID + "'", "select"); StringBuilder sb = new StringBuilder(); if (!PrintFile.Exists) { MessageBox.Show("打印文件不存在"); return false; } string filechangetime = PrintFile.LastWriteTime.ToString(); if (filechangetime != filelastwritetime) { _lblApp.Quit(); _lblApp = new ApplicationClass(); BaseUtil.WriteLbl(); filechangetime = PrintFile.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); string update = "la_lastwritetime = to_date((regexp_substr('" + filechangetime + "','\\d+.+\\d+')),'yyyy-mm-dd hh24:mi:ss')"; dh.UpdateByCondition("label", update, "la_id = '" + LaID + "'"); } doc = _lblApp.Documents.Open(LabelName, true); if (doc == null) { MessageBox.Show("标签文件打开失败"); return false; } for (int k = 0; k < doc.Variables.FormVariables.Count; k++) { doc.Variables.FormVariables.Item(k + 1).Value = null; } //执行全部的SQL for (int i = 0; i < dt.Rows.Count; i++) { string sql = dt.Rows[i]["lp_sql"].ToString(); try { Regex ConnoteA = new Regex("{\\w+}"); foreach (Match mch in ConnoteA.Matches(sql)) { string x = mch.Value.Trim(); sql = sql.Replace(x, "'" + SnCode + "'"); } DataTable Param = (DataTable)dh.ExecuteSql(sql.ToString(), "select"); if (Param.Rows.Count == 0) continue; //查询的结果的参数个数大于1需要给标签的多个参数赋值 if (Param.Rows.Count > 0) { int LoopTime = Param.Rows.Count > 100 ? 100 : Param.Rows.Count; for (int j = 0; j < LoopTime; j++) { for (int k = 0; k < doc.Variables.FormVariables.Count; k++) { if (j == 0 & doc.Variables.FormVariables.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper()) { doc.Variables.FormVariables.Item(k + 1).Value = Param.Rows[0][0].ToString(); } //使用SN开头的参数赋值SN1,SN2,SN3等参数 if (doc.Variables.FormVariables.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j + 1)) { doc.Variables.FormVariables.Item(k + 1).Value = Param.Rows[j][0].ToString(); } } } } } catch (System.Exception ex) { MessageBox.Show("SQL维护不正确"); } } LogManager.DoLog(sb.ToString()); //保存本次赋值进行打印 doc.Printer.SwitchTo(PrinterName); doc.PrintDocument(PrintNum); LogicHandler.DoCommandLog(iCaller, User.UserCode, "", User.UserLineCode, User.UserSourceCode, "打印", "成功打印", SnCode, ""); for (int k = 0; k < doc.Variables.FormVariables.Count; k++) { doc.Variables.FormVariables.Item(k + 1).Value = null; } LogicHandler.doLabelPrintLog(SnCode, LabelType, MakeCode, ProdCode, User.UserSourceCode, User.CurrentStepCode, IfRePrint, User.UserCode); return true; } public static bool SinglePrint(string iCaller, string LabelName, string LaID, string PrinterName, string SnCode, int PrintNum, string MakeCode, string ProdCode, string LabelType, string IfRePrint, out string ErrorMessage) { ErrorMessage = ""; DataTable dt = new DataTable(); if (IfRePrint != "-1") { if (LabelType == "卡通箱标" || LabelType == "彩盒标" || LabelType == "栈板标" || LabelType == "机身标") { dt = (DataTable)dh.ExecuteSql("select lpl_id from labelprintlog where lpl_value='" + SnCode + "' and lpl_type='" + LabelType + "' and lpl_stepcode='" + User.CurrentStepCode + "'", "select"); } else { dt = (DataTable)dh.ExecuteSql("select lpl_id from labelprintlog where lpl_value='" + SnCode + "' and lpl_makecode='" + MakeCode + "' and lpl_type='" + LabelType + "' and lpl_stepcode='" + User.CurrentStepCode + "'", "select"); } if (dh.getFieldDataByCondition("employee", "em_type", "em_code = '" + User.UserCode + "'").ToString() != "admin") { ////如果已经打印过了,则不允许再打印 if (dt.Rows.Count > 0) { ErrorMessage = SnCode + LabelType + "已打印"; return false; } } } // string filelastwritetime = dh.getFieldDataByCondition("label", "la_lastwritetime", "la_id = '" + LaID + "'").ToString(); // FileInfo PrintFile = new FileInfo(LabelName); //打开模板路径 //查询模板对应的取值SQL和参数名称 dt = (DataTable)dh.ExecuteSql("select lp_name,lp_sql from label left join LABELPARAMETER on la_id=lp_laid where la_id='" + LaID + "'", "select"); //StringBuilder sb = new StringBuilder(); //if (!PrintFile.Exists) //{ // MessageBox.Show("打印文件不存在"); // return false; //} //string filechangetime = PrintFile.LastWriteTime.ToString(); //if (filechangetime != filelastwritetime) //{ // lbl.Dispose(); // lbl = new Engine(); // // BaseUtil.WriteLbl(); // filechangetime = PrintFile.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); // string update = "la_lastwritetime = to_date((regexp_substr('" + filechangetime + "','\\d+.+\\d+')),'yyyy-mm-dd hh24:mi:ss')"; // dh.UpdateByCondition("label", update, "la_id = '" + LaID + "'"); //} doc2 = _btApp.Formats.Open(LabelName); if (doc2 == null) { MessageBox.Show("标签文件打开失败"); return false; } //执行全部的SQL for (int i = 0; i < dt.Rows.Count; i++) { string sql = dt.Rows[i]["lp_sql"].ToString(); try { Regex ConnoteA = new Regex("{\\w+}"); foreach (Match mch in ConnoteA.Matches(sql)) { string x = mch.Value.Trim(); sql = sql.Replace(x, "'" + SnCode + "'"); } DataTable Param = (DataTable)dh.ExecuteSql(sql.ToString(), "select"); if (Param.Rows.Count == 0) continue; //查询的结果的参数个数大于1需要给标签的多个参数赋值 if (Param.Rows.Count > 0) { int LoopTime = Param.Rows.Count > 200 ? 200 : Param.Rows.Count; for (int j = 0; j < LoopTime; j++) { for (int k = 0; k < doc2.NamedSubStrings.Count; k++) { if (j == 0 & doc2.NamedSubStrings.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper()) { doc2.SetNamedSubStringValue(doc2.NamedSubStrings.Item(k + 1).Name, Param.Rows[0][0].ToString()); } //使用SN开头的参数赋值SN1,SN2,SN3等参数 //if (j != 0 & doc2.NamedSubStrings.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j)) //{ // doc2.SetNamedSubStringValue(doc2.NamedSubStrings.Item(k + 1).Name, Param.Rows[j][0].ToString()); //} if (doc2.NamedSubStrings.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j + 1)) { doc2.SetNamedSubStringValue(doc2.NamedSubStrings.Item(k + 1).Name, Param.Rows[j][0].ToString()); } } } } } catch (System.Exception ex) { MessageBox.Show("SQL维护不正确" + ex.Message); } } // LogManager.DoLog(sb.ToString()); //保存本次赋值进行打印 // doc2.Printer.SwitchTo(PrinterName); // 同样标签的份数 doc2.PrintSetup.IdenticalCopiesOfLabel = PrintNum; // 序列标签数 doc2.PrintSetup.NumberSerializedLabels = 1; doc2.PrintSetup.Printer = PrinterName; doc2.PrintOut(false, false); doc2.Close(BarTender.BtSaveOptions.btDoNotSaveChanges); LogicHandler.DoCommandLog(iCaller, User.UserCode, "", User.UserLineCode, User.UserSourceCode, "打印", "成功打印", SnCode, ""); LogicHandler.doLabelPrintLog(SnCode, LabelType, MakeCode, ProdCode, User.UserSourceCode, User.CurrentStepCode, IfRePrint, User.UserCode); //打印完毕 _btApp.Quit(BarTender.BtSaveOptions.btDoNotSaveChanges); return true; } } }