自动化立体仓库 - WMS系统
chen.lin
3 天以前 3c824a50b4894545ecf6ea57b5889444fe77c11c
src/main/webapp/views/erpMaterialuse/materialuse.html
@@ -69,7 +69,10 @@
                <el-button type="primary" @click="fnPrintRed('是')">打印(红字)</el-button>
            </el-form-item>
            <el-form-item label="">
                <el-button type="primary" @click="fnCanelPrintRed()">撤销生成(红字)</el-button>
               <el-button type="primary" @click="fnCanelPrintRed()">撤销生成(红字)</el-button>
            </el-form-item>
            <el-form-item label="">
               <el-button type="success" @click="manualSync()">手动同步</el-button>
            </el-form-item>
        </el-form>
        <el-table :data="tableData" border style="width: 100%" row-key="finterid" @selection-change="handleSelectionChange" max-height="650">
@@ -174,8 +177,13 @@
                        data.datetime = null
                        data.create_time = tableSearchParam.value.datetime[0] + " - " + tableSearchParam.value.datetime[1]
                    }
                    const loading = ElementPlus.ElLoading.service({
                        lock: true,
                        text: 'Loading',
                        background: 'rgba(0, 0, 0, 0.7)',
                    })
                    $.ajax({
                        url: "http://127.0.0.1:9090/mo/materialreceive/getList",
                        url: "http://127.0.0.1:8133/mo/materialreceive/getList",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
@@ -184,9 +192,13 @@
                        contentType: 'application/json;charset=UTF-8',
                        method: 'GET',
                        success: function(res) {
                            loading.close()
                            if (res.code == 200) {
                                tableData.value = res.data
                                ElementPlus.ElMessage({
                                    message: "拉取数据完成",
                                    type: 'success'
                                });
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
@@ -200,13 +212,20 @@
                }
                function fnCanelPrint(){
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择",
                            type: 'error'
                        });
                        return ;
                    }
                    const loading = ElementPlus.ElLoading.service({
                        lock: true,
                        text: 'Loading',
                        background: 'rgba(0, 0, 0, 0.7)',
                    })
                    $.ajax({
                        url:"http://127.0.0.1:9090/mo/materialuse/canelprint",
                        url:"http://127.0.0.1:8133/mo/materialuse/canelprint",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
@@ -235,13 +254,20 @@
                }
                function fnCanelPrintRed(){
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择",
                            type: 'error'
                        });
                        return ;
                    }
                    const loading = ElementPlus.ElLoading.service({
                        lock: true,
                        text: 'Loading',
                        background: 'rgba(0, 0, 0, 0.7)',
                    })
                    $.ajax({
                        url:"http://127.0.0.1:9090/mo/materialuse/canelprint1",
                        url:"http://127.0.0.1:8133/mo/materialuse/canelprint1",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
@@ -271,7 +297,7 @@
                function getDepOptions(){
                    $.ajax({
                        url: "http://127.0.0.1:9090/basicinfo/departmentl/getlistfordropdown",
                        url: "http://127.0.0.1:8133/basicinfo/departmentl/getlistfordropdown",
                        contentType: 'application/json;charset=UTF-8',
                        method: 'GET',
                        success: function(res) {
@@ -291,33 +317,136 @@
                    });
                }
                function fnPrint(izPrint) {
                    ElementPlus.ElMessageBox.confirm('确定打印吗?')
                        .then(() => {
                            print(izPrint,0)
                        })
                        .catch(() => {
                            // catch error
                        })
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择",
                            type: 'error'
                        });
                        return ;
                    }
                    // 打印前确认
                    if (izPrint === '是') {
                        ElementPlus.ElMessageBox.confirm('确定打印吗?')
                            .then(() => {
                                print(izPrint, 0);
                            })
                            .catch(() => {
                                // 取消
                            });
                    } else {
                        print(izPrint, 0);
                    }
                }
                // 手动同步
                function manualSync() {
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择要同步的数据",
                            type: 'error'
                        });
                        return ;
                    }
                    ElementPlus.ElMessageBox.confirm('确定要同步选中的数据到WMS吗?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        const loading = ElementPlus.ElLoading.service({
                            lock: true,
                            text: '同步中...',
                            background: 'rgba(0, 0, 0, 0.7)',
                        });
                        // 构建同步参数(传递选中的数据)
                        const syncParams = {
                            icmoDTOS: JSON.stringify(selectList.value)
                        };
                        $.ajax({
                            url: "http://127.0.0.1:8133/api/materialReceive/sync/manual",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: JSON.stringify(syncParams),
                            contentType: 'application/json;charset=UTF-8',
                            method: 'POST',
                            success: function(res) {
                                loading.close();
                                if (res.code == 200) {
                                    ElementPlus.ElMessage({
                                        message: res.data.message || "同步任务已提交",
                                        type: 'success'
                                    });
                                    // 刷新列表
                                    setTimeout(() => {
                                        page();
                                    }, 2000);
                                } else {
                                    ElementPlus.ElMessage({
                                        message: res.msg || "同步失败",
                                        type: 'error'
                                    });
                                }
                            },
                            error: function() {
                                loading.close();
                                ElementPlus.ElMessage({
                                    message: "同步请求失败",
                                    type: 'error'
                                });
                            }
                        });
                    }).catch(() => {
                        // 取消
                    });
                }
                function fnPrintView(izPrint){
                    print(izPrint,0)
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择",
                            type: 'error'
                        });
                        return ;
                    }
                    // 打印预览直接调用打印接口(后端不校验出库完成状态)
                    print(izPrint, 0);
                }
                function fnPrintRedView(izPrint) {
                    print(izPrint,1);
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择",
                            type: 'error'
                        });
                        return ;
                    }
                    // 打印预览直接调用打印接口(后端不校验出库完成状态)
                    print(izPrint, 1);
                }
                function fnPrintRed(izPrint) {
                    ElementPlus.ElMessageBox.confirm('确定红字打印吗?')
                        .then(() => {
                            print(izPrint,1);
                        })
                        .catch(() => {
                            // catch error
                        })
                    if (selectList.value.length === 0){
                        ElementPlus.ElMessage({
                            message: "请先选择",
                            type: 'error'
                        });
                        return ;
                    }
                    // 打印前确认
                    if (izPrint === '是') {
                        ElementPlus.ElMessageBox.confirm('确定打印吗?')
                            .then(() => {
                                print(izPrint, 1);
                            })
                            .catch(() => {
                                // 取消
                            });
                    } else {
                        print(izPrint, 1);
                    }
                }
                function print(izPrint,izRed){
@@ -328,7 +457,7 @@
                        background: 'rgba(0, 0, 0, 0.7)',
                    })
                    $.ajax({
                        url:"http://127.0.0.1:9090/mo/materialuse/print",
                        url:"http://127.0.0.1:8133/mo/materialuse/print",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
@@ -348,58 +477,232 @@
                                    type: 'success'
                                });
                                page()
                                LODOP.PRINT_INITA(0,0,800,1100,"生产领料单");
                                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();
                                }
//                    LODOP.PRINT_DESIGN();
                                // 开始加载条形码图片
                                addBarcodeToPrint();
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                ElementPlus.ElMessage({
                                    message: res.msg,
                                // 后端返回错误信息(校验失败)
                                ElementPlus.ElMessageBox.alert(res.msg || "打印失败", '错误', {
                                    confirmButtonText: '确定',
                                    type: 'error'
                                });
                            }
                        },
                        error: function(xhr, status, error) {
                            loading.close()
                            ElementPlus.ElMessage({
                                message: "打印请求失败,请稍后重试",
                                type: 'error'
                            });
                        }
                    });
                }
@@ -475,6 +778,7 @@
                    fnCanelPrintRed,
                    fnPrintRed,
                    fnPrintRedView,
                    manualSync,
                    handleSizeChange,
                    handleCurrentChange,
                    handleSelectionChange