| | |
| | | LODOP.PRINT_INITA(0,0,800,1100,"生成领料单"); |
| | | LODOP.SET_PRINT_PAGESIZE(1,0,0,"A4"); |
| | | LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE",1); |
| | | if(izRed==1) |
| | | { |
| | | LODOP.ADD_PRINT_TEXT(28,268,331,36,"生成领料单(红字)"); |
| | | |
| | | // 收集二维码单号:优先使用生产单号,但如果生产单号没有被全部选中,则使用任务单号 |
| | | var barcodeCodeSet = new Set(); |
| | | if (selectList.value && selectList.value.length > 0 && tableData.value && tableData.value.length > 0) { |
| | | // 按生产单号分组,统计每个生产单号的总行数和选中行数 |
| | | var soCodeGroups = {}; |
| | | tableData.value.forEach(function(item) { |
| | | if (item.soCode) { |
| | | if (!soCodeGroups[item.soCode]) { |
| | | soCodeGroups[item.soCode] = { |
| | | total: 0, |
| | | selected: 0, |
| | | soCode: item.soCode |
| | | }; |
| | | } |
| | | soCodeGroups[item.soCode].total++; |
| | | } |
| | | }); |
| | | |
| | | // 统计每个生产单号的选中行数 |
| | | selectList.value.forEach(function(item) { |
| | | if (item.soCode && soCodeGroups[item.soCode]) { |
| | | soCodeGroups[item.soCode].selected++; |
| | | } |
| | | }); |
| | | |
| | | // 根据是否全部选中决定使用生产单号还是任务单号 |
| | | selectList.value.forEach(function(item) { |
| | | if (item.soCode && soCodeGroups[item.soCode]) { |
| | | var group = soCodeGroups[item.soCode]; |
| | | // 如果该生产单号的所有行都被选中,使用生产单号 |
| | | if (group.selected === group.total) { |
| | | barcodeCodeSet.add(item.soCode); |
| | | } else { |
| | | // 如果该生产单号只有部分行被选中,使用任务单号 |
| | | if (item.fbillno) { |
| | | barcodeCodeSet.add(item.fbillno); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | else{ |
| | | LODOP.ADD_PRINT_TEXT(28,268,331,36,"生成领料单"); |
| | | var barcodeCodeStr = Array.from(barcodeCodeSet).join('|'); |
| | | |
| | | // 定义添加条形码的函数 |
| | | function addBarcodeToPrint() { |
| | | // 在右上角添加条形码(如果有单号) |
| | | if (barcodeCodeStr) { |
| | | // 将所有单号用竖线连接,用于条形码(Code128支持竖线) |
| | | var barcodeCodeArray = barcodeCodeStr.split('|'); |
| | | // 使用所有单号拼接,用竖线分隔 |
| | | var barcodeValue = barcodeCodeStr; // 直接使用拼接后的字符串,已经是用竖线分隔的 |
| | | |
| | | // 控制台打印参数 |
| | | // console.log("条形码编码的真实字符(生产单号/任务单号):", barcodeValue); |
| | | // console.log("单号数组:", barcodeCodeArray); |
| | | // console.log("单号数组长度:", barcodeCodeArray.length); |
| | | |
| | | // 使用后端接口生成条形码图片,先加载图片转换为base64 |
| | | // type=1表示条形码,type=2表示二维码 |
| | | // 将所有单号都编码到条形码中 |
| | | // 固定二维码尺寸,保持正方形比例,避免挤占打印文本和被拉长 |
| | | var barcodeWidth = 130; // 固定宽度130px,不根据数量动态调整 |
| | | var barcodeHeight = 130; // 固定高度130px,保持正方形比例 |
| | | var barcodeUrl = baseUrl + "/file/barcode/qrcode/auth?type=2¶m=" + encodeURIComponent(barcodeValue) + "&width=" + barcodeWidth + "&height=" + barcodeHeight; |
| | | |
| | | // console.log("条形码宽度(固定):", barcodeWidth); |
| | | // console.log("条形码编码内容(生产单号/任务单号):", barcodeValue); |
| | | |
| | | // 控制台打印条形码的真实字符(编码的数据内容) |
| | | // console.log("=== 条形码信息 ==="); |
| | | // console.log("条形码编码的真实字符(生产单号/任务单号,用|分隔):", barcodeValue); |
| | | // console.log("条形码字符长度:", barcodeValue.length); |
| | | // console.log("条形码字符编码(UTF-8):", encodeURIComponent(barcodeValue)); |
| | | // console.log("条形码URL参数部分:", "type=1¶m=" + encodeURIComponent(barcodeValue) + "&width=130&height=40"); |
| | | |
| | | // 创建一个临时img元素加载图片,然后转换为base64 |
| | | var img = new Image(); |
| | | img.crossOrigin = 'anonymous'; |
| | | img.onload = function() { |
| | | try { |
| | | // 创建canvas将图片转换为base64 |
| | | var canvas = document.createElement('canvas'); |
| | | canvas.width = img.width; |
| | | canvas.height = img.height; |
| | | var ctx = canvas.getContext('2d'); |
| | | ctx.drawImage(img, 0, 0); |
| | | var base64Image = canvas.toDataURL('image/png'); |
| | | |
| | | // 控制台打印条形码图片信息 |
| | | // console.log("条形码图片已生成"); |
| | | // console.log("条形码图片base64前50个字符:", base64Image.substring(0, 50) + "..."); |
| | | // console.log("条形码图片base64总长度:", base64Image.length); |
| | | // console.log("条形码图片尺寸:", img.width + "x" + img.height); |
| | | // console.log("条形码编码内容确认(生产单号/任务单号):", barcodeValue); |
| | | // console.log("=== 条形码信息结束 ==="); |
| | | |
| | | // LODOP添加图片,使用base64格式 |
| | | // ADD_PRINT_IMAGE参数:Top, Left, Width, Height, ImageURL或ImageData |
| | | // 条形码位置:右上角,Top: 20, Left: 650 (页面宽度800,右边留50像素边距) |
| | | // 固定显示尺寸,保持正方形比例,避免挤占打印文本和被拉长 |
| | | var displayWidth = barcodeWidth; // 固定宽度130px |
| | | var displayHeight = barcodeHeight; // 固定高度130px,保持正方形 |
| | | var displayLeft = 800 - displayWidth - 20; // 右对齐,留20px边距 |
| | | try { |
| | | LODOP.ADD_PRINT_IMAGE(20, displayLeft, displayWidth, displayHeight, base64Image); |
| | | console.log("条形码图片已添加到打印页面(ADD_PRINT_IMAGE方式),位置:", displayLeft + ", 宽度:", displayWidth); |
| | | } catch(e) { |
| | | // 如果ADD_PRINT_IMAGE失败,使用HTML方式 |
| | | console.log("ADD_PRINT_IMAGE失败,尝试HTML方式"); |
| | | var htmlContent = '<img src="' + base64Image + '" style="width:' + displayWidth + 'px;height:' + displayHeight + 'px;" />'; |
| | | LODOP.ADD_PRINT_HTM(20, displayLeft, displayWidth, displayHeight, htmlContent); |
| | | console.log("条形码图片已添加到打印页面(ADD_PRINT_HTM方式),位置:", displayLeft + ", 宽度:", displayWidth); |
| | | } |
| | | |
| | | // 如果有多个单号,在条形码下方显示所有单号的文本(方便人工识别) |
| | | // 已注释:二维码底下不显示字符串 |
| | | // if (barcodeCodeArray.length > 1) { |
| | | // LODOP.ADD_PRINT_TEXT(65, 650, 130, 20, barcodeCodeStr); |
| | | // LODOP.SET_PRINT_STYLEA(0, "FontSize", 9); |
| | | // LODOP.SET_PRINT_STYLEA(0, "Alignment", 2); // 居中对齐 |
| | | // } |
| | | |
| | | // 图片加载完成后,执行打印或预览 |
| | | executePrint(); |
| | | } catch(e) { |
| | | console.error("转换图片失败:", e); |
| | | // 如果转换失败,只显示文本(生产单号/任务单号) |
| | | var displayWidth = barcodeWidth; // 固定宽度130px |
| | | var displayHeight = barcodeHeight; // 固定高度130px |
| | | var displayLeft = 800 - displayWidth - 20; |
| | | LODOP.ADD_PRINT_TEXT(20, displayLeft, displayWidth, displayHeight, barcodeValue); |
| | | LODOP.SET_PRINT_STYLEA(0, "FontSize", 12); |
| | | LODOP.SET_PRINT_STYLEA(0, "Alignment", 2); |
| | | executePrint(); |
| | | } |
| | | }; |
| | | img.onerror = function() { |
| | | console.error("加载条形码图片失败"); |
| | | // 如果加载失败,只显示文本(生产单号/任务单号) |
| | | var displayWidth = barcodeWidth; // 固定宽度130px |
| | | var displayHeight = barcodeHeight; // 固定高度130px |
| | | var displayLeft = 800 - displayWidth - 20; |
| | | LODOP.ADD_PRINT_TEXT(20, displayLeft, displayWidth, displayHeight, barcodeValue); |
| | | LODOP.SET_PRINT_STYLEA(0, "FontSize", 12); |
| | | LODOP.SET_PRINT_STYLEA(0, "Alignment", 2); |
| | | executePrint(); |
| | | }; |
| | | img.src = barcodeUrl; |
| | | } else { |
| | | // 没有单号,直接执行打印 |
| | | executePrint(); |
| | | } |
| | | } |
| | | LODOP.SET_PRINT_STYLEA(0,"FontSize",20); |
| | | LODOP.SET_PRINT_STYLEA(0,"ItemType",1); |
| | | LODOP.ADD_PRINT_TEXT(69,21,213,25,"生产线:"+depName.value); |
| | | LODOP.SET_PRINT_STYLEA(0,"FontSize",12); |
| | | LODOP.SET_PRINT_STYLEA(0,"ItemType",1); |
| | | LODOP.ADD_PRINT_TEXT(70,268,213,25,"计划开工日期:"+tableSearchParam.value.fplancommitdate.toLocaleString('zh-CN', { |
| | | timeZone: 'Asia/Shanghai', |
| | | year: 'numeric', |
| | | month: '2-digit', |
| | | day: '2-digit', |
| | | hour: '2-digit', |
| | | minute: '2-digit', |
| | | second: '2-digit', |
| | | hour12: false |
| | | }).slice(0, 10)); |
| | | LODOP.SET_PRINT_STYLEA(0,"FontSize",12); |
| | | LODOP.SET_PRINT_STYLEA(0,"ItemType",1); |
| | | LODOP.ADD_PRINT_TABLE(96,16,2000,960,CreateTable(res.data)); |
| | | LODOP.SET_PRINT_STYLEA(0,"TableHeightScope",1); |
| | | LODOP.SET_PRINT_MODE("FULL_WIDTH_FOR_OVERFLOW",true); |
| | | if(izPrint=="是") |
| | | { |
| | | LODOP.PRINT(); |
| | | |
| | | // 定义执行打印的函数 |
| | | function executePrint() { |
| | | // 计算表格的起始位置:如果有二维码,表格需要向下移动 |
| | | var tableTop = 96; // 默认表格起始位置 |
| | | var qrCodeTop = 20; // 二维码顶部位置 |
| | | var qrCodeHeight = 130; // 二维码高度 |
| | | var qrCodeBottom = qrCodeTop + qrCodeHeight; // 二维码底部位置:150 |
| | | var spacing = 10; // 二维码和表格之间的间距 |
| | | |
| | | // 如果有二维码,且表格原始位置会被二维码覆盖,则向下移动表格 |
| | | if (barcodeCodeStr && tableTop < qrCodeBottom) { |
| | | tableTop = qrCodeBottom + spacing; // 表格从二维码下方开始,留10px间距 |
| | | } |
| | | |
| | | if(izRed==1) |
| | | { |
| | | LODOP.ADD_PRINT_TEXT(28,268,331,36,"生成领料单(红字)"); |
| | | } |
| | | else{ |
| | | LODOP.ADD_PRINT_TEXT(28,268,331,36,"生成领料单"); |
| | | } |
| | | LODOP.SET_PRINT_STYLEA(0,"FontSize",20); |
| | | LODOP.SET_PRINT_STYLEA(0,"ItemType",1); |
| | | LODOP.ADD_PRINT_TEXT(69,21,213,25,"生产线:"+depName.value); |
| | | LODOP.SET_PRINT_STYLEA(0,"FontSize",12); |
| | | LODOP.SET_PRINT_STYLEA(0,"ItemType",1); |
| | | LODOP.ADD_PRINT_TEXT(70,268,213,25,"计划开工日期:"+tableSearchParam.value.fplancommitdate.toLocaleString('zh-CN', { |
| | | timeZone: 'Asia/Shanghai', |
| | | year: 'numeric', |
| | | month: '2-digit', |
| | | day: '2-digit', |
| | | hour: '2-digit', |
| | | minute: '2-digit', |
| | | second: '2-digit', |
| | | hour12: false |
| | | }).slice(0, 10)); |
| | | LODOP.SET_PRINT_STYLEA(0,"FontSize",12); |
| | | LODOP.SET_PRINT_STYLEA(0,"ItemType",1); |
| | | LODOP.ADD_PRINT_TABLE(tableTop,16,2000,960,CreateTable(res.data)); |
| | | LODOP.SET_PRINT_STYLEA(0,"TableHeightScope",1); |
| | | LODOP.SET_PRINT_MODE("FULL_WIDTH_FOR_OVERFLOW",true); |
| | | if(izPrint=="是") |
| | | { |
| | | LODOP.PRINT(); |
| | | } |
| | | else{ |
| | | LODOP.PREVIEW(); |
| | | } |
| | | } |
| | | else{ |
| | | LODOP.PREVIEW(); |
| | | } |
| | | |
| | | // 开始加载条形码图片 |
| | | addBarcodeToPrint(); |
| | | } else if (res.code === 403) { |
| | | top.location.href = baseUrl + "/"; |
| | | } else { |