自动化立体仓库 - WMS系统
#
1
2 天以前 b1ab4be395a104f6e1bb25249e0b93c520080053
#
9个文件已修改
2个文件已添加
240 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasAgvMast.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasAgvMastLog.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/AgvBindCtnrAndBinTwoParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/AgvGoTheArnParam.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/bindCtnrAndBinParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkLogScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/constant/AgvConstant.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasAgvMastLogMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -374,6 +374,9 @@
        } catch (Exception e){
            return R.error("单据编号[order_id]以 "+sign_arm_sku+" 与 "+sign_arm_order+" 作为拆分标记拆分失败!!!");
        }
        if (param.getArm_no()>4){
            return R.ok();
        }
        openService.taskArmWorkOrderStatus(param);
        return R.ok();
@@ -451,7 +454,7 @@
        boolean taskAgvReport = openService.TaskAgvReport(param);
        if (taskAgvReport){
            agvBindAndBin(String.valueOf(param.getTaskNo()));
            return R.ok();
            return new R(0,"成功");
        }
        return R.error("任务号不存在");
    }
@@ -551,7 +554,7 @@
            Thread.sleep(500);
            openService.agvBindAndBin(taskNo);
        } catch (Exception e) {
            log.error("异步处理AGV光栅后续逻辑失败", e);
            log.error("异步处理AGV搬运后续逻辑失败", e);
        }
    }
src/main/java/com/zy/asrs/entity/BasAgvMast.java
@@ -136,9 +136,15 @@
    @TableField("devp_id")
    private Integer devpId;
    /**
     * barcode
     */
    @ApiModelProperty(value= "barcode")
    private String barcode;
    @ApiModelProperty(value= "任务类型")
    @TableField("io_type")
    private Integer ioType;
    private Integer ioType;//AGV库位==》输送线站点  0  AGV库位==》AGV库位  1  输送线站点==》AGV库位  2  输送线站点==》输送线站点  3
    public BasAgvMast() {
        SnowflakeIdWorker snowflakeIdWorker = SpringUtils.getBean(SnowflakeIdWorker.class);
src/main/java/com/zy/asrs/entity/BasAgvMastLog.java
@@ -87,6 +87,12 @@
    private Integer floorNo;
    /**
     * barcode
     */
    @ApiModelProperty(value= "barcode")
    private String barcode;
    /**
     * 状态 0: 初始  1: 作业中  2: 完成  
     */
    @ApiModelProperty(value= "状态 0: 初始  1: 作业中  2: 完成  ")
src/main/java/com/zy/asrs/entity/param/AgvBindCtnrAndBinTwoParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.entity.param;
import lombok.Data;
/*
 *  Created by Monkey D. Luffy on 2025.09.09
 * */
@Data
public class AgvBindCtnrAndBinTwoParam {
    private String reqCode;
    private String podCode;//托盘码
    private String positionCode = "2034";//站点
    private String indBind;
}
src/main/java/com/zy/asrs/entity/param/AgvGoTheArnParam.java
@@ -23,7 +23,7 @@
            case "3100101":
            case "3100201":
                ArmAgvGratingParam armAgvGratingParam1 = new ArmAgvGratingParam();
                armAgvGratingParam1.setArmNo(5);
                armAgvGratingParam1.setArmNo(6);
                armAgvGratingParam1.setChannel("A1");
                armList.add(armAgvGratingParam1);
                return armList;
@@ -34,11 +34,11 @@
            case "2900101":
            case "2900201":
                ArmAgvGratingParam armAgvGratingParam2 = new ArmAgvGratingParam();
                armAgvGratingParam2.setArmNo(5);
                armAgvGratingParam2.setArmNo(6);
                armAgvGratingParam2.setChannel("A2");
                armList.add(armAgvGratingParam2);
                ArmAgvGratingParam armAgvGratingParam3 = new ArmAgvGratingParam();
                armAgvGratingParam3.setArmNo(6);
                armAgvGratingParam3.setArmNo(5);
                armAgvGratingParam3.setChannel("A1");
                armList.add(armAgvGratingParam3);
                return armList;
@@ -47,7 +47,7 @@
            case "2800101":
            case "2800201":
                ArmAgvGratingParam armAgvGratingParam4 = new ArmAgvGratingParam();
                armAgvGratingParam4.setArmNo(6);
                armAgvGratingParam4.setArmNo(5);
                armAgvGratingParam4.setChannel("A2");
                armList.add(armAgvGratingParam4);
                return armList;
src/main/java/com/zy/asrs/entity/param/bindCtnrAndBinParam.java
@@ -7,5 +7,6 @@
    String barcode; //托盘条码
    String staNo; // 目标站点
    String locNo; //  目标库位
    Integer floorNo = 1; //  目标楼层
    String indBind; // 0:解绑 1:绑定
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -18,6 +18,7 @@
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.asrs.utils.Utils;
import com.zy.common.constant.AgvConstant;
import com.zy.common.constant.ArmConstant;
import com.zy.common.model.DetlDto;
import com.zy.common.service.CommonService;
@@ -807,6 +808,8 @@
        basAgvMast.setStaNo(param.getStaNo());
        basAgvMast.setSourceLocNo(param.getSourceLocNo());
        basAgvMast.setLocNo(param.getLocNo());
        String locNo = null;
        String staNo = null;
        // 默认值
        basAgvMast.setPriority(1L);          // 默认优先级
        basAgvMast.setStatus(0);             // 初始状态
@@ -814,11 +817,33 @@
        basAgvMast.setModiTime(new Date());  // 修改时间
        basAgvMast.setIoType(param.getIoType());// 任务类型
        basAgvMast.setFloorNo(param.getFloorNo()); //楼层
        switch (basAgvMast.getIoType()){
            // AGV库位==》输送线站点  0
            // AGV库位==》AGV库位  1
            // 输送线站点==》AGV库位  2
            // 输送线站点==》输送线站点  3
            case 0:
            case 1:
                locNo = param.getSourceLocNo();
                break;
            case 2:
            case 3:
                staNo = param.getSourceStaNo().toString();
                break;
        }
        // 插入数据库
        basAgvMastService.insert(basAgvMast);
        return true;
        bindCtnrAndBinParam bindParam = new bindCtnrAndBinParam();
        bindParam.setBarcode(basAgvMast.getTimestamp().toString());
        bindParam.setIndBind("1");
        bindParam.setFloorNo(basAgvMast.getFloorNo());
        bindParam.setLocNo(locNo);
        bindParam.setStaNo(staNo);
        if(bindCtnrAndBin(bindParam)){
            return true;
        }else{
            throw new CoolException("未能绑定");
        }
    }
    @Override
@@ -865,51 +890,53 @@
        if (param == null) {
            throw new CoolException("参数不能为空");
        }
        AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam();
        BasAgvLocNoService basAgvLocNoService = SpringUtils.getBean(BasAgvLocNoService.class);
        BasAgvLocNo basAgvLocNoSou = basAgvLocNoService.selectOne(new EntityWrapper<BasAgvLocNo>().eq("loc_no", param.getLocNo()));
        BasAgvLocNo basAgvLocNoEnd = basAgvLocNoService.selectOne(new EntityWrapper<BasAgvLocNo>().eq("sta_no", param.getStaNo()));
        agvBindCtnrAndBinParam.setReqCode(String.valueOf(System.currentTimeMillis()));
        agvBindCtnrAndBinParam.setCtnrCode(param.getBarcode());
        agvBindCtnrAndBinParam.setCtnrTyp("1");
        if(basAgvLocNoEnd != null && basAgvLocNoEnd.getAgvLocNo() != null){
            agvBindCtnrAndBinParam.setStgBinCode(basAgvLocNoEnd.getAgvLocNo());
        }
        if(basAgvLocNoSou != null && basAgvLocNoSou.getAgvLocNo() != null){
            agvBindCtnrAndBinParam.setStgBinCode(basAgvLocNoSou.getAgvLocNo());
        }
        agvBindCtnrAndBinParam.setIndBind(param.getIndBind());
        try {
            String URL = "http://10.10.10.200:8181/rcms/services/rest/hikRpcService"; // AGV接口地址
            String mesPath = "bindCtnrAndBin"; // 接口路径
            String response = "";
            boolean success = false;
        if (param.getFloorNo()==1){
            AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam();
            BasAgvLocNoService basAgvLocNoService = SpringUtils.getBean(BasAgvLocNoService.class);
            BasAgvLocNo basAgvLocNoSou = basAgvLocNoService.selectOne(new EntityWrapper<BasAgvLocNo>().eq("loc_no", param.getLocNo()));
            BasAgvLocNo basAgvLocNoEnd = basAgvLocNoService.selectOne(new EntityWrapper<BasAgvLocNo>().eq("sta_no", param.getStaNo()));
            agvBindCtnrAndBinParam.setReqCode(String.valueOf(System.currentTimeMillis()));
            agvBindCtnrAndBinParam.setCtnrCode(param.getBarcode());
            agvBindCtnrAndBinParam.setCtnrTyp("1");
            if(basAgvLocNoEnd != null && basAgvLocNoEnd.getAgvLocNo() != null){
                agvBindCtnrAndBinParam.setStgBinCode(basAgvLocNoEnd.getAgvLocNo());
            }
            if(basAgvLocNoSou != null && basAgvLocNoSou.getAgvLocNo() != null){
                agvBindCtnrAndBinParam.setStgBinCode(basAgvLocNoSou.getAgvLocNo());
            }
            agvBindCtnrAndBinParam.setIndBind(param.getIndBind());
            try {
                log.info("AGV绑定容器接口请求参数: {}", JSON.toJSONString(agvBindCtnrAndBinParam));
                String URL = AgvConstant.AGV_URL+"/"+AgvConstant.AGV_hikRpcService; // AGV接口地址
                String mesPath = AgvConstant.getAGVADAPTOR(param.getFloorNo()); // 接口路径
                String response = "";
                boolean success = false;
                try {
                    log.info("AGV绑定容器接口请求参数: {}", JSON.toJSONString(agvBindCtnrAndBinParam));
                response = new HttpHandler.Builder()
                        .setUri(URL)
                        .setPath(mesPath)
                        .setJson(JSON.toJSONString(agvBindCtnrAndBinParam))
                        .build()
                        .doPost();
                    response = new HttpHandler.Builder()
                            .setUri(URL)
                            .setPath(mesPath)
                            .setJson(JSON.toJSONString(agvBindCtnrAndBinParam))
                            .build()
                            .doPost();
                log.info("AGV绑定容器接口响应: {}", response);
                JSONObject jsonObject = JSON.parseObject(response);
                    log.info("AGV绑定容器接口响应: {}", response);
                    JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code") != null && jsonObject.getInteger("code").equals(0)) {
                    success = true;
                } else {
                    log.error("AGV绑定容器失败!!!url:{};request:{};response:{}", URL + "/" + mesPath, JSON.toJSONString(agvBindCtnrAndBinParam), response);
                    throw new CoolException("AGV绑定容器失败: " + jsonObject.getString("msg"));
                    if (jsonObject.getInteger("code") != null && jsonObject.getInteger("code").equals(0)) {
                        success = true;
                    } else {
                        log.error("AGV绑定容器失败!!!url:{};request:{};response:{}", URL + "/" + mesPath, JSON.toJSONString(agvBindCtnrAndBinParam), response);
                        throw new CoolException("AGV绑定容器失败: " + jsonObject.getString("msg"));
                    }
                } catch (Exception e) {
                    log.error("AGV绑定容器接口调用异常!!!url:{};request:{};response:{}", URL + "/" + mesPath, JSON.toJSONString(agvBindCtnrAndBinParam), response, e);
                    throw new CoolException("AGV绑定容器接口调用异常: " + e.getMessage());
                }
            } catch (Exception e) {
                log.error("AGV绑定容器接口调用异常!!!url:{};request:{};response:{}", URL + "/" + mesPath, JSON.toJSONString(agvBindCtnrAndBinParam), response, e);
                throw new CoolException("AGV绑定容器接口调用异常: " + e.getMessage());
                throw new CoolException(e.getMessage());
            }
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
        } else {}
        return true;
    }
@@ -933,7 +960,7 @@
        agvGoParam.setCode("0");
        agvGoParam.setMessage("继续执行");
        agvGoParam.setReqCode(param.getReqCode());
        ReturnT<String> result = new PostMesDataUtils().postMesDataArmGrating("光栅下发后继续任务:", URL, AGVPath, param);
        ReturnT<String> result = new PostMesDataUtils().postMesDataArmGrating("光栅下发后继续任务:", URL, AGVPath, agvGoParam);
        if (result.getCode()==200){
            return true;
        }
@@ -946,21 +973,49 @@
        String URL = "http://10.10.10.200:8181/"; // AGV接口地址
        String AGVPath = "rcms/services/rest/hikRpcService/bindCtnrAndBin"; // 接口路径
        BasAgvMast basAgvMast = basAgvMastService.selectOne(new EntityWrapper<BasAgvMast>().eq("task_no",taskNo));
        BasAgvLocNoService basAgvLocNoService = SpringUtils.getBean(BasAgvLocNoService.class);
        BasAgvLocNo basAgvLocNoEnd = basAgvLocNoService.selectOne(
                new EntityWrapper<BasAgvLocNo>().eq("sta_no", basAgvMast.getStaNo())
        );
        AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam();
        agvBindCtnrAndBinParam.setReqCode(basAgvMast.getTaskNo() + "-" + basAgvMast.getTimestamp());
        agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
        agvBindCtnrAndBinParam.setCtnrTyp("1");
        agvBindCtnrAndBinParam.setStgBinCode(basAgvLocNoEnd.getAgvLocNo());
        agvBindCtnrAndBinParam.setIndBind("0");
        ReturnT<String> resultBind = new PostMesDataUtils().postMesDataArmGrating("AGV容器绑定解绑", URL,AGVPath, agvBindCtnrAndBinParam);
        if (resultBind.getCode()!=200){
            return true;
        if (Cools.isEmpty(basAgvMast)){
            return false;
        }
        if (basAgvMast.getFloorNo()==1){
            BasAgvLocNoService basAgvLocNoService = SpringUtils.getBean(BasAgvLocNoService.class);
            BasAgvLocNo basAgvLocNoEnd = basAgvLocNoService.selectOne(
                    new EntityWrapper<BasAgvLocNo>().eq("sta_no", basAgvMast.getStaNo())
            );
            if (Cools.isEmpty(basAgvMast)){
                return false;
            }
            AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam();
            agvBindCtnrAndBinParam.setReqCode(basAgvMast.getTaskNo() + "-" + basAgvMast.getTimestamp());
            agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
            agvBindCtnrAndBinParam.setCtnrTyp("1");
            agvBindCtnrAndBinParam.setStgBinCode(basAgvLocNoEnd.getAgvLocNo());
            agvBindCtnrAndBinParam.setIndBind("0");
            ReturnT<String> resultBind = new PostMesDataUtils().postMesDataArmGrating("AGV容器绑定解绑", URL,AGVPath, agvBindCtnrAndBinParam);
            if (resultBind.getCode()!=200){
                basAgvMast.setStatus(4);
                basAgvMastService.updateById(basAgvMast);
                return true;
            }
            return false;
        }else {
            if (basAgvMast.getIoType()==0 && basAgvMast.getStaNo()==2034){
                AgvBindCtnrAndBinTwoParam agvBindCtnrAndBinTwoParam = new AgvBindCtnrAndBinTwoParam();
                agvBindCtnrAndBinTwoParam.setReqCode(basAgvMast.getTaskNo() + "-" + basAgvMast.getTimestamp());
                agvBindCtnrAndBinTwoParam.setPodCode(basAgvMast.getBarcode());
                agvBindCtnrAndBinTwoParam.setPositionCode(basAgvMast.getStaNo().toString());
                agvBindCtnrAndBinTwoParam.setIndBind("0");;
                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataArmGrating("AGV容器绑定解绑",
                        AgvConstant.AGV_URL+"/"+AgvConstant.AGV_hikRpcService,AgvConstant.getAGVADAPTOR(2), agvBindCtnrAndBinTwoParam);
                if (resultBind.getCode()!=200){
                    basAgvMast.setStatus(4);
                    basAgvMastService.updateById(basAgvMast);
                    return true;
                }
            }
        }
        return false;
    }
src/main/java/com/zy/asrs/task/WorkLogScheduler.java
@@ -72,7 +72,7 @@
    @Scheduled(cron = "0/10 * * * * ? ")
    private void executeAgv(){
        List<BasAgvMast> basAgvstList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("status", 3));
        List<BasAgvMast> basAgvstList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("status", 4));
        if (basAgvstList.isEmpty()) {
            return;
        }
src/main/java/com/zy/common/constant/AgvConstant.java
New file
@@ -0,0 +1,23 @@
package com.zy.common.constant;
/*
 *  Created by Monkey D. Luffy on 2025.09.09
 * */
public class AgvConstant {
    public static final String AGV_URL = "http://10.10.10.200:8181";
    public static final String AGV_hikRpcService = "rcms/services/rest/hikRpcService";
    public static final String AGV_bindPodAndBerth = "bindPodAndBerth";//bangding 2
    public static final String AGV_bindCtnrAndBin = "bindCtnrAndBin";//bangding 1
    public static String getAGVADAPTOR(int f) {
        switch (f) {
            case 1:
                return AGV_bindCtnrAndBin;
            default:
                return AGV_bindPodAndBerth;
        }
    }
}
src/main/resources/mapper/BasAgvMastLogMapper.xml
@@ -13,6 +13,7 @@
        <result column="loc_no" property="locNo" />
        <result column="priority" property="priority" />
        <result column="floor_no" property="floorNo" />
        <result column="barcode" property="barcode" />
        <result column="status" property="status" />
        <result column="error_time" property="errorTime" />
        <result column="error_memo" property="errorMemo" />
src/main/webapp/static/js/common.js
@@ -203,8 +203,8 @@
    ,{field: 'safeQty', align: 'center',title: '总件数', hide: true}
    ,{field: 'weight', align: 'center',title: '单箱净重kg', hide: false}
    ,{field: 'manLength', align: 'center',title: '长(毫米)', hide: false}
    ,{field: 'height', align: 'center',title: '宽(毫米)', hide: false}
    ,{field: 'width', align: 'center',title: '高(毫米)', hide: false}
    ,{field: 'width', align: 'center',title: '宽(毫米)', hide: false}
    ,{field: 'height', align: 'center',title: '高(毫米)', hide: false}
    // ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}