/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:BarcodePrintLogic.cs * 2.功能描述:条码打印服务端业务逻辑 * 编辑履历: * 作者 日期 版本 修改内容 * 陈晓野 2017/03/15 1.00 新建 *******************************************************************************/ using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Drawing.Printing; using Oracle.DataAccess.Client; using Dongke.IBOSS.PRD.Basics.BaseResources; using Dongke.IBOSS.PRD.Basics.DataAccess; using Dongke.IBOSS.PRD.Service.DataModels; using Dongke.IBOSS.PRD.WCF.DataModels; using Dongke.WinForm.Controls.InvoiceLayout; namespace Dongke.IBOSS.PRD.Service.BarcodePrintService { /// /// 条码打印服务端业务逻辑 /// public static class BarcodePrintLogic { /// /// 打印条码 /// /// 条码 /// 打印份数 /// 工序打印时:null;补打时:打印机ID /// /// public static ServiceResultEntity PrintBarcode(string barcode, int copies, int? printerID, SUserInfo sUserInfo) { // TODO 异常分析 int err_lable = 0; #if DEBUG Dongke.IBOSS.PRD.Basics.Library.OutputLog.TraceLog(Dongke.IBOSS.PRD.Basics.Library.LogPriority.Debug, "PrintBarcode", "begin -- " + barcode, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), Dongke.IBOSS.PRD.Basics.Library.LocalPath.LogExePath+@"printdebug\"); #endif IDBTransaction oracleTrConn = null; string printerName = null; LayoutBox layoutBox = null; try { ServiceResultEntity sre = new ServiceResultEntity(); oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString); oracleTrConn.Connect(); if (printerID == null) { string sqlPrinterName = "SELECT p.printername\n" + " FROM tp_mst_user u\n" + " INNER JOIN tp_mst_barcodeprinter p\n" + " ON p.printerid = u.barcodeprinterid\n" + " WHERE u.userid = :userid\n" + " AND p.valueflag = '1'"; OracleParameter[] pps = new OracleParameter[]{ new OracleParameter(":userid", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input), }; printerName = oracleTrConn.GetSqlResultToStr(sqlPrinterName, pps); if (string.IsNullOrWhiteSpace(printerName)) { return sre; } } System.Drawing.Printing.PrinterSettings.StringCollection installedPrinters = System.Drawing.Printing.PrinterSettings.InstalledPrinters; if (installedPrinters.Count < 1) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "服务器没有安装打印驱动"; return sre; } err_lable = 1; //oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString); //oracleTrConn.Connect(); List parameters = new List(); // 补打时,获得打印机名 if (printerID.HasValue) { string sqlPrinterName = "SELECT p.printername\n" + " FROM tp_mst_barcodeprinter p\n" + " WHERE p.printerID = :printerID\n" + " AND p.valueflag = '1'"; parameters.Clear(); parameters.Add(new OracleParameter(":printerID", OracleDbType.Int32, printerID.Value, ParameterDirection.Input)); printerName = oracleTrConn.GetSqlResultToStr(sqlPrinterName, parameters.ToArray()); } err_lable = 2; // 工序打印时,获取当前工号配置的打印机 //if (string.IsNullOrWhiteSpace(printerName)) //{ // string sqlPrinterName = // "SELECT p.printername\n" + // " FROM tp_mst_user u\n" + // " INNER JOIN tp_mst_barcodeprinter p\n" + // " ON p.printerid = u.barcodeprinterid\n" + // " WHERE u.userid = :userid\n" + // " AND p.valueflag = '1'"; // parameters.Clear(); // parameters.Add(new OracleParameter(":userid", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input)); // printerName = oracleTrConn.GetSqlResultToStr(sqlPrinterName, parameters.ToArray()); //} err_lable = 3; if (string.IsNullOrWhiteSpace(printerName)) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "此用户没有设置打印机"; return sre; } bool hasPrinter = false; foreach (string item in installedPrinters) { if (item == printerName) { hasPrinter = true; break; } } if (!hasPrinter) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "服务器没有连接相应打印机【" + printerName + "】"; return sre; } err_lable = 4; // 打印 //LayoutBox layoutBox = new LayoutBox(); layoutBox = new LayoutBox(); err_lable = 5; layoutBox.Name = "layoutBox"; layoutBox.LayoutMode = LayoutMode.Preview; // 设置打印机 layoutBox.PrinterSettings.PrinterName = printerName; layoutBox.NumberOfCopies = copies; err_lable = 6; string message = layoutBox.CheckPrintSettingIn(PrintType.Print); if (!string.IsNullOrWhiteSpace(message)) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = message; return sre; } err_lable = 7; if (printerID != null) { string sqlString = @"select FUN_CMN_GetBarCode(:barcode,null,:accountid) From DUAL"; OracleParameter[] paras1 = new OracleParameter[]{ new OracleParameter(":barcode",OracleDbType.Varchar2, barcode,ParameterDirection.Input), new OracleParameter(":accountid",OracleDbType.Int32, sUserInfo.AccountID,ParameterDirection.Input), }; barcode = oracleTrConn.GetSqlResultToStr(sqlString, paras1); } err_lable = 8; // 获取打印数据 parameters.Clear(); parameters.Add(new OracleParameter("in_Barcode", OracleDbType.NVarchar2, barcode, ParameterDirection.Input)); parameters.Add(new OracleParameter("in_AccountID", OracleDbType.Int32, sUserInfo.AccountID, ParameterDirection.Input)); parameters.Add(new OracleParameter("in_UserID", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input)); parameters.Add(new OracleParameter("out_Status", OracleDbType.Int32, ParameterDirection.Output)); parameters.Add(new OracleParameter("out_Message", OracleDbType.NVarchar2, 2000, null, ParameterDirection.Output)); parameters.Add(new OracleParameter("out_LayoutData", OracleDbType.RefCursor, ParameterDirection.Output)); parameters.Add(new OracleParameter("out_PrintData", OracleDbType.RefCursor, ParameterDirection.Output)); DataSet data = oracleTrConn.ExecStoredProcedure("PRO_PM_GETBarCodePrintDATA", parameters.ToArray()); err_lable = 9; int status = Convert.ToInt32(parameters[3].Value.ToString()); if (status < 0) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = parameters[4].Value.ToString(); return sre; } if (data == null || data.Tables.Count != 2) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "没有打印数据"; return sre; } DataTable layoutData = data.Tables[0]; DataTable printData = data.Tables[1]; if (printData.Rows.Count == 0) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "此条码不存在"; return sre; } if (layoutData.Rows.Count == 0) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = string.Format("此产品类别【{0}】或商标【{1}】没有对应的打印模板", printData.Rows[0]["goodstypename"], printData.Rows[0]["logoname"] ); return sre; } if (printerID == null && printData.Rows.Count > 0) { int goodsCopies = Convert.ToInt32(printData.Rows[0]["printcopies"]); if (goodsCopies > 0) { copies = goodsCopies; layoutBox.NumberOfCopies = copies; } } err_lable = 10; byte[] bytes = layoutData.Rows[0]["LayoutData"] as byte[]; if (bytes != null) { //try //{ // layoutBox.ReadLayout(bytes); //} //catch (Exception ex) //{ // throw new Exception("ReadLayout", ex); //} layoutBox.ReadLayout(bytes); } err_lable = 11; bool isPrint = false; //try { //layoutBox.DataSource = printData; //layoutBox.Refresh(); layoutBox.PrintDataSource = printData; layoutBox.PrintAreaVisible = false; layoutBox.PrintBackground = false; isPrint = layoutBox.Print(false); } err_lable = 12; //catch (Exception ex) //{ // throw new Exception("Print", ex); //} if (!isPrint) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "打印失败"; return sre; } sre.Result = printData; /* // 记录打印信息 string sqlString = "INSERT INTO TP_MST_BarCodePrintLog\n" + " (BARCODE, LAYOUTID, ACCOUNTID, CREATEUSERID)\n" + "VALUES\n" + " (:BARCODE, :LAYOUTID, :ACCOUNTID, :CREATEUSERID)"; parameters.Clear(); parameters.Add(new OracleParameter(":BARCODE", OracleDbType.NVarchar2, barcode, ParameterDirection.Input)); parameters.Add(new OracleParameter(":LAYOUTID", OracleDbType.Int32, layoutData.Rows[0]["LayoutID"], ParameterDirection.Input)); parameters.Add(new OracleParameter(":ACCOUNTID", OracleDbType.Int32, sUserInfo.AccountID, ParameterDirection.Input)); parameters.Add(new OracleParameter(":CREATEUSERID", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input)); int result = oracleTrConn.ExecuteNonQuery(sqlString, parameters.ToArray()); //if (result == 0) //{ // sre.Status = Constant.ServiceResultStatus.NoModifyData; // return sre; //} */ oracleTrConn.Commit(); return sre; } catch (Exception ex) { if (oracleTrConn != null && oracleTrConn.ConnState == ConnectionState.Open) { oracleTrConn.Rollback(); } // TODO 异常分析 Dongke.IBOSS.PRD.Basics.Library.OutputLog.TraceLog(Dongke.IBOSS.PRD.Basics.Library.LogPriority.Debug, "PrintBarcode --- " + err_lable, "barcode -- " + barcode + System.Environment.NewLine + "copies -- " + copies + System.Environment.NewLine + "printerID -- " + printerID + System.Environment.NewLine + "printerName -- " + printerName + System.Environment.NewLine , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), Dongke.IBOSS.PRD.Basics.Library.LocalPath.LogExePath + @"printdebug\"); throw ex; } finally { if (oracleTrConn != null && oracleTrConn.ConnState == ConnectionState.Open) { oracleTrConn.Disconnect(); } layoutBox?.Dispose(); } } /// /// 获取条码打印机 /// /// /// public static DataSet GetBarcodePrinter(SUserInfo sUserInfo) { IDBConnection oracleConn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString); try { //获取系统参数管理的数据 string sqlString = "SELECT bp.printerid, bp.printername\n" + " FROM tp_mst_barcodeprinter bp\n" + " LEFT JOIN tp_mst_user u\n" + " ON u.userid = :userid\n" + " AND u.barcodeprinterid = bp.printerid\n" + " WHERE bp.valueflag = '1'\n" + " AND bp.accountid = :accountid\n" + " ORDER BY nvl2(u.userid, 0, 1), bp.displayno"; Oracle.DataAccess.Client.OracleParameter[] oracleParameter = new Oracle.DataAccess.Client.OracleParameter[] { new Oracle.DataAccess.Client.OracleParameter(":userid",sUserInfo.UserID), new Oracle.DataAccess.Client.OracleParameter(":accountid",sUserInfo.AccountID), }; oracleConn.Open(); DataSet result = oracleConn.GetSqlResultToDs(sqlString, oracleParameter); oracleConn.Close(); return result; } catch (Exception ex) { if (oracleConn.ConnState == ConnectionState.Open) { oracleConn.Close(); } throw ex; } finally { if (oracleConn != null && oracleConn.ConnState == ConnectionState.Open) { oracleConn.Close(); } } } /// /// 设置当期用户默认打印机配置 /// /// 打印机ID /// /// public static ServiceResultEntity SetCurrentUserPrinter(int printerID, SUserInfo sUserInfo) { IDBTransaction oracleTrConn = null; ServiceResultEntity sre = new ServiceResultEntity(); try { System.Drawing.Printing.PrinterSettings.StringCollection installedPrinters = System.Drawing.Printing.PrinterSettings.InstalledPrinters; if (installedPrinters.Count < 1) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "服务器没有安装打印驱动"; return sre; } oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString); oracleTrConn.Connect(); List parameters = new List(); string sqlPrinterName = "SELECT p.printername\n" + " FROM tp_mst_barcodeprinter p\n" + " WHERE p.printerID = :printerID\n" + " AND p.valueflag = '1'"; parameters.Add(new OracleParameter(":printerID", OracleDbType.Int32, printerID, ParameterDirection.Input)); DataTable printer = oracleTrConn.GetSqlResultToDt(sqlPrinterName, parameters.ToArray()); if (printer == null || printer.Rows.Count == 0) { sre.Status = Constant.ServiceResultStatus.Other; sre.Message = "系统中不存在此打印机"; return sre; } string sqlString = "UPDATE tp_mst_user u\n" + " SET u.barcodeprinterid = :printerid\n" + " WHERE u.userid = :userid"; parameters.Add(new OracleParameter(":userid", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input)); sre.Result = oracleTrConn.ExecuteNonQuery(sqlString, parameters.ToArray()); oracleTrConn.Commit(); } catch (Exception ex) { if (oracleTrConn != null && oracleTrConn.ConnState == ConnectionState.Open) { oracleTrConn.Rollback(); } throw ex; } finally { if (oracleTrConn != null && oracleTrConn.ConnState == ConnectionState.Open) { oracleTrConn.Disconnect(); } } return sre; } } }