自动化立体仓库 - WMS系统
chen.lin
14 小时以前 38c0d1cb155b27fb8054d6b302df2669a5d6e10e
二维码打印
1个文件已修改
235 ■■■■ 已修改文件
src/main/webapp/views/erpMaterialuse/materialuse.html 235 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/erpMaterialuse/materialuse.html
@@ -480,40 +480,213 @@
                                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&param=" + 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&param=" + 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 {