自动化立体仓库 - WMS系统
zhangc
2025-01-15 27917bf679759fb1aadcbf148db27b0407053db5
优化库位检索逻辑,移除冗余参数
3个文件已修改
247 ■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -103,7 +103,7 @@
            List<AgvWaitPakin> agvWaitPakinList = agvWaitPakinService.selectList(new EntityWrapper<AgvWaitPakin>().eq("supp_code", agvBasDevp.getBarcode()));
            //检索库位,选择合适的库位
            AgvLocMast agvLocMast = agvCommonService.getLocNo(agvBasDevp.getLocType1(), agvBasDevp.getFloor(), false, false, null);
            AgvLocMast agvLocMast = agvCommonService.getLocNo(agvBasDevp.getLocType1(), agvBasDevp.getFloor(), false, false);
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(1, 201L, agvBasDevp.getDevNo(), agvLocMast.getLocNo(), agvBasDevp.getBarcode(), now, userId, agvBasDevp.getLocType2(), agvLocMast.getPltType());
            //标记是否为输送线入库
@@ -569,19 +569,19 @@
            Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "elevatorTasks"));
            if (Cools.isEmpty(config)) {
                if (isCurrLev.get()) {
                    agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, true, factory);
                    agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, true);
                } else {
                    agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, false, factory);
                    agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, false);
                }
            } else {
                List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().like("loc_no", "02F1").like("source_loc_no", "F1"));
                if (Integer.parseInt(config.getValue()) <= agvWrkMasts.size()) {
                    agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, true, factory);
                    agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, true);
                } else {
                    if (isCurrLev.get()) {
                        agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, true, factory);
                        agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, true);
                    } else {
                        agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, false, factory);
                        agvLocMast = agvCommonService.getLocNo(locType, agvBasDevp.getFloor(), false, false);
                    }
                    //agvLocMast = agvCommonService.getLocNo(locType,agvBasDevp.getFloor(),false,false);
                }
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -5,14 +5,12 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.service.AgvBasDevpService;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.AutoMoveHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
@@ -67,21 +65,22 @@
     * crnNo :2目标楼层
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    private synchronized void execute2(){
    private synchronized void execute2() {
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type",108)
                        .andNew()
                        .eq("crn_no",2).or().eq("crn_no",3)
                        .orderBy("io_pri",false).orderBy("appe_time",true)
                );
                .andNew().eq("io_type", 108)
                .andNew()
                .eq("crn_no", 2).or().eq("crn_no", 3)
                .orderBy("io_pri", false).orderBy("appe_time", true)
        );
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                // TODO 自动回流
                autoMoveHandler.start2(agvWrkMast);
            } catch (Exception e){
            } catch (Exception e) {
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
@@ -116,20 +115,20 @@
     * ioType 111.手动调拨
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute3(){
    private void execute3() {
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type",111)
                .orderBy("io_pri",false)
                .orderBy("appe_time",true)
                .andNew().eq("io_type", 111)
                .orderBy("io_pri", false)
                .orderBy("appe_time", true)
        );
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                autoMoveHandler.start3(agvWrkMast);
            } catch (Exception e){
            } catch (Exception e) {
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
@@ -137,21 +136,21 @@
    }
    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute4(){
    private void execute4() {
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type",114)
                .orderBy("io_pri",false)
                .orderBy("appe_time",true)
                .andNew().eq("io_type", 114)
                .orderBy("io_pri", false)
                .orderBy("appe_time", true)
        );
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                autoMoveHandler.start4(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("工作号" + agvWrkMast.getWrkNo() + "调拨出库,处理失败:===》异常原因:" + e.getMessage());
            }
        }
@@ -185,21 +184,21 @@
     * ioType 113.空托盘手动回流
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack3(){
    private void autoEmptyBack3() {
        // 工作档为201 且 入出库类型为109
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 214)
                .eq("loc_no","")
                .eq("io_type",113)
                .orderBy("io_pri",false));
                .eq("loc_no", "")
                .eq("io_type", 113)
                .orderBy("io_pri", false));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                autoMoveHandler.autoEmptyBack3(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"空板自动回库  接驳点 - 1楼库位,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("工作号" + agvWrkMast.getWrkNo() + "空板自动回库  接驳点 - 1楼库位,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
@@ -233,38 +232,65 @@
     * 2楼或3楼站点可入信号全部没有,代表走电梯自动搬运模式
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack4(){
    private void autoEmptyBack4() {
        // 查询 不为1楼的空货架
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                new EntityWrapper<AgvLocMast>()
                        // TODO 四期
                        .eq("loc_sts", "D")
                        .eq("loc_type1", 3)
                        .ne("floor", 1)
                        .eq("loc_sts","D")
                        .eq("loc_type1",3));
                        .ne("lve1", 1));
        if (agvLocMasts.isEmpty()) {
            return;
        }
        for (AgvLocMast agvLocMast : agvLocMasts) {
            try{
            try {
                autoMoveHandler.autoEmptyBack4(agvLocMast);
            } catch (Exception e){
                log.error("库位号"+agvLocMast.getLocNo()+"空板自动回库 库位-接驳点  库位-吸塑车间,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点  库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
    private boolean determineFloorConnection(Integer floor){
        try{
    /**
     // TODO 四期
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBackSiqi() {
        // 查询 二厂的的半成品箱壳类型的空货架
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                new EntityWrapper<AgvLocMast>()
                        .eq("loc_sts", "D")
                        .eq("loc_type1", 6)
                        .eq("floor", 2));
        if (agvLocMasts.isEmpty()) {
            return;
        }
        for (AgvLocMast agvLocMast : agvLocMasts) {
            try {
                autoMoveHandler.autoEmptyBackSiqi(agvLocMast);
            } catch (Exception e) {
                log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点  库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
    private boolean determineFloorConnection(Integer floor) {
        try {
            List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().eq("floor", floor).like("dev_no", "DB_"));
            if (!agvBasDevps.isEmpty()){
                for (AgvBasDevp agvBasDevp:agvBasDevps){
                    if (agvBasDevp.getInEnable().equals("Y")){
            if (!agvBasDevps.isEmpty()) {
                for (AgvBasDevp agvBasDevp : agvBasDevps) {
                    if (agvBasDevp.getInEnable().equals("Y")) {
                        return false;
                    }
                }
                return true;
            }
        }catch (Exception e){
            log.error("判断当前楼层接驳位是否全部关闭,异常"+e.getMessage());
        } catch (Exception e) {
            log.error("判断当前楼层接驳位是否全部关闭,异常" + e.getMessage());
        }
        return false;
    }
@@ -277,7 +303,7 @@
     *
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack5(){
    private void autoEmptyBack5() {
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>()
                .ne("floor", 1)
                .eq("loc_sts", "F")
@@ -286,10 +312,10 @@
            return;
        }
        for (AgvBasDevp agvBasDevp : agvBasDevps) {
            try{
            try {
                autoMoveHandler.autoEmptyBack5(agvBasDevp);
            } catch (Exception e){
                log.error("站点号"+agvBasDevp.getDevNo()+"站点是否自动 优先选择先到接驳位(接驳位可入) 后选择直接回库,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("站点号" + agvBasDevp.getDevNo() + "站点是否自动 优先选择先到接驳位(接驳位可入) 后选择直接回库,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
@@ -299,7 +325,7 @@
     * 手动: 生成 113 手动回流
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack6(){
    private void autoEmptyBack6() {
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>()
                .eq("floor", 1)
                .eq("loc_sts", "F")
@@ -308,10 +334,10 @@
            return;
        }
        for (AgvBasDevp agvBasDevp : agvBasDevps) {
            try{
            try {
                autoMoveHandler.autoEmptyBack6(agvBasDevp);
            } catch (Exception e){
                log.error("站点号"+agvBasDevp.getDevNo()+"检测1楼接驳点 生成 113 手动回流,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("站点号" + agvBasDevp.getDevNo() + "检测1楼接驳点 生成 113 手动回流,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
@@ -341,11 +367,10 @@
            long time3 = time - time1;
            if (time3 > 0 && time3 < (1000 * 60 * 10)) {
            if (time3 > 0 && time3 < (1000* 60 * 10)) {
                List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().like("loc_no", "02F1").like("source_loc_no", "F1").eq("io_type",12));
                if (maxTansk <= agvWrkMasts.size()){
                List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().like("loc_no", "02F1").like("source_loc_no", "F1").eq("io_type", 12));
                if (maxTansk <= agvWrkMasts.size()) {
                    return;
                }
@@ -353,16 +378,16 @@
                        new EntityWrapper<AgvLocMast>()
                                .eq("floor", 1)
                                .eq("lev1", 1)
                                .eq("loc_sts","F")
                                .eq("loc_type1",3));
                                .eq("loc_sts", "F")
                                .eq("loc_type1", 3));
                if (agvLocMasts.isEmpty()) {
                    return;
                }
                for (AgvLocMast agvLocMast : agvLocMasts) {
                    try{
                        autoMoveHandler.autoTransfers(agvLocMast,maxTansk);
                    } catch (Exception e){
                        log.error("库位号"+agvLocMast.getLocNo()+"定时移库任务 吸塑一楼 --> 吸塑二楼,处理失败:===》异常原因:"+e.getMessage());
                    try {
                        autoMoveHandler.autoTransfers(agvLocMast, maxTansk);
                    } catch (Exception e) {
                        log.error("库位号" + agvLocMast.getLocNo() + "定时移库任务 吸塑一楼 --> 吸塑二楼,处理失败:===》异常原因:" + e.getMessage());
                    }
                }
            }
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -217,7 +217,7 @@
    private ReturnT<String> doAutoMove3(AgvWrkMast agvWrkMast) {
        Date now = new Date();
        //检索库位,选择合适的库位
        AgvLocMast locMast = agvCommonService.getLocNo(3,agvWrkMast.getCrnNo(),false,false,null);
        AgvLocMast locMast = agvCommonService.getLocNo(3,agvWrkMast.getCrnNo(),false,false);
        if (Cools.isEmpty(locMast)) {
            log.info("暂无库位");
            return FAIL;
@@ -328,7 +328,7 @@
        Date now = new Date();
        AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo());
        //检索空闲接驳位,选择合适的接驳位
        AgvLocMast locMast = agvCommonService.getLocNo(3, 1,true,true,null);
        AgvLocMast locMast = agvCommonService.getLocNo(3, 1,true,true);
        if (Cools.isEmpty(locMast)) {
            throw new CoolException("1楼暂无空库位");
        }
@@ -420,7 +420,7 @@
            ioType = 109;
        } else {
            //检索库位,选择合适的库位
            locMast = agvCommonService.getLocNo(3,1,true,true,null);
            locMast = agvCommonService.getLocNo(3,1,true,true);
            locNo = locMast.getLocNo();
            wrkSts = 201L;
            ioType = 109;
@@ -465,6 +465,84 @@
        return SUCCESS;
    }
    public ReturnT<String> autoEmptyBackSiqi(AgvLocMast agvLocMast) {
        Date now = new Date();
        //查询工作档
        AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(agvLocMast.getBarcode());
        if(!Cools.isEmpty(agvWrkMast)){
            throw new CoolException("当前"+agvLocMast.getBarcode()+"货架码已在工作档中");
        }
        String floor = "";
        String locNo = "";
        Long wrkSts = 0L;
        Integer ioType = 0;
        AgvLocMast locMast = new AgvLocMast();
        if (agvLocMast.getFloor() == 3) {
            floor = "F3";
        } else if(agvLocMast.getFloor() == 2) {
            floor = "F2";
        }
        List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("io_type", 109).like("source_loc_no", floor).or().eq("io_type", 113));
        if (agvWrkMasts.size() >= 5) {
            //log.error("暂停回流");
            return FAIL;
            //throw new CoolException("暂停回流");
        }
        //检索空闲可入接驳位 没有空闲可入接驳位 直接找库位
        AgvBasDevp devpNo = agvCommonService.getDevpNo(6, agvLocMast.getFloor(),"Y","Y");
        if (!Cools.isEmpty(devpNo)) {
            locNo = devpNo.getDevNo();
            wrkSts = 21L;
            ioType = 109;
        } else {
            //检索库位,选择合适的库位
            locMast = agvCommonService.getLocNo(6,1,true,true);
            locNo = locMast.getLocNo();
            wrkSts = 201L;
            ioType = 109;
        }
        //生成工作档
        AgvWrkMast mast = new AgvWrkMast();
        //工作状态
        mast.setWrkSts(wrkSts);
        //入出库类型
        mast.setIoType(ioType);
        mast.setIoTime(now);
        //优先级
        mast.setIoPri(300.0);
        //源站点
        mast.setSourceLocNo(agvLocMast.getLocNo());
        //目标站点
        mast.setLocNo(locNo);
        //货架编码
        mast.setBarcode(agvLocMast.getBarcode());
        //货架类型
        mast.setWhsType(30);
        mast.setAppeUser(9527L);
        mast.setAppeTime(now);
        mast.setModiUser(9527L);
        mast.setModiTime(now);
        mast.setLogErrMemo("autoEmptyBack4");
        if (!agvWrkMastService.insertByIncrease(mast)) {
            throw new CoolException("保存工作档失败");
        }
        //更新目标库位状态
        updateAgvLocMast(agvLocMast,"R");
        if (wrkSts == 21L) {
            updateAgvBasDevp(devpNo,"S",agvLocMast.getLocType2(),agvLocMast.getBarcode());
        } else {
            updateAgvLocMast(locMast,"S");
        }
        return SUCCESS;
    }
    public ReturnT<String> autoEmptyBack5(AgvBasDevp agvBasDevp) {
        //查询工作档
        AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(agvBasDevp.getBarcode());
@@ -495,7 +573,7 @@
            //入出库类型
            mast.setIoType(109);
            //检索库位,选择合适的库位
            AgvLocMast locMast = agvCommonService.getLocNo(3,1,true,true,null);
            AgvLocMast locMast = agvCommonService.getLocNo(3,1,true,true);
            mast.setLocNo(locMast.getLocNo());
            updateAgvLocMast(locMast,"S");
        } else {
@@ -569,7 +647,7 @@
            throw new CoolException("当前"+agvLocMast.getBarcode()+"货架码已在工作档中");
        }
        //检索库位,选择合适的库位
        AgvLocMast LocMast = agvCommonService.getLocNo(3,1,false,false,null);
        AgvLocMast LocMast = agvCommonService.getLocNo(3,1,false,false);
        if (LocMast.getLev1() != 2) {
            throw new CoolException("目标楼层不是吸塑二楼");
        }