From 27d5abcf08b2bf080369b92e21c918136a86f786 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Mon, 17 Nov 2025 14:20:46 +0800 Subject: [PATCH] =?UTF-8?q?2025-11-17=20=E8=AE=A2=E5=8D=95=E4=BA=A7?= =?UTF-8?q?=E5=87=BA=E6=A0=87=E7=AD=BE=E6=8A=A5=E8=A1=A8=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/modules/print/PoPartPrint.vue | 221 +------- .../searchSfdcRollsReport.vue | 513 +++++++++++++++++- 2 files changed, 512 insertions(+), 222 deletions(-) diff --git a/src/views/modules/print/PoPartPrint.vue b/src/views/modules/print/PoPartPrint.vue index be28c2b..20d0aec 100644 --- a/src/views/modules/print/PoPartPrint.vue +++ b/src/views/modules/print/PoPartPrint.vue @@ -397,7 +397,9 @@ import { } from '../../../api/wms/wms' import {poPartLabelPrint} from '../clodopLabel/poPartLabel' import getLodop from '@/utils/LodopFuncs.js' +import labelPrintTemplates from '@/mixins/labelPrintTemplates.js' export default { + mixins: [labelPrintTemplates], data() { return { functionId: this.$route.meta.menuId, @@ -1352,225 +1354,6 @@ export default { LODOP.PREVIEW(); }, - // A001 标签打印(70mm x 30mm)- 左边二维码,右边文字信息 - printLabelA001(LODOP, printData, isNewPage){ - if(isNewPage){ - LODOP.NEWPAGE(); - } - - // ============================================================ - // 1. 纸张设置 - // ============================================================ - // SET_PRINT_PAGESIZE(方向, 宽度, 高度, 纸张名称) - // 方向: 0=纵向, 1=横向 - // 宽度/高度: 单位为 1/10 毫米,如 700 = 70mm - LODOP.SET_PRINT_PAGESIZE(0, 700, 300, ''); - - // ============================================================ - // 2. 绘制边框和分隔线 - // ============================================================ - // ADD_PRINT_RECT(上边距, 左边距, 宽度, 高度, 边框样式, 边框粗细) - // 边框样式: 0=实线 - // 边框粗细: 单位为像素 - - // 外边框(1mm边距,68mm宽 x 28mm高) - LODOP.ADD_PRINT_RECT('1mm', '1mm', '68mm', '28mm', 0, 1); - - // ADD_PRINT_LINE(起点Y, 起点X, 终点Y, 终点X, 线条样式, 线条粗细) - // 线条样式: 0=实线 - - // 垂直分隔线:左右分隔(从上到下) - // 参数说明:起点(1mm, 22mm) -> 终点(29mm, 22mm) - LODOP.ADD_PRINT_LINE('1mm', '22mm', '29mm', '22mm', 0, 1); - - // 水平分隔线1:编码下方 - // 参数说明:起点(8mm, 22mm) -> 终点(8mm, 69mm) - LODOP.ADD_PRINT_LINE('8mm', '22mm', '8mm', '69mm', 0, 1); - - // 水平分隔线2:型号下方 - // 参数说明:起点(13mm, 22mm) -> 终点(13mm, 69mm) - LODOP.ADD_PRINT_LINE('13mm', '22mm', '13mm', '69mm', 0, 1); - - // 水平分隔线3:数量下方 - // 参数说明:起点(18mm, 22mm) -> 终点(18mm, 69mm) - LODOP.ADD_PRINT_LINE('18mm', '22mm', '18mm', '69mm', 0, 1); - - // 水平分隔线4:批号下方 - // 参数说明:起点(23mm, 22mm) -> 终点(23mm, 69mm) - LODOP.ADD_PRINT_LINE('23mm', '22mm', '23mm', '69mm', 0, 1); - - // ============================================================ - // 3. 左侧二维码 - // ============================================================ - // ADD_PRINT_BARCODE(上边距, 左边距, 宽度, 高度, 条码类型, 条码内容) - // 二维码位置:距上7mm,距左3mm,尺寸20mm x 20mm - const qrIndex = LODOP.ADD_PRINT_BARCODE('7mm', '3mm', '20mm', '20mm', 'QRCode', printData.rollNo || ''); - LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeVersion", 4); - LODOP.SET_PRINT_STYLEA(qrIndex, "QRCodeErrorLevel", "M"); - - // ============================================================ - // 4. 右侧文字信息(5行) - // ============================================================ - // ADD_PRINT_TEXT(上边距, 左边距, 宽度, 高度, 文字内容) - - // 文字起始X位置(左边距)和宽度 - const startX = '23mm'; // 可调整:文字左边距,增大向右移,减小向左移 - const textWidth = '43mm'; // 可调整:文字区域宽度 - - // 编码(第1行) - // 上边距4mm:可调整,增大向下移,减小向上移 - const text1 = LODOP.ADD_PRINT_TEXT('4mm', startX, textWidth, '4mm', `编码:${printData.partNo || ''}`); - LODOP.SET_PRINT_STYLEA(text1, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text1, "FontSize", 8); // 可调整:字体大小 - - // 型号(第2行) - // 上边距9mm:可调整 - const text2 = LODOP.ADD_PRINT_TEXT('9mm', startX, textWidth, '4mm', `型号:${printData.spec || ''}`); - LODOP.SET_PRINT_STYLEA(text2, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text2, "FontSize", 8); - - // 数量(第3行) - // 上边距14mm:可调整 - const text3 = LODOP.ADD_PRINT_TEXT('14mm', startX, textWidth, '4mm', `数量:${printData.quantity || ''}`); - LODOP.SET_PRINT_STYLEA(text3, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text3, "FontSize", 8); - - // 批号(第4行) - // 上边距19mm:可调整 - const text4 = LODOP.ADD_PRINT_TEXT('19mm', startX, textWidth, '4mm', `批号:${printData.batchNo || ''}`); - LODOP.SET_PRINT_STYLEA(text4, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text4, "FontSize", 8); - - // 日期(第5行) - // 上边距24mm:可调整 - const text5 = LODOP.ADD_PRINT_TEXT('24mm', startX, textWidth, '4mm', `日期:${printData.documentDate || ''}`); - LODOP.SET_PRINT_STYLEA(text5, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text5, "FontSize", 8); - }, - - // 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. 绘制边框 - // ============================================================ - // 外边框(2mm边距,66mm宽 x 16mm高) - LODOP.ADD_PRINT_RECT('1mm', '1mm', '68mm', '18mm', 0, 1); - - // ============================================================ - // 3. 左侧二维码 - // ============================================================ - // 二维码位置:距上3mm,距左3mm,尺寸15mm x 15mm - 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行:编码 - 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", 8); - - // 第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", 8); - - // 第3行:良品 + 不良品(左右分布) - // 良品(左侧) - const text3 = LODOP.ADD_PRINT_TEXT('11mm', startX, '20mm', '3mm', `良品:${printData.goodQuantity || ''}`); - LODOP.SET_PRINT_STYLEA(text3, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text3, "FontSize", 8); - - // 不良品(右侧) - const text4 = LODOP.ADD_PRINT_TEXT('11mm', '43mm', '23mm', '3mm', `不良品:${printData.badQuantity || ''}`); - LODOP.SET_PRINT_STYLEA(text4, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text4, "FontSize", 8); - - // 第4行:总数 + 良率(左右分布) - // 总数(左侧) - const text5 = LODOP.ADD_PRINT_TEXT('15mm', startX, '20mm', '3mm', `总数:${printData.quantity || ''}`); - LODOP.SET_PRINT_STYLEA(text5, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text5, "FontSize", 8); - - // 良率(右侧) - const text6 = LODOP.ADD_PRINT_TEXT('15mm', '43mm', '23mm', '3mm', `良率:${printData.yield || ''}%`); - LODOP.SET_PRINT_STYLEA(text6, "FontName", "Microsoft YaHei"); - LODOP.SET_PRINT_STYLEA(text6, "FontSize", 8); - }, - - // 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); - }, deleteLabels(){ if(this.selectionDataList.length===0){ this.$message.error('未选择标签!'); diff --git a/src/views/modules/shopOrder/productionReport/searchSfdcRollsReport.vue b/src/views/modules/shopOrder/productionReport/searchSfdcRollsReport.vue index 29a0b3a..7dc4c52 100644 --- a/src/views/modules/shopOrder/productionReport/searchSfdcRollsReport.vue +++ b/src/views/modules/shopOrder/productionReport/searchSfdcRollsReport.vue @@ -57,6 +57,7 @@ class="el-button el-button--primary el-button--medium"> {{ buttons.download }} + 打印 属性变动 @@ -65,7 +66,7 @@ :height="height" :data="dataList" border - @selection-change="handleSelectionChange" + @selection-change="selectionChangeHandle" v-loading="dataListLoading" style="width: 100%;"> 关闭 + + + +
+ + 标签打印设置 +
+ + + + +
@@ -148,10 +285,14 @@ import { } from "@/api/sysLanguage.js" import {searchSfdcRollsReport, updateSfdcRollsAttribute} from "../../../../api/shopOrder/productionReport"; import {updateInventoryStockAttribute} from "../../../../api/wms/wms"; +import getLodop from '@/utils/LodopFuncs.js'; +import {getPartLabelTemplateList, callUspPartLabelTemplate} from '@/api/wms/wms.js'; +import labelPrintTemplates from '@/mixins/labelPrintTemplates.js'; var functionId='104003003'; export default { //查询-产线产量报告 name: "searchProductionLineOutputReport", + mixins: [labelPrintTemplates], components: { Chooselist }, @@ -248,6 +389,17 @@ import {updateInventoryStockAttribute} from "../../../../api/wms/wms"; pageIndex: 1, pageSize: 50, totalPage: 0, + // 标签打印相关 + printDialogVisible: false, + printDialogData: { + printTimes: 1, + labelNo: '', + printerName: '' + }, + labelTemplateList: [], + printerList: [], + printLoading: false, + multiPartNoTip: '', columnList: [ { userId: this.$store.state.user.name, @@ -657,10 +809,197 @@ import {updateInventoryStockAttribute} from "../../../../api/wms/wms"; return this.dataList; }, - handleSelectionChange(val){ + selectionChangeHandle(val){ this.selectionDataList = val console.log(this.selectionDataList) }, + // 打印标签 + async printLabelModel(){ + if(this.selectionDataList.length===0){ + this.$message.error('未选择标签!'); + return false; + } + + // 检查是否选择了不同物料的标签 + const uniquePartNos = [...new Set(this.selectionDataList.map(item => item.partNo))]; + const isSinglePartNo = uniquePartNos.length === 1; + + if(isSinglePartNo){ + // 同一物料,查询标签模板列表 + await this.getLabelTemplates(uniquePartNos[0]); + // 如果没有查到模板,设置提示信息 + if(this.labelTemplateList.length === 0) { + this.multiPartNoTip = '暂无可用模板'; + } else { + this.multiPartNoTip = ''; + } + } else { + // 不同物料,不查询模板列表,后端会自动返回 + this.labelTemplateList = []; + this.multiPartNoTip = `已选择 ${uniquePartNos.length} 种物料,将由系统自动匹配模板`; + } + + // 获取打印机列表 + this.getPrinterList(); + + // 打开标签打印对话框 + this.printDialogData = { + printTimes: 1, + labelNo: '', + printerName: '' + }; + this.printDialogVisible = true; + }, + + // 获取标签模板列表(仅当选中同一物料时) + async getLabelTemplates(partNo){ + const params = { + site: this.$store.state.user.site, + buNo: this.selectionDataList[0].buNo || 'BU01', + partNo: partNo + }; + + try { + const {data} = await getPartLabelTemplateList(params); + if (data && data.code === 0) { + this.labelTemplateList = data.list || []; + if(this.labelTemplateList.length > 0){ + // 默认选中第一个 + this.printDialogData.labelNo = this.labelTemplateList[0].labelNo; + } + } else { + this.$message.error(data.msg || '获取标签模板失败!'); + } + } catch (error) { + console.error('获取标签模板失败:', error); + this.$message.error('获取标签模板失败!'); + } + }, + + // 获取打印机列表 + getPrinterList(){ + try { + const LODOP = getLodop(); + if (!LODOP) { + this.$message.warning('未检测到打印控件,请确保已安装并启动CLodop!'); + return; + } + + const printerCount = LODOP.GET_PRINTER_COUNT(); + this.printerList = []; + for (let i = 0; i < printerCount; i++) { + this.printerList.push(LODOP.GET_PRINTER_NAME(i)); + } + + if(this.printerList.length > 0){ + // 默认选中第一个打印机 + this.printDialogData.printerName = this.printerList[0]; + } + } catch (error) { + console.error('获取打印机列表失败:', error); + this.$message.error('获取打印机列表失败!'); + } + }, + + // 确认打印 + async confirmPrint(){ + // 验证必填项 + if(!this.printDialogData.printerName){ + this.$message.error('请选择打印机!'); + return; + } + + this.printLoading = true; + + try { + // 调用存储过程获取打印参数 + const printDataList = []; + + for(let i = 0; i < this.selectionDataList.length; i++){ + const item = this.selectionDataList[i]; + const params = { + site: item.site || this.$store.state.user.site, + buNo: 'BU01', + menuID: this.$route.meta.menuId || '', + relatedOrderNo: item.orderNo || '', // 参数4:orderNo + relatedOrderLineNo: item.createdOpsSeqNo ? String(item.createdOpsSeqNo) : '', // 参数5:createdOpsSeqNo + documentNo: item.orderNo || '', + partNo: item.partNo, + // 如果选择了不同物料,labelNo传空字符串,让存储过程自动返回 + labelNo: this.printDialogData.labelNo || '', + rollNo: item.rollNo + }; + + console.log('调用存储过程参数:', params); + + const {data} = await callUspPartLabelTemplate(params); + if (data && data.code === 0) { + // 确保 labelNo 字段存在 + const printData = { + ...data.row, + labelNo: data.row.labelNo || data.row.LabelNo || data.row.label_no || this.printDialogData.labelNo + }; + console.log('存储过程返回数据:', printData); + printDataList.push(printData); + } else { + this.$message.error(`获取标签 ${item.rollNo} 的打印参数失败:${data.msg}`); + this.printLoading = false; + return; + } + } + + // 根据 labelNo 调用相应的打印方法 + this.executePrint(printDataList); + + this.printDialogVisible = false; + this.$message.success('打印任务已发送!'); + this.getData(); + + } catch (error) { + console.error('打印失败:', error); + this.$message.error('打印失败:' + error.message); + } finally { + this.printLoading = false; + } + }, + + // 执行打印 + executePrint(printDataList){ + const LODOP = getLodop(); + if (!LODOP) { + this.$message.error('无法连接到打印控件!'); + return; + } + + // 初始化打印任务 + LODOP.PRINT_INIT('订单产出标签打印'); + + // 设置打印模式 + LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE", true); + + // 设置打印机 + LODOP.SET_PRINTER_INDEX(this.printDialogData.printerName); + + for(let times = 0; times < this.printDialogData.printTimes; times++){ + for(let i = 0; i < printDataList.length; i++){ + const printData = printDataList[i]; + + // 根据 labelNo 调用不同的打印方法 + if(printData.labelNo === 'A001'){ + this.printLabelA001(LODOP, printData, i > 0 || times > 0); + } else if(printData.labelNo === 'A002'){ + this.printLabelA002(LODOP, printData, i > 0 || times > 0); + } else if(printData.labelNo === 'A003'){ + this.printLabelA003(LODOP, printData, i > 0 || times > 0); + } else { + this.$message.warning(`未知的标签模板:${printData.labelNo}`); + } + } + } + + // 预览打印(避免水印) + LODOP.PREVIEW(); + }, // 打开属性变动对话框 openAttributeChangeDialog() { if(this.selectionDataList.length === 0){ @@ -770,8 +1109,176 @@ import {updateInventoryStockAttribute} from "../../../../api/wms/wms"; } -