自动化立体仓库 - WCS系统
Junjie
2023-05-15 9361123198ee6afe4b7b4278d677b619765faae8
库位查询
24个文件已添加
3个文件已修改
1324 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LocMastController.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasLocSts.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocMast.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasLocStsMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasLocStsService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasLocStsServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasLocStsMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/common.css 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/stoMan/stoQue.js 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/stoMan/stoQue.html 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/alarm-detl.html 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/ic_loading.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/icon_date.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/icon_search.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-admin.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-blue.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-colorful.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-cyan.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-green.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-my.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-pink.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-purple.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-red.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/theme/img/theme-white.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/tpl-note.html 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/tpl/tpl-theme.html 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java
New file
@@ -0,0 +1,130 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.entity.Parameter;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class LocMastController extends BaseController {
    @Autowired
    private LocMastService locMastService;
    @PostMapping(value = "/group/empty/stock")
    @ManagerAuth(memo = "获取同组货架的空库位")
    public R getGroupEmptyStock(@RequestParam(required = false) String sourceLocNo) {
        return R.ok().add(locMastService.queryGroupEmptyStock(sourceLocNo));
    }
    @RequestMapping(value = "/locMast/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(locMastService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/locMast/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        excludeTrash(param);
        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(locMastService.selectPage(new Page<>(curr, limit), wrapper.eq("status",0)));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/locMast/add/auth")
    @ManagerAuth(memo = "库位添加")
    public R add(LocMast locMast) {
        locMast.setModiUser(getUserId());
        locMast.setModiTime(new Date());
        locMast.setAppeUser(getUserId());
        locMast.setAppeTime(new Date());
        locMastService.insert(locMast);
        return R.ok();
    }
    @RequestMapping(value = "/locMast/delete/auth")
    @ManagerAuth(memo = "库位删除")
    public R delete(@RequestParam String param){
        List<LocMast> list = JSONArray.parseArray(param, LocMast.class);
        if (Cools.isEmpty(list)){
            return R.error();
        }
        for (LocMast entity : list){
            locMastService.delete(new EntityWrapper<>(entity));
        }
        return R.ok();
    }
    @RequestMapping(value = "/locMast/export/auth")
    @ManagerAuth(memo = "库位导出")
    public R export(@RequestBody JSONObject param){
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
        Map<String, Object> map = excludeTrash(param.getJSONObject("locMast"));
        convert(map, wrapper);
        List<LocMast> list = locMastService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/locMastQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
        wrapper.like("loc_no", condition);
        Page<LocMast> page = locMastService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (LocMast locMast : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", locMast.getLocNo());
            map.put("value", locMast.getLocNo());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/locMast/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != locMastService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(LocMast.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/BasLocSts.java
New file
@@ -0,0 +1,164 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
@TableName("asr_bas_loc_sts")
public class BasLocSts implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 库位状态代号
     */
    @ApiModelProperty(value= "库位状态代号")
    @TableId(value = "loc_sts", type = IdType.INPUT)
    @TableField("loc_sts")
    private String locSts;
    /**
     * 库位状态描述
     */
    @ApiModelProperty(value= "库位状态描述")
    @TableField("loc_desc")
    private String locDesc;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("modi_user")
    private Long modiUser;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("modi_time")
    private Date modiTime;
    /**
     * 创建者
     */
    @ApiModelProperty(value= "创建者")
    @TableField("appe_user")
    private Long appeUser;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("appe_time")
    private Date appeTime;
    public BasLocSts() {}
    public BasLocSts(String locDesc, Long modiUser, Date modiTime, Long appeUser, Date appeTime) {
        this.locDesc = locDesc;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.appeUser = appeUser;
        this.appeTime = appeTime;
    }
//    BasLocSts basLocSts = new BasLocSts(
//            null,    // 库位状态描述
//            null,    // 修改人员
//            null,    // 修改时间
//            null,    // 创建者
//            null    // 添加时间
//    );
    public String getLocSts() {
        return locSts;
    }
    public void setLocSts(String locSts) {
        this.locSts = locSts;
    }
    public String getLocDesc() {
        return locDesc;
    }
    public void setLocDesc(String locDesc) {
        this.locDesc = locDesc;
    }
    public Long getModiUser() {
        return modiUser;
    }
    public String getModiUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.modiUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public void setModiUser(Long modiUser) {
        this.modiUser = modiUser;
    }
    public Date getModiTime() {
        return modiTime;
    }
    public String getModiTime$(){
        if (Cools.isEmpty(this.modiTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
    }
    public void setModiTime(Date modiTime) {
        this.modiTime = modiTime;
    }
    public Long getAppeUser() {
        return appeUser;
    }
    public String getAppeUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public void setAppeUser(Long appeUser) {
        this.appeUser = appeUser;
    }
    public Date getAppeTime() {
        return appeTime;
    }
    public String getAppeTime$(){
        if (Cools.isEmpty(this.appeTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
    public void setAppeTime(Date appeTime) {
        this.appeTime = appeTime;
    }
}
src/main/java/com/zy/asrs/entity/LocMast.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasLocStsService;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
@@ -174,6 +175,9 @@
    @TableField("ctn_no")
    private String ctnNo;
    @ApiModelProperty(value= "")
    private String status;
    public String getIoTime$(){
        if (Cools.isEmpty(this.ioTime)){
            return "";
@@ -269,4 +273,13 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.errorTime);
    }
    public String getLocSts$(){
        BasLocStsService service = SpringUtils.getBean(BasLocStsService.class);
        BasLocSts basLocSts = service.selectById(this.locSts);
        if (!Cools.isEmpty(basLocSts)){
            return String.valueOf(basLocSts.getLocDesc());
        }
        return null;
    }
}
src/main/java/com/zy/asrs/mapper/BasLocStsMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.BasLocSts;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasLocStsMapper extends BaseMapper<BasLocSts> {
}
src/main/java/com/zy/asrs/service/BasLocStsService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.BasLocSts;
public interface BasLocStsService extends IService<BasLocSts> {
}
src/main/java/com/zy/asrs/service/impl/BasLocStsServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.BasLocSts;
import com.zy.asrs.mapper.BasLocStsMapper;
import com.zy.asrs.service.BasLocStsService;
import org.springframework.stereotype.Service;
@Service("basLocStsService")
public class BasLocStsServiceImpl extends ServiceImpl<BasLocStsMapper, BasLocSts> implements BasLocStsService {
}
src/main/resources/mapper/BasLocStsMapper.xml
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasLocStsMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasLocSts">
        <id column="loc_sts" property="locSts" />
        <result column="loc_desc" property="locDesc" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/LocMastMapper.xml
@@ -34,6 +34,7 @@
        <result column="mk" property="mk" />
        <result column="barcode" property="barcode" />
        <result column="ctn_no" property="ctnNo" />
        <result column="status" property="status" />
    </resultMap>
src/main/webapp/static/css/common.css
@@ -1,53 +1,13 @@
/* 统一处理 */
*, *::before, *::after {
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}
html {
    line-height: 1.5;
    font-size: 15px;
    font-family: sans-serif;
    height: 100%;
}
/**, *::before, *::after {*/
/*    -webkit-box-sizing: border-box;*/
/*    box-sizing: border-box;*/
/*    margin: 0;*/
/*    padding: 0;*/
/*}*/
body {
    height: 100%;
    background-color: #fff;
}
iframe {
    border-width: 0;
}
/* 布局 */
.row::after, .row::before {
    content: "";
    display: table;
    clear: both;
}
.col-md3:empty {
    background:rgba(0,0,0,0.04);
    border: 1px solid rgba(0,0,0,.3);
    min-height:32px;
    height: inherit;
    z-index:1;
}
.col-md1,.col-md10,.col-md11,.col-md12,.col-md2,.col-md3,.col-md4,.col-md5,.col-md6,.col-md7,.col-md8,.col-md9{
    float:left;
}
.col-md1{width:8.33333333%}
.col-md2{width:16.66666667%}
.col-md3{width:25%}
.col-md4{width:33.33333333%}
.col-md5{width:41.66666667%}
.col-md6{width:50%}
.col-md7{width:58.33333333%}
.col-md8{width:66.66666667%}
.col-md9{width:75%}
.col-md10{width:83.33333333%}
.col-md11{width:91.66666667%}
.col-md12{width:100%}
input::placeholder {
    color: #b4b4b4;
src/main/webapp/static/js/stoMan/stoQue.js
New file
@@ -0,0 +1,342 @@
var pageCurr;
var locNo;
layui.use(['table','laydate', 'form'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    layDate.render({
        elem: '.layui-laydate-range'
        ,type: 'datetime'
        ,range: true
    });
    // 数据渲染
    tableIns = table.render({
        elem: '#stoQue',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/locMast/list/auth',
        page: true,
        limit: 20,
        limits: [20, 30, 50, 100, 200, 500],
        even: true,
        toolbar: '#toolbar',
        cellMinWidth: 50,
        cols: [[
            {type: 'checkbox'}
            ,{field: 'locNo', align: 'center',title: '库位号'}
            ,{field: 'locSts$', align: 'center',title: '库位状态', width: 180, style: 'color: #8E2323'}
            // ,{field: 'whsType$', align: 'center',title: '库位类型'}
            ,{field: 'crnNo', align: 'center',title: '堆垛机号'}
            ,{field: 'row1', align: 'center',title: '排'}
            ,{field: 'bay1', align: 'center',title: '列'}
            ,{field: 'lev1', align: 'center',title: '层'}
            ,{field: 'fullPlt', align: 'center',title: '满板', templet:function(row){
                    var html = "<input value='fullPlt' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' table-index='"+row.LAY_TABLE_INDEX+"'";
                    if(row.fullPlt === 'Y'){html += " checked ";}
                    html += "disabled='disabled' >";
                    return html;
                },width:80}
            ,{field: 'modiUser$', align: 'center',title: '修改人员'}
            ,{field: 'modiTime$', align: 'center',title: '修改时间', width: 180}
            ,{ fixed: 'right', title:'操作', align: 'center', toolbar: '#operate'}
        ]],
        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();
            form.on('checkbox(tableCheckbox)', function (data) {
                var _index = $(data.elem).attr('table-index')||0;
                if(data.elem.checked){
                    res.data[_index][data.value] = 'Y';
                }else{
                    res.data[_index][data.value] = 'N';
                }
            });
            if (count === 1){
                // locDetl(res.data[0][locNo]);
            }
        }
    });
    // 监听排序事件
    table.on('sort(stoQue)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {
                curr: 1
            },
            done: function (res, curr, count) {
                if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                }
                pageCurr=curr;
                limit();
            }
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(stoQue)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id);
        switch(obj.event) {
            // 更新库存
            case 'refreshSto': // todo:luxiaotao
                alert("还没做");
                break;
            case 'exportData':
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'wrkLastno': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/wrkLastno/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg)
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(stoQue)', function(obj) {
        var data = obj.data;
        switch (obj.event) {
            // 查看明细
            case 'locDetl':
                // locDetl(data.locNo);
                if (data.locSts.trim() === ''
                    || data.locSts.trim() === 'S'
                    || data.locSts.trim() === 'D'
                    || data.locSts.trim() === 'O')  {
                    layer.msg("此库位的状态不存在物料");
                    return;
                }
                locDetlToLayer(data.locNo);
                break;
        }
    });
    // iframe物料详情
    function locDetlToLayer(val) {
        locNo = val;
        layer.open({
            type: 2,
            title: '库存明细',
            maxmin: true,
            area: [top.detailWidth, top.detailHeight],
            shadeClose: true,
            content: '../report/locDetl.html',
            success: function(layero, index){
            }
        });
    }
    // div物料详情
    var pageCur;
    function locDetl(locNo){
        $('#detlTable').css("display", 'block');
        // 数据渲染
        tableIns1 = table.render({
            elem: '#locDetlByMap',
            headers: {token: localStorage.getItem('token')},
            url: baseUrl+'/locDetl/list/auth',
            page: true,
            limit: 5,
            skin: 'line',
            where: {loc_no: locNo},
            even: true,
            cellMinWidth: 50,
            cols: [[
                // {type: 'checkbox'}
                {field: 'locNo$', align: 'center',title: '库位号'}
                ,{field: 'matnr', align: 'center',title: '物料'}
                ,{field: 'lgnum', align: 'center',title: '仓库号'}
                ,{field: 'tbnum', align: 'center',title: '转储请求编号'}
                // ,{field: 'tbpos', align: 'center',title: '行项目'}
                ,{field: 'zmatid', align: 'center',title: '物料标签ID'}
                ,{field: 'maktx', align: 'center',title: '物料描述'}
                ,{field: 'werks', align: 'center',title: '工厂'}
                ,{field: 'anfme', align: 'center',title: '数量'}
                ,{field: 'altme', align: 'center',title: '单位'}
                ,{field: 'zpallet', align: 'center',title: '托盘条码'}
                ,{field: 'bname', align: 'center',title: '用户ID'}
            ]],
            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+"/";
                }
                pageCur=curr;
                form.on('checkbox(tableCheckbox)', function (data) {
                    var _index = $(data.elem).attr('table-index')||0;
                    if(data.elem.checked){
                        res.data[_index][data.value] = 'Y';
                    }else{
                        res.data[_index][data.value] = 'N';
                    }
                });
            }
        });
    }
    // 搜索栏重置事件
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        $('#detlTable').css("display", 'none');
        tableReload(false);
    });
    // 搜索栏搜索事件
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        $('#detlTable').css("display", 'none');
        tableReload(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
            },
            done: function (res, curr, count) {
                if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                }
                pageCurr=curr;
                if (count === 1){
                    // locDetl(res.data[0][locNo]);
                }
                if (res.data.length === 0 && count !== 0) {
                    tableIns.reload({
                        where: searchData,
                        page: {
                            curr: pageCurr-1
                        }
                    });
                    pageCurr -= 1;
                }
                limit(child);
            }
        });
    }
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function setFormVal(el, data, showImg) {
    for (var val in data) {
        var find = el.find(":input[id='" + val + "']");
        find.val(data[val]);
        if (showImg){
            var next = find.next();
            if (next.get(0)){
                if (next.get(0).localName === "img") {
                    find.hide();
                    next.attr("src", data[val]);
                    next.show();
                }
            }
        }
    }
}
function clearFormVal(el) {
    $(':input', el)
        .val('')
        .removeAttr('checked')
        .removeAttr('selected');
}
function detailScreen(index) {
    var detail = layer.getChildFrame('#data-detail', index);
    var height = detail.height()+60;
    if (height > ($(window).height()*0.9)) {
        height = ($(window).height()*0.9);
    }
    layer.style(index, {
        top: (($(window).height()-height)/3)+"px",
        height: height+'px'
    });
    $(".layui-layer-shade").remove();
}
$('body').keydown(function () {
    if (event.keyCode === 13) {
        $("#search").click();
    }
});
src/main/webapp/views/stoMan/stoQue.html
New file
@@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
    <style>
        #btn-export {
        }
        #refresh-sto {
            display: none;
        }
        .loc-detl {
            display: none;
        }
        #detlTable {
            margin-top: 20px;
        }
    </style>
</head>
<body>
<!-- 搜索栏 -->
<div id="search-box" class="layui-form layui-card-header">
    <div class="layui-inline">
        <div class="layui-input-inline">
            <input class="layui-input" type="text" name="loc_no" placeholder="库位号" autocomplete="off">
        </div>
    </div>
    <div class="layui-inline">
        <div class="layui-input-inline">
            <input class="layui-input" type="text" name="loc_sts" placeholder="库位状态" autocomplete="off">
        </div>
    </div>
    <div class="layui-inline">
        <div class="layui-input-inline">
            <input class="layui-input" type="text" name="barcode" placeholder="托盘码" autocomplete="off">
        </div>
    </div>
    <!-- 日期范围 -->
    <div class="layui-inline" style="width: 300px">
        <div class="layui-input-inline">
            <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
        </div>
    </div>
    <!-- 待添加 -->
    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">搜索</button>
        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">重置</button>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">导出</button>
    </div>
</script>
<!-- 表格 -->
<table class="layui-hide" id="stoQue" lay-filter="stoQue"></table>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-xs loc-detl" lay-event="locDetl">查看明细</a>
</script>
<!--明细表-->
<div id="detlTable" style="display: none">
    <div class="layui-inline"  style="width:90%;margin-top: 10px;margin-left: 20px">
        <span style=" color: indianred">以下为当前库位的物料明细</span>
    </div>
    <table class="layui-hide" id="locDetlByMap" lay-filter="locDetlByMap"></table>
</div>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/stoMan/stoQue.js" charset="utf-8"></script>
</body>
</html>
src/main/webapp/views/tpl/alarm-detl.html
New file
@@ -0,0 +1,52 @@
<style>
    pre {
        font-family: 'DejaVu Sans Mono','Courier New',monospace;
        padding: 15px 10px;
        line-height: 17px;
        margin: 5px;
        word-wrap: break-word;
        border: solid 1px #9e9e9e;
        border-radius: 3px;
        color: #729fcf;
    }
    .string { color: #4e9a06; }
    .number { color: #ad7fa8; }
    .boolean { color: #c4a000; }
    .null { color: #babdb6; }
    .key { color: #204a87; }
</style>
<div style="padding: 25px 25px 15px 25px;" id="callbackDialog">
    <fieldset class="layui-elem-field layui-field-title">
        <legend>基础信息</legend>
    </fieldset>
    <div class="layui-text" style="margin-bottom: 5px;">
        事件编号:{{d.request}}<br />
        设备编号:{{d.response.sensorId$}}<br />
        设备类型:{{d.response.sensorType$}}<br />
    </div>
    <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
        <legend>报警信息</legend>
    </fieldset>
    <div class="layui-text" style="margin-bottom: 5px;">
        发送时间:{{d.response.createTime$}}<br />
        故障描述:{{d.response.desc}}<br />
    </div>
    <div class="text-center" style="padding-top: 15px;text-align: right">
        <button class="layui-btn layui-btn-normal" ew-event="closeDialog">关闭</button>
    </div>
</div>
<!-- js部分 -->
<script>
    layui.config({
        base: baseUrl + "/static/layui/lay/modules/"
    }).use(['layer', 'admin'], function () {
        var $ = layui.jquery;
        var layer = layui.layer;
        var admin = layui.admin;
        var layerData = admin.getLayerData('#callbackDialog');
    });
</script>
src/main/webapp/views/tpl/theme/img/ic_loading.gif
src/main/webapp/views/tpl/theme/img/icon_date.png
src/main/webapp/views/tpl/theme/img/icon_search.png
src/main/webapp/views/tpl/theme/img/theme-admin.png
src/main/webapp/views/tpl/theme/img/theme-blue.png
src/main/webapp/views/tpl/theme/img/theme-colorful.png
src/main/webapp/views/tpl/theme/img/theme-cyan.png
src/main/webapp/views/tpl/theme/img/theme-green.png
src/main/webapp/views/tpl/theme/img/theme-my.png
src/main/webapp/views/tpl/theme/img/theme-pink.png
src/main/webapp/views/tpl/theme/img/theme-purple.png
src/main/webapp/views/tpl/theme/img/theme-red.png
src/main/webapp/views/tpl/theme/img/theme-white.png
src/main/webapp/views/tpl/tpl-note.html
New file
@@ -0,0 +1,206 @@
<div class="layui-card-header">本地便签</div>
<div class="note-wrapper"></div>
<div class="note-empty">
    <i class="layui-icon layui-icon-face-surprised"></i>
    <p>没有便签</p>
</div>
<div class="btn-circle" id="noteAddBtn" title="添加便签" style="position: absolute;">
    <i class="layui-icon layui-icon-add-1"></i>
</div>
<script>
    layui.use(['layer', 'form', 'util', 'admin'], function () {
        var $ = layui.jquery;
        var layer = layui.layer;
        var util = layui.util;
        var admin = layui.admin;
        var dataList = [];  // 便签列表
        var $noteWrapper = $('.note-wrapper');
        /* 渲染列表 */
        function renderList() {
            $noteWrapper.empty();
            dataList = layui.data(admin.setter.tableName).notes;
            if (dataList === undefined) dataList = [];
            for (var i = 0; i < dataList.length; i++) {
                var item = dataList[i];
                $noteWrapper.prepend([
                    '<div class="note-item" data-id="', item.id, '">',
                    '   <div class="note-item-content">', util.escape(item.content), '</div>',
                    '   <div class="note-item-time">', item.time, '</div>',
                    '   <i class="layui-icon layui-icon-close-fill note-item-del"></i>',
                    '</div>'
                ].join(''));
            }
            $('.note-empty').css('display', dataList.length === 0 ? 'block' : 'none');
            // 点击修改
            $('.note-item').click(function () {
                var index = parseInt($(this).attr('data-id'));
                showNote(dataList[index]);
            });
            // 点击删除
            $('.note-item-del').click(function (e) {
                var id = parseInt($(this).parent().attr('data-id'));
                layer.confirm('确认删除吗?', {
                    skin: 'layui-layer-admin',
                    shade: .1,
                    shadeClose: true
                }, function (index) {
                    layer.close(index);
                    dataList.splice(id, 1);
                    for (var i = 0; i < dataList.length; i++) dataList[i].id = i;
                    putDataList();
                    renderList();
                });
                e.stopPropagation();
            });
        }
        renderList();
        /* 添加 */
        $('#noteAddBtn').click(function () {
            showNote();
        });
        // 显示编辑弹窗
        function showNote(data) {
            var id = data ? data.id : undefined, content = data ? data.content : '';
            admin.open({
                id: 'layer-note-edit',
                title: '便签',
                type: 1,
                area: 'auto',
                offset: '50px',
                shadeClose: true,
                content: '<textarea id="noteEditText" placeholder="请输入内容" style="width: 280px;height: 150px;border: none;color: #666666;word-wrap: break-word;padding: 10px 20px;resize: vertical;">' + content + '</textarea>',
                success: function () {
                    $('#noteEditText').change(function () {
                        content = $(this).val();
                    });
                },
                end: function () {
                    if (id !== undefined) {
                        if (!content) {
                            dataList.splice(id, 1);
                            for (var i = 0; i < dataList.length; i++) dataList[i].id = i;
                        } else if (content !== dataList[id].content) {
                            dataList[id].content = content;
                            dataList[id].time = util.toDateString(new Date(), 'yyyy-MM-dd HH:mm');
                        }
                    } else if (content) {
                        dataList.push({
                            id: dataList.length, content: content,
                            time: util.toDateString(new Date(), 'yyyy-MM-dd HH:mm')
                        });
                    }
                    putDataList();
                    renderList();
                }
            });
        }
        /* 更新本地缓存 */
        function putDataList() {
            layui.data(admin.setter.tableName, {key: 'notes', value: dataList});
        }
    });
</script>
<style>
    .note-wrapper {
        padding: 15px 0 15px 15px;
        background-color: #fbfbfb;
        position: absolute;
        top: 43px;
        left: 0;
        right: 0;
        bottom: 0;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
    }
    .note-wrapper .note-item {
        display: inline-block;
        width: 110px;
        padding: 12px;
        cursor: pointer;
        position: relative;
        border-radius: 8px;
        margin: 0 15px 15px 0;
        border: 1px solid #eeeeee;
        background-color: #ffffff;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
        -webkit-transition: all .3s ease;
        -moz-transition: all .3s ease;
        -ms-transition: all .3s ease;
        -o-transition: all .3s ease;
        transition: all .3s ease;
    }
    .note-wrapper .note-item:hover {
        box-shadow: 0 0 8px rgba(0, 0, 0, .05);
        -webkit-transform: scale(1.02);
        -moz-transform: scale(1.02);
        -ms-transform: scale(1.02);
        -o-transform: scale(1.02);
        transform: scale(1.02);
    }
    .note-wrapper .note-item .note-item-content {
        color: #666;
        height: 80px;
        font-size: 14px;
        overflow: hidden;
        word-break: break-all;
    }
    .note-wrapper .note-item .note-item-time {
        color: #999;
        font-size: 12px;
        margin-top: 8px;
    }
    .note-wrapper .note-item .note-item-del {
        position: absolute;
        top: 2px;
        right: 2px;
        color: #FF5722;
        font-size: 24px;
        height: 24px;
        width: 24px;
        background-color: #fff;
        border-radius: 50%;
        visibility: hidden;
        -webkit-transition: all .3s ease;
        -moz-transition: all .3s ease;
        -ms-transition: all .3s ease;
        -o-transition: all .3s ease;
        transition: all .3s ease;
        opacity: 0;
    }
    .note-wrapper .note-item:hover .note-item-del {
        visibility: visible;
        opacity: 1;
    }
    .note-empty {
        color: #999;
        padding: 80px 0;
        text-align: center;
        display: none;
        position: relative;
        z-index: 1
    }
    .note-empty .layui-icon {
        font-size: 60px;
        margin-bottom: 10px;
        display: inline-block;
    }
</style>
src/main/webapp/views/tpl/tpl-theme.html
New file
@@ -0,0 +1,229 @@
<div class="layui-card-header">主题设置</div>
<div class="more-theme-list">
    <div class="more-theme-item" data-theme="theme-normal">
        <img src="tpl/theme/img/theme-admin.png"/>
    </div>
    <div class="more-theme-item" data-theme="theme-cyan">
        <img src="tpl/theme/img/theme-cyan.png"/>
    </div>
    <div class="more-theme-item" data-theme="theme-white">
        <img src="tpl/theme/img/theme-white.png"/>
    </div>
    <div class="more-theme-item" data-theme="theme-pink">
        <img src="tpl/theme/img/theme-pink.png"/>
    </div>
    <div class="more-theme-item active" data-theme="theme-colorful">
        <img src="tpl/theme/img/theme-colorful.png"/>
    </div>
    <div class="more-theme-item" data-theme="theme-blue">
        <img src="tpl/theme/img/theme-blue.png"/>
    </div>
    <div class="more-theme-item" data-theme="theme-green">
        <img src="tpl/theme/img/theme-green.png"/>
    </div>
    <div class="more-theme-item" data-theme="theme-purple">
        <img src="tpl/theme/img/theme-purple.png"/>
    </div>
<!--    <div class="more-theme-item" data-theme="theme-red">-->
<!--        <img src="tpl/theme/img/theme-red.png"/>-->
<!--    </div>-->
    <div class="more-theme-item" data-theme="theme-my">
        <img src="tpl/theme/img/theme-my.png"/>
    </div>
</div>
<!-- 导航 -->
<div class="more-menu-list">
<!--    <a class="more-menu-item" href="https://easyweb.vip/doc/" target="_blank">-->
<!--        <i class="layui-icon layui-icon-read" style="font-size: 19px;"></i> 开发文档-->
<!--    </a>-->
<!--    <a class="more-menu-item" href="https://demo.easyweb.vip/spa" target="_blank">-->
<!--        <i class="layui-icon layui-icon-tabs" style="font-size: 16px;"></i> &nbsp;spa版本-->
<!--    </a>-->
<!--    <a class="more-menu-item" href="https://demo.easyweb.vip/theme" target="_blank">-->
<!--        <i class="layui-icon layui-icon-theme"></i> 主题生成器-->
<!--    </a>-->
</div>
<!-- 控制开关 -->
<div class="layui-form" style="margin: 25px 0;" lay-filter="more-set-form">
    <div class="layui-form-item">
        <label class="set-item-label">页&emsp;脚:</label>
        <div class="set-item-ctrl">
            <input id="setFooter" lay-filter="setFooter" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
        </div>
        <label class="set-item-label"> Tab&nbsp;记忆:</label>
        <div class="set-item-ctrl">
            <input id="setTab" lay-filter="setTab" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="set-item-label">多标签:</label>
        <div class="set-item-ctrl">
            <input id="setMoreTab" lay-filter="setMoreTab" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
        </div>
        <label class="set-item-label">切换刷新:</label>
        <div class="set-item-ctrl">
            <input id="setRefresh" lay-filter="setRefresh" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="set-item-label">导航箭头:</label>
        <div class="set-item-ctrl">
            <input lay-filter="navArrow" type="radio" value="" title="默认" name="navArrow">
            <input lay-filter="navArrow" type="radio" value="arrow2" title="箭头" name="navArrow">
            <input lay-filter="navArrow" type="radio" value="arrow3" title="加号" name="navArrow">
        </div>
    </div>
</div>
<script>
    layui.use(['form', 'admin'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var admin = layui.admin;
        var setter = admin.setter;
        var $body = $('body');
        // 切换主题
        var $themItem = $('.more-theme-item');
        $themItem.click(function () {
            $themItem.removeClass('active');
            $(this).addClass('active');
            admin.changeTheme($(this).data('theme'));
        });
        var theme = $body.data('theme');
        if (theme) {
            $themItem.removeClass('active');
            $themItem.filter('[data-theme="' + theme + '"]').addClass('active');
        }
        // 关闭/开启页脚
        form.on('switch(setFooter)', function (data) {
            var checked = data.elem.checked;
            admin.putSetting('closeFooter', !checked);
            checked ? $body.removeClass('close-footer') : $body.addClass('close-footer');
        });
        $('#setFooter').prop('checked', !$body.hasClass('close-footer'));
        // 关闭/开启Tab记忆功能
        form.on('switch(setTab)', function (data) {
            layui.index.setTabCache(data.elem.checked);
        });
        $('#setTab').prop('checked', setter.cacheTab);
        // 关闭/开启多标签
        form.on('switch(setMoreTab)', function (data) {
            var checked = data.elem.checked;
            admin.putSetting('pageTabs', checked);
            admin.putTempData('indexTabs', undefined);
            location.reload();
        });
        $('#setMoreTab').prop('checked', setter.pageTabs);
        // 切换Tab自动刷新
        var $mainTab = $('.layui-body>.layui-tab[lay-filter="admin-pagetabs"]');
        form.on('switch(setRefresh)', function (data) {
            var checked = data.elem.checked;
            admin.putSetting('tabAutoRefresh', checked);
            checked ? $mainTab.attr('lay-autoRefresh', 'true') : $mainTab.removeAttr('lay-autoRefresh');
        });
        $('#setRefresh').prop('checked', setter.tabAutoRefresh === true);
        // 导航小三角
        var $leftNav = $('.layui-layout-admin>.layui-side>.layui-side-scroll>.layui-nav');
        form.on('radio(navArrow)', function (data) {
            $leftNav.removeClass('arrow2 arrow3');
            data.value && $leftNav.addClass(data.value);
            admin.putSetting('navArrow', data.value);
        });
        var navArrow = $leftNav.hasClass('arrow2') ? 'arrow2' : $leftNav.hasClass('arrow3') ? 'arrow3' : '';
        $('[name="navArrow"][value="' + navArrow + '"]').prop('checked', true);
        form.render('radio', 'more-set-form');
        form.render('checkbox', 'more-set-form');
    });
</script>
<style>
    /* theme */
    .more-theme-list {
        padding-left: 15px;
        padding-top: 20px;
        margin-bottom: 10px;
    }
    .more-theme-item {
        padding: 4px;
        margin: 0 6px 15px 0;
        display: inline-block;
        border: 1px solid transparent;
    }
    .more-theme-item img {
        width: 80px;
        height: 50px;
        background: #f5f7f9;
        box-sizing: border-box;
        border: 1px solid #f5f7f9;
        cursor: pointer;
    }
    .more-theme-item:hover, .more-theme-item.active {
        border-color: #5FB878;
    }
    .more-menu-item {
        color: #595959;
        height: 50px;
        line-height: 50px;
        font-size: 16px;
        padding: 0 25px;
        border-bottom: 1px solid #e8e8e8;
        font-style: normal;
        display: block;
    }
    /* menu */
    .more-menu-item:first-child {
        border-top: 1px solid #e8e8e8;
    }
    .more-menu-item:hover {
        color: #595959;
        background: #f6f6f6;
    }
    .more-menu-item .layui-icon {
        font-size: 18px;
        padding-right: 10px;
    }
    .more-menu-item:after {
        color: #8c8c8c;
        right: 16px;
        content: "\e602";
        position: absolute;
        font-family: layui-icon !important;
    }
    .more-menu-item.no-icon:after {
        display: none;
    }
    /* setting from */
    .set-item-label {
        height: 38px;
        line-height: 38px;
        padding-left: 20px;
        display: inline-block;
    }
    .set-item-ctrl {
        height: 38px;
        line-height: 38px;
        display: inline-block;
    }
    .set-item-ctrl > * {
        margin: 0 !important;
    }
</style>