BarcodePrintLogic - 副本.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:BarcodePrintLogic.cs
  5. * 2.功能描述:条码打印服务端业务逻辑
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 陈晓野 2017/03/15 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data;
  13. using System.Drawing;
  14. using System.Drawing.Printing;
  15. using Oracle.DataAccess.Client;
  16. using Dongke.IBOSS.PRD.Basics.BaseResources;
  17. using Dongke.IBOSS.PRD.Basics.DataAccess;
  18. using Dongke.IBOSS.PRD.Service.DataModels;
  19. using Dongke.IBOSS.PRD.WCF.DataModels;
  20. using Dongke.WinForm.Controls.InvoiceLayout;
  21. namespace Dongke.IBOSS.PRD.Service.BarcodePrintService
  22. {
  23. /// <summary>
  24. /// 条码打印服务端业务逻辑
  25. /// </summary>
  26. public static class BarcodePrintLogic
  27. {
  28. /// <summary>
  29. /// 打印条码
  30. /// </summary>
  31. /// <param name="barcode">条码</param>
  32. /// <param name="copies">打印份数</param>
  33. /// <param name="printerID">工序打印时:null;补打时:打印机ID</param>
  34. /// <param name="sUserInfo"></param>
  35. /// <returns></returns>
  36. public static ServiceResultEntity PrintBarcode(string barcode, int copies, int? printerID, SUserInfo sUserInfo)
  37. {
  38. // TODO 异常分析
  39. int err_lable = 0;
  40. #if DEBUG
  41. Dongke.IBOSS.PRD.Basics.Library.OutputLog.TraceLog(Dongke.IBOSS.PRD.Basics.Library.LogPriority.Debug,
  42. "PrintBarcode",
  43. "begin -- " + barcode,
  44. DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
  45. Dongke.IBOSS.PRD.Basics.Library.LocalPath.LogExePath+@"printdebug\");
  46. #endif
  47. IDBTransaction oracleTrConn = null;
  48. string printerName = null;
  49. try
  50. {
  51. ServiceResultEntity sre = new ServiceResultEntity();
  52. oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString);
  53. oracleTrConn.Connect();
  54. if (printerID == null)
  55. {
  56. string sqlPrinterName =
  57. "SELECT p.printername\n" +
  58. " FROM tp_mst_user u\n" +
  59. " INNER JOIN tp_mst_barcodeprinter p\n" +
  60. " ON p.printerid = u.barcodeprinterid\n" +
  61. " WHERE u.userid = :userid\n" +
  62. " AND p.valueflag = '1'";
  63. OracleParameter[] pps = new OracleParameter[]{
  64. new OracleParameter(":userid", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input),
  65. };
  66. printerName = oracleTrConn.GetSqlResultToStr(sqlPrinterName, pps);
  67. if (string.IsNullOrWhiteSpace(printerName))
  68. {
  69. return sre;
  70. }
  71. }
  72. System.Drawing.Printing.PrinterSettings.StringCollection installedPrinters =
  73. System.Drawing.Printing.PrinterSettings.InstalledPrinters;
  74. if (installedPrinters.Count < 1)
  75. {
  76. sre.Status = Constant.ServiceResultStatus.Other;
  77. sre.Message = "服务器没有安装打印驱动";
  78. return sre;
  79. }
  80. err_lable = 1;
  81. //oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString);
  82. //oracleTrConn.Connect();
  83. List<OracleParameter> parameters = new List<OracleParameter>();
  84. // 补打时,获得打印机名
  85. if (printerID.HasValue)
  86. {
  87. string sqlPrinterName =
  88. "SELECT p.printername\n" +
  89. " FROM tp_mst_barcodeprinter p\n" +
  90. " WHERE p.printerID = :printerID\n" +
  91. " AND p.valueflag = '1'";
  92. parameters.Clear();
  93. parameters.Add(new OracleParameter(":printerID", OracleDbType.Int32, printerID.Value, ParameterDirection.Input));
  94. printerName = oracleTrConn.GetSqlResultToStr(sqlPrinterName, parameters.ToArray());
  95. }
  96. err_lable = 2;
  97. // 工序打印时,获取当前工号配置的打印机
  98. //if (string.IsNullOrWhiteSpace(printerName))
  99. //{
  100. // string sqlPrinterName =
  101. // "SELECT p.printername\n" +
  102. // " FROM tp_mst_user u\n" +
  103. // " INNER JOIN tp_mst_barcodeprinter p\n" +
  104. // " ON p.printerid = u.barcodeprinterid\n" +
  105. // " WHERE u.userid = :userid\n" +
  106. // " AND p.valueflag = '1'";
  107. // parameters.Clear();
  108. // parameters.Add(new OracleParameter(":userid", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input));
  109. // printerName = oracleTrConn.GetSqlResultToStr(sqlPrinterName, parameters.ToArray());
  110. //}
  111. err_lable = 3;
  112. if (string.IsNullOrWhiteSpace(printerName))
  113. {
  114. sre.Status = Constant.ServiceResultStatus.Other;
  115. sre.Message = "此用户没有设置打印机";
  116. return sre;
  117. }
  118. bool hasPrinter = false;
  119. foreach (string item in installedPrinters)
  120. {
  121. if (item == printerName)
  122. {
  123. hasPrinter = true;
  124. break;
  125. }
  126. }
  127. if (!hasPrinter)
  128. {
  129. sre.Status = Constant.ServiceResultStatus.Other;
  130. sre.Message = "服务器没有连接相应打印机【" + printerName + "】";
  131. return sre;
  132. }
  133. err_lable = 4;
  134. // 打印
  135. LayoutBox layoutBox = new LayoutBox();
  136. err_lable = 5;
  137. layoutBox.Name = "layoutBox";
  138. layoutBox.LayoutMode = LayoutMode.Preview;
  139. // 设置打印机
  140. layoutBox.PrinterSettings.PrinterName = printerName;
  141. layoutBox.NumberOfCopies = copies;
  142. err_lable = 6;
  143. string message = layoutBox.CheckPrintSettingIn(PrintType.Print);
  144. if (!string.IsNullOrWhiteSpace(message))
  145. {
  146. sre.Status = Constant.ServiceResultStatus.Other;
  147. sre.Message = message;
  148. return sre;
  149. }
  150. err_lable = 7;
  151. if (printerID != null)
  152. {
  153. string sqlString = @"select FUN_CMN_GetBarCode(:barcode,null,:accountid) From DUAL";
  154. OracleParameter[] paras1 = new OracleParameter[]{
  155. new OracleParameter(":barcode",OracleDbType.Varchar2, barcode,ParameterDirection.Input),
  156. new OracleParameter(":accountid",OracleDbType.Int32, sUserInfo.AccountID,ParameterDirection.Input),
  157. };
  158. barcode = oracleTrConn.GetSqlResultToStr(sqlString, paras1);
  159. }
  160. err_lable = 8;
  161. // 获取打印数据
  162. parameters.Clear();
  163. parameters.Add(new OracleParameter("in_Barcode", OracleDbType.NVarchar2, barcode, ParameterDirection.Input));
  164. parameters.Add(new OracleParameter("in_AccountID", OracleDbType.Int32, sUserInfo.AccountID, ParameterDirection.Input));
  165. parameters.Add(new OracleParameter("in_UserID", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input));
  166. parameters.Add(new OracleParameter("out_Status", OracleDbType.Int32, ParameterDirection.Output));
  167. parameters.Add(new OracleParameter("out_Message", OracleDbType.NVarchar2, 2000, null, ParameterDirection.Output));
  168. parameters.Add(new OracleParameter("out_LayoutData", OracleDbType.RefCursor, ParameterDirection.Output));
  169. parameters.Add(new OracleParameter("out_PrintData", OracleDbType.RefCursor, ParameterDirection.Output));
  170. DataSet data = oracleTrConn.ExecStoredProcedure("PRO_PM_GETBarCodePrintDATA", parameters.ToArray());
  171. err_lable = 9;
  172. int status = Convert.ToInt32(parameters[2].Value.ToString());
  173. if (status < 0)
  174. {
  175. sre.Status = Constant.ServiceResultStatus.Other;
  176. sre.Message = parameters[3].Value.ToString();
  177. return sre;
  178. }
  179. if (data == null || data.Tables.Count != 2)
  180. {
  181. sre.Status = Constant.ServiceResultStatus.Other;
  182. sre.Message = "没有打印数据";
  183. return sre;
  184. }
  185. DataTable layoutData = data.Tables[0];
  186. DataTable printData = data.Tables[1];
  187. if (printData.Rows.Count == 0)
  188. {
  189. sre.Status = Constant.ServiceResultStatus.Other;
  190. sre.Message = "此条码不存在";
  191. return sre;
  192. }
  193. if (layoutData.Rows.Count == 0)
  194. {
  195. sre.Status = Constant.ServiceResultStatus.Other;
  196. sre.Message = string.Format("此产品类别【{0}】或商标【{1}】没有对应的打印模板",
  197. printData.Rows[0]["goodstypename"],
  198. printData.Rows[0]["logoname"]
  199. );
  200. return sre;
  201. }
  202. if (printerID == null && printData.Rows.Count > 0)
  203. {
  204. int goodsCopies = Convert.ToInt32(printData.Rows[0]["printcopies"]);
  205. if (goodsCopies > 0)
  206. {
  207. copies = goodsCopies;
  208. layoutBox.NumberOfCopies = copies;
  209. }
  210. }
  211. err_lable = 10;
  212. byte[] bytes = layoutData.Rows[0]["LayoutData"] as byte[];
  213. if (bytes != null)
  214. {
  215. //try
  216. //{
  217. // layoutBox.ReadLayout(bytes);
  218. //}
  219. //catch (Exception ex)
  220. //{
  221. // throw new Exception("ReadLayout", ex);
  222. //}
  223. layoutBox.ReadLayout(bytes);
  224. }
  225. err_lable = 11;
  226. bool isPrint = false;
  227. //try
  228. {
  229. //layoutBox.DataSource = printData;
  230. //layoutBox.Refresh();
  231. layoutBox.PrintDataSource = printData;
  232. layoutBox.PrintAreaVisible = false;
  233. layoutBox.PrintBackground = false;
  234. isPrint = layoutBox.Print(false);
  235. }
  236. err_lable = 12;
  237. //catch (Exception ex)
  238. //{
  239. // throw new Exception("Print", ex);
  240. //}
  241. if (!isPrint)
  242. {
  243. sre.Status = Constant.ServiceResultStatus.Other;
  244. sre.Message = "打印失败";
  245. return sre;
  246. }
  247. sre.Result = printData;
  248. /*
  249. // 记录打印信息
  250. string sqlString = "INSERT INTO TP_MST_BarCodePrintLog\n" +
  251. " (BARCODE, LAYOUTID, ACCOUNTID, CREATEUSERID)\n" +
  252. "VALUES\n" +
  253. " (:BARCODE, :LAYOUTID, :ACCOUNTID, :CREATEUSERID)";
  254. parameters.Clear();
  255. parameters.Add(new OracleParameter(":BARCODE", OracleDbType.NVarchar2, barcode, ParameterDirection.Input));
  256. parameters.Add(new OracleParameter(":LAYOUTID", OracleDbType.Int32, layoutData.Rows[0]["LayoutID"], ParameterDirection.Input));
  257. parameters.Add(new OracleParameter(":ACCOUNTID", OracleDbType.Int32, sUserInfo.AccountID, ParameterDirection.Input));
  258. parameters.Add(new OracleParameter(":CREATEUSERID", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input));
  259. int result = oracleTrConn.ExecuteNonQuery(sqlString, parameters.ToArray());
  260. //if (result == 0)
  261. //{
  262. // sre.Status = Constant.ServiceResultStatus.NoModifyData;
  263. // return sre;
  264. //}
  265. */
  266. oracleTrConn.Commit();
  267. return sre;
  268. }
  269. catch (Exception ex)
  270. {
  271. if (oracleTrConn != null &&
  272. oracleTrConn.ConnState == ConnectionState.Open)
  273. {
  274. oracleTrConn.Rollback();
  275. }
  276. // TODO 异常分析
  277. Dongke.IBOSS.PRD.Basics.Library.OutputLog.TraceLog(Dongke.IBOSS.PRD.Basics.Library.LogPriority.Debug,
  278. "PrintBarcode --- " + err_lable,
  279. "barcode -- " + barcode + System.Environment.NewLine +
  280. "copies -- " + copies + System.Environment.NewLine +
  281. "printerID -- " + printerID + System.Environment.NewLine +
  282. "printerName -- " + printerName + System.Environment.NewLine
  283. ,
  284. DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
  285. Dongke.IBOSS.PRD.Basics.Library.LocalPath.LogExePath + @"printdebug\");
  286. throw ex;
  287. }
  288. finally
  289. {
  290. if (oracleTrConn != null &&
  291. oracleTrConn.ConnState == ConnectionState.Open)
  292. {
  293. oracleTrConn.Disconnect();
  294. }
  295. }
  296. }
  297. /// <summary>
  298. /// 获取条码打印机
  299. /// </summary>
  300. /// <param name="sUserInfo"></param>
  301. /// <returns></returns>
  302. public static DataSet GetBarcodePrinter(SUserInfo sUserInfo)
  303. {
  304. IDBConnection oracleConn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString);
  305. try
  306. {
  307. //获取系统参数管理的数据
  308. string sqlString = "SELECT bp.printerid, bp.printername\n" +
  309. " FROM tp_mst_barcodeprinter bp\n" +
  310. " LEFT JOIN tp_mst_user u\n" +
  311. " ON u.userid = :userid\n" +
  312. " AND u.barcodeprinterid = bp.printerid\n" +
  313. " WHERE bp.valueflag = '1'\n" +
  314. " AND bp.accountid = :accountid\n" +
  315. " ORDER BY nvl2(u.userid, 0, 1), bp.displayno";
  316. Oracle.DataAccess.Client.OracleParameter[] oracleParameter = new Oracle.DataAccess.Client.OracleParameter[]
  317. {
  318. new Oracle.DataAccess.Client.OracleParameter(":userid",sUserInfo.UserID),
  319. new Oracle.DataAccess.Client.OracleParameter(":accountid",sUserInfo.AccountID),
  320. };
  321. oracleConn.Open();
  322. DataSet result = oracleConn.GetSqlResultToDs(sqlString, oracleParameter);
  323. oracleConn.Close();
  324. return result;
  325. }
  326. catch (Exception ex)
  327. {
  328. if (oracleConn.ConnState == ConnectionState.Open)
  329. {
  330. oracleConn.Close();
  331. }
  332. throw ex;
  333. }
  334. finally
  335. {
  336. if (oracleConn != null &&
  337. oracleConn.ConnState == ConnectionState.Open)
  338. {
  339. oracleConn.Close();
  340. }
  341. }
  342. }
  343. /// <summary>
  344. /// 设置当期用户默认打印机配置
  345. /// </summary>
  346. /// <param name="printerID">打印机ID</param>
  347. /// <param name="sUserInfo"></param>
  348. /// <returns></returns>
  349. public static ServiceResultEntity SetCurrentUserPrinter(int printerID, SUserInfo sUserInfo)
  350. {
  351. IDBTransaction oracleTrConn = null;
  352. ServiceResultEntity sre = new ServiceResultEntity();
  353. try
  354. {
  355. System.Drawing.Printing.PrinterSettings.StringCollection installedPrinters =
  356. System.Drawing.Printing.PrinterSettings.InstalledPrinters;
  357. if (installedPrinters.Count < 1)
  358. {
  359. sre.Status = Constant.ServiceResultStatus.Other;
  360. sre.Message = "服务器没有安装打印驱动";
  361. return sre;
  362. }
  363. oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString);
  364. oracleTrConn.Connect();
  365. List<OracleParameter> parameters = new List<OracleParameter>();
  366. string sqlPrinterName =
  367. "SELECT p.printername\n" +
  368. " FROM tp_mst_barcodeprinter p\n" +
  369. " WHERE p.printerID = :printerID\n" +
  370. " AND p.valueflag = '1'";
  371. parameters.Add(new OracleParameter(":printerID", OracleDbType.Int32, printerID, ParameterDirection.Input));
  372. DataTable printer = oracleTrConn.GetSqlResultToDt(sqlPrinterName, parameters.ToArray());
  373. if (printer == null || printer.Rows.Count == 0)
  374. {
  375. sre.Status = Constant.ServiceResultStatus.Other;
  376. sre.Message = "系统中不存在此打印机";
  377. return sre;
  378. }
  379. string sqlString = "UPDATE tp_mst_user u\n" +
  380. " SET u.barcodeprinterid = :printerid\n" +
  381. " WHERE u.userid = :userid";
  382. parameters.Add(new OracleParameter(":userid", OracleDbType.Int32, sUserInfo.UserID, ParameterDirection.Input));
  383. sre.Result = oracleTrConn.ExecuteNonQuery(sqlString, parameters.ToArray());
  384. oracleTrConn.Commit();
  385. }
  386. catch (Exception ex)
  387. {
  388. if (oracleTrConn != null &&
  389. oracleTrConn.ConnState == ConnectionState.Open)
  390. {
  391. oracleTrConn.Rollback();
  392. }
  393. throw ex;
  394. }
  395. finally
  396. {
  397. if (oracleTrConn != null &&
  398. oracleTrConn.ConnState == ConnectionState.Open)
  399. {
  400. oracleTrConn.Disconnect();
  401. }
  402. }
  403. return sre;
  404. }
  405. }
  406. }