From 3c694130c2a5bb6fe198801bc0e871136a34d7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Fri, 22 Aug 2025 11:30:23 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改二维码生成逻辑,改为一次性二维码,存储更多信息 --- .../KLPService/VendorSelect/index.vue | 10 +- klp-ui/src/utils/klp.js | 116 ++++++- klp-ui/src/views/index.vue | 14 +- .../wms/print/components/CodeRenderer.vue | 295 ++++++++++++++++++ klp-ui/src/views/wms/print/index-simple.vue | 70 +++++ klp-ui/src/views/wms/print/index.vue | 228 ++++++++++++-- klp-ui/src/views/wms/print/scaner.vue | 21 +- klp-ui/src/views/wms/purchasePlan/list.vue | 4 +- 8 files changed, 711 insertions(+), 47 deletions(-) create mode 100644 klp-ui/src/views/wms/print/components/CodeRenderer.vue create mode 100644 klp-ui/src/views/wms/print/index-simple.vue diff --git a/klp-ui/src/components/KLPService/VendorSelect/index.vue b/klp-ui/src/components/KLPService/VendorSelect/index.vue index f7fda7cd..9127320b 100644 --- a/klp-ui/src/components/KLPService/VendorSelect/index.vue +++ b/klp-ui/src/components/KLPService/VendorSelect/index.vue @@ -1,5 +1,13 @@ diff --git a/klp-ui/src/utils/klp.js b/klp-ui/src/utils/klp.js index 0354ad4a..aa37e5fe 100644 --- a/klp-ui/src/utils/klp.js +++ b/klp-ui/src/utils/klp.js @@ -1,4 +1,4 @@ - +import QRCode from 'qrcode'; /** * 通用js方法封装处理 @@ -231,3 +231,117 @@ export function tansParams(params) { export function blobValidate(data) { return data.type !== 'application/json' } + +/** + * 保存二维码为图片 + * @param {string} code 二维码内容 + * @param {string} text 下方文字 + * @param {number} index 索引,用于生成文件名 + * @param {Object} context Vue组件实例上下文(需要包含$message、barcodeWidth、barcodeHeight) + */ +export async function saveAsImage(code, text, index, context) { + // 确保上下文存在 + if (!context) { + console.error('缺少组件上下文,请传入Vue实例'); + return; + } + + try { + // 检查QRCode库是否加载 + if (typeof QRCode === 'undefined') { + throw new Error('QRCode库未加载,请确保已引入'); + } + + // 创建临时canvas用于绘制二维码和文字 + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + if (!ctx) { + throw new Error('无法获取canvas上下文'); + } + + // 从上下文获取尺寸参数,提供默认值 + const barcodeWidth = context.barcodeWidth || 200; + const barcodeHeight = context.barcodeHeight || 200; + const textHeight = 30; // 文字区域高度 + + canvas.width = barcodeWidth; + canvas.height = barcodeHeight + textHeight; + + // 绘制二维码 + const qrCanvas = document.createElement('canvas'); + qrCanvas.width = barcodeWidth; + qrCanvas.height = barcodeHeight; + + // 等待二维码绘制完成 + await new Promise((resolve, reject) => { + QRCode.toCanvas(qrCanvas, code, { + width: barcodeWidth, + height: barcodeHeight, + margin: 0, + errorCorrectionLevel: 'M' + }, (error) => { + if (error) reject(error); + else resolve(); + }); + }); + + // 将二维码绘制到主canvas + ctx.drawImage(qrCanvas, 0, 0); + + // 绘制文字(处理文字过长情况) + ctx.fillStyle = '#000'; + ctx.font = '14px Arial, sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + + // 处理过长文字,最多显示2行 + const maxTextWidth = barcodeWidth - 20; // 预留边距 + let displayText = text; + if (ctx.measureText(text).width > maxTextWidth) { + // 尝试截断并添加省略号 + let i = text.length; + while (ctx.measureText(text.substring(0, i)).width > maxTextWidth && i > 0) { + i--; + } + displayText = text.substring(0, i) + '...'; + } + ctx.fillText(displayText, barcodeWidth / 2, barcodeHeight + 5); + + // 创建图片链接并下载 + canvas.toBlob(blob => { + if (!blob) { + throw new Error('无法生成图片blob对象'); + } + + try { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + + // 处理文件名特殊字符 + a.download = `二维码_${index + 1}.png`; + a.href = url; + + // 模拟点击下载 + document.body.appendChild(a); + const event = new MouseEvent('click'); + a.dispatchEvent(event); + + // 清理资源 + setTimeout(() => { + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, 100); + + context.$message.success('图片保存成功'); + } catch (urlError) { + console.error('创建下载链接失败:', urlError); + context.$message.error('创建下载链接失败'); + } + }, 'image/png'); // 明确指定MIME类型 + + } catch (error) { + console.error('保存图片失败:', error); + context.$message.error(`保存图片失败: ${error.message || '未知错误'}`); + } +} + diff --git a/klp-ui/src/views/index.vue b/klp-ui/src/views/index.vue index ade431c8..861731d5 100644 --- a/klp-ui/src/views/index.vue +++ b/klp-ui/src/views/index.vue @@ -10,8 +10,11 @@
愿你天黑有灯,下雨有伞
+ + + -
+ -
+ - +
-->
diff --git a/klp-ui/src/views/wms/print/components/CodeRenderer.vue b/klp-ui/src/views/wms/print/components/CodeRenderer.vue new file mode 100644 index 00000000..257138fd --- /dev/null +++ b/klp-ui/src/views/wms/print/components/CodeRenderer.vue @@ -0,0 +1,295 @@ + + + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/print/index-simple.vue b/klp-ui/src/views/wms/print/index-simple.vue new file mode 100644 index 00000000..9b80e2ee --- /dev/null +++ b/klp-ui/src/views/wms/print/index-simple.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/klp-ui/src/views/wms/print/index.vue b/klp-ui/src/views/wms/print/index.vue index c7f15f39..d3ad88fc 100644 --- a/klp-ui/src/views/wms/print/index.vue +++ b/klp-ui/src/views/wms/print/index.vue @@ -1,48 +1,147 @@ diff --git a/klp-ui/src/views/wms/print/scaner.vue b/klp-ui/src/views/wms/print/scaner.vue index a1d1e0f3..2ae38542 100644 --- a/klp-ui/src/views/wms/print/scaner.vue +++ b/klp-ui/src/views/wms/print/scaner.vue @@ -20,14 +20,14 @@ - + @@ -441,6 +441,7 @@ export default { .table-panel { flex: 1; + height: calc(100vh - 220px); background-color: #fff; border-radius: 8px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); diff --git a/klp-ui/src/views/wms/purchasePlan/list.vue b/klp-ui/src/views/wms/purchasePlan/list.vue index b01e8251..c265031a 100644 --- a/klp-ui/src/views/wms/purchasePlan/list.vue +++ b/klp-ui/src/views/wms/purchasePlan/list.vue @@ -12,9 +12,9 @@ - + From 76926c3a1003d7aa8ea49075c7e22006f28263c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Fri, 22 Aug 2025 13:19:22 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=89=AB=E7=A0=81?= =?UTF-8?q?=E5=90=8E=E7=9B=B4=E6=8E=A5=E6=8F=92=E5=85=A5=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- klp-ui/src/views/wms/print/index.vue | 27 +++----- .../src/views/wms/stockIo/panels/detail.vue | 63 ++++++++++++------- scaner/src/main/java/org/example/Main.java | 60 +++++++++++------- .../main/java/org/example/ScanDataUtil.java | 3 +- 4 files changed, 90 insertions(+), 63 deletions(-) diff --git a/klp-ui/src/views/wms/print/index.vue b/klp-ui/src/views/wms/print/index.vue index d3ad88fc..c35df02b 100644 --- a/klp-ui/src/views/wms/print/index.vue +++ b/klp-ui/src/views/wms/print/index.vue @@ -62,10 +62,10 @@ - - + + + placeholder="请选择原材料" @change="onItemChange($event, idx)" /> @@ -135,7 +135,10 @@ export default { warehouseId: b.warehouseId, itemType: b.itemType, itemId: b.itemId, - batchNo: b.batchNo + batchNo: b.batchNo, + quantity: b.count, + unit: b.unit, + recordType: 1, }), count: b.count || 1, textTpl: b.text || '' @@ -143,19 +146,8 @@ export default { } }, methods: { - onItemChange(item) { - // 选中后构造条码数据并插入 - console.log(item); - const itemType = this.itemType; - const name = (itemType == 'semi' || itemType == 'product') ? item.productName : item.rawMaterialName; - const code = (itemType == 'semi' || itemType == 'product') ? item.productCode : item.rawMaterialCode; - const itemId = (itemType == 'semi' || itemType == 'product') ? item.productId : item.rawMaterialId; - const o = { - code: encodeURIComponent(`${itemType}__${itemId || ''}`), - count: 1, - textTpl: `${name}[${code}]` - } - this.drawerBarcodeData.push(o); + onItemChange(item, idx) { + this.drawerBarcodeData[idx].unit = item.unit; }, fetchMaster() { listStockIo({ pageSize: 9999, pageNum: 1 }).then(res => { @@ -182,6 +174,7 @@ export default { itemId: undefined, batchNo: 'auto', count: 0, + unit: '', text: '默认文字', } diff --git a/klp-ui/src/views/wms/stockIo/panels/detail.vue b/klp-ui/src/views/wms/stockIo/panels/detail.vue index 4289cc4e..62911052 100644 --- a/klp-ui/src/views/wms/stockIo/panels/detail.vue +++ b/klp-ui/src/views/wms/stockIo/panels/detail.vue @@ -19,6 +19,41 @@
+ + + + + + + + + + + + + + + + + + @@ -90,7 +125,7 @@ - +