自动化立体仓库 - WMS系统
#
lty
1 天以前 0a1ff7f86f00476c3f6e3ac7084be6f6f299de2f
#
7个文件已修改
334 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ReportQueryController.java 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ViewLocMapDto.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WCSReportHandler.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/report/locMap.js 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/report/viewLocMap.html 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ReportQueryController.java
@@ -19,6 +19,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * 日志统计控制器层
@@ -93,31 +94,110 @@
    public R queryViewLocMapRows(){
        return R.ok().add(reportQueryMapper.getViewLocRowTotal());
    }
    @RequestMapping("/viewLocMapList/layers.action")
    public R queryViewLocMapLevs(){
        return R.ok().add(reportQueryMapper.getViewLocLevTotal());
    }
    @RequestMapping("/viewLocMapList.action")
    public R queryViewLocMapListByPages(@RequestParam(defaultValue = "0")Integer row){
        // 获取排级数据
        // 表格标题:列 ===>> 升序
        List<String> bays = reportQueryMapper.getViewLocBayCount(row);
        // !表格第一列放层级数
        bays.add(0, "");
        // 表格行:层 ====>> 倒序
        List<String> levs = reportQueryMapper.getViewLocLevCount(row);
        List<Map<String, Object>> body = new ArrayList<>();
        for (String lev : levs){
            // 获取层级数据
            List<ViewLocMapDto> dtos = reportQueryMapper.getViewLocBays(row, Integer.parseInt(lev));
            // !表格第一列放层级数
            dtos.add(0, new ViewLocMapDto(null ,null, lev));
            Map<String, Object> map = new HashMap<>();
            map.put("loc", dtos);
            body.add(map);
        }
    public R queryViewLocMapListByPages(
            @RequestParam(required = false, defaultValue = "0") Integer row,
            @RequestParam(required = false) Integer layer) {
        Map<String, Object> result = new HashMap<>();
        result.put("title", bays);
        List<String> title = new ArrayList<>();
        List<Map<String, Object>> body = new ArrayList<>();
        if (layer != null && layer > 0) {
            // ── 按层显示所有排 × 所有列 ───────────────────────────────
            // 1. 表头:所有 bay
            List<String> allBays = reportQueryMapper.getAllBays(); // 或生成 1 到 maxBay
            title.add(""); // 第一列放排号
            title.addAll(allBays);
            // 2. 获取该层所有库位
            List<ViewLocMapDto> locs = reportQueryMapper.getLocMapByLayer(layer);
            // 3. 按 row 分组(推荐用 Map 或 Stream 分组)
            Map<Integer, List<ViewLocMapDto>> rowMap = locs.stream()
                    .collect(Collectors.groupingBy(ViewLocMapDto::getRow1));
            // 4. 遍历所有排,生成每一行
            List<Integer> allRows = reportQueryMapper.getAllRows();
            for (Integer currentRow : allRows) {
                List<ViewLocMapDto> rowData = rowMap.getOrDefault(currentRow, new ArrayList<>());
                // 按 bay 排序并补齐空位
                Map<Integer, ViewLocMapDto> bayMap = rowData.stream()
                        .collect(Collectors.toMap(ViewLocMapDto::getBay1, d -> d));
                List<ViewLocMapDto> line = new ArrayList<>();
                // 第一列:排号
                line.add(new ViewLocMapDto(null, null, String.valueOf(currentRow)));
                // 填充所有 bay
                for (String bayStr : allBays) {
                    int bay = Integer.parseInt(bayStr);
                    ViewLocMapDto dto = bayMap.get(bay);
                    if (dto != null) {
                        line.add(dto);
                    } else {
                        // 无库位 → 补空
                        line.add(new ViewLocMapDto(null, 0, null)); // 或自定义空状态
                    }
                }
                Map<String, Object> map = new HashMap<>();
                map.put("loc", line);
                body.add(map);
            }
        }
        else {
            // ── 按排模式(原有逻辑) ─────────────────────
            title = reportQueryMapper.getViewLocBayCount(row);
            title.add(0, "");
            List<String> levs = reportQueryMapper.getViewLocLevCount(row);
            body = new ArrayList<>();
            for (String lev : levs) {
                List<ViewLocMapDto> dtos = reportQueryMapper.getViewLocBays(row, Integer.parseInt(lev));
                dtos.add(0, new ViewLocMapDto(null, null, lev));
                Map<String, Object> map = new HashMap<>();
                map.put("loc", dtos);
                body.add(map);
            }
        }
        result.put("title", title);
        result.put("body", body);
        return R.ok(result);
    }
//    @RequestMapping("/viewLocMapList.action")
//    public R queryViewLocMapListByPages(@RequestParam(defaultValue = "0")Integer row){
//        // 获取排级数据
//        // 表格标题:列 ===>> 升序
//        List<String> bays = reportQueryMapper.getViewLocBayCount(row);
//        // !表格第一列放层级数
//        bays.add(0, "");
//        // 表格行:层 ====>> 倒序
//        List<String> levs = reportQueryMapper.getViewLocLevCount(row);
//        List<Map<String, Object>> body = new ArrayList<>();
//        for (String lev : levs){
//            // 获取层级数据
//            List<ViewLocMapDto> dtos = reportQueryMapper.getViewLocBays(row, Integer.parseInt(lev));
//            // !表格第一列放层级数
//            dtos.add(0, new ViewLocMapDto(null ,null, lev));
//            Map<String, Object> map = new HashMap<>();
//            map.put("loc", dtos);
//            body.add(map);
//        }
//        Map<String, Object> result = new HashMap<>();
//        result.put("title", bays);
//        result.put("body", body);
//        return R.ok(result);
//    }
    //------------------站点日入出库次数统计--------------------------------------
src/main/java/com/zy/asrs/entity/ViewLocMapDto.java
@@ -15,7 +15,8 @@
    private String bgc = "#fff";
    // 字体颜色
    private String color = "#666";
    private Integer row1;
    private Integer lev1;
    public ViewLocMapDto() {
    }
@@ -36,7 +37,12 @@
    public Integer getBay1() {
        return bay1;
    }
    public Integer getRow1() {
        return row1;
    }
    public Integer getLev1() {
        return lev1;
    }
    public void setBay1(Integer bay1) {
        this.bay1 = bay1;
    }
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
@@ -27,21 +27,27 @@
//    // 库位Map
    @Select("select distinct row1 from asr_loc_mast order by row1 asc")
    List<Integer> getViewLocRowTotal();
    @Select("select distinct lev1 from asr_loc_mast order by lev1 asc")
    List<Integer> getViewLocLevTotal();
    @Select("select distinct lev1 from asr_loc_mast where row1=#{row1} order by lev1 desc")
    public List<String> getViewLocLevCount(@Param("row1") int row1);
//
    //
    @Select("select loc_no as locNo, bay1,loc_sts as locSts from asr_loc_mast where row1=#{row1} and lev1=#{lev1} order by bay1")
    public List<ViewLocMapDto> getViewLocBays(@Param("row1") int row1, @Param("lev1") int lev1);
    // 库位Map
    @Select("select distinct bay1 from asr_loc_mast where row1=#{row1} order by bay1")
    public List<String> getViewLocBayCount(@Param("row1") int row1);
    @Select("select lev1,loc_sts as locSts from asr_loc_mast where row1=#{row1} and bay1=#{bay1} order by bay1")
    public List<ViewLocMapDto> getViewLocLevs(@Param("row1") int row1, @Param("bay1") int bay1);
    @Select("SELECT DISTINCT row1 FROM asr_loc_mast ORDER BY row1 ASC")
    List<Integer> getAllRows();
    @Select("SELECT DISTINCT bay1 FROM asr_loc_mast ORDER BY bay1 ASC")
    List<String> getAllBays();
    @Select("SELECT row1,lev1,bay1,loc_no as locNo,loc_sts as locSts FROM asr_loc_mast WHERE lev1 = #{layer} ORDER BY row1 ASC, bay1 ASC")
    List<ViewLocMapDto> getLocMapByLayer(@Param("layer") Integer layer);
    //分页查询站点入出库次数统计
    public List<ViewInOutBean> queryViewInOutList(ViewInOutBean viewInOut);
    public int getViewInOutCount(ViewInOutBean viewInOut);
src/main/java/com/zy/asrs/task/handler/WCSReportHandler.java
@@ -67,23 +67,23 @@
        if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57){//入库
            workIssuedResult.setPriorityCode(14);//优先级
            task.setTaskType(0);//入库
            task.setStartNode(inDevp + 1);
            LocNo = Utils.getLocNo(Utils.getRow(wrkMast.getLocNo()),Utils.getBay(wrkMast.getLocNo()),Utils.getLev(wrkMast.getLocNo()));
            task.setStartNode(inDevp);
            LocNo = Utils.getLocNoToWcs(Utils.getRow(wrkMast.getLocNo()),Utils.getBay(wrkMast.getLocNo()),Utils.getLev(wrkMast.getLocNo()));
            task.setEndNode(LocNo);//目标库位
            task.setCargoSize(null);
        }else if(wrkMast.getIoType() == 10 ){//空板入库
            workIssuedResult.setPriorityCode(12);//优先级
            task.setTaskType(0);//入库
            task.setStartNode(inDevp + 1);
            LocNo = Utils.getLocNo(Utils.getRow(wrkMast.getLocNo()),Utils.getBay(wrkMast.getLocNo()),Utils.getLev(wrkMast.getLocNo()));
            task.setStartNode(inDevp);
            LocNo = Utils.getLocNoToWcs(Utils.getRow(wrkMast.getLocNo()),Utils.getBay(wrkMast.getLocNo()),Utils.getLev(wrkMast.getLocNo()));
            task.setEndNode(LocNo);//目标库位
            task.setCargoSize(null);
        }else if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107){//出库
            workIssuedResult.setPriorityCode(15);//优先级
            task.setTaskType(1);//出库
            sourceLocNo = Utils.getLocNo(Utils.getRow(wrkMast.getSourceLocNo()),Utils.getBay(wrkMast.getSourceLocNo()),Utils.getLev(wrkMast.getSourceLocNo()));
            sourceLocNo = Utils.getLocNoToWcs(Utils.getRow(wrkMast.getSourceLocNo()),Utils.getBay(wrkMast.getSourceLocNo()),Utils.getLev(wrkMast.getSourceLocNo()));
            task.setStartNode(sourceLocNo);//源库位
            task.setEndNode(outDevp);
            task.setCargoSize(null);
@@ -91,8 +91,8 @@
        }else if(wrkMast.getIoType() == 11){//移库
            workIssuedResult.setPriorityCode(11);//优先级
            task.setTaskType(2);//移库
            sourceLocNo = Utils.getLocNo(Utils.getRow(wrkMast.getSourceLocNo()),Utils.getBay(wrkMast.getSourceLocNo()),Utils.getLev(wrkMast.getSourceLocNo()));
            LocNo = Utils.getLocNo(Utils.getRow(wrkMast.getLocNo()),Utils.getBay(wrkMast.getLocNo()),Utils.getLev(wrkMast.getLocNo()));
            sourceLocNo = Utils.getLocNoToWcs(Utils.getRow(wrkMast.getSourceLocNo()),Utils.getBay(wrkMast.getSourceLocNo()),Utils.getLev(wrkMast.getSourceLocNo()));
            LocNo = Utils.getLocNoToWcs(Utils.getRow(wrkMast.getLocNo()),Utils.getBay(wrkMast.getLocNo()),Utils.getLev(wrkMast.getLocNo()));
            task.setStartNode(sourceLocNo);//源库位
            task.setEndNode(LocNo);//目标库位
            task.setCargoSize(null);
@@ -100,7 +100,7 @@
        } else {//空板出库
            workIssuedResult.setPriorityCode(13);//优先级
            task.setTaskType(1);//出库
            sourceLocNo = Utils.getLocNo(Utils.getRow(wrkMast.getSourceLocNo()),Utils.getBay(wrkMast.getSourceLocNo()),Utils.getLev(wrkMast.getSourceLocNo()));
            sourceLocNo = Utils.getLocNoToWcs(Utils.getRow(wrkMast.getSourceLocNo()),Utils.getBay(wrkMast.getSourceLocNo()),Utils.getLev(wrkMast.getSourceLocNo()));
            task.setStartNode(sourceLocNo);//源库位
            task.setEndNode(outDevp);
            task.setCargoSize(null);
src/main/resources/application.yml
@@ -63,7 +63,7 @@
  #是否开启wms下发任务给wcs
  workIssued-fig : true
  #地址
  url : 10.10.10.122:8089
  url : 10.10.10.122:8082
  #wms下发任务给wcs
  workIssued : fromWms/taskReceive
  #库位同步
src/main/webapp/static/js/report/locMap.js
@@ -1,14 +1,17 @@
layui.use(['table','laydate', 'form'], function(){
layui.use(['table', 'laydate', 'form'], function(){
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    getLocMapRows();
    getLocTable(1);
    // 初始加载
    loadRowsOptions();       // 加载「排」选项(始终需要)
    loadLayersOptions();     // 加载「层」选项(提前准备)
    getLocTable('byRow', 1); // 默认按排 + 第1排
    function getLocMapRows() {
    // 加载所有可用排
    function loadRowsOptions() {
        $.ajax({
            url: baseUrl+"/report/viewLocMapList/rows.action",
            url: baseUrl + "/report/viewLocMapList/rows.action",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            async: false,
@@ -16,70 +19,91 @@
                if (res.code === 200) {
                    var tpl = $("#locMastRowTemplate").html();
                    var template = Handlebars.compile(tpl);
                    var html = template(res);
                    $('#rowSelect').append(html);
                    $('#rowSelect').append(template(res));
                    form.render('select');
                } else if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg)
                    top.location.href = baseUrl + "/";
                }
            }
        });
    }
    function getLocTable(row){
    // 加载所有可用层(需要后端支持新接口)
    function loadLayersOptions() {
        $.ajax({
            url: baseUrl+"/report/viewLocMapList.action",
            url: baseUrl + "/report/viewLocMapList/layers.action",  // ← 需要新增接口
            headers: {'token': localStorage.getItem('token')},
            data: {row: row},
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200) {
                    var tpl = $("#locMastRowTemplate").html(); // 复用模板
                    var template = Handlebars.compile(tpl);
                    $('#layerSelect').append(template(res));
                    form.render('select');
                }
            }
        });
    }
    // 核心:根据模式加载库位表
    function getLocTable(mode, value) {
        var url = baseUrl + "/report/viewLocMapList.action";
        var data = {};
        if (mode === 'byRow') {
            data.row = value;
        } else if (mode === 'byLayer') {
            data.layer = value;
        }
        $.ajax({
            url: url,
            headers: {'token': localStorage.getItem('token')},
            data: data,
            method: 'POST',
            success: function (res) {
                if (res.code === 200) {
                    var tpl = $("#locMapTemplate").html();
                    var template = Handlebars.compile(tpl);
                    var html = template(res.data);
                    $('#locMap').html(html);
                    $('#locMap').html(template(res.data));
                } else if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg)
                    layer.msg(res.msg || '加载失败');
                }
            }
        });
    }
    form.on('select(row)', function (data) {
        getLocTable(data.value);
    // 监听 显示模式 切换
    form.on('select(viewMode)', function (data) {
        var mode = data.value;
        if (mode === 'byRow') {
            $('#rowSelectBox').show();
            $('#layerSelectBox').hide();
            // 读取当前选中的排
            var currentRow = $('#rowSelect').val() || 1;
            getLocTable('byRow', currentRow);
        } else if (mode === 'byLayer') {
            $('#rowSelectBox').hide();
            $('#layerSelectBox').show();
            var currentLayer = $('#layerSelect').val() || 1;
            getLocTable('byLayer', currentLayer);
        }
    });
});
var locNo = '';
function locDetl(el) {
    var value = $(el).attr('title');
    var html = $(el).html();
    if (value===null
        ||value === undefined
        || value.trim()===''
        || html.trim()==='S'
        || html.trim()==='D'
        || html.trim()==='O'
        || html.trim()==='Z'
    // 监听 排 变化
    form.on('select(row)', function (data) {
        if ($('#viewMode').val() === 'byRow') {
            getLocTable('byRow', data.value);
        }
    });
    ){
    } else {
        layer.open({
            type: 2,
            title: '库位物料',
            maxmin: true,
            area: [top.detailWidth, top.detailHeight],
            shadeClose: true,
            content: 'locDetl.html',
            success: function(layero, index){
                locNo = value;
            }
        });
    }
}
    // 监听 层 变化
    form.on('select(layer)', function (data) {
        if ($('#viewMode').val() === 'byLayer') {
            getLocTable('byLayer', data.value);
        }
    });
});
src/main/webapp/views/report/viewLocMap.html
@@ -50,22 +50,35 @@
        .layui-table td:hover {
            opacity: 0.5;
        }
</style>
    </style>
</head>
<body>
<!-- 搜索栏 -->
<div id="search-box" class="layui-form layui-card-header">
    <div class="layui-inline" style="margin-left: 10px">
        <label class="layui-form-label" style="width:80px">显示模式</label>
        <div class="layui-input-inline" style="width:120px;">
            <select id="viewMode" name="viewMode" lay-filter="viewMode">
                <option value="byRow">按排显示</option>
                <option value="byLayer">按层显示</option>
            </select>
        </div>
    </div>
    <!-- 按排时的下拉框(默认显示) -->
    <div class="layui-inline" id="rowSelectBox" style="margin-left: 20px;">
        <div class="layui-input-inline">
            <select id="rowSelect" name="row" lay-filter="row">
<!--                <option value="1">第1排</option>-->
<!--                <option value="2">第2排</option>-->
<!--                <option value="3">第3排</option>-->
<!--                <option value="4">第4排</option>-->
<!--                <option value="5">第5排</option>-->
<!--                <option value="6">第6排</option>-->
<!--                <option value="7">第7排</option>-->
<!--                <option value="8">第8排</option>-->
                <!-- 选项由js动态生成 -->
            </select>
        </div>
    </div>
    <!-- 按层时的下拉框(初始隐藏) -->
    <div class="layui-inline" id="layerSelectBox" style="margin-left: 20px; display:none;">
        <div class="layui-input-inline">
            <select id="layerSelect" name="layer" lay-filter="layer">
                <!-- 选项由js动态生成 -->
            </select>
        </div>
    </div>
@@ -79,20 +92,20 @@
<script type="text/template" id="locMapTemplate">
    <thead>
        <tr>
    <tr>
        {{#each title}}
            <th lay-data="{field:'{{this}}', width:100}">{{this}}</th>
        <th lay-data="{field:'{{this}}', width:100}">{{this}}</th>
        {{/each}}
        </tr>
    </tr>
    </thead>
    <tbody>
        {{#each body}}
        <tr>
            {{#each loc}}
                <td class="a-loc" title="{{locNo}}" onclick="locDetl(this)" style="background-color:{{bgc}};color:{{color}}">{{locSts}}</td>
            {{/each}}
        </tr>
    {{#each body}}
    <tr>
        {{#each loc}}
        <td class="a-loc" title="{{locNo}}" onclick="locDetl(this)" style="background-color:{{bgc}};color:{{color}}">{{locSts}}</td>
        {{/each}}
    </tr>
    {{/each}}
    </tbody>
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
@@ -107,5 +120,12 @@
    <option value="{{this}}">{{this}}</option>
    {{/each}}
</script>
<script src="../../static/js/translate.js"></script>
<script>
    translate.selectLanguageTag.show = false; //不出现的select的选择语言
    translate.service.use('client.edge'); //设置翻译服务
    translate.listener.start(); //开启页面元素动态监控,js改变的内容也会被翻译,参考文档: http://translate.zvo.cn/4067.html
    translate.execute();
</script>
</html>