1
19 小时以前 fb74f60f1d8397acf5251ae289e80ab8a056857f
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -5,6 +5,7 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.RgvStatusType;
import com.zy.asrs.domain.param.CrnOperatorParam;
import com.zy.asrs.domain.param.RgvOperatorParam;
import com.zy.asrs.domain.vo.RgvMsgTableVo;
import com.zy.asrs.domain.vo.RgvStateTableVo;
@@ -21,6 +22,7 @@
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.RgvTaskStatusType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
@@ -34,8 +36,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * RGV接口
@@ -59,45 +63,83 @@
    @Autowired
    private LocMastService locMastService;
    @ManagerAuth(memo = "解锁小车")
    @PostMapping("/lock")
    public R lock(CrnOperatorParam param){
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, param.getRgvNo());
        rgvThread.setPakMk(true);
        return R.ok();
    }
    @PostMapping("/table/rgv/state")
    @ManagerAuth(memo = "RGV信息表")
    public R rgvStateTable(){
    public R rgvStateTable() {
        List<RgvStateTableVo> list = new ArrayList<>();
        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
        for (BasRgv basRgv : rgvs) {
            // 表格行
            RgvStateTableVo vo = new RgvStateTableVo();
            vo.setRgvNo(basRgv.getRgvNo());   //  RGV号
            list.add(vo);
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
            if (rgvThread == null) {
                continue;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            vo.setStatusType(rgvProtocol.modeType.desc);   //  模式状态
            vo.setStatus(rgvProtocol.getStatusType().desc);     //  状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  工位1任务号
            vo.setStatus1(rgvProtocol.getStatusType1().desc);  // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1()==1?"有物":"无物");  // 工位1有物
            vo.setRgvPos(rgvProtocol.getRgvPos());
            vo.setRgvPos1(rgvProtocol.getRgvPosI());
            vo.setWalkPos(rgvProtocol.getWalkPos()==1?"不在定位":"在定位");
//            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  工位2任务号
//            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 工位2状态
//            vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物");  // 工位2有物
            if (rgvThread == null) continue;
            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
            if (rgvProtocol.getAlarm() > 0) {
                BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm());
                vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) continue;
            vo.setStatusType(rgvProtocol.modeType.desc);   // 模式状态
            vo.setStatus(String.valueOf(rgvProtocol.getMode())); // 状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());      // 工位1任务号
            vo.setStatus1(rgvProtocol.getStatusType1().desc); // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1() ? "有物" : "无物"); // 工位1有物
            vo.setRgvPos(rgvProtocol.getRgvPos());
            vo.setRgvPos1(rgvProtocol.getRgvPosI2());
            vo.setWalkPos(Objects.equals(rgvProtocol.getWalkPos(), 1) ? "在定位" : "不在定位");
            vo.setPakMk(rgvThread.isPakMk() ? "无锁" : "锁定");
//            vo.setPakIn(rgvThread.isPakIn() ? "可入" : "不可入");
//            vo.setPakOut(rgvThread.isPakOut() ? "可出" : "不可出");
//            vo.setPakRgv(rgvThread.isPakRgv() ? "无锁" : "锁定");
            vo.setPaking(rgvThread.isPaking()? "无锁" : "锁定");
//            vo.setPakAll(rgvThread.isPakAll() ? "无锁" : "锁定");
//            vo.setPakToCrn(rgvThread.isPakToCrn() ? "无锁" : "锁定");
            vo.setWorkNo2(rgvProtocol.getTaskNo2());      // 工位2任务号
//            vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态
            vo.setLoading2(rgvProtocol.getLoaded2() ? "有物" : "无物"); // 工位2有物
            // --- 遍历 errX 字段生成 warnCode 和 alarm ---
            List<String> alarms = new ArrayList<>();
            List<String> warnCodes = new ArrayList<>();
            Field[] fields = rgvProtocol.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (field.getName().startsWith("err") && field.getType().equals(Boolean.class)) {
                    field.setAccessible(true);
                    try {
                        Boolean value = (Boolean) field.get(rgvProtocol);
                        if (Boolean.TRUE.equals(value)) {
                            String numPart = field.getName().substring(3);
                            int errId = Integer.parseInt(numPart);
                            warnCodes.add(String.valueOf(errId));
                            BasRgvErr rgvErr = basRgvErrMapper.selectById(errId);
                            alarms.add(rgvErr == null ? "未知异常(" + errId + ")" : rgvErr.getErrName());
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
            vo.setWarnCode(String.join(",", warnCodes));
            vo.setAlarm(alarms.isEmpty() ? "" : String.join(",", alarms));
        }
        return R.ok().add(list);
    }
    @PostMapping("/table/rgv/msg")
    @ManagerAuth(memo = "RGV数据表")
@@ -119,22 +161,11 @@
                continue;
            }
            vo.setWorkNo(rgvProtocol.getTaskNo1());  //  任务号
            if (rgvProtocol.getTaskNo1()>0) {
                WrkMast wrkMast = wrkMastService.selectById(rgvProtocol.getTaskNo1());
                if (wrkMast != null) {
                    vo.setStatus(RgvStatusType.process(wrkMast.getIoType()).getDesc());   //  模式状态
                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  源站
                    vo.setStaNo(wrkMast.getStaNo$());   //  目标站
                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  源库位
                    vo.setLocNo(wrkMast.getLocNo());    //  目标库位
                }
            } else {
                vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc);   //  模式状态
            }
            vo.setXspeed(rgvProtocol.getXSpeed());  //  走行速度(m/min)
            vo.setXdistance(rgvProtocol.getXDistance());  //  走行距离(Km)
            vo.setXduration(rgvProtocol.getXDuration());    //  走行时长(H)
            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  工位1工作号
            vo.setWorkNo2(rgvProtocol.getTaskNo2()); //工位2 工作号
            vo.setStaNo(String.valueOf(rgvProtocol.getRgvPosDestination())); //小车目标站
            vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc);   //  模式状态
        }
        return R.ok().add(list);
    }
@@ -161,17 +192,17 @@
    public R rgvFetchPut(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
//        command.setAckFinish2((short) 0);  // 任务完成确认位
//        command.setTaskNo2((short) 0); // 工作号
//        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2(false);  // 任务完成确认位
        command.setTaskNo2(0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -181,17 +212,18 @@
    public R rgvFetch(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH); // 任务模式: 取货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        command.setWrkTaskPri(param.getWorkSta());  //执行工位
        command.setTaskNo(Math.toIntExact(param.getWorkNo())); // 工作号
        command.setTaskStatus(RgvTaskStatusType.FETCH); // 任务模式: 取货
        command.setTargetPosition(Integer.valueOf(param.getStaNo()));  // 目标站
//        command.setTaskMode2(RgvTaskModeType.FETCH); // 任务模式: 取放货
//        command.setAckFinish1(false);  // 任务完成确认位
//        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
//        command.setAckFinish2(false);  // 任务完成确认位
//        command.setTaskNo2( 0); // 工作号
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -201,37 +233,40 @@
    public R rgvPut(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.PUT); // 任务模式: 放货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        command.setWrkTaskPri(param.getWorkSta());  //执行工位
        command.setTaskNo(Math.toIntExact(param.getWorkNo())); // 工作号
        command.setTaskStatus(RgvTaskStatusType.PUT); // 任务模式: 取货
        command.setTargetPosition(Integer.valueOf(param.getStaNo()));  // 目标站
//        command.setAckFinish1(false);  // 任务完成确认位
//        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
//        command.setAckFinish2(false);  // 任务完成确认位
//        command.setTaskNo2( 0); // 工作号
//        command.setTaskMode2(RgvTaskModeType.FETCH); // 任务模式: 取放货
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "任务完成")
    @PostMapping("/operator/taskComplete")
    public R rgvTaskComplete(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 1);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(true);  // 任务完成确认位
//        command.setTaskNo1(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2((short) 1);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setAckFinish2(true);  // 任务完成确认位
        command.setTaskNo2( 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand((short) 0);
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -244,19 +279,12 @@
        }
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand((short) 0);
        command.setWrkTaskPri(0);  //执行工位
        command.setTaskNo(Math.toIntExact(0)); // 工作号
        command.setTaskStatus((short)0); // 任务模式: 取货
        command.setTargetPosition(0);  // 目标站
        return rgvControl(command)? R.ok(): R.error();
        return rgvClear(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "手动复位")
@@ -280,12 +308,12 @@
                RgvCommand Command = new RgvCommand();
                Command.setRgvNo(rgv.getId()); // RGV编号
                Command.setTaskMode1(RgvTaskModeType.NONE);
                Command.setAckFinish1((short) 0);  // 任务完成确认位
                Command.setAckFinish2((short) 0);  // 任务完成确认位
                Command.setCommand((short) 0);  // 任务完成确认位
                Command.setAckFinish1(true);  // 任务完成确认位
                Command.setAckFinish2(true);  // 任务完成确认位
                Command.setCommand(true);  // 任务完成确认位
                // 延时发送
                Thread.sleep(1000L);
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, Command))) {
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, Command))) {
                    return R.ok();
                } else {
                    throw new CoolException("命令下发失败");
@@ -311,7 +339,7 @@
                if (rgvProtocol == null) {
                    throw new CoolException("RGV不在线");
                }
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, command))) {
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, command))) {
                    return true;
                } else {
                    throw new CoolException("命令下发失败");
@@ -321,4 +349,30 @@
        return false;
    }
    private boolean rgvClear(RgvCommand command){
        if (command.getRgvNo() == null) {
            throw new CoolException("请选择RGV");
        }
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            // 获取RGV信息
            if (command.getRgvNo().equals(rgv.getId())) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                if (rgvThread == null) {
                    throw new CoolException("RGV不在线");
                }
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    throw new CoolException("RGV不在线");
                }
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(3, command))) {
                    return true;
                } else {
                    throw new CoolException("命令下发失败");
                }
            }
        }
        return false;
    }
}