王佳豪
2021-03-09 cc344f433bf14d966207255ac0c8f93a9a46dec2
1.0.5
1.pda新增平仓入库功能
2.pda新增主界面方块型功能菜单
2个文件已添加
11个文件已修改
431 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LocNormalController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/LocNormalParam.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocNormalMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocNormalService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocNormalMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/pda.css 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pda/comb.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pda/combPro.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pda/index.html 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pda/locNormalIn.html 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pda/stockIn.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pda/stockOut.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocNormalController.java
@@ -11,6 +11,7 @@
import com.core.common.DateUtils;
import com.core.common.R;
import com.zy.asrs.entity.LocNormal;
import com.zy.asrs.entity.param.LocNormalParam;
import com.zy.asrs.service.LocNormalService;
import com.zy.common.utils.excel.locNomal.LocNormalExcel;
import com.zy.common.utils.excel.locNomal.LocNormalExcelListener;
@@ -27,36 +28,39 @@
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static jdk.nashorn.api.scripting.ScriptUtils.convert;
@RestController
public class LocNormalController extends BaseController{
public class LocNormalController extends BaseController {
    @Autowired
    private LocNormalService locNormalService;
    @RequestMapping(value = "/locNomal/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(required = false)String condition,
                  @RequestParam Map<String, Object> param){
    public R list(@RequestParam(defaultValue = "1") Integer curr,
                  @RequestParam(defaultValue = "10") Integer limit,
                  @RequestParam(required = false) String orderByField,
                  @RequestParam(required = false) String orderByType,
                  @RequestParam(required = false) String condition,
                  @RequestParam Map<String, Object> param) {
        excludeTrash(param);
        EntityWrapper<LocNormal> wrapper = new EntityWrapper<>();
        convert(param, wrapper);
        allLike(LocNormal.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        }
        wrapper.eq("state", "1").or().eq("state", "2");
        return R.ok(locNormalService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
    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)){
            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]));
@@ -84,7 +88,7 @@
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<LocNormal> wrapper = new EntityWrapper<LocNormal>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != locNormalService.selectOne(wrapper)){
        if (null != locNormalService.selectOne(wrapper)) {
            return R.parse(BaseRes.REPEAT).add(getComment(LocNormal.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
@@ -114,13 +118,28 @@
        locNormalService.removeLocNormal(param.getMatnr(), modiUser, modiTime);
    }
    // 导入
    /* 导入 */
    @RequestMapping(value = "/locNormal/import/auth")
    @ManagerAuth(memo = "平仓管理导入")
    @Transactional
    public R matCodeImport(MultipartFile file) throws IOException, InterruptedException {
    public R locNormalImport(MultipartFile file) throws IOException, InterruptedException {
        LocNormalExcelListener listener = new LocNormalExcelListener(getUserId());
        EasyExcel.read(file.getInputStream(), LocNormalExcel.class, listener).sheet().doRead();
        return R.ok("成功导入"+listener.getTotal()+"条物料信息");
        return R.ok("成功导入" + listener.getTotal() + "条物料信息");
    }
    /* pda入库 */
    @RequestMapping(value = "/locNormal/pda/in")
    @ManagerAuth(memo = "平仓管理pda入库")
    @Transactional
    public R locNormalPdaIn(@RequestBody LocNormalParam param) {
        Long userId = getUserId();
        Date timeNow = new Date();
        for (Integer i = 0; i < param.getNormalList().size(); i++) {
            param.getNormalList().get(i).setAppeUser(userId);
            param.getNormalList().get(i).setAppeTime(timeNow);
        }
        locNormalService.pdaLocNormalIn(param.getNormalList());
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/param/LocNormalParam.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.param;
import com.zy.asrs.entity.LocNormal;
import java.util.List;
public class LocNormalParam {
    private List<LocNormal> normalList;
    public List<LocNormal> getNormalList() {
        return normalList;
    }
    public void setNormalList(List<LocNormal> normalList) {
        this.normalList = normalList;
    }
}
src/main/java/com/zy/asrs/mapper/LocNormalMapper.java
@@ -23,4 +23,6 @@
    public void outLocNormal(@Param("matnr") String matnr, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime);
    public void removeLocNormal(@Param("matnr") String matnr, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime);
    public void pdaLocNormalIn(List<LocNormal> list);
}
src/main/java/com/zy/asrs/service/LocNormalService.java
@@ -15,4 +15,6 @@
  public void outLocNormal(String matnr, Long modiUser, Date modiTime);
  public void removeLocNormal(String matnr, Long modiUser, Date modiTime);
  public void pdaLocNormalIn(List<LocNormal> list);
}
src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
@@ -34,4 +34,9 @@
    public void removeLocNormal(String matnr, Long modiUser, Date modiTime) {
        baseMapper.removeLocNormal(matnr, modiUser, modiTime);
    }
    @Override
    public void pdaLocNormalIn(List<LocNormal> list) {
        baseMapper.pdaLocNormalIn(list);
    }
}
src/main/resources/mapper/LocNormalMapper.xml
@@ -4,22 +4,22 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.LocNormal">
        <result column="matnr" property="matnr" />
        <result column="maktx" property="maktx" />
        <result column="lgnum" property="lgnum" />
        <result column="type" property="type" />
        <result column="mnemonic" property="mnemonic" />
        <result column="supplier" property="supplier" />
        <result column="warehouse" property="warehouse" />
        <result column="brand" property="brand" />
        <result column="anfme" property="anfme" />
        <result column="bname" property="bname" />
        <result column="memo" property="memo" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
        <result column="state" property="state" />
        <result column="matnr" property="matnr"/>
        <result column="maktx" property="maktx"/>
        <result column="lgnum" property="lgnum"/>
        <result column="type" property="type"/>
        <result column="mnemonic" property="mnemonic"/>
        <result column="supplier" property="supplier"/>
        <result column="warehouse" property="warehouse"/>
        <result column="brand" property="brand"/>
        <result column="anfme" property="anfme"/>
        <result column="bname" property="bname"/>
        <result column="memo" property="memo"/>
        <result column="modi_user" property="modiUser"/>
        <result column="modi_time" property="modiTime"/>
        <result column="appe_user" property="appeUser"/>
        <result column="appe_time" property="appeTime"/>
        <result column="state" property="state"/>
    </resultMap>
    <select id="getLocNormalData" resultMap="BaseResultMap">
@@ -42,4 +42,16 @@
        update asr_loc_normal set state = '3',modi_user = #{modiUser, jdbcType=DECIMAL},
        modi_time = #{modiTime, jdbcType=TIMESTAMP} where matnr = #{matnr,jdbcType=VARCHAR}
    </update>
    <insert id="pdaLocNormalIn">
        BEGIN
        <foreach collection="list" item="item" index="index">
            INSERT INTO asr_loc_normal (matnr, maktx, anfme, warehouse, state, appe_user, appe_time)
            VALUES (#{item.matnr,jdbcType=VARCHAR}, #{item.maktx,jdbcType=VARCHAR}, #{item.anfme,jdbcType=DECIMAL},
            #{item.warehouse,jdbcType=VARCHAR}, '1', #{item.appeUser,jdbcType=DECIMAL},
            #{item.appeTime,jdbcType=TIMESTAMP})
        </foreach>
        END;
    </insert>
</mapper>
src/main/webapp/static/css/pda.css
@@ -35,6 +35,11 @@
    height: 40px;
    margin-right: 0;
}
#warehouse {
    width: 65%;
    height: 40px;
    margin-right: 0;
}
header button {
    height: 20px;
    width: 70px;
src/main/webapp/views/pda/comb.html
@@ -36,6 +36,7 @@
    <div class="layui-btn-container">
        <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">重置</button>
        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()" style="margin-left: 20px">组托</button>
        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" style="margin-left: 20px">返回</button>
        <span id="tips"></span>
    </div>
</footer>
@@ -181,5 +182,9 @@
            $("#code").focus();
        }
    }
    function back() {
        parent.backIndex();
    }
</script>
</html>
src/main/webapp/views/pda/combPro.html
@@ -74,6 +74,7 @@
    <div class="layui-btn-container">
        <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">重置</button>
        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()" style="margin-left: 20px">组托</button>
        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" style="margin-left: 20px">返回</button>
        <span id="tips"></span>
    </div>
</footer>
@@ -341,5 +342,9 @@
            $("#code").focus();
        }
    }
    function back() {
        parent.backIndex();
    }
</script>
</html>
src/main/webapp/views/pda/index.html
@@ -13,10 +13,12 @@
            -webkit-box-sizing: border-box;
            -moz-box-sizing: border-box;
        }
        html {
            height: 100%;
            /*line-height: 1.5;*/
        }
        body {
            height: 100%;
            /*overflow: hidden;*/
@@ -30,12 +32,14 @@
            position: fixed;
            width: 100%;
            overflow: hidden;
            box-shadow: 0 1px 2px 0 rgba(0,0,0,.1)
            box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .1)
        }
        .nav li {
            float: left;
            border-right: 1px solid #f1f1f1; /*todo*/
        }
        .nav li a {
            font-size: 20px;
            letter-spacing: 1px;
@@ -47,48 +51,85 @@
            /*-webkit-transform:scale(1.5);*/
            /*-moz-transform:scale(1.5);*/
        }
        .nav li a:hover {
            color: #000;
        }
        .nav-unselect {
            color: #666;
            color: blue;
        }
        .nav-select {
            background-color: #f1f1f1;  /*todo*/
            color: #000;
            background-color: #f1f1f1; /*todo*/
            color: blue;
        }
        /* 主体 */
        #content {
            padding-top: 32px;
            /*padding-top: 32px;*/
            width: 100%;
            height: 100%;
        }
        iframe {
            border-width: 0;
        }
        td {
            text-align: center;
            vertical-align: middle;
            height: 80px;
            font-size: 24px;
        }
    </style>
</head>
<body>
<!-- 导航栏 -->
<ul class="nav">
    <li><a id="comb" onclick="nav(this.id)" class="nav-select" href="#">组托</a></li>
    <li><a id="combPro" onclick="nav(this.id)" class="nav-unselect" href="#">关联组托</a></li>
    <li><a id="stockIn" onclick="nav(this.id)" class="nav-unselect" href="#">入库</a></li>
    <li><a id="stockOut" onclick="nav(this.id)" class="nav-unselect" href="#">出库</a></li>
</ul>
<!-- 导航菜单 -->
<table id="navList" style="width: 100%; border-color: #e6e6e6" border="1" cellspacing="1">
    <tr>
        <td>
            <a id="comb" onclick="nav(this.id)" class="nav-select" href="#">组托</a>
        </td>
        <td>
            <a id="combPro" onclick="nav(this.id)" class="nav-unselect" href="#">关联组托</a>
        </td>
    </tr>
    <tr>
        <td>
            <a id="stockIn" onclick="nav(this.id)" class="nav-unselect" href="#">入库</a>
        </td>
        <td>
            <a id="stockOut" onclick="nav(this.id)" class="nav-unselect" href="#">出库</a>
        </td>
    </tr>
    <tr>
        <td>
            <a id="locNormalIn" onclick="nav(this.id)" class="nav-unselect" href="#">平仓入库</a>
        </td>
        <td></td>
    </tr>
</table>
<!-- 主体内容 -->
<iframe id="content" src="comb.html"></iframe>
<iframe id="content" src=""></iframe>
</body>
<script>
    // 导航栏
    function nav(id) {
        $('.nav-select').attr("class", "nav-unselect");
        $('#'+id).attr("class", "nav-select");
        $('#content').attr("src", id+".html");
        $('#' + id).attr("class", "nav-select");
        $('#content').attr("src", id + ".html");
        $('#navList').css('display', 'none');
        $('#content').css('display', 'block');
    }
    function backIndex() {
        $('#navList').css('display', 'inline-table');
        $('#content').css('display', 'none');
    }
</script>
</html>
src/main/webapp/views/pda/locNormalIn.html
New file
@@ -0,0 +1,214 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
    <title>平仓入库</title>
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/pda.css" media="all">
    <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/handlebars/handlebars-v4.5.3.js"></script>
    <style>
    </style>
</head>
<body>
<!-- 头部 -->
<header>
    <div>
        <div class="layui-input-inline">
            <label class="layui-form-label">库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区</label>
            <input class="layui-input" type="number" id="warehouse" onkeyup="findCode(this)" placeholder="扫码 / 输入"
                   autocomplete="off">
        </div>
    </div>
    <div style="margin: 5px 5px">
        <button id="mat-btn" type="button" class="layui-btn layui-btn-normal" onclick="getMat()"><i
                class="layui-icon">+</i>提取
        </button>
    </div>
</header>
<!-- 主体 -->
<main>
    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
</main>
<!-- 尾部 -->
<footer>
    <div class="layui-btn-container">
        <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">重置</button>
        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()"
                style="margin-left: 20px">组托
        </button>
        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()"
                style="margin-left: 20px">返回
        </button>
        <span id="tips"></span>
    </div>
</footer>
</body>
<script>
    var tableIns;
    layui.use(['table', 'laydate', 'form'], function () {
        var table = layui.table;
        var $ = layui.jquery;
        var layer = layui.layer;
        var form = layui.form;
        tableIns = table.render({
            elem: '#chooseData',
            data: [],
            limit: 500,
            cellMinWidth: 50,
            cols: [[
                {fixed: 'left', align: 'center', field: 'count', title: '数量', style: 'color: blue', width: 50},
                {field: 'matNo', align: 'center', title: '物料编码'},
                {field: 'matName', align: 'center', title: '物料名称'}
            ]],
            done: function (res, curr, count) {
            }
        });
    });
    window.onload = function () {
        document.getElementById("warehouse").focus();
    }
    function findCode(el) {
        if (el.value.length === 7) {
            $('#mat-btn').focus();
            getMat();
        }
    }
    var matCodeLayerIdx;
    function getMat() {
        matCodeLayerIdx = layer.open({
            type: 2,
            title: '提取物料',
            shade: [0.3, '#000'],
            area: ['90%', '80%'],
            content: 'matQuery.html',
            success: function (layero, index) {
                $('.layui-layer-title').css('font-size', '16px');
            },
            end: function () {
                $('#mat-btn').focus();
            }
        });
    }
    // 添加表格数据
    var matData = [];
    function addTableData(data) {
        if (isEmpty(data.matName)) {
            tips("提取失败", true);
            return;
        }
        let toPush = true;
        for (var j = 0; j < matData.length; j++) {
            if (data.matNo === matData[j].matNo) {
                matData[j].count = Number(matData[j].count) + Number(data.count);
                toPush = false;
            }
        }
        if (toPush) {
            matData.push(data);
        }
        tips("提取成功");
        tableIns.reload({data: matData});
    }
    // 重置
    function reset() {
        $('#code').val("");
        matData = [];
        tableIns.reload({data: matData});
    }
    // 组托
    function comb() {
        let barcode = $('#warehouse').val();
        if (isEmpty(barcode)) {
            tips("库区条码为空", true);
            document.getElementById("warehouse").focus();
            return;
        }
        if (matData.length === 0) {
            tips("请提取物料", true);
            return;
        }
        // 构造平仓入库数据
        var data = []
        matData.map(function (item) {
            data.push({
                matnr: item.matNo,
                maktx: item.matName,
                anfme: item.count,
                warehouse: barcode,
            });
        });
        // 请求保存接口
        $.ajax({
            url: baseUrl + "/locNormal/pda/in",
            headers: {'token': localStorage.getItem('token')},
            data: JSON.stringify({
                normalList: data,
            }),
            contentType: 'application/json;charset=UTF-8',
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200) {
                    reset();
                    tips("组托成功")
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/pda";
                } else {
                    tips(res.msg, true)
                }
            },
        });
    }
    /**
     * 提示信息
     * @param msg 提示内容
     * @param warn true:红色字体
     */
    function tips(msg, warn) {
        // var tips = $('#tips');
        // tips.html(msg);
        // tips.css("color", warn?"red":'#666');
        layer.msg(msg, {icon: warn ? 2 : 1})
    }
    document.onkeyup = function (e) {
        if (window.event)//如果window.event对象存在,就以此事件对象为准
            e = window.event;
        var key = e.charCode || e.keyCode;
        if (key === 115) {
            $("#comb-btn").focus();
            comb();
        } else if (key === 113) {
            $("#code").val("");
            $("#code").focus();
        }
    }
    function back() {
        parent.backIndex();
    }
</script>
</html>
src/main/webapp/views/pda/stockIn.html
@@ -92,6 +92,9 @@
</main>
<!-- 尾部 -->
<footer>
    <div class="layui-btn-container" style="text-align: center; margin-bottom: 8px">
        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" >返回</button>
    </div>
    <div class="layui-btn-container">
        <button type="button" class="layui-btn layui-btn-primary" onclick="reset()">重置</button>
        <button id="empty-pakin" type="button" class="layui-btn layui-btn-normal" onclick="emptyPakIn()" style="margin-left: 15px">空板入库</button>
@@ -316,6 +319,10 @@
            $("#code").focus();
        }
    }
    function back() {
        parent.backIndex();
    }
</script>
<script type="text/template" id="putSiteSelectTemplate">
    {{#each data}}
src/main/webapp/views/pda/stockOut.html
@@ -54,6 +54,7 @@
    <div class="layui-btn-container">
        <button id="reset" type="button" class="layui-btn layui-btn-primary" onclick="reset()">重置</button>
        <button id="pakOut" type="button" class="layui-btn layui-btn-normal" onclick="pakOut()" style="margin-left: 20px">出库</button>
        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" style="margin-left: 20px">返回</button>
        <span id="tips"></span>
    </div>
</footer>
@@ -279,6 +280,10 @@
            $("#locNo").focus();
        }
    }
    function back() {
        parent.backIndex();
    }
</script>
<script type="text/template" id="takeSiteSelectTemplate">
    {{#each data}}