| | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * 日志统计控制器层 |
| | |
| | | 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); |
| | | // } |
| | | |
| | | |
| | | //------------------站点日入出库次数统计-------------------------------------- |
| | |
| | | private String bgc = "#fff"; |
| | | // 字体颜色 |
| | | private String color = "#666"; |
| | | |
| | | private Integer row1; |
| | | private Integer lev1; |
| | | public ViewLocMapDto() { |
| | | } |
| | | |
| | |
| | | public Integer getBay1() { |
| | | return bay1; |
| | | } |
| | | |
| | | public Integer getRow1() { |
| | | return row1; |
| | | } |
| | | public Integer getLev1() { |
| | | return lev1; |
| | | } |
| | | public void setBay1(Integer bay1) { |
| | | this.bay1 = bay1; |
| | | } |
| | |
| | | // // 库位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); |
| | |
| | | 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); |
| | |
| | | }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); |
| | |
| | | } 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); |
| | |
| | | #是否开启wms下发任务给wcs |
| | | workIssued-fig : true |
| | | #地址 |
| | | url : 10.10.10.122:8089 |
| | | url : 10.10.10.122:8082 |
| | | #wms下发任务给wcs |
| | | workIssued : fromWms/taskReceive |
| | | #库位同步 |
| | |
| | | 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, |
| | |
| | | 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); |
| | | } |
| | | }); |
| | | }); |
| | |
| | | .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> |
| | |
| | | |
| | | <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> |
| | |
| | | <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> |
| | | |