import QRCode from 'qrcode'; /** * 标签打印模板 Mixin * 提供 A001、A002、A003 三种标签打印模板的通用方法 */ export default { methods: { /** * 生成二维码图片的Base64字符串 * @param {string} text - 二维码内容 * @param {number} size - 二维码尺寸(像素) * @returns {Promise} - Base64图片字符串 */ async generateQRCodeImage(text, size = 150) { try { const dataUrl = await QRCode.toDataURL(text, { width: size, margin: 0, errorCorrectionLevel: 'M' }); return dataUrl; } catch (err) { console.error('生成二维码失败:', err); return ''; } }, // A001 标签打印(70mm x 30mm)- 左边二维码,右边文字信息 // 布局:2mm边距,左侧二维码区20mm,右侧文字区,底部两行物料名称 async printLabelA001(LODOP, printData, isNewPage){ if(isNewPage){ LODOP.NEWPAGE(); } // ============================================================ // 1. 纸张设置 // ============================================================ // 纸张大小 70mm x 30mm,留2mm边距,实际打印区域 66mm x 26mm LODOP.SET_PRINT_PAGESIZE(0, 700, 300, ''); // ============================================================ // 2. 绘制边框和分隔线 // ============================================================ // 外边框(2mm边距,66mm宽 x 26mm高) LODOP.ADD_PRINT_RECT('2mm', '2mm', '66mm', '26mm', 0, 1); // 垂直分隔线:左右分隔(二维码区18mm,文字区48mm) LODOP.ADD_PRINT_LINE('2mm', '20mm', '19mm', '20mm', 0, 1); // 水平分隔线1:编码下方 LODOP.ADD_PRINT_LINE('7mm', '20mm', '7mm', '68mm', 0, 1); // 水平分隔线2:型号下方 LODOP.ADD_PRINT_LINE('11mm', '20mm', '11mm', '68mm', 0, 1); // 水平分隔线3:数量下方 LODOP.ADD_PRINT_LINE('15mm', '20mm', '15mm', '68mm', 0, 1); // 水平分隔线4:批号下方,同时是物料描述区上边界(横跨整个宽度) LODOP.ADD_PRINT_LINE('19mm', '2mm', '19mm', '68mm', 0, 1); // ============================================================ // 3. 左侧二维码(使用LODOP自带二维码) // ============================================================ // 可见区域:18mm(宽) x 17mm(高) // 二维码有默认白边(静区),需放大约20%让白边溢出到框外 const qrContent = printData.rollNo || ''; if (qrContent) { // 位置:top=2mm, left=2mm(往右下移动) const qrIndex = LODOP.ADD_PRINT_BARCODE('2mm', '2.5mm', '21mm', '20mm', 'QRCode', qrContent); LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 0); // 自动选择版本 LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M"); } // ============================================================ // 4. 右侧文字信息(4行)- 字体6号 // ============================================================ const labelX = '21mm'; // 标签列起始位置 const valueX = '32mm'; // 值列起始位置(从30mm改为32mm,给标签留更多空间) const labelWidth = '11mm'; // 标签列宽度(从9mm改为11mm,确保冒号能显示) const valueWidth = '35mm'; // 值列宽度 const fontSize = 6; // 字体大小 // 编码(第1行) const label1 = LODOP.ADD_PRINT_TEXT('3.5mm', labelX, labelWidth, '3mm', '编码:'); LODOP.SET_PRINT_STYLEA(label1, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(label1, "FontSize", fontSize); const value1 = LODOP.ADD_PRINT_TEXT('3.5mm', valueX, valueWidth, '3mm', printData.partNo || ''); LODOP.SET_PRINT_STYLEA(value1, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(value1, "FontSize", fontSize); LODOP.SET_PRINT_STYLEA(value1, "Bold", 1); // 型号(第2行) const label2 = LODOP.ADD_PRINT_TEXT('7.5mm', labelX, labelWidth, '3mm', '型号:'); LODOP.SET_PRINT_STYLEA(label2, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(label2, "FontSize", fontSize); const value2 = LODOP.ADD_PRINT_TEXT('7.5mm', valueX, valueWidth, '3mm', printData.spec || ''); LODOP.SET_PRINT_STYLEA(value2, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(value2, "FontSize", fontSize); // 数量(第3行) const label3 = LODOP.ADD_PRINT_TEXT('11.5mm', labelX, labelWidth, '3mm', '数量:'); LODOP.SET_PRINT_STYLEA(label3, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(label3, "FontSize", fontSize); const value3 = LODOP.ADD_PRINT_TEXT('11.5mm', valueX, valueWidth, '3mm', printData.quantity || ''); LODOP.SET_PRINT_STYLEA(value3, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(value3, "FontSize", fontSize); // 批号(第4行) const label4 = LODOP.ADD_PRINT_TEXT('15.5mm', labelX, labelWidth, '3mm', '批号:'); LODOP.SET_PRINT_STYLEA(label4, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(label4, "FontSize", fontSize); const value4 = LODOP.ADD_PRINT_TEXT('15.5mm', valueX, valueWidth, '3mm', printData.batchNo || ''); LODOP.SET_PRINT_STYLEA(value4, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(value4, "FontSize", fontSize); // ============================================================ // 5. 底部物料名称(2行)- 横跨整个宽度 // ============================================================ const partDesc = printData.partDesc || ''; // 底部区域:从19mm分隔线下方开始,高度约8mm,可显示两行文字 const descText = LODOP.ADD_PRINT_TEXT('19.5mm', '3mm', '63mm', '8mm', partDesc); LODOP.SET_PRINT_STYLEA(descText, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(descText, "FontSize", fontSize); LODOP.SET_PRINT_STYLEA(descText, "LineSpacing", 0); // 行间距 LODOP.SET_PRINT_STYLEA(descText, "Multiline", true); // 允许多行 }, // A002 标签打印(70mm x 20mm)- 其他工序用 printLabelA002(LODOP, printData, isNewPage){ if(isNewPage){ LODOP.NEWPAGE(); } // ============================================================ // 1. 纸张设置 // ============================================================ // 设置纸张大小 70mm x 20mm (0=纵向) LODOP.SET_PRINT_PAGESIZE(0, 700, 200, ''); // ============================================================ // 2. 绘制边框 // ============================================================ // 外边框(1mm边距,68mm宽 x 18mm高) LODOP.ADD_PRINT_RECT('1mm', '1mm', '68mm', '18mm', 0, 1); // ============================================================ // 3. 左侧二维码 // ============================================================ // 二维码位置:距上1.6mm,距左3.4mm,尺寸18.2mm x 18.2mm const qrIndex = LODOP.ADD_PRINT_BARCODE('1.6mm', '3.4mm', '18.2mm', '18.2mm', 'QRCode', printData.rollNo || ''); LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 4); LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M"); // ============================================================ // 4. 右侧文字信息(4行)- 向左移动,字体缩小 // ============================================================ const startX = '22mm'; // 文字左边距(从23mm改为22mm,向左移动1mm) const textWidth = '46mm'; // 文字区域宽度(从43mm增加到46mm) // 第1行:编码 const text1 = LODOP.ADD_PRINT_TEXT('3mm', startX, textWidth, '3mm', `编码:${printData.partNo || ''}`); LODOP.SET_PRINT_STYLEA(text1, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text1, "FontSize", 7); // 第2行:卷号 const text2 = LODOP.ADD_PRINT_TEXT('7mm', startX, textWidth, '3mm', `卷号:${printData.rollNo || ''}`); LODOP.SET_PRINT_STYLEA(text2, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text2, "FontSize", 7); // 第3行:良品 + 不良品(左右分布) // 良品(左侧) const text3 = LODOP.ADD_PRINT_TEXT('11mm', startX, '22mm', '3mm', `良品:${printData.goodQuantity || ''}`); LODOP.SET_PRINT_STYLEA(text3, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text3, "FontSize", 7); // 不良品(右侧) const text4 = LODOP.ADD_PRINT_TEXT('11mm', '44mm', '24mm', '3mm', `不良品:${printData.badQuantity || ''}`); LODOP.SET_PRINT_STYLEA(text4, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text4, "FontSize", 7); // 第4行:总数 + 良率(左右分布) // 总数(左侧) const text5 = LODOP.ADD_PRINT_TEXT('15mm', startX, '22mm', '3mm', `总数:${printData.quantity || ''}`); LODOP.SET_PRINT_STYLEA(text5, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text5, "FontSize", 7); // 良率(右侧) const yieldValue = printData['yield'] || printData.yield || ''; const yieldText = yieldValue ? `良率:${yieldValue}%` : '良率:'; const text6 = LODOP.ADD_PRINT_TEXT('15mm', '44mm', '24mm', '3mm', yieldText); LODOP.SET_PRINT_STYLEA(text6, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text6, "FontSize", 7); }, // A003 标签打印(70mm x 20mm)- 绑定用 printLabelA003(LODOP, printData, isNewPage){ if(isNewPage){ LODOP.NEWPAGE(); } // ============================================================ // 1. 纸张设置 // ============================================================ // 设置纸张大小 70mm x 20mm (0=纵向) LODOP.SET_PRINT_PAGESIZE(0, 700, 200, ''); // ============================================================ // 2. 绘制边框 // ============================================================ // 外边框(1mm边距,68mm宽 x 18mm高) LODOP.ADD_PRINT_RECT('1mm', '1mm', '68mm', '18mm', 0, 1); // ============================================================ // 3. 左侧二维码 // ============================================================ // 二维码位置:距上1.6mm,距左3.4mm,尺寸18.2mm x 18.2mm const qrIndex = LODOP.ADD_PRINT_BARCODE('1.6mm', '3.4mm', '18.2mm', '18.2mm', 'QRCode', printData.rollNo || ''); LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 4); LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M"); // ============================================================ // 4. 右侧文字信息(4行) // ============================================================ const startX = '23mm'; // 文字左边距 const textWidth = '43mm'; // 文字区域宽度 // 第1行:ERP No. const text1 = LODOP.ADD_PRINT_TEXT('3mm', startX, textWidth, '3mm', `ERP No.: ${printData.partNo || ''}`); LODOP.SET_PRINT_STYLEA(text1, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text1, "FontSize", 8); // 第2行:Batch No. + Reel No.(左右分布) // Batch No.(左侧) const text2 = LODOP.ADD_PRINT_TEXT('7mm', startX, '20mm', '3mm', `Batch No.: ${printData.batchNo || ''}`); LODOP.SET_PRINT_STYLEA(text2, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text2, "FontSize", 8); // Reel No.(右侧) const text3 = LODOP.ADD_PRINT_TEXT('7mm', '43mm', '23mm', '3mm', `Reel No.: ${printData.reelNo || ''}`); LODOP.SET_PRINT_STYLEA(text3, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text3, "FontSize", 8); // 第3行:Good QTY const text4 = LODOP.ADD_PRINT_TEXT('11mm', startX, textWidth, '3mm', `Good QTY: ${printData.goodQuantity || ''}`); LODOP.SET_PRINT_STYLEA(text4, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text4, "FontSize", 8); // 第4行:Bad QTY const text5 = LODOP.ADD_PRINT_TEXT('15mm', startX, textWidth, '3mm', `Bad QTY: ${printData.badQuantity || ''}`); LODOP.SET_PRINT_STYLEA(text5, "FontName", "Microsoft YaHei"); LODOP.SET_PRINT_STYLEA(text5, "FontSize", 8); } } }