自动化立体仓库 - WCS系统
#
taisheng
7 天以前 4453cdecbc6e7a925ae76e3223418654f1cf0b18
src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -3,7 +3,11 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.param.ShuttleOperatorParam;
import com.zy.asrs.domain.vo.*;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.WrkMast;
@@ -11,8 +15,13 @@
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.enums.NavigationMapType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.NavigateMapUtils;
import com.zy.common.utils.RedisUtil;
import com.zy.common.utils.ShuttleOperaUtils;
import com.zy.core.News;
import com.zy.core.action.ShuttleAction;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.dispatcher.ShuttleDispatchUtils;
@@ -30,6 +39,7 @@
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
@@ -54,6 +64,12 @@
    private RedisUtil redisUtil;
    @Autowired
    private ShuttleDispatchUtils shuttleDispatchUtils;
    @Autowired
    private ShuttleOperaUtils shuttleOperaUtils;
    @Autowired
    private ShuttleAction shuttleAction;
    @Autowired
    private NavigateMapUtils navigateMapUtils;
    @PostMapping("/table/shuttle/state")
    @ManagerAuth(memo = "四向穿梭车信息表")
@@ -81,7 +97,7 @@
            shuttleData.put("moveAdvancePath", null);//穿梭车预计路径
            if (shuttleProtocol.getTaskNo() != 0) {
                //存在任务,获取指令
                Object object = redisUtil.get(RedisKeyType.SHUTTLE.key + shuttleProtocol.getTaskNo());
                Object object = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + shuttleProtocol.getTaskNo());
                if (object != null) {
                    ShuttleRedisCommand redisCommand = JSON.parseObject(object.toString(), ShuttleRedisCommand.class);
                    shuttleData.put("moveAdvancePath", redisCommand.getAssignCommand().getNodes());//穿梭车预计路径
@@ -165,25 +181,34 @@
    @RequestMapping(value = "/command/query")
    public R shuttleCommandQuery(@RequestParam("wrkNo") Integer wrkNo) {
        Object o = redisUtil.get(RedisKeyType.SHUTTLE.key + wrkNo);
        Object o = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo);
        if (o == null) {
            return R.error();
            return R.error("指令不存在");
        }
        ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class);
        return R.ok().add(redisCommand);
        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
        List<ShuttleCommand> commands = assignCommand.getCommands();
        HashMap<String, Object> map = new HashMap<>();
        map.put("commands", commands);
        map.put("shuttleNo", redisCommand.getShuttleNo());
        map.put("commandStep", redisCommand.getCommandStep());
        map.put("wrkNo", redisCommand.getWrkNo());
        return R.ok().add(map);
    }
    //回退命令
    @RequestMapping(value = "/command/rollback")
    public R shuttleCommandRollback(@RequestParam("wrkNo") Integer wrkNo
            , @RequestParam("commandStep") Integer commandStep) {
        Object o = redisUtil.get(RedisKeyType.SHUTTLE.key + wrkNo);
        Object o = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo);
        if (o == null) {
            return R.error();
        }
        ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class);
        redisCommand.setCommandStep(commandStep);
        redisUtil.set(RedisKeyType.SHUTTLE.key + wrkNo, JSON.toJSONString(redisCommand));
        redisUtil.set(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo, JSON.toJSONString(redisCommand));
        return R.ok();
    }
@@ -192,7 +217,7 @@
    public R shuttleCommandCompleteSwitch(@RequestParam("wrkNo") Integer wrkNo
            , @RequestParam("commandStep") Integer commandStep
            , @RequestParam("complete") Integer complete) {
        Object o = redisUtil.get(RedisKeyType.SHUTTLE.key + wrkNo);
        Object o = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo);
        if (o == null) {
            return R.error();
        }
@@ -201,14 +226,14 @@
        List<ShuttleCommand> commands = assignCommand.getCommands();
        ShuttleCommand command = commands.get(commandStep);
        command.setComplete(complete != 0);
        redisUtil.set(RedisKeyType.SHUTTLE.key + wrkNo, JSON.toJSONString(redisCommand));
        redisUtil.set(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo, JSON.toJSONString(redisCommand));
        return R.ok();
    }
    //重启任务(命令)
    @RequestMapping(value = "/command/restart")
    public R shuttleCommandCompleteSwitch(@RequestParam("wrkNo") Integer wrkNo) {
        Object o = redisUtil.get(RedisKeyType.SHUTTLE.key + wrkNo);
        Object o = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo);
        if (o == null) {
            return R.error();
        }
@@ -230,11 +255,11 @@
    //删除任务(命令)
    @RequestMapping(value = "/command/del")
    public R liftCommandDel(@RequestParam("wrkNo") Integer wrkNo) {
        Object o = redisUtil.get(RedisKeyType.SHUTTLE.key + wrkNo);
        Object o = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo);
        if (o == null) {
            return R.error();
        }
        redisUtil.del(RedisKeyType.SHUTTLE.key + wrkNo);
        redisUtil.del(RedisKeyType.SHUTTLE_WORK_FLAG.key + wrkNo);
        return R.ok();
    }
@@ -242,146 +267,119 @@
    /************************** 手动操作 ******************************/
    /****************************************************************/
//    @ManagerAuth(memo = "手动操作")
//    @PostMapping("/operator/shuttle")
//    public R shuttleOperator(ShuttleOperatorParam param){
//        if (Cools.isEmpty(param.getShuttleNo(), param.getShuttleTaskMode())) {
//            return R.parse(BaseRes.PARAM);
//        }
//
//        ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
//
//        if (param.getShuttleTaskMode() == 1 || param.getShuttleTaskMode() == 2 || param.getShuttleTaskMode() == 14) {
//            if (Cools.isEmpty(param.getSourceLocNo(), param.getDistLocNo())) {
//                return R.parse(BaseRes.PARAM);
//            }
//            assignCommand.setSourceLocNo(param.getSourceLocNo());
//            assignCommand.setLocNo(param.getDistLocNo());
//        }
//
//        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
//            if (param.getShuttleNo().equals(shuttleSlave.getId())) {
//                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
//                if (shuttleThread == null) {
//                    throw new CoolException("四向穿梭车不在线");
//                }
//                ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
//                if (shuttleProtocol == null) {
//                    throw new CoolException("四向穿梭车不在线");
//                }
//
//                ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode().intValue());
//                assignCommand.setShuttleNo(shuttleSlave.getId()); // 四向穿梭车编号
//                assignCommand.setTaskMode(shuttleTaskModeType.id);
//                assignCommand.setTaskNo(commonService.getWorkNo(3));//获取任务号
//                assignCommand.setAuto(false);//手动模式
//
//                if (shuttleTaskModeType == ShuttleTaskModeType.TRANSPORT) {
//                    //搬运货物任务
//                    NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(shuttleSlave.getId(), assignCommand.getTaskNo(), shuttleProtocol.getCurrentLocNo(), param.getSourceLocNo(), param.getDistLocNo());
//                    if (result == null) {
//                        throw new CoolException("路径计算失败");
//                    }
//
//                    assignCommand.setCommands(result.getCommands());
//                    assignCommand.setNodes(result.getNodes());
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.MOVE_LOC_NO) {
//                    //移动到目标库位
//                    Integer mapType = NavigationMapType.NORMAL.id;
//                    if (shuttleProtocol.getLiftPosition() == 2) {
//                        mapType = NavigationMapType.DFX.id;
//                    }
//                    NyShuttleOperaResult result = NyShuttleOperaUtils.getStartToTargetCommands(shuttleSlave.getId(), assignCommand.getTaskNo().intValue(), shuttleProtocol.getCurrentLocNo(), param.getDistLocNo(), mapType);
//                    if (result == null) {
//                        throw new CoolException("路径计算失败");
//                    }
//
//                    assignCommand.setCommands(result.getCommands());
//                    assignCommand.setNodes(result.getNodes());
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.PALLET_LIFT) {
//                    //托盘顶升
//                    NyShuttleHttpCommand command = NyHttpUtils.getPalletLiftCommand(shuttleSlave.getId(), assignCommand.getTaskNo().intValue(), true);
//                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
//                    commands.add(command);
//                    assignCommand.setCommands(commands);
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.PALLET_DOWN) {
//                    //托盘下降
//                    NyShuttleHttpCommand command = NyHttpUtils.getPalletLiftCommand(shuttleSlave.getId(), assignCommand.getTaskNo().intValue(), false);
//                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
//                    commands.add(command);
//                    assignCommand.setCommands(commands);
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.CHARGE) {
//                    //充电开关
//                    boolean charge = false;
//                    if (shuttleProtocol.getChargState() == 1) {
//                        //已充电,关闭充电
//                        charge = false;
//                    }else {
//                        //开启充电
//                        charge = true;
//                    }
//                    NyShuttleHttpCommand command = NyHttpUtils.getChargeCommand(shuttleSlave.getId(), assignCommand.getTaskNo().intValue(), charge);
//                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
//                    commands.add(command);
//                    assignCommand.setCommands(commands);
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.RESET) {
//                    //复位
//                    shuttleProtocol.setTaskNo(0);//工作号清空
//                    shuttleProtocol.setToken(0);//令牌清空
//                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);//任务状态-空闲
//                    shuttleProtocol.setPakMk(false);//作业标记复位
//
//                    shuttleProtocol.setMoveLoc(false);
//                    shuttleProtocol.setMoveType(0);
//                    shuttleProtocol.setXStart(0);
//                    shuttleProtocol.setXTarget(0);
//                    shuttleProtocol.setXCurrent(0);
//                    shuttleProtocol.setYStart(0);
//                    shuttleProtocol.setYTarget(0);
//                    shuttleProtocol.setYCurrent(0);
//                    return R.ok();
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.SHUTTLE_CONTROL) {
//                    //小车管制
//                    NyShuttleHttpCommand suspendCommand = NyHttpUtils.getSuspendCommand(shuttleSlave.getId(), assignCommand.getTaskNo().intValue(), true);
//                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
//                    commands.add(suspendCommand);
//                    assignCommand.setCommands(commands);
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.SHUTTLE_CANCEL_CONTROL) {
//                    //小车取消管制
//                    NyShuttleHttpCommand suspendCommand = NyHttpUtils.getSuspendCommand(shuttleSlave.getId(), assignCommand.getTaskNo().intValue(), false);
//                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
//                    commands.add(suspendCommand);
//                    assignCommand.setCommands(commands);
//                } else if (shuttleTaskModeType == ShuttleTaskModeType.MOVE_LOC_NO_WRK_MAST) {
//                    //移动到目标库位(生成移动任务)
//                    shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), param.getDistLocNo(), param.getShuttleNo());
//                    return R.ok();
//                } else {
//                    throw new CoolException("未知命令");
//                }
//
//                if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, assignCommand))) {
//                    return R.ok();
//                } else {
//                    throw new CoolException("命令下发失败");
//                }
//            }
//        }
//        return R.error();
//    }
    @ManagerAuth(memo = "手动操作")
    @PostMapping("/operator/shuttle")
    public R shuttleOperator(ShuttleOperatorParam param){
        if (Cools.isEmpty(param.getShuttleNo(), param.getShuttleTaskMode())) {
            return R.parse(BaseRes.PARAM);
        }
        ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
        if (param.getShuttleTaskMode().intValue() == ShuttleTaskModeType.MOVE_LOC_NO.id
                || param.getShuttleTaskMode().intValue() == ShuttleTaskModeType.MOVE_LOC_NO_TASK.id
                || param.getShuttleTaskMode().intValue() == ShuttleTaskModeType.TRANSPORT.id) {
            if (Cools.isEmpty(param.getSourceLocNo(), param.getDistLocNo())) {
                return R.parse(BaseRes.PARAM);
            }
            assignCommand.setSourceLocNo(param.getSourceLocNo());
            assignCommand.setLocNo(param.getDistLocNo());
        }
        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, param.getShuttleNo());
        if (shuttleThread == null) {
            throw new CoolException("四向穿梭车不在线");
        }
        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
        if (shuttleProtocol == null) {
            throw new CoolException("四向穿梭车不在线");
        }
        ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode().intValue());
        assignCommand.setShuttleNo(param.getShuttleNo()); // 四向穿梭车编号
        assignCommand.setTaskMode(shuttleTaskModeType.id);
        assignCommand.setTaskNo(commonService.getWorkNo(99));//获取任务号
        assignCommand.setAuto(false);//手动模式
        if (shuttleTaskModeType == ShuttleTaskModeType.MOVE_LOC_NO) {
            //移动到目标库位
            Integer mapType = NavigationMapType.NORMAL.id;
            if (shuttleProtocol.getHasLift()) {
                mapType = NavigationMapType.DFX.id;
            }
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), param.getDistLocNo(), mapType, assignCommand, shuttleThread);
            if (commands == null) {
                throw new CoolException("路径计算失败");
            }
            assignCommand.setCommands(commands);
            //尝试锁定目标站路径
            boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(param.getDistLocNo()), shuttleProtocol.getShuttleNo(), assignCommand.getNodesDeepCopy(), true);//所使用的路径进行锁定禁用
            if (!result2) {
                News.info("{}任务,{}小车,路径锁定失败,禁止派发", param.getDistLocNo(), shuttleProtocol.getShuttleNo());
                throw new CoolException("路径锁定失败");
            }
        } else if (shuttleTaskModeType == ShuttleTaskModeType.PALLET_LIFT) {
            //托盘顶升
            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
            assignCommand.setCommands(commands);
        } else if (shuttleTaskModeType == ShuttleTaskModeType.PALLET_DOWN) {
            //托盘下降
            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
            assignCommand.setCommands(commands);
        } else if (shuttleTaskModeType == ShuttleTaskModeType.CHARGE) {
            //充电开关
            boolean charge = false;
            if (shuttleProtocol.getHasCharge()) {
                //已充电,关闭充电
                charge = false;
            }else {
                //开启充电
                charge = true;
            }
            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, charge);
            assignCommand.setCommands(commands);
        } else if (shuttleTaskModeType == ShuttleTaskModeType.RESET) {
            //复位
            shuttleThread.setSyncTaskNo(0);//工作号清空
            shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);//任务状态-空闲
            shuttleThread.setPakMk(true);//作业标记复位
            shuttleThread.enableMoveLoc(null, false);
            return R.ok();
        } else if (shuttleTaskModeType == ShuttleTaskModeType.MOVE_LOC_NO_TASK) {
            //移动到目标库位(生成移动任务)
            shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), param.getDistLocNo(), param.getShuttleNo());
            return R.ok();
        } else if (shuttleTaskModeType == ShuttleTaskModeType.SHUTTLE_DEMO_OPEN) {
            //演示模式-开
            shuttleThread.enableDemo(true);
            return R.ok();
        } else if (shuttleTaskModeType == ShuttleTaskModeType.SHUTTLE_DEMO_CLOSE) {
            //演示模式-关
            shuttleThread.enableDemo(false);
            return R.ok();
        } else {
            throw new CoolException("未知命令");
        }
        shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
        return R.ok();
    }
    @PostMapping("/detl/update")
    @ManagerAuth(memo = "修改数据")
    public R shuttleUpdate(@RequestParam Integer shuttleNo,
                           @RequestParam Integer workNo,
                           @RequestParam String pakMk,
                           @RequestParam Integer token) {
                           @RequestParam String pakMk) {
        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
        if (shuttleThread == null) {
            return R.error("plc已掉线");
        }
        if (workNo != null) {
            shuttleThread.setTaskNo(workNo);
            shuttleThread.setSyncTaskNo(workNo);
        }
        if (pakMk != null) {
            shuttleThread.setPakMk(pakMk.equals("Y"));