自动化立体仓库 - WCS系统
Junjie
2023-05-09 6b016cef0828cbd8ead4a2ff43d5bcb6e266a584
ShuttleThread and LiftThread task restart
2个文件已添加
6个文件已修改
342 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/RedisConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/RedisUtil.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LiftRedisCommand.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LiftThread.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ShuttleThread.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -606,6 +606,56 @@
        }
    }
    /**
     * 从redis中重启任务
     */
    public synchronized void restartTaskFromRedis() {
        HashMap<Object, Object> map = redisUtil.getRedis();
        for (Object key : map.keySet()) {
            if (key.toString().contains("lift_wrk_no_")) {//提升机任务
                LiftRedisCommand redisCommand = JSON.parseObject(map.get(key).toString(), LiftRedisCommand.class);
                if (redisCommand == null) {
                    continue;
                }
                Short liftNo = redisCommand.getLiftNo();
                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo.intValue());
                if (liftThread == null) {
                    continue;
                }
                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
                if (!liftProtocol.isIdle()) {
                    continue;
                }
                //提升机处于空闲状态,进行任务的恢复
                liftProtocol.setTaskNo(redisCommand.getWrkNo());//将提升机线程分配任务号
                liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//工作状态
                liftProtocol.setLiftLock(true);//提升机锁定
            }else {//四向穿梭车任务
                ShuttleRedisCommand redisCommand = JSON.parseObject(map.get(key).toString(), ShuttleRedisCommand.class);
                if (redisCommand == null) {
                    continue;
                }
                Short shuttleNo = redisCommand.getShuttleNo();
                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo.intValue());
                if (shuttleThread == null) {
                    continue;
                }
                ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
                if (!shuttleProtocol.isIdle()) {
                    continue;
                }
                //四向穿梭车处于空闲状态,进行任务的恢复
                shuttleProtocol.setTaskNo(redisCommand.getWrkNo());//将四向穿梭车线程分配任务号
                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);//工作状态
            }
        }
    }
    /**
     * 入库  ===>>  四向穿梭车入库作业下发
src/main/java/com/zy/common/config/RedisConfig.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
@@ -14,7 +15,7 @@
 * Redis配置类
 * Created by vincent on 2019-12-23
 */
//@Configuration
@Configuration
//@EnableCaching // 开启数据缓存机制
public class RedisConfig extends CachingConfigurerSupport {
src/main/java/com/zy/common/utils/RedisUtil.java
@@ -6,6 +6,7 @@
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -101,6 +102,21 @@
    }
    /**
     * 获取全部数据
     * @return
     */
    public HashMap<Object, Object> getRedis() {
        Set<String> keys = redisTemplate.keys("*");
        HashMap<Object, Object> map = new HashMap<>();
        for (String key : keys) {
            Object value = redisTemplate.opsForValue().get(key);
            map.put(key, value);
        }
        return map;//返回全部数据集合
    }
    /**
     * 普通缓存放入
     *
     * @param key   键
src/main/java/com/zy/core/MainProcess.java
@@ -51,12 +51,14 @@
                    // 间隔
                    Thread.sleep(500);
                    // 拣料、并板、盘点再入库
                    mainService.stnToCrnStnPick();
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
                    mainService.crnIoExecute();
                    //从redis中重启任务
                    mainService.restartTaskFromRedis();
//                    // 拣料、并板、盘点再入库
//                    mainService.stnToCrnStnPick();
//                    // 出库  ===>>  堆垛机出库站到出库站
//                    mainService.crnStnToOutStn();
//                    // 入出库  ===>>  堆垛机入出库作业下发
//                    mainService.crnIoExecute();
                    // 入库  ===>>  四向穿梭车入库作业下发
                    mainService.shuttleIoInExecute();
                    // 出库  ===>>  四向穿梭车出库作业下发
@@ -67,10 +69,10 @@
                    mainService.liftIoExecute();
                    //提升机任务完成
                    mainService.liftFinished();
                    // 入库  ===>> 执行堆垛机对工作档的完成操作
                    mainService.storeFinished();
                    // 入库 ===>> 执行穿梭车对工作档的完成操作
                    mainService.carGenerateStore();
//                    // 入库  ===>> 执行堆垛机对工作档的完成操作
//                    mainService.storeFinished();
//                    // 入库 ===>> 执行穿梭车对工作档的完成操作
//                    mainService.carGenerateStore();
                    // 异常信息记录
                    mainService.recErr();
                    // 入库  ===>> 空栈板初始化入库,叉车入库站放货
@@ -82,9 +84,9 @@
                    // 穿梭车 ===>> 小车电量检测充电
                    mainService.loopShuttleCharge();
                    mainService.executeShuttleCharge();
                    // 穿梭车 ===>> 小车电量检测充电
                    mainService.loopSteCharge();
                    mainService.executeSteCharge();
//                    // 穿梭车 ===>> 小车电量检测充电
//                    mainService.loopSteCharge();
//                    mainService.executeSteCharge();
                    //出入库模式
                    i++;
                    if (i > 1) {
src/main/java/com/zy/core/model/command/LiftRedisCommand.java
New file
@@ -0,0 +1,20 @@
package com.zy.core.model.command;
import lombok.Data;
@Data
public class LiftRedisCommand {
    //提升机号
    private Short liftNo;
    //工作号
    private Short wrkNo;
    //命令执行步序
    private Integer commandStep;
    //命令
    private LiftAssignCommand assignCommand;
}
src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java
New file
@@ -0,0 +1,29 @@
package com.zy.core.model.command;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class ShuttleRedisCommand implements Serializable {
    //四向穿梭车号
    private Short shuttleNo;
    //工作号
    private Short wrkNo;
    //命令执行步序
    private Integer commandStep;
    //命令
    private ShuttleAssignCommand assignCommand;
    //发生错误时尝试执行的指令,优先级最高
    private List<ShuttleCommand> errorCommands;
    //提升机安全锁定标记
    private Boolean liftSecurityMk = false;
}
src/main/java/com/zy/core/thread/LiftThread.java
@@ -26,10 +26,7 @@
import com.zy.core.enums.*;
import com.zy.core.model.LiftSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.LiftAssignCommand;
import com.zy.core.model.command.LiftCommand;
import com.zy.core.model.command.ShuttleAssignCommand;
import com.zy.core.model.command.ShuttleCommand;
import com.zy.core.model.command.*;
import com.zy.core.model.protocol.LiftProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -37,7 +34,6 @@
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
@@ -185,10 +181,9 @@
                        && !liftProtocol.getRunning()
                        && liftProtocol.getReady()
                        && liftProtocol.getPakMk()
                        && liftProtocol.getTaskNo() != 0
                        && liftProtocol.getAssignCommand() != null) {
                        && liftProtocol.getTaskNo() != 0) {
                    //还有未完成的命令
                    executeWork(liftProtocol.getAssignCommand());
                    executeWork(liftProtocol.getTaskNo());
                }
                //将提升机状态保存至数据库
@@ -290,9 +285,6 @@
    //分配任务
    private void assignWork(LiftAssignCommand assignCommand) {
        //将此map存入redis中
        HashMap<String, Object> map = new HashMap<>();
        //手动模式指令
        if (!assignCommand.getAuto()) {
            LiftCommand command = new LiftCommand();
@@ -328,42 +320,40 @@
            assignCommand.setCommands(commands);
        }
        //提升机号
        map.put("lift_no", assignCommand.getLiftNo());
        //工作号
        map.put("wrk_no", assignCommand.getTaskNo());
        //命令执行步序
        map.put("commandStep", 0);
        //命令
        map.put("assignCommand", assignCommand);
        LiftRedisCommand redisCommand = new LiftRedisCommand();
        redisCommand.setLiftNo(assignCommand.getLiftNo());//提升机号
        redisCommand.setWrkNo(assignCommand.getTaskNo());//工作号
        redisCommand.setCommandStep(0);//命令执行步序
        redisCommand.setAssignCommand(assignCommand);//命令
        //任务数据保存到redis
        redisUtil.set("lift_wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
        redisUtil.set("lift_wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand));
        liftProtocol.setAssignCommand(assignCommand);
        liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);
        //执行下发任务
        executeWork(assignCommand);
        executeWork(assignCommand.getTaskNo());
    }
    //执行任务
    private boolean executeWork(LiftAssignCommand assignCommand) {
    private boolean executeWork(Short wrkNo) {
        //读取redis数据
        if (assignCommand == null) {
        if (wrkNo == null) {
            return false;
        }
        //将标记置为false(防止重发)
        liftProtocol.setPakMk(false);
        Object o = redisUtil.get("lift_wrk_no_" + assignCommand.getTaskNo());
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo);
        if (o == null) {
            return false;
        }
        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
        List<LiftCommand> commands = assignCommand.getCommands();
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class);
        List<LiftCommand> commands = redisCommand.getAssignCommand().getCommands();
        //当前步序
        int commandStep = Integer.parseInt(map.get("commandStep").toString());
        int commandStep = redisCommand.getCommandStep();
        //总步序
        int size = commands.size();
        LiftAssignCommand assignCommand = redisCommand.getAssignCommand();
        //取出命令
        LiftCommand command = commands.get(commandStep);
@@ -379,17 +369,17 @@
                //更新redis数据
                //步序增加
                commandStep++;
                map.put("commandStep", commandStep);
                redisCommand.setCommandStep(commandStep);
                //任务数据保存到redis
                redisUtil.set("lift_wrk_no_" + map.get("wrk_no").toString(), JSON.toJSONString(map));
                redisUtil.set("lift_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
            }else {
                //已执行完成
                //保存数据到数据库做流水
                BasLiftOptService liftOptService = SpringUtils.getBean(BasLiftOptService.class);
                if (liftOptService != null) {
                    BasLiftOpt opt = new BasLiftOpt(
                            assignCommand.getTaskNo().intValue(),
                            assignCommand.getLiftNo().intValue(),
                            redisCommand.getWrkNo().intValue(),
                            redisCommand.getLiftNo().intValue(),
                            new Date(),
                            null,
                            null,
@@ -399,7 +389,7 @@
                    liftOptService.insert(opt);
                }
                //删除redis
                redisUtil.del("lift_wrk_no_" + map.get("wrk_no").toString());
                redisUtil.del("lift_wrk_no_" + redisCommand.getWrkNo());
                if (assignCommand.getAuto()) {
                    //对主线程抛出等待确认状态waiting
@@ -407,13 +397,11 @@
                    News.info("提升机任务执行完成等待确认中,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
                }else {
                    //手动模式不抛出等待状态
                    if (assignCommand.getTaskMode() == 5) {
                        liftProtocol.setTaskNo((short) 0);
                        liftProtocol.setShuttleNo((short) 0);
                        liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                        liftProtocol.setPakMk(true);
                        liftProtocol.setSecurityMk(false);
                    }
                    liftProtocol.setTaskNo((short) 0);
                    liftProtocol.setShuttleNo((short) 0);
                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                    liftProtocol.setPakMk(true);
                    liftProtocol.setSecurityMk(false);
                    News.info("提升机手动任务执行完成,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
                }
src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -29,10 +29,7 @@
import com.zy.core.enums.*;
import com.zy.core.model.ShuttleSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.LiftAssignCommand;
import com.zy.core.model.command.LiftCommand;
import com.zy.core.model.command.ShuttleAssignCommand;
import com.zy.core.model.command.ShuttleCommand;
import com.zy.core.model.command.*;
import com.zy.core.model.protocol.LiftProtocol;
import com.zy.core.model.protocol.ShuttleProtocol;
import lombok.Data;
@@ -41,7 +38,6 @@
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
@@ -187,32 +183,29 @@
                if(shuttleProtocol.getProtocolStatusType() == ShuttleProtocolStatusType.FIXING
                        && shuttleProtocol.getTaskNo() != 0
                        && shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE
                        && shuttleProtocol.getAssignCommand() != null){
                        && shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE){
                    //处于故障修复状态
                    //执行下一步指令
                    executeWork(shuttleProtocol.getAssignCommand());
                    executeWork(shuttleProtocol.getTaskNo());
                }
                //四向穿梭车空闲、有任务、标记为true、存在任务指令,需要执行任务的下一条指令
                if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE
                        && shuttleProtocol.getTaskNo() != 0
                        && shuttleProtocol.getPakMk()
                        && shuttleProtocol.getAssignCommand() != null) {
                        && shuttleProtocol.getPakMk()) {
                    //执行下一步指令
                    executeWork(shuttleProtocol.getAssignCommand());
                    executeWork(shuttleProtocol.getTaskNo());
                }
                //检测是否有提升机锁定标记,有则检测提升机是否到位,是否能走下一步命令
                if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE
                        && shuttleProtocol.getTaskNo() != 0
                        && shuttleProtocol.getAssignCommand() != null) {
                    Object o = redisUtil.get("wrk_no_" + shuttleProtocol.getAssignCommand().getTaskNo());
                        && shuttleProtocol.getTaskNo() != 0) {
                    Object o = redisUtil.get("wrk_no_" + shuttleProtocol.getTaskNo());
                    if (o != null) {
                        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
                        if (map.containsKey("liftSecurityMk") && Boolean.parseBoolean(map.get("liftSecurityMk").toString())) {
                        ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class);
                        if (redisCommand.getLiftSecurityMk()) {
                            //执行下一步指令
                            executeWork(shuttleProtocol.getAssignCommand());
                            executeWork(shuttleProtocol.getTaskNo());
                        }
                    }
                }
@@ -400,8 +393,6 @@
    //分配任务
    private void assignWork(ShuttleAssignCommand assignCommand) {
        //将此map存入redis中
        HashMap<String, Object> map = new HashMap<>();
        if (!assignCommand.getAuto()) {
            List<ShuttleCommand> commands = new ArrayList<>();
            ShuttleCommand command = new ShuttleCommand();
@@ -637,46 +628,42 @@
            assignCommand.setCommands(commands);
        }
        //四向穿梭车号
        map.put("shuttle_no", assignCommand.getShuttleNo());
        //工作号
        map.put("wrk_no", assignCommand.getTaskNo());
        //命令执行步序
        map.put("commandStep", 0);
        //命令
        map.put("assignCommand", assignCommand);
        //发生错误时尝试执行的指令,优先级最高
        map.put("errorCommands", new ArrayList<ShuttleCommand>());
        ShuttleRedisCommand redisCommand = new ShuttleRedisCommand();
        redisCommand.setShuttleNo(assignCommand.getShuttleNo());//四向穿梭车号
        redisCommand.setWrkNo(assignCommand.getTaskNo());//工作号
        redisCommand.setCommandStep(0);//命令执行步序
        redisCommand.setAssignCommand(assignCommand);//命令
        redisCommand.setErrorCommands(new ArrayList<ShuttleCommand>());//发生错误时尝试执行的指令,优先级最高
        shuttleProtocol.setTaskNo(assignCommand.getTaskNo());
        shuttleProtocol.setAssignCommand(assignCommand);
        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
        //任务数据保存到redis
        redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
        redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand));
        //执行下发任务
        executeWork(assignCommand);
        executeWork(assignCommand.getTaskNo());
    }
    //执行下发的指令
    private boolean executeWork(ShuttleAssignCommand assignCommand) {
    private boolean executeWork(Short wrkNo) {
        //读取redis数据
        if (assignCommand == null) {
        if (wrkNo == null) {
            return false;
        }
        Object o = redisUtil.get("wrk_no_" + assignCommand.getTaskNo());
        Object o = redisUtil.get("wrk_no_" + wrkNo);
        if (o == null) {
            return false;
        }
        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
        ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class);
        if (!checkLiftStation(assignCommand)) {//检测是否有提升机站点,有则调度提升机
        if (!checkLiftStation(wrkNo)) {//检测是否有提升机站点,有则调度提升机
            return false;
        }
        //将标记置为false(防止重发)
        shuttleProtocol.setPakMk(false);
        List<ShuttleCommand> errorCommands =  JSON.parseArray(map.get("errorCommands").toString(),ShuttleCommand.class);
        List<ShuttleCommand> errorCommands = redisCommand.getErrorCommands();
        if (errorCommands.size() > 0) {
            //优先执行该指令
            ShuttleCommand errorCommand = errorCommands.get(0);//取出指令
@@ -688,15 +675,15 @@
                if (shuttleProtocol.getCurrentCode().equals(errorCommand.getStartCodeNum())) {
                    //起点和终点属于同一库位,无需再执行移动操作
                    errorCommands.remove(0);//移除该命令
                    map.put("errorCommands", new ArrayList<ShuttleCommand>());
                    redisCommand.setErrorCommands(new ArrayList<ShuttleCommand>());
                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
                    //当前步序
                    int commandStep = Integer.parseInt(map.get("commandStep").toString());
                    int commandStep = redisCommand.getCommandStep();
                    //步序回退
                    commandStep--;
                    map.put("commandStep", commandStep);
                    redisCommand.setCommandStep(commandStep);
                    //任务数据保存到redis
                    redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
                    redisUtil.set("wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
                    shuttleProtocol.setPakMk(true);
                    return true;
                }else {
@@ -730,10 +717,10 @@
                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
                //当前步序
                int commandStep = Integer.parseInt(map.get("commandStep").toString());
                int commandStep = redisCommand.getCommandStep();
                //步序回退
                commandStep--;
                map.put("commandStep", commandStep);
                redisCommand.setCommandStep(commandStep);
            }
            if (!write(errorCommand)) {
@@ -742,18 +729,19 @@
            } else {
                News.info("四向穿梭车命令下发成功,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(errorCommand));
                errorCommands.remove(0);
                map.put("errorCommands", errorCommands);
                redisCommand.setErrorCommands(errorCommands);
                //任务数据保存到redis
                redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
                redisUtil.set("wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
                return true;
            }
        }
        List<ShuttleCommand> commands = assignCommand.getCommands();
        List<ShuttleCommand> commands = redisCommand.getAssignCommand().getCommands();
        //当前步序
        int commandStep = Integer.parseInt(map.get("commandStep").toString());
        int commandStep = redisCommand.getCommandStep();
        //path路径数目
        int size = commands.size();
        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
        //取出命令
        ShuttleCommand command = commands.get(commandStep);
@@ -779,9 +767,9 @@
                //更新redis数据
                //步序增加
                commandStep++;
                map.put("commandStep", commandStep);
                redisCommand.setCommandStep(commandStep);
                //任务数据保存到redis
                redisUtil.set("wrk_no_" + map.get("wrk_no").toString(), JSON.toJSONString(map));
                redisUtil.set("wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
            }else {
                //已执行完成
                //保存数据到数据库做流水
@@ -802,7 +790,7 @@
                    shuttleOptService.insert(opt);
                }
                if (map.containsKey("liftSecurityMk") && Boolean.parseBoolean(map.get("liftSecurityMk").toString())) {
                if (redisCommand.getLiftSecurityMk()) {
                    //曾锁定过提升机,需要进行解锁
                    LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1);
                    LiftProtocol liftProtocol = liftThread.getLiftProtocol();
@@ -812,20 +800,16 @@
                }
                //删除redis
                redisUtil.del("wrk_no_" + map.get("wrk_no").toString());
                redisUtil.del("wrk_no_" + redisCommand.getWrkNo());
                if (!assignCommand.getAuto()) {
                    //手动模式不抛出等待状态,直接复位
                    if (assignCommand.getTaskMode() == 9) {
                        //设置四向穿梭车为空闲状态
                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                        //任务号清零
                        shuttleProtocol.setTaskNo((short) 0);
                        //标记复位
                        shuttleProtocol.setPakMk(true);
                        //任务指令清零
                        shuttleProtocol.setAssignCommand(null);
                    }
                    //设置四向穿梭车为空闲状态
                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                    //任务号清零
                    shuttleProtocol.setTaskNo((short) 0);
                    //标记复位
                    shuttleProtocol.setPakMk(true);
                    News.info("四向穿梭车手动任务执行完成,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
                }else {
                    if (!assignCommand.getCharge()) {
@@ -846,22 +830,22 @@
    /**
     * 检测是否有提升机站点,有则调度提升机
     */
    private boolean checkLiftStation(ShuttleAssignCommand assignCommand) {
    private boolean checkLiftStation(Short wrkNo) {
        //读取redis数据
        if (assignCommand == null) {
        if (wrkNo == null) {
            return false;
        }
        Object o = redisUtil.get("wrk_no_" + assignCommand.getTaskNo());
        Object o = redisUtil.get("wrk_no_" + wrkNo);
        if (o == null) {
            return false;
        }
        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
        ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class);
        //当前步序
        int commandStep = Integer.parseInt(map.get("commandStep").toString());
        int commandStep = redisCommand.getCommandStep();
        //检测是否存在提升机口的指令
        List<ShuttleCommand> commands = assignCommand.getCommands();
        List<ShuttleCommand> commands = redisCommand.getAssignCommand().getCommands();
        BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
        ArrayList<Short> qrCodeValues = new ArrayList<>();
        for (BasDevp basDevp : basDevpService.selectList(null)) {
@@ -939,9 +923,9 @@
        liftProtocol.setShuttleNo(shuttleProtocol.getShuttleNo());//设置四向穿梭车号
        liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//设置提升机状态为工作中
        liftProtocol.setSecurityMk(true);//标记置为true,防止其他任务占用当前提升机
        map.put("liftSecurityMk", true);//标记置为true,防止其他任务占用当前提升机
        redisCommand.setLiftSecurityMk(true);//标记置为true,防止其他任务占用当前提升机
        //任务数据保存到redis
        redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
        redisUtil.set("wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
        //命令list
        ArrayList<LiftCommand> liftCommands = new ArrayList<>();
@@ -977,10 +961,10 @@
            return false;
        }
        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
        ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class);
        List<ShuttleCommand> commands = assignCommand.getCommands();
        //当前步序
        int commandStep = Integer.parseInt(map.get("commandStep").toString());
        int commandStep = redisCommand.getCommandStep();
        //path路径数目
        int size = commands.size();
@@ -1041,9 +1025,9 @@
        moveCommand.setStartCodeNum(command.getStartCodeNum());//存入目标库位号
        list.add(moveCommand);
        map.put("errorCommands", list);
        redisCommand.setErrorCommands(list);
        //任务数据保存到redis
        redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
        redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand));
        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.FIXING);
        return true;
    }