自动化立体仓库 - WMS系统
chen.lin
2026-02-14 371462edc6b3ee1de97c235d4a019b544badda0d
src/main/webapp/static/js/task/task.js
@@ -1,4 +1,5 @@
var pageCurr;
var tableIns;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table', 'laydate', 'form', 'admin'], function () {
@@ -9,11 +10,68 @@
    var form = layui.form;
    var admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
    // AGV任务管理:工作状态用多选框(勾选多项),仅本页;用原生 checkbox 不经过 layui 美化,保证勾选与框内显示始终一致
    function updateTaskWrkStsFromCheckbox() {
        var ids = [], texts = [];
        $('#taskWrkStsCheckboxWrap input:checkbox:checked').each(function () {
            var $input = $(this);
            ids.push($input.val());
            var text = $input.data('text') || $input.closest('label').clone().children().remove().end().text().trim() || $input.val();
            texts.push(text);
        });
        $('input[name="wrk_sts"]').val(ids.join(','));
        $('#wrkSts\\$').val(texts.join(', '));
    }
    $(document).on('change', '#taskWrkStsCheckboxWrap input:checkbox', updateTaskWrkStsFromCheckbox);
    function initWrkStsDropdownThenTable() {
        $.ajax({
            url: baseUrl + '/basWrkStatusQueryAgv/auth',
            headers: {token: localStorage.getItem('token')},
            data: {condition: ''},
            method: 'POST',
            traditional: true,
            success: function (res) {
                var $wrap = $('#taskWrkStsCheckboxWrap');
                $wrap.empty();
                var defaultIds = {'7': true, '8': true, '9': true};
                if (res.code === 200 && res.data && res.data.length) {
                    res.data.forEach(function (item) {
                        var id = String(item.id);
                        var text = item.value || id;
                        var checked = defaultIds[id] ? ' checked' : '';
                        $wrap.append(
                            '<label class="task-wrksts-cb-label" style="display: inline-block; margin: 4px 12px 4px 0; cursor: pointer;"><input type="checkbox" value="' + id + '" data-text="' + (text.replace(/"/g, '&quot;')) + '"' + checked + '> ' + text + '</label>'
                        );
                    });
                    updateTaskWrkStsFromCheckbox();
                }
                // 点击输入框展开/收起下拉(不调用 autoShow,避免走全局逻辑)
                $('#wrkSts\\$').off('click').on('click', function () {
                    var $win = $('#taskWrkStsWindow');
                    $win.toggle();
                });
                var initialWhere = {};
                $.each($('#search-box [name]').serializeArray(), function () {
                    initialWhere[this.name] = this.value;
                });
                renderTaskTable(initialWhere);
            },
            error: function () {
                renderTaskTable({});
            }
        });
    }
    function renderTaskTable(initialWhere) {
        tableIns = table.render({
        elem: '#task',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl + '/task/list/auth',
        where: initialWhere,
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
@@ -23,22 +81,26 @@
        cols: [[
            {type: 'checkbox'}
            , {field: 'wrkNo', align: 'center', title: '工作号', sort: true, width: 105}
            , {field: 'agvWrkNo', align: 'center', title: 'AGV工作号', width: 180}
            , {field: 'ioTime$', align: 'center', title: '工作时间', width: 160}
            , {field: 'wrkSts$', align: 'center', title: '工作状态', width: 150}
            , {field: 'ioType$', align: 'center', title: '入出库类型', width: 150}
            , {field: 'ioPri', align: 'center', title: '优先级', width: 80}
            , {field: 'taskType$', align: 'center', title: '任务类型'}
            , {field: 'taskType$', align: 'center', title: '任务类型', width: 120}
            , {field: 'crnNo$', align: 'center', title: '堆垛机', hide: true}
            , {field: 'sourceStaNo$', align: 'center', title: '源站'}
            , {field: 'staNo$', align: 'center', title: '目标站', width: 120}
            , {field: 'sourceStaNo$', align: 'center', title: '源站', width: 120}
            , {field: 'sourceLocNo', align: 'center', title: '源库位', width: 120}
            , {field: 'staNo$', align: 'center', title: '目标站', width: 120}
            , {field: 'locNo', align: 'center', title: '目标库位', width: 120}
            , {field: 'barcode', align: 'center', title: '条码', width: 110}
            , {field: 'errorMemo', align: 'center', title: 'AGV回复报文', width: 200, hide: true}
            , {field: 'errorMemo2', align: 'center', title: 'AGV回复报文2', width: 200, hide: true}
            , {field: 'errorTime$', align: 'center', title: '错误时间', width: 160, hide: true}
            , {field: 'preHave', align: 'center', title: '先入品', hide: true}
            , {field: 'takeNone', align: 'center', title: '空操作', hide: true}
            , {field: 'modiUser$', align: 'center', title: '修改人员', hide: true}
            , {field: 'modiTime$', align: 'center', title: '修改时间', hide: true, width: 160}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 200}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 250}
        ]],
        request: {
            pageName: 'curr',
@@ -62,7 +124,10 @@
            pageCurr = curr;
            limit();
        }
    });
        });
    }
    initWrkStsDropdownThenTable();
    // 监听排序事件
    table.on('sort(task)', function (obj) {
@@ -171,7 +236,7 @@
                        title: '工作号:' + data.wrkNo,
                        shadeClose: true
                    }, function () {
                        http.post(baseUrl + "/hand/control/wrkMast", {workNo: data.wrkNo, type: 2}, function (res) {
                        http.post(baseUrl + "/task/control", {workNo: data.wrkNo, type: 2}, function (res) {
                            $(".layui-laypage-btn")[0].click();
                            layer.msg(data.wrkNo + res.msg);
                        })
@@ -182,7 +247,7 @@
                        title: '工作号:' + data.wrkNo,
                        shadeClose: true
                    }, function () {
                        http.post(baseUrl + "/hand/control/wrkMast", {workNo: data.wrkNo, type: 2}, function (res) {
                        http.post(baseUrl + "/task/control", {workNo: data.wrkNo, type: 2}, function (res) {
                            $(".layui-laypage-btn")[0].click();
                            layer.msg(data.wrkNo + res.msg);
                        })
@@ -193,7 +258,7 @@
            //  拣料入库
            case 'pick':
                layer.confirm('拣料入库该笔工作档?', {title: '工作号:' + data.wrkNo, shadeClose: true}, function () {
                    http.post(baseUrl + "/hand/control/wrkMast", {workNo: data.wrkNo, type: 3}, function (res) {
                    http.post(baseUrl + "/task/control", {workNo: data.wrkNo, type: 3}, function (res) {
                        $(".layui-laypage-btn")[0].click();
                        layer.msg(data.wrkNo + res.msg);
                    })
@@ -219,6 +284,34 @@
                    title: '工作号:' + data.wrkNo,
                    shadeClose: true
                }, function () {
                });
                break;
            //  删除(单条)
            case 'delete':
                layer.confirm('确定要删除该条AGV任务吗?', {
                    title: '工作号:' + data.wrkNo,
                    shadeClose: true
                }, function (i) {
                    layer.close(i);
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl + "/task/delete/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: {'ids[]': [data.id]},
                        traditional: true,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200) {
                                layer.msg(res.msg || '删除成功', {icon: 1});
                                tableReload();
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    });
                });
                break;
        }
@@ -274,7 +367,7 @@
            $.ajax({
                url: baseUrl + "/task/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                data: {'ids[]': ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
@@ -318,6 +411,128 @@
    layDateRender();
    // 呼叫AGV功能 - 暂时注释掉
    /*
    // 初始化呼叫AGV表单渲染
    form.render('select');
    // 呼叫类型切换事件
    form.on('select(callAgvType)', function(data) {
        var callType = data.value;
        if (callType === 'manual') {
            // 手动输入:显示目标站点
            $('#callAgvTarSiteGroup').show();
            $('#callAgvTarLocGroup').hide();
            $('#callAgvTarSite').attr('placeholder', '目标站点');
        } else if (callType === 'outbound') {
            // 出库:隐藏目标站点和库位(自动分配)
            $('#callAgvTarSiteGroup').hide();
            $('#callAgvTarLocGroup').hide();
        } else if (callType === 'inbound') {
            // 入库:显示目标库位,隐藏目标站点(站点自动分配)
            $('#callAgvTarSiteGroup').hide();
            $('#callAgvTarLocGroup').show();
            $('#callAgvTarLoc').attr('placeholder', '目标库位');
        }
    });
    // 呼叫AGV搬运 - 从页面上方表单获取输入
    $('#callAgvBtn').on('click', function() {
        var callType = $('#callAgvType').val();
        var orgSite = $('#callAgvOrgSite').val();
        var tarSite = $('#callAgvTarSite').val();
        var tarLoc = $('#callAgvTarLoc').val();
        var barcode = $('#callAgvBarcode').val();
        // 验证必填项
        if (!orgSite || orgSite.trim() === '') {
            layer.msg('请输入源站点', {icon: 2});
            $('#callAgvOrgSite').focus();
            return;
        }
        if (callType === 'manual') {
            // 手动输入:需要目标站点
            if (!tarSite || tarSite.trim() === '') {
                layer.msg('请输入目标站点', {icon: 2});
                $('#callAgvTarSite').focus();
                return;
            }
        } else if (callType === 'inbound') {
            // 入库:需要目标库位
            if (!tarLoc || tarLoc.trim() === '') {
                layer.msg('请输入目标库位', {icon: 2});
                $('#callAgvTarLoc').focus();
                return;
            }
        }
        if (!barcode || barcode.trim() === '') {
            layer.msg('请输入托盘码', {icon: 2});
            $('#callAgvBarcode').focus();
            return;
        }
        // 构建确认信息
        var confirmMsg = '确认呼叫AGV搬运?<br/>呼叫类型:';
        if (callType === 'manual') {
            confirmMsg += '手动输入<br/>源站点:' + orgSite + '<br/>目标站点:' + tarSite + '<br/>托盘码:' + barcode;
        } else if (callType === 'outbound') {
            confirmMsg += '起点+出库(站点和缓存位自动分配)<br/>源站点:' + orgSite + '<br/>托盘码:' + barcode;
        } else if (callType === 'inbound') {
            confirmMsg += '起点+入库(站点自动分配)<br/>源站点:' + orgSite + '<br/>目标库位:' + tarLoc + '<br/>托盘码:' + barcode;
        }
        layer.confirm(confirmMsg, {
            title: '呼叫AGV确认',
            icon: 3,
            shadeClose: true
        }, function(index) {
            var loadIndex = layer.load(2);
            var requestData = {
                callType: callType,
                orgSite: orgSite.trim(),
                barcode: barcode.trim()
            };
            if (callType === 'manual' && tarSite) {
                requestData.tarSite = tarSite.trim();
            }
            if (callType === 'inbound' && tarLoc) {
                requestData.tarLoc = tarLoc.trim();
            }
            $.ajax({
                url: baseUrl + "/mobile/cache/agv/call",
                headers: {'token': localStorage.getItem('token')},
                data: JSON.stringify(requestData),
                contentType: 'application/json;charset=UTF-8',
                method: 'POST',
                success: function(res) {
                    layer.close(loadIndex);
                    layer.close(index);
                    if (res.code === 200) {
                        layer.msg('呼叫AGV成功', {icon: 1});
                        // 清空表单
                        $('#callAgvOrgSite').val('');
                        $('#callAgvTarSite').val('');
                        $('#callAgvTarLoc').val('');
                        $('#callAgvBarcode').val('');
                        // 刷新表格
                        tableReload();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg || '呼叫AGV失败', {icon: 2});
                    }
                },
                error: function() {
                    layer.close(loadIndex);
                    layer.close(index);
                    layer.msg('网络请求失败', {icon: 2});
                }
            });
        });
    });
    */
});
// 关闭动作
@@ -326,6 +541,7 @@
});
function tableReload(child) {
    if (!tableIns) return;
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function () {
        searchData[this.name] = this.value;