自动化立体仓库 - WMS系统
zhangc
2025-01-08 f68db688939b4ff75c4d5b7ad12e0acfa56d5c98
订单历史档
2个文件已添加
939 ■■■■■ 已修改文件
src/main/webapp/static/js/orderLog/order.js 308 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderLog/out.js 631 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderLog/order.js
New file
@@ -0,0 +1,308 @@
var insTbCount = 0;
var admin;
var insTb
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['layer', 'form', 'table', 'util', 'admin', 'xmSelect', 'laydate'], function () {
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    var table = layui.table;
    var util = layui.util;
    admin = layui.admin;
    var xmSelect = layui.xmSelect;
    var layDate = layui.laydate;
    var laytpl = layui.laytpl;
    // 渲染搜索模板
    $.ajax({
        url: baseUrl+"/docType/list/auth",
        headers: {'token': localStorage.getItem('token')},
        data: {
            limit: 9999
        },
        method: 'POST',
        success: function (res) {
            if (res.code === 200){
                let template = Handlebars.compile($('#docTypeTpl').html());
                $('#docType-query').html(template(res.data));
                layui.form.render('select');
            } else if (res.code === 403){
                top.location.href = baseUrl+"/";
            } else {
                layer.msg(res.msg, {icon: 2})
            }
        }
    })
    // 渲染表格
    insTb = table.render({
        elem: '#order',
        url: baseUrl+'/orderLog/head/page/auth',
        headers: {token: localStorage.getItem('token')},
        page: true,
        cellMinWidth: 100,
        cols: [[
            {type: 'numbers'},
            {field: 'defNumber', align: 'center', title: '操作系统号', hide: false, width: 120},
            {field: '操作单据', align: 'center', title: '操作单据', hide: true},
            {field: '操作类型', align: 'center', title: '操作类型', hide: true},
            {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            //{field: 'itemName', align: 'center', title: '核算主体'},
            {field: 'docType$', align: 'center', title: '单据类型'},
            //{field: 'defNumber', align: 'center', title: '业务类型'},
            //{field: 'postFee', align: 'center', title: '总数量',  minWidth: 130, width: 130},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160},
            {field: 'createTime$', title: '创建时间', hide: true},
            {field: 'createBy$', title: '创建人'},
            {field: 'orderTime', align: 'center',title: '单据日期'},
            //{field: 'shipCode', align: 'center',title: '制单人', hide: false},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160, width: 160},
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {field: 'cstmrName', align: 'center',title: '供应商/客户编码', hide: true},
            {field: 'tel', align: 'center',title: '仓库', hide: true},
            {field: 'operMemb', align: 'center',title: '出入库类别', hide: true},
            {field: 'salesman', align: 'center',title: '部门', hide: true},
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function (res, curr, count) {
            limit();
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            insTbCount = count;
        }
    });
    // 搜索
    form.on('submit(tbSearch)', function (data) {
        insTb.reload({where: data.field, page: {curr: 1}});
    });
    // 添加
    $("#orderAddBtn").click(function () {
        showEditModel();
    });
    // 导入销售单
    $("#importOrder").click(function () {
        $("#importExcel").trigger("click");
    });
    // 工具条点击事件
    table.on('tool(order)', function (obj) {
        var data = obj.data;
        var layEvent = obj.event;
        if (layEvent === 'edit') {
            showEditModel(data);
        } else if (layEvent === 'wrkTrace') {
            showWrkTrace(data.id);
        } else if (layEvent === 'del') {
            doDel(data.id);
        } else if (layEvent === 'complete') {
            doModify(data.id, 4);
        } else if (layEvent === 'report'){
            doReport(data.id);
        } else if (layEvent === 'look') {
            var $a = $(obj.tr).find('a[lay-event="look"]');
            var offset = $a.offset();
            var top = offset.top;
            var left = offset.left;
            layer.open({
                type: 1,
                title: false,
                area: '1460px',
                offset: [top + 'px', (left - 900 + $a.outerWidth()) + 'px'],
                shade: .01,
                shadeClose: true,
                fixed: false,
                content: '<table id="lookSSXMTable" lay-filter="lookSSXMTable"></table>',
                success: function (layero) {
                    table.render({
                        elem: '#lookSSXMTable',
                        headers: {token: localStorage.getItem('token')},
                        url: baseUrl+'/orderDetlLog/list/auth',
                        where: {
                            order_id: data.id
                        },
                        page: true,
                        cellMinWidth: 100,
                        cols: [[
                            //{type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 140},
                            {field: 'maktx', title: '商品名称', width: 150},
                            {field: 'batch', title: '批号'},
                            {field: 'anfme', title: '数量'},
                            {field: 'qty', title: '作业数量', style: 'font-weight: bold'},
                            // {field: 'unit', title: '单位'},
                            // {
                            //     field: 'createTime$', title: '创建时间', sort: true, templet: function (d) {
                            //         return util.toDateString(d.createTime);
                            //     },  width: 180
                            // },
                            // {field: 'inQty', title: '已入库量'},
                            // {field: 'color', title: '颜色'},
                            //{field: 'specs', title: '规格型号'},
                            {field: 'unit', title: '计量单位'},
                            //{field: 'manu', title: '行号'},
                            {field: 'threeCode', title: '销售单号'},
                            //{field: 'deadTime', title: '自由项'},
                            {field: 'processSts$', title: '工序'},
                            //{field: 'specs', title: '规格'},
                            {field: 'reportQty', title: '上报数量'},
                            //{field: 'itemNum', title: '行唯一标识'}
                        ]],
                        request: {
                            pageName: 'curr',
                            pageSize: 'limit'
                        },
                        parseData: function (res) {
                            return {
                                'code': res.code,
                                'msg': res.msg,
                                'count': res.data.total,
                                'data': res.data.records
                            }
                        },
                        response: {
                            statusCode: 200
                        },
                        done: function () {
                            $(layero).find('.layui-table-view').css('margin', '0');
                        },
                        size: ''
                    });
                }
            });
        }
    });
    // 任务追溯
    function showWrkTrace(orderId) {
        let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false});
        $.ajax({
            url: baseUrl+"/orderLog/wrk/trace/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                orderId: orderId
            },
            method: 'POST',
            success: function (res) {
                layer.close(loadIndex);
                if (res.code === 200){
                    laytpl(wrkTraceDialog.innerHTML).render(res.data, function (html) {
                        admin.open({
                            type: 1,
                            title: '任务追溯',
                            area: ['800px', '450px'],
                            shadeClose: true,
                            content: html,
                            success: function (layero, dIndex) {
                                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                                /** 统计图表 */
                                var traceCharts = echarts.init(document.getElementById('wrkTraceCharts'));
                                var traceOptions = {
                                    title: {
                                        text: '作业/总量', x: 'center', y: '38%',
                                        textStyle: {fontSize: 18, color: '#262626', fontWeight: 'normal'},
                                        subtextStyle: {fontSize: 36, color: '#10B4E8'},
                                        itemGap: 20
                                    },
                                    color: ['#10B4E8', '#E0E0E0', '#FF0000'],
                                    tooltip: {trigger: 'item'},
                                    series: [{name: '数量', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}}}]
                                };
                                traceCharts.setOption(traceOptions);
                                // 赋值
                                traceCharts.setOption({
                                    title: {
                                        subtext: res.data.wrkQty+"/"+res.data.totalQty
                                    },
                                    series: [
                                        {
                                            data: [
                                                {name: '已作业', value: res.data.wrkQty},
                                                {name: '未作业', value: res.data.totalQty-res.data.wrkQty-res.data.lackQty},
                                                {name: '库存不足', value: res.data.lackQty},
                                            ]
                                        }
                                    ]
                                });
                            }
                        });
                    });
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg, {icon: 2});
                }
            }
        })
    }
    layDate.render({
        elem: '.layui-laydate-range'
        ,type: 'datetime'
        ,range: true
    });
});
function upload(obj){
    if(!obj.files) {
        return;
    }
    var file = obj.files[0];
    admin.confirm('确认导入 [' + file.name +'] 文件吗?', function (index) {
        layer.load(1, {shade: [0.1,'#fff']});
        var url = baseUrl + "/orderLog/excel/import/auth";
        var form = new FormData();
        form.append("file", file);
        let xhr = new XMLHttpRequest();
        xhr.open("post", url, true);
        xhr.setRequestHeader('token', localStorage.getItem('token'));
        xhr.onload = uploadComplete;
        xhr.onerror =  uploadFailed;
        xhr.onloadend = function () {
            layer.closeAll('loading');
        };
        // xhr.upload.onprogress = progressFunction;
        xhr.upload.onloadstart = function(){
            ot = new Date().getTime();
            oloaded = 0;
        };
        xhr.send(form);
    }, function(index){
    });
}
function uploadComplete(evt) {
    let res = JSON.parse(evt.target.responseText);
    if(res.code === 200) {
        layer.msg(res.msg, {icon: 1});
        insTb.reload({page: {curr: 1}});
    } else {
        alert(res.msg);
        // layer.msg(res.msg, {icon: 2});
    }
}
function uploadFailed(evt) {
    let res = JSON.parse(evt.target.responseText);
    alert(res.msg);
    // layer.msg(res.msg, {icon: 2});
}
src/main/webapp/static/js/orderLog/out.js
New file
@@ -0,0 +1,631 @@
var pageCurr;
var insTb2;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).extend({
    notice: 'notice/notice',
}).use(['table','laydate', 'form', 'util', 'admin', 'notice', 'treeTable', 'xmSelect', 'tableMerge', 'tableX'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    var util = layui.util;
    var notice = layui.notice;
    var treeTable = layui.treeTable;
    var xmSelect = layui.xmSelect;
    var tableMerge = layui.tableMerge;
    var tableX = layui.tableX;
    insTb2 = table.render({
        elem: '#orderDetlTable',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/orderDetl/pakout/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#orderDetToolbar',
        height: 'full-120',
        where: {order_id: 9999999999},
        cols: [[
            {type: 'checkbox'}
            ,{type: 'numbers', title: '#'}
            ,{field: 'orderNo', align: 'center',title: '单据编号', templet: '#orderNoTpl', width: 160}
            ,{field: 'matnr', align: 'center',title: '物料号', width: 160}
            ,{field: 'maktx', align: 'center',title: '物料名称', width: 200}
            ,{field: 'batch', align: 'center',title: '序列码'}
            ,{field: 'specs', align: 'center',title: '规格'}
            // ,{field: 'anfme', align: 'center',title: '数量'}
            // ,{field: 'qty', align: 'center',title: '作业数量', style: 'font-weight: bold'}
            ,{field: 'enableQty', align: 'center',title: '待出数量', style: 'font-weight: bold'}
            ,{field: 'color', align: 'center',title: '销售订单号'}
            ,{field: 'origin', align: 'center',title: '销售订单行号'}
            // ,{field: 'name', align: 'center',title: '名称'}
            // ,{field: 'model', align: 'center',title: '通用型号'}
            ,{field: 'unit', align: 'center',title: '单位', hide: true}
            ,{field: 'barcode', align: 'center',title: '商品条码', hide: true}
            // ,{field: 'supplier', align: 'center',title: '供应商'}
            // ,{field: 'unitPrice', align: 'center',title: '单价'}
            // ,{field: 'itemNum', align: 'center',title: '品项数'}
            // ,{field: 'count', align: 'center',title: '数量'}
            // ,{field: 'weight', align: 'center',title: '重量'}
            // ,{field: 'status$', align: 'center',title: '状态'}
            // ,{field: 'createBy$', align: 'center',title: '添加人员'}
            // ,{field: 'createTime$', align: 'center',title: '添加时间'}
            // ,{field: 'updateBy$', align: 'center',title: '修改人员'}
            // ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            // ,{field: 'memo', align: 'center',title: '备注'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 160}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    /* 表格2搜索 */
    form.on('submit(sensorTbSearch)', function (data) {
        insTb2.reload({where: data.field, page: {curr: 1}});
        return false;
    });
    /* 表格2头工具栏点击事件 */
    table.on('toolbar(orderDetlTable)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        if (obj.event === 'pakoutPreview') { // 添加
            if (checkStatus.length === 0) {
                layer.msg('请选择至少一条出库明细', {icon: 2});
                return;
            }
            pakoutPreview(checkStatus.map(function (d) {
                return d.id;
            }));
        } else if (obj.event === 'del') { // 删除
            var checkRows = table.checkStatus('sensorTable');
            if (checkRows.data.length === 0) {
                layer.msg('请选择要删除的数据', {icon: 2});
                return;
            }
            var ids = checkRows.data.map(function (d) {
                return d.id;
            });
            doDelSensor({ids: ids});
        }
    });
    /* 表格2工具条点击事件 */
    table.on('tool(orderDetlTable)', function (obj) {
        var data = obj.data;
        switch (obj.event) {
            // 出库
            case 'pakoutPreview':
                pakoutPreview([data.id])
                break;
        }
    });
    function pakoutPreview(ids) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl + "/out/pakout/preview/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(ids),
            method: 'POST',
            success: function (res) {
                layer.close(loadIndex);
                if (res.code === 200){
                    pakoutPreviewDialog(res.data)
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        })
    }
    function pakoutPreviewDialog(data) {
        for(var i=0; i<data.length; i++){
            if(!data[i].staNos){
                data[i].staNos = data[i].agvStaNos;
                data[i].staNo = data[i].agvStaNo;
            }
        }
        var tableCache;
        layer.open({
            type: 1
            ,title: false
            ,closeBtn: false
            ,offset: '50px'
            ,area: ['1200px', '700px']
            ,shade: 0.5
            ,shadeClose: false
            ,btn: ['立即出库', '稍后处理']
            ,btnAlign: 'c'
            ,moveType: 1 //拖拽模式,0或者1
            ,content: $('#pakoutPreviewBox').html()
            ,success: function(layero, index){
                stoPreTabIdx = table.render({
                    elem: '#stoPreTab',
                    data: data,
                    height: 520,
                    page: false,
                    limit: Number.MAX_VALUE,
                    cellMinWidth: 100,
                    cols: [[
                        // {type: 'checkbox', merge: ['orderNo']},
                        {field: 'orderNo', title: '单据编号', merge: true, align: 'center'},
                        {field: 'title', title: '商品', merge: true, align: 'center', width: 350},
                        {field: 'batch', title: '序列码', align: 'center'},
                        {field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'},
                        {field: 'locNo', title: '货位', align: 'center', templet: '#locNoTpl'},
                        {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
                        // {type: 'checkbox', merge: ['locNo']},
                    ]],
                    //cols: getCol(data),
                    done: function (res) {
                        tableMerge.render(this);
                        $('.layui-table-body.layui-table-main').css("overflow", "auto");
                        tableCache = tableData = table.cache.stoPreTab;
                    }
                });
                // 修改出库站
                form.on('select(tbBasicTbStaNos)', function (obj) {
                    let index  = obj.othis.parents('tr').attr("data-index");
                    let data = tableCache[index];
                    for (let i = 0; i<tableCache.length; i++) {
                        if (tableCache[i].locNo === data.locNo) {
                            //tableCache[i]['staNo'] = Number(obj.elem.value);
                            tableCache[i]['staNo'] = obj.elem.value;
                        }
                    }
                    obj.othis.children().find("input").css("color", "blue");
                    return false;
                });
                // 批量修改出库站
                form.on('submit(batchModifySta)', function () {
                    modifySta();
                });
                // 批量修改出库站 - 站点选择
                function modifySta() {
                    // 出库站取交集
                    let staBatchSelectVal = [];
                    for(let i = 0; i<tableCache.length; i++) {
                        let staNos = tableCache[i].staNos;
                        if (staNos !== null) {
                            if (staBatchSelectVal.length === 0) {
                                staBatchSelectVal = staNos;
                            } else {
                                staBatchSelectVal = staBatchSelectVal.filter(val =>
                                    {
                                        return new Set(staNos).has(val)
                                    }
                                )
                            }
                        }
                    }
                    if (staBatchSelectVal.length === 0) {
                        layer.msg("出库站没有交集,无法批量修改", {icon: 2});
                        return;
                    }
                    admin.open({
                        type: 1,
                        area: '300px',
                        offset: 'auto',
                        title: '请选择站点',
                        content: $('#staBatchSelectDialog').html(),
                        success: function (layero, ddIndex) {
                            // 渲染下拉框
                            let template = Handlebars.compile($('#batchStaSelectTpl').html());
                            $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
                            // 确认
                            form.on('submit(staBatchSelectConfirm)', function (obj) {
                                let loadIdx = layer.load(2);
                                //let batchSta = Number(obj.field.batchSta);
                                let batchSta = obj.field.batchSta;
                                let arr = [];
                                for (let i = 0; i<tableCache.length; i++) {
                                    tableCache[i]['staNo'] = batchSta;
                                    arr.push(i);
                                }
                                stoPreTabIdx.reload({data: tableCache});
                                arr.forEach(item => {
                                    $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
                                });
                                layui.form.render('select');
                                arr.forEach(item => {
                                    $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
                                });
                                layer.close(loadIdx); layer.close(ddIndex);
                                return false;
                            });
                            // 弹窗不出现滚动条
                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            layui.form.render('select');
                        },
                    })
                }
            }
            ,yes: function(index, layero){
                //按钮【立即出库】的回调
                pakout(tableCache, index);
            }
            ,btn2: function(index, layero){
                //按钮【稍后处理】的回调
                layer.close(index)
                //return false 开启该代码可禁止点击该按钮关闭
            }
        });
    }
    function pakout(tableCache, layerIndex) {
        // let loadIndex = layer.load(2);
        for(var i=0; i<tableCache.length; i++){
            if(tableCache[i].agvStaNos){
                tableCache[i].agvStaNo = tableCache[i].staNo;
                tableCache[i].staNos = null;
                tableCache[i].staNo = null;
            }
        }
        notice.msg('正在生成出库任务......', {icon: 4});
        $.ajax({
            url: baseUrl + "/out/pakout/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(tableCache),
            method: 'POST',
            success: function (res) {
                notice.destroy();
                if (res.code === 200) {
                    layer.close(layerIndex);
                    layer.msg(res.msg, {icon: 1});
                    insTb.reload({where: null});
                    insTb2.reload({where: null, page: {curr: 1}});
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        });
    }
    /* 删除订单 */
    function doDelSensor(obj) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/sensor/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: obj.ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        $(".layui-laypage-btn")[0].click();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 修改状态
    form.on('switch(statusSwitch)', function (obj) {
        var index  = obj.othis.parents('tr').attr("data-index");
        var data = tableData[index];
        data[this.name] = obj.elem.checked?1:0;
        http.post(baseUrl+"/sensor/edit/auth", {id: data.id, status: data[this.name]}, function (res) {
            layer.msg(res.msg, {icon: 1});
        })
    })
    window.pakoutPreview = pakoutPreview;
    // ----------------------------------------------------------------------------------------------------------------------------------
    // 合并出库
    form.on('submit(mergeOut)', function (data) {
        let checkStatus = layui.table.checkStatus('originTable').data;
        if (checkStatus.length < 2) {
            layer.msg("请至少选择两条以上合并数据", {icon: 7});
            return false;
        }
        showMerge(checkStatus.map(function (d) {
            return d.id;
        }));
    });
    // 订单合并窗口
    function showMerge(orderIds) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/order/merge/preview/auth",
            headers: {'token': localStorage.getItem('token')},
            method: 'GET',
            data: {
                orderIds: orderIds
            },
            success: function (res) {
                layer.close(loadIndex);
                if (res.code === 200){
                    layer.open({
                        type: 1
                        , title: false
                        , closeBtn: false
                        , offset: '50px'
                        , area: ['1200px', '700px']
                        , shade: 0.5
                        , shadeClose: false
                        , btn: ['确定', '取消']
                        , btnAlign: 'c'
                        , moveType: 1 //拖拽模式,0或者1
                        , content: $('#mergeDialog').html()
                        , success: function (layero, index) {
                            orderMergeTabIdx = table.render({
                                elem: '#orderMergeTab',
                                data: res.data,
                                height: 550,
                                page: false,
                                limit: Number.MAX_VALUE,
                                cellMinWidth: 100,
                                cols: [[
                                    {type: 'checkbox'},
                                    {field: 'matnr', title: '物料号', align: 'center', width: 350},
                                    {field: 'maktx', title: '物料名称', align: 'center'},
                                    {field: 'specs', title: '规格', align: 'center'},
                                    {field: 'batch', title: '批号', align: 'center'},
                                    {field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'},
                                ]],
                                done: function (res) {
                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
                                }
                            });
                        }
                        , yes: function (index, layero) {
                            //按钮【确定】的回调
                            let checkStatus = layui.table.checkStatus('orderMergeTab').data;
                            if (checkStatus.length < 1) {
                                layer.msg("请至少选择一条数据", {icon: 7});
                                return false;
                            }
                            let loadIndex = layer.load(2);
                            $.ajax({
                                url: baseUrl + "/out/pakout/preview/merge/auth",
                                headers: {'token': localStorage.getItem('token')},
                                contentType: 'application/json;charset=UTF-8',
                                data: JSON.stringify(checkStatus),
                                method: 'POST',
                                success: function (res) {
                                    layer.close(loadIndex);
                                    if (res.code === 200){
                                        layer.close(index)
                                        pakoutPreviewMergeDialog(res.data)
                                    } else if (res.code === 403){
                                        top.location.href = baseUrl+"/";
                                    } else {
                                        layer.msg(res.msg, {icon: 2})
                                    }
                                }
                            })
                        }
                        , btn2: function (index, layero) {
                            //按钮【取消】的回调
                            layer.close(index)
                            //return false 开启该代码可禁止点击该按钮关闭
                        }
                    })
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        })
    }
    function pakoutPreviewMergeDialog(data) {
        for(var i=0; i<data.length; i++){
            if(!data[i].staNos){
                data[i].staNos = data[i].agvStaNos;
                data[i].staNo = data[i].agvStaNo;
            }
        }
        var mergeTabCache;
        layer.open({
            type: 1
            ,title: false
            ,closeBtn: false
            ,offset: '50px'
            ,area: ['1200px', '700px']
            ,shade: 0.5
            ,shadeClose: false
            ,btn: ['立即出库', '稍后处理']
            ,btnAlign: 'c'
            ,moveType: 1 //拖拽模式,0或者1
            ,content: $('#pakoutPreviewMergeBox').html()
            ,success: function(layero, index){
                stoPreTabMergeIdx = table.render({
                    elem: '#stoPreTabMerge',
                    data: data,
                    height: 520,
                    page: false,
                    limit: Number.MAX_VALUE,
                    cellMinWidth: 100,
                    cols: [[
                        // {type: 'checkbox', merge: ['orderNo']},
                        {field: 'title', title: '商品', merge: true, align: 'center', width: 350},
                        {field: 'specs', title: '规格', align: 'center'},
                        {field: 'batch', title: '序列码', align: 'center'},
                        {field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'},
                        {field: 'locNo', title: '货位', align: 'center', templet: '#locNoTpl'},
                        {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
                        // {type: 'checkbox', merge: ['locNo']},
                    ]],
                    done: function (res) {
                        tableMerge.render(this);
                        $('.layui-table-body.layui-table-main').css("overflow", "auto");
                        mergeTabCache = table.cache.stoPreTabMerge;
                    }
                });
                // 修改出库站
                form.on('select(tbBasicTbStaNos)', function (obj) {
                    let index  = obj.othis.parents('tr').attr("data-index");
                    let data = mergeTabCache[index];
                    for (let i = 0; i<mergeTabCache.length; i++) {
                        if (mergeTabCache[i].locNo === data.locNo) {
                            //mergeTabCache[i]['staNo'] = Number(obj.elem.value);
                            mergeTabCache[i]['staNo'] = obj.elem.value;
                        }
                    }
                    obj.othis.children().find("input").css("color", "blue");
                    return false;
                });
                // 批量修改出库站
                form.on('submit(batchModifySta)', function () {
                    modifySta();
                });
                // 批量修改出库站 - 站点选择
                function modifySta() {
                    // 出库站取交集
                    let staBatchSelectVal = [];
                    for(let i = 0; i<mergeTabCache.length; i++) {
                        let staNos = mergeTabCache[i].staNos;
                        if (staNos !== null) {
                            if (staBatchSelectVal.length === 0) {
                                staBatchSelectVal = staNos;
                            } else {
                                staBatchSelectVal = staBatchSelectVal.filter(val =>
                                    {
                                        return new Set(staNos).has(val)
                                    }
                                )
                            }
                        }
                    }
                    if (staBatchSelectVal.length === 0) {
                        layer.msg("出库站没有交集,无法批量修改", {icon: 2});
                        return;
                    }
                    admin.open({
                        type: 1,
                        area: '300px',
                        offset: 'auto',
                        title: '请选择站点',
                        content: $('#staBatchSelectDialog').html(),
                        success: function (layero, ddIndex) {
                            // 渲染下拉框
                            let template = Handlebars.compile($('#batchStaSelectTpl').html());
                            $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
                            // 确认
                            form.on('submit(staBatchSelectConfirm)', function (obj) {
                                let loadIdx = layer.load(2);
                                //let batchSta = Number(obj.field.batchSta);
                                let batchSta = obj.field.batchSta;
                                let arr = [];
                                for (let i = 0; i<mergeTabCache.length; i++) {
                                    mergeTabCache[i]['staNo'] = batchSta;
                                    arr.push(i);
                                }
                                console.log(mergeTabCache)
                                stoPreTabMergeIdx.reload({data: mergeTabCache});
                                arr.forEach(item => {
                                    $('div[lay-id=stoPreTabMerge] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
                                });
                                layui.form.render('select');
                                arr.forEach(item => {
                                    $('div[lay-id=stoPreTabMerge] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
                                });
                                layer.close(loadIdx); layer.close(ddIndex);
                                return false;
                            });
                            // 弹窗不出现滚动条
                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            layui.form.render('select');
                        },
                    })
                }
            }
            ,yes: function(index, layero){
                //按钮【立即出库】的回调
                pakout(mergeTabCache, index);
            }
            ,btn2: function(index, layero){
                //按钮【稍后处理】的回调
                layer.close(index)
                //return false 开启该代码可禁止点击该按钮关闭
            }
        });
    }
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    (child ? parent.tableIns : tableIns).reload({
        where: searchData,
        page: {
            curr: pageCurr
        }
    });
}
/**
 * 一键出库
 */
function autoOut(orderId) {
    let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false});
    $.ajax({
        url: baseUrl + "/out/pakout/orderDetlIds/auth",
        headers: {'token': localStorage.getItem('token')},
        data: { orderId : orderId },
        method: 'POST',
        success: function (res) {
            layer.close(loadIndex);
            if (res.code === 200){
                pakoutPreview(res.data);
            } else if (res.code === 403){
                top.location.href = baseUrl+"/";
            } else {
                layer.msg(res.msg, {icon: 2});
            }
        }
    })
}