You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
12 KiB

  1. import QRCode from 'qrcode';
  2. /**
  3. * 标签打印模板 Mixin
  4. * 提供 A001A002A003 三种标签打印模板的通用方法
  5. */
  6. export default {
  7. methods: {
  8. /**
  9. * 生成二维码图片的Base64字符串
  10. * @param {string} text - 二维码内容
  11. * @param {number} size - 二维码尺寸像素
  12. * @returns {Promise<string>} - Base64图片字符串
  13. */
  14. async generateQRCodeImage(text, size = 150) {
  15. try {
  16. const dataUrl = await QRCode.toDataURL(text, {
  17. width: size,
  18. margin: 0,
  19. errorCorrectionLevel: 'M'
  20. });
  21. return dataUrl;
  22. } catch (err) {
  23. console.error('生成二维码失败:', err);
  24. return '';
  25. }
  26. },
  27. // A001 标签打印(70mm x 30mm)- 左边二维码,右边文字信息
  28. // 布局:2mm边距,左侧二维码区20mm,右侧文字区,底部两行物料名称
  29. async printLabelA001(LODOP, printData, isNewPage){
  30. if(isNewPage){
  31. LODOP.NEWPAGE();
  32. }
  33. // ============================================================
  34. // 1. 纸张设置
  35. // ============================================================
  36. // 纸张大小 70mm x 30mm,留2mm边距,实际打印区域 66mm x 26mm
  37. LODOP.SET_PRINT_PAGESIZE(0, 700, 300, '');
  38. // ============================================================
  39. // 2. 绘制边框和分隔线
  40. // ============================================================
  41. // 外边框(2mm边距,66mm宽 x 26mm高)
  42. LODOP.ADD_PRINT_RECT('2mm', '2mm', '66mm', '26mm', 0, 1);
  43. // 垂直分隔线:左右分隔(二维码区18mm,文字区48mm)
  44. LODOP.ADD_PRINT_LINE('2mm', '20mm', '19mm', '20mm', 0, 1);
  45. // 水平分隔线1:编码下方
  46. LODOP.ADD_PRINT_LINE('7mm', '20mm', '7mm', '68mm', 0, 1);
  47. // 水平分隔线2:型号下方
  48. LODOP.ADD_PRINT_LINE('11mm', '20mm', '11mm', '68mm', 0, 1);
  49. // 水平分隔线3:数量下方
  50. LODOP.ADD_PRINT_LINE('15mm', '20mm', '15mm', '68mm', 0, 1);
  51. // 水平分隔线4:批号下方,同时是物料描述区上边界(横跨整个宽度)
  52. LODOP.ADD_PRINT_LINE('19mm', '2mm', '19mm', '68mm', 0, 1);
  53. // ============================================================
  54. // 3. 左侧二维码(使用LODOP自带二维码)
  55. // ============================================================
  56. // 可见区域:18mm(宽) x 17mm(高)
  57. // 二维码有默认白边(静区),需放大约20%让白边溢出到框外
  58. const qrContent = printData.rollNo || '';
  59. if (qrContent) {
  60. // 位置:top=2mm, left=2mm(往右下移动)
  61. const qrIndex = LODOP.ADD_PRINT_BARCODE('2mm', '2.5mm', '21mm', '20mm', 'QRCode', qrContent);
  62. LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 0); // 自动选择版本
  63. LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M");
  64. }
  65. // ============================================================
  66. // 4. 右侧文字信息(4行)- 字体6号
  67. // ============================================================
  68. const labelX = '21mm'; // 标签列起始位置
  69. const valueX = '32mm'; // 值列起始位置(从30mm改为32mm,给标签留更多空间)
  70. const labelWidth = '11mm'; // 标签列宽度(从9mm改为11mm,确保冒号能显示)
  71. const valueWidth = '35mm'; // 值列宽度
  72. const fontSize = 6; // 字体大小
  73. // 编码(第1行)
  74. const label1 = LODOP.ADD_PRINT_TEXT('3.5mm', labelX, labelWidth, '3mm', '编码:');
  75. LODOP.SET_PRINT_STYLEA(label1, "FontName", "Microsoft YaHei");
  76. LODOP.SET_PRINT_STYLEA(label1, "FontSize", fontSize);
  77. const value1 = LODOP.ADD_PRINT_TEXT('3.5mm', valueX, valueWidth, '3mm', printData.partNo || '');
  78. LODOP.SET_PRINT_STYLEA(value1, "FontName", "Microsoft YaHei");
  79. LODOP.SET_PRINT_STYLEA(value1, "FontSize", fontSize);
  80. LODOP.SET_PRINT_STYLEA(value1, "Bold", 1);
  81. // 型号(第2行)
  82. const label2 = LODOP.ADD_PRINT_TEXT('7.5mm', labelX, labelWidth, '3mm', '型号:');
  83. LODOP.SET_PRINT_STYLEA(label2, "FontName", "Microsoft YaHei");
  84. LODOP.SET_PRINT_STYLEA(label2, "FontSize", fontSize);
  85. const value2 = LODOP.ADD_PRINT_TEXT('7.5mm', valueX, valueWidth, '3mm', printData.spec || '');
  86. LODOP.SET_PRINT_STYLEA(value2, "FontName", "Microsoft YaHei");
  87. LODOP.SET_PRINT_STYLEA(value2, "FontSize", fontSize);
  88. // 数量(第3行)
  89. const label3 = LODOP.ADD_PRINT_TEXT('11.5mm', labelX, labelWidth, '3mm', '数量:');
  90. LODOP.SET_PRINT_STYLEA(label3, "FontName", "Microsoft YaHei");
  91. LODOP.SET_PRINT_STYLEA(label3, "FontSize", fontSize);
  92. const value3 = LODOP.ADD_PRINT_TEXT('11.5mm', valueX, valueWidth, '3mm', printData.quantity || '');
  93. LODOP.SET_PRINT_STYLEA(value3, "FontName", "Microsoft YaHei");
  94. LODOP.SET_PRINT_STYLEA(value3, "FontSize", fontSize);
  95. // 批号(第4行)
  96. const label4 = LODOP.ADD_PRINT_TEXT('15.5mm', labelX, labelWidth, '3mm', '批号:');
  97. LODOP.SET_PRINT_STYLEA(label4, "FontName", "Microsoft YaHei");
  98. LODOP.SET_PRINT_STYLEA(label4, "FontSize", fontSize);
  99. const value4 = LODOP.ADD_PRINT_TEXT('15.5mm', valueX, valueWidth, '3mm', printData.batchNo || '');
  100. LODOP.SET_PRINT_STYLEA(value4, "FontName", "Microsoft YaHei");
  101. LODOP.SET_PRINT_STYLEA(value4, "FontSize", fontSize);
  102. // ============================================================
  103. // 5. 底部物料名称(2行)- 横跨整个宽度
  104. // ============================================================
  105. const partDesc = printData.partDesc || '';
  106. // 底部区域:从19mm分隔线下方开始,高度约8mm,可显示两行文字
  107. const descText = LODOP.ADD_PRINT_TEXT('19.5mm', '3mm', '63mm', '8mm', partDesc);
  108. LODOP.SET_PRINT_STYLEA(descText, "FontName", "Microsoft YaHei");
  109. LODOP.SET_PRINT_STYLEA(descText, "FontSize", fontSize);
  110. LODOP.SET_PRINT_STYLEA(descText, "LineSpacing", 0); // 行间距
  111. LODOP.SET_PRINT_STYLEA(descText, "Multiline", true); // 允许多行
  112. },
  113. // A002 标签打印(70mm x 20mm)- 其他工序用
  114. printLabelA002(LODOP, printData, isNewPage){
  115. if(isNewPage){
  116. LODOP.NEWPAGE();
  117. }
  118. // ============================================================
  119. // 1. 纸张设置
  120. // ============================================================
  121. // 设置纸张大小 70mm x 20mm (0=纵向)
  122. LODOP.SET_PRINT_PAGESIZE(0, 700, 200, '');
  123. // ============================================================
  124. // 2. 绘制边框
  125. // ============================================================
  126. // 外边框(1mm边距,68mm宽 x 18mm高)
  127. LODOP.ADD_PRINT_RECT('1mm', '1mm', '68mm', '18mm', 0, 1);
  128. // ============================================================
  129. // 3. 左侧二维码
  130. // ============================================================
  131. // 二维码位置:距上1.6mm,距左3.4mm,尺寸18.2mm x 18.2mm
  132. const qrIndex = LODOP.ADD_PRINT_BARCODE('1.6mm', '3.4mm', '18.2mm', '18.2mm', 'QRCode', printData.rollNo || '');
  133. LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 4);
  134. LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M");
  135. // ============================================================
  136. // 4. 右侧文字信息(4行)- 向左移动,字体缩小
  137. // ============================================================
  138. const startX = '22mm'; // 文字左边距(从23mm改为22mm,向左移动1mm)
  139. const textWidth = '46mm'; // 文字区域宽度(从43mm增加到46mm)
  140. // 第1行:编码
  141. const text1 = LODOP.ADD_PRINT_TEXT('3mm', startX, textWidth, '3mm', `编码:${printData.partNo || ''}`);
  142. LODOP.SET_PRINT_STYLEA(text1, "FontName", "Microsoft YaHei");
  143. LODOP.SET_PRINT_STYLEA(text1, "FontSize", 7);
  144. // 第2行:卷号
  145. const text2 = LODOP.ADD_PRINT_TEXT('7mm', startX, textWidth, '3mm', `卷号:${printData.rollNo || ''}`);
  146. LODOP.SET_PRINT_STYLEA(text2, "FontName", "Microsoft YaHei");
  147. LODOP.SET_PRINT_STYLEA(text2, "FontSize", 7);
  148. // 第3行:良品 + 不良品(左右分布)
  149. // 良品(左侧)
  150. const text3 = LODOP.ADD_PRINT_TEXT('11mm', startX, '22mm', '3mm', `良品:${printData.goodQuantity || ''}`);
  151. LODOP.SET_PRINT_STYLEA(text3, "FontName", "Microsoft YaHei");
  152. LODOP.SET_PRINT_STYLEA(text3, "FontSize", 7);
  153. // 不良品(右侧)
  154. const text4 = LODOP.ADD_PRINT_TEXT('11mm', '44mm', '24mm', '3mm', `不良品:${printData.badQuantity || ''}`);
  155. LODOP.SET_PRINT_STYLEA(text4, "FontName", "Microsoft YaHei");
  156. LODOP.SET_PRINT_STYLEA(text4, "FontSize", 7);
  157. // 第4行:总数 + 良率(左右分布)
  158. // 总数(左侧)
  159. const text5 = LODOP.ADD_PRINT_TEXT('15mm', startX, '22mm', '3mm', `总数:${printData.quantity || ''}`);
  160. LODOP.SET_PRINT_STYLEA(text5, "FontName", "Microsoft YaHei");
  161. LODOP.SET_PRINT_STYLEA(text5, "FontSize", 7);
  162. // 良率(右侧)
  163. const yieldValue = printData['yield'] || printData.yield || '';
  164. const yieldText = yieldValue ? `良率:${yieldValue}%` : '良率:';
  165. const text6 = LODOP.ADD_PRINT_TEXT('15mm', '44mm', '24mm', '3mm', yieldText);
  166. LODOP.SET_PRINT_STYLEA(text6, "FontName", "Microsoft YaHei");
  167. LODOP.SET_PRINT_STYLEA(text6, "FontSize", 7);
  168. },
  169. // A003 标签打印(70mm x 20mm)- 绑定用
  170. printLabelA003(LODOP, printData, isNewPage){
  171. if(isNewPage){
  172. LODOP.NEWPAGE();
  173. }
  174. // ============================================================
  175. // 1. 纸张设置
  176. // ============================================================
  177. // 设置纸张大小 70mm x 20mm (0=纵向)
  178. LODOP.SET_PRINT_PAGESIZE(0, 700, 200, '');
  179. // ============================================================
  180. // 2. 绘制边框
  181. // ============================================================
  182. // 外边框(1mm边距,68mm宽 x 18mm高)
  183. LODOP.ADD_PRINT_RECT('1mm', '1mm', '68mm', '18mm', 0, 1);
  184. // ============================================================
  185. // 3. 左侧二维码
  186. // ============================================================
  187. // 二维码位置:距上1.6mm,距左3.4mm,尺寸18.2mm x 18.2mm
  188. const qrIndex = LODOP.ADD_PRINT_BARCODE('1.6mm', '3.4mm', '18.2mm', '18.2mm', 'QRCode', printData.rollNo || '');
  189. LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 4);
  190. LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M");
  191. // ============================================================
  192. // 4. 右侧文字信息(4行)
  193. // ============================================================
  194. const startX = '23mm'; // 文字左边距
  195. const textWidth = '43mm'; // 文字区域宽度
  196. // 第1行:ERP No.
  197. const text1 = LODOP.ADD_PRINT_TEXT('3mm', startX, textWidth, '3mm', `ERP No.: ${printData.partNo || ''}`);
  198. LODOP.SET_PRINT_STYLEA(text1, "FontName", "Microsoft YaHei");
  199. LODOP.SET_PRINT_STYLEA(text1, "FontSize", 8);
  200. // 第2行:Batch No. + Reel No.(左右分布)
  201. // Batch No.(左侧)
  202. const text2 = LODOP.ADD_PRINT_TEXT('7mm', startX, '20mm', '3mm', `Batch No.: ${printData.batchNo || ''}`);
  203. LODOP.SET_PRINT_STYLEA(text2, "FontName", "Microsoft YaHei");
  204. LODOP.SET_PRINT_STYLEA(text2, "FontSize", 8);
  205. // Reel No.(右侧)
  206. const text3 = LODOP.ADD_PRINT_TEXT('7mm', '43mm', '23mm', '3mm', `Reel No.: ${printData.reelNo || ''}`);
  207. LODOP.SET_PRINT_STYLEA(text3, "FontName", "Microsoft YaHei");
  208. LODOP.SET_PRINT_STYLEA(text3, "FontSize", 8);
  209. // 第3行:Good QTY
  210. const text4 = LODOP.ADD_PRINT_TEXT('11mm', startX, textWidth, '3mm', `Good QTY: ${printData.goodQuantity || ''}`);
  211. LODOP.SET_PRINT_STYLEA(text4, "FontName", "Microsoft YaHei");
  212. LODOP.SET_PRINT_STYLEA(text4, "FontSize", 8);
  213. // 第4行:Bad QTY
  214. const text5 = LODOP.ADD_PRINT_TEXT('15mm', startX, textWidth, '3mm', `Bad QTY: ${printData.badQuantity || ''}`);
  215. LODOP.SET_PRINT_STYLEA(text5, "FontName", "Microsoft YaHei");
  216. LODOP.SET_PRINT_STYLEA(text5, "FontSize", 8);
  217. }
  218. }
  219. }