自动化立体仓库 - WMS系统
#
whycq
2024-06-11 2f7c2cf530721226082cb4fb7efe10ddc22070f6
#
10个文件已修改
334 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvMobileController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/AgvCommonService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/order.html 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvMobileController.java
@@ -425,11 +425,11 @@
        if (mT.equals("unAuto")) {
            moveType = "2";
            ioType = 111;
            int count = agvWrkMastService.selectCount(new EntityWrapper<AgvWrkMast>().eq("io_type", ioType));
            if (count>3){
                log.equals("111任务堵塞,稍后再试!!!当前限制数量3条,限制条件:io_type = 111");
                throw new CoolException("111任务堵塞,稍后再试!");
            }
            //int count = agvWrkMastService.selectCount(new EntityWrapper<AgvWrkMast>().eq("io_type", ioType));
            //if (count>3){
            //    log.equals("111任务堵塞,稍后再试!!!当前限制数量3条,限制条件:io_type = 111");
            //    throw new CoolException("111任务堵塞,稍后再试!");
            //}
        } else {
            moveType = "1";
            ioType = 108;
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -35,106 +35,6 @@
    @Autowired
    private OpenService openService;
    /****************************************************************************/
    /********************************* 打包上线 **********************************/
    /****************************************************************************/
    @PostMapping("/order/pakin/new/package/v1")
    @AppAuth(memo = "打包上线接口")
    public synchronized R pakinOrderPackage(@RequestHeader(required = false) String appkey,
                                            @RequestBody(required = false) PackParam param,
                                            HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        openService.packageUp(param);
        return R.ok();
    }
    /**
     * 添加入库单
     */
    @PostMapping("/order/pakin/new/default/v1")
    public synchronized R pakinOrderCreate(@RequestHeader(required = false) String appkey,
                                           @RequestBody OpenOrderPakinParam param,
                                           HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getOrderNo())) {
            return R.error("单据编号[orderNo]不能为空");
        }
        if (Cools.isEmpty(param.getOrderType())) {
            return R.error("单据类型[orderType]不能为空");
        }
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.pakinOrderCreate(param);
        return R.ok();
    }
    /**
     * 入库单回写
     */
    @PostMapping("/order/pakin/complete/default/v1")
    public synchronized R orderPakinComplete(@RequestHeader(required = false) String appkey,
                                             @RequestBody(required = false) OpenOrderCompleteParam param,
                                             HttpServletRequest request) {
        auth(appkey, param, request);
        return R.ok().add(openService.pakinOrderComplete(param));
    }
    /**
     * 添加出库单
     */
    @PostMapping("/order/pakout/new/default/v1")
    @AppAuth(memo = "添加订单出库")
    public synchronized R pakoutOrderCreate(@RequestHeader(required = false) String appkey,
                                            @RequestBody OpenOrderPakoutParam param,
                                            HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getLgort())) {
            return R.error("单据编号[lgort]不能为空");
        }
        if (!param.getLgort().equals("5006")) {
            return R.ok();
        }
        if (Cools.isEmpty(param.getOrderNo())) {
            return R.error("单据编号[orderNo]不能为空");
        }
        if (Cools.isEmpty(param.getOrderType())) {
            return R.error("单据类型[orderType]不能为空");
        }
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.pakoutOrderCreate(param);
        return R.ok();
    }
    /**
     * 出库单回写
     */
    @PostMapping("/order/pakout/complete/default/v1")
    public synchronized R orderPakoutComplete(@RequestHeader(required = false) String appkey,
                                              @RequestBody(required = false) OpenOrderCompleteParam param,
                                              HttpServletRequest request) {
        auth(appkey, param, request);
        return R.ok().add(openService.pakoutOrderComplete(param));
    }
    /**
     * 库存统计
     */
@@ -163,45 +63,7 @@
    }
    /**
     * 入库通知档生成
     */
    @PostMapping("/comb/v1")
    public synchronized R combMES(@RequestHeader(required = false) String appkey,
                                      @RequestBody(required = false) CombParam param,
                                      HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        openService.combMes(param);
        return R.ok("组托成功");
    }
    /**
     * 入库记录获取
     */
    @PostMapping("/inlog/v1")
    public synchronized R inlogERP(@RequestHeader(required = false) String appkey,
                                  HttpServletRequest request){
        auth(appkey,null, request);
        if (Cools.isEmpty()) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.inlogERP());
    }
    /**
     * 出库记录获取
     */
    @PostMapping("/outlog/v1")
    public synchronized R outlogERP(@RequestHeader(required = false) String appkey,
                                   HttpServletRequest request){
        auth(appkey,null, request);
        if (Cools.isEmpty()) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.outlogERP());
    }
    private void auth(String appkey, Object obj, HttpServletRequest request) {
@@ -218,66 +80,6 @@
        }
    }
    @PostMapping("/order/matSync/default/v1")
    public synchronized R syncMatInfoU8(@RequestHeader(required = false) String appkey,
                                         @RequestBody(required = false) Map<String, Object> param,
                                         HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        int msgU = 0;
        int msgT = 0;
        int msgF = 0;
        StringBuilder msg= new StringBuilder("原因:");
        List<MatInfoParam> matDetails = (List<MatInfoParam>) param.get("matDetails");
        for (Object matDetail : matDetails){
            MatInfoParam matInfoParam = JSONObject.parseObject(JSON.toJSONString(matDetail),MatInfoParam.class);
            if (Cools.isEmpty(matDetails)) {
                msgF++;
                continue;
            }
            openService.syncMat(matInfoParam);
            if(matInfoParam.isUpdate()){
                msgU++;
            }else if(matInfoParam.isInsert()){
                msgT++;
            } else if(matInfoParam.isError()){
                msgF++;
                msg.append(matInfoParam.getCinvcode()).append(":").append(matInfoParam.getMemo()).append(";");
            }
        }
        String message = "";
        boolean success = false;
        if(msgT != 0){
            message += "成功接收物料:"+msgT+"个";
            success = true;
        }
        if(msgU != 0){
            message += "成功修改物料:"+msgU+"个";
            success = true;
        }
        if(msgF != 0){
            message += "接收物料失败:"+msgF+"个;"+msg;
        }
        if(success){
            return R.ok(message);
        }else {
            return R.error(message);
        }
//        if (MsgF==0){
//            return R.ok("成功接收物料:"+MsgT+"个");
//        }else if (MsgT==0){
//            return R.error("接收物料失败:"+MsgF+"个;"+Msg);
//        }else {
//            return R.ok("成功接收物料:"+MsgT+"个;"+"接收物料失败:"+MsgF+"个;"+Msg);
//        }
    }
    @PostMapping("/order/pak/default/v1")
    @AppAuth(memo = "生成退货补货单据")
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -292,9 +292,16 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 工序状态
     */
    @ApiModelProperty(value= "工序状态 1:待加工,2:已加工,3:无需加工")
    @TableField("process_sts")
    private Integer processSts;
    public OrderDetl() {}
    public OrderDetl(Long orderId, String orderNo, Double anfme, Double qty, String matnr, String maktx, String batch, String specs, String model, String color, String brand, String unit, Double price, String sku, Double units, String barcode, String origin, String manu, String manuDate, String itemNum, Double safeQty, Double weight, Double length, Double volume, String threeCode, String supp, String suppCode, Integer beBatch, String deadTime, Integer deadWarn, Integer source, Integer inspect, Integer danger, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
    public OrderDetl(Long orderId, String orderNo, Double anfme, Double qty, String matnr, String maktx, String batch, String specs, String model, String color, String brand, String unit, Double price, String sku, Double units, String barcode, String origin, String manu, String manuDate, String itemNum, Double safeQty, Double weight, Double length, Double volume, String threeCode, String supp, String suppCode, Integer beBatch, String deadTime, Integer deadWarn, Integer source, Integer inspect, Integer danger, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo,Integer processSts) {
        this.orderId = orderId;
        this.orderNo = orderNo;
        this.anfme = anfme;
@@ -334,6 +341,7 @@
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
        this.processSts = processSts;
    }
    public String getOrderId$(){
@@ -345,6 +353,22 @@
        return null;
    }
    public String getProcessSts$(){
        if (null == this.processSts){ return null; }
        switch (this.processSts){
            case 0:
                return "其他";
            case 1:
                return "待加工";
            case 2:
                return "已加工";
            case 3:
                return "无需加工";
            default:
                return String.valueOf(this.processSts);
        }
    }
    public String getBeBatch$(){
        if (null == this.beBatch){ return null; }
        switch (this.beBatch){
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -501,10 +501,16 @@
    @Synchronized
    public String allocationOut(AgvMobileStartPakin param, Long userId) {
        Date now = new Date();
        if(Cools.isEmpty(param.getBarcode())) {
            throw new CoolException("请输入货架码");
        }
        AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", param.getDevNo()));
        Integer oldWrkNo = agvWrkMast.getWrkNo();
        if (Cools.isEmpty(agvWrkMast)) {
            throw new CoolException("工作档中没有此站点任务");
        }
        if (!agvWrkMast.getBarcode().equals(param.getBarcode())) {
            throw new CoolException("当前货架码与任务不匹配");
        }
        if (!agvWrkMast.getWrkSts().equals(207L)) {
            throw new CoolException("工作状态不符合离场条件");
@@ -546,8 +552,14 @@
    public String allocationIn(AgvMobileStartPakin param, Long userId) {
        Date now = new Date();
        AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", param.getBarcode()));
        if (Cools.isEmpty(agvWrkMast)) {
            throw new CoolException("暂无当前货架码的任务");
        }
        if (agvWrkMast.getIoType() != 111) {
            throw new CoolException("非手动调拨任务,不支持次功能");
        }
        if (!Cools.isEmpty(agvWrkMast.getSourceLocNo())) {
            throw new CoolException("当前货架码任有源库位,请确认");
        }
        AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(param.getDevNo());
        if (Cools.isEmpty(agvWrkMast)) {
@@ -582,10 +594,16 @@
    @Synchronized
    public String empOut(AgvMobileStartPakin param, Long userId) {
        Date now = new Date();
        if (Cools.isEmpty(param.getBarcode())) {
            throw new CoolException("请输入货架码");
        }
        AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("source_loc_no", param.getDevNo()));
        Integer oldWrkNo = agvWrkMast.getWrkNo();
        if (Cools.isEmpty(agvWrkMast)) {
            throw new CoolException("工作档中没有此站点任务");
        }
        if (!agvWrkMast.getBarcode().equals(param.getBarcode())) {
            throw new CoolException("当前货架码与任务不匹配");
        }
        agvWrkMast.setWrkSts(213L);
        agvWrkMast.setSourceLocNo("");
@@ -608,6 +626,12 @@
        if (Cools.isEmpty(agvWrkMast)) {
            throw new CoolException("工作档中没有此站点任务");
        }
        if (agvWrkMast.getIoType() != 113) {
            throw new CoolException("当前工作类型不能空架进场");
        }
        if (agvWrkMast.getWrkSts() != 213) {
            throw new CoolException("当前工作类型不能空架进场");
        }
        agvWrkMast.setWrkSts(214L);
        agvWrkMast.setSourceLocNo(param.getDevNo());
        if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) {
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -355,6 +355,7 @@
        //查询入库通知档
        List<AgvWaitPakin> agvWaitPakinList = agvWaitPakinService.selectByContainerCode(containerCode);
        if(!Cools.isEmpty(agvWaitPakinList)){
            agvLocMast = agvCommonService.getLocNo(locType,agvBasDevp.getFloor(),false,false);
            String devNo = agvBasDevp.getDevNo();
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -196,7 +196,14 @@
    }
    private ReturnT<String> doHandMove2(AgvWrkMast agvWrkMast) {
        Date now = new Date();
        AgvBasDevp devpNo = agvCommonService.getDevpNo(3, 1, "Y", "Y");
        String lev1 = agvWrkMast.getSourceLocNo().substring(agvWrkMast.getSourceLocNo().length() - 4).substring(0, 2);
        AgvBasDevp devpNo = new AgvBasDevp();
        if ("01".equals(lev1)) {
            devpNo = agvCommonService.getDevpNo(3, 1, "Y", "Y");
        } else {
            devpNo = agvCommonService.getDevpNo(3, 5, "Y", "Y");
        }
        if (Cools.isEmpty(devpNo)) {
            throw new CoolException("暂无空闲接驳位");
        }
src/main/java/com/zy/common/service/AgvCommonService.java
@@ -253,7 +253,11 @@
            if (isEmpty) {
                wrapper.eq("floor", floor).eq("lev1",1);
            } else {
                wrapper.eq("floor", floor).orderBy("lev1",!orderBy);
                if (isCurrLev) {
                    wrapper.eq("floor", floor).eq("lev1",1);
                } else {
                    wrapper.eq("floor", floor).orderBy("lev1",!orderBy);
                }
            }
src/main/resources/application.yml
@@ -10,8 +10,8 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    #    url: jdbc:sqlserver://127.0.0.1:1433;databasename=phyzasrs
    url: jdbc:sqlserver://192.168.4.15:1433;databasename=phyzasrs
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=phyzasrs
#    url: jdbc:sqlserver://192.168.4.15:1433;databasename=phyzasrs
    username: sa
    password: sa@123
  mvc:
src/main/webapp/static/js/order/order.js
@@ -162,7 +162,7 @@
                            //{field: 'manu', title: '行号'},
                            {field: 'threeCode', title: '销售单号'},
                            {field: 'deadTime', title: '自由项'},
                            //{field: 'itemNum', title: '行唯一标识'}
                            {field: 'processSts$', title: '工序'}
                        ]],
                        request: {
                            pageName: 'curr',
@@ -195,7 +195,7 @@
            type: 1,
            title: (expTpe ? '修改' : '添加') + '单据',
            content: $('#editDialog').html(),
            area: '1300px',
            area: '1600px',
            success: function (layero, dIndex) {
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                var isExpAdd = !expTpe;
@@ -254,6 +254,13 @@
                    page: true,
                    height: '350px;',
                    cellMinWidth: 100,
                    css: [ // 设置单元格样式
                        // 取消默认的溢出隐藏,并设置适当高度
                        '.layui-table-cell{height: 50px; line-height: 40px;}',
                        '.layui-table-cell .layui-colorpicker{width: 38px; height: 38px;}',
                        '.layui-table-cell select{height: 36px; padding: 0 5px;}'
                    ].join(''),
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
@@ -263,13 +270,35 @@
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'threeCode', title: '销售订单号(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'deadTime', title: '销售订单行号(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'processSts', title: '工序', templet: function (d) {
                                console.log(d)
                            var select = `<select class="layui-select" name="processSts"  lay-filter="processStsSelect" data-value=${d.processSts} id=${d.id}>
                                            <option value="">选择状态</option>
                                            <option value="1">待加工</option>
                                            <option value="2">已加工</option>
                                            <option value="3">无需加工</option>
                                        </select>`;
                            return select;
                            }},
                        // {field: 'inQty', title: '已入库量',  minWidth: 100, width: 100},
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
                    ]],
                    done: function (res) {
                    done: function (res,curr, count) {
                        console.log(res)
                        $(layero).find('.layui-table-view').css('margin', '0');
                        $(".layui-table-body").css('overflow','visible');
                        $(".layui-table-box").css('overflow','visible');
                        $(".layui-table-view").css('overflow','visible');
                        var tableElem = this.elem.next('.layui-table-view');
                        count || tableElem.find('.layui-table-header').css('overflow', 'auto');
                        layui.each(tableElem.find('select[name="processSts"]'), function (index, item) {
                            var elem = $(item);
                            elem.val(elem.data('state')).parents('div.layui-table-cell').css('overflow', 'visible');
                        });
                        form.render();//刷新表单
                    },
                    size: ''
                };
@@ -314,6 +343,17 @@
                        });
                    }
                });
                // 工具条点击事件
                form.on('select(processStsSelect)', function (obj) {
                    console.log(obj)
                    var id = obj.elem.id
                    var val = obj.value
                    for (let item of xxDataList) {
                        if (item.id == id) {
                            item.processSts = val
                        }
                    }
                });
                // 明细数据修改
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = obj.tr.attr("data-index");
src/main/webapp/views/order/order.html
@@ -38,6 +38,11 @@
        .btn-delete {
            display: none;
        }
        td .layui-form-select {
            margin-top: -9px;
            margin-left: -14px;
            margin-right: -14px;
        }
    </style>
</head>
<body>
@@ -208,6 +213,11 @@
    </form>
</script>
<!--工序状态-->
<script type="text/html" id="process">
</script>
<!-- 订单任务追溯 -->
<script id="wrkTraceDialog" type="text/html" style="position: relative">
    <div style="position: absolute; top: 0; left: 0;">