/*******************************************************************************
* 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;
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();
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[2].Value.ToString());
if (status < 0)
{
sre.Status = Constant.ServiceResultStatus.Other;
sre.Message = parameters[3].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();
}
}
}
///
/// 获取条码打印机
///
///
///
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;
}
}
}