package com.zy.asrs.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; 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.LocMast; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasShuttleService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.utils.Utils; import com.zy.common.utils.NavigatePositionConvert; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.*; import com.zy.core.model.ShuttleSlave; import com.zy.core.model.Task; import com.zy.core.model.command.ShuttleAssignCommand; import com.zy.core.model.command.ShuttleCommand; import com.zy.core.model.protocol.ShuttleProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.ShuttleThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 四向穿梭车接口 */ @Slf4j @RestController @RequestMapping("/shuttle") public class ShuttleController { @Autowired private SlaveProperties slaveProperties; @Autowired private BasShuttleService basShuttleService; @Autowired private WrkMastService wrkMastService; @Autowired private LocMastService locMastService; @PostMapping("/table/shuttle/state") @ManagerAuth(memo = "四向穿梭车信息表") public R steStateTable(){ List list = new ArrayList<>(); List shuttles = basShuttleService.selectList(new EntityWrapper().orderBy("shuttle_no")); for (BasShuttle basShuttle : shuttles) { // 表格行 ShuttleStateTableVo vo = new ShuttleStateTableVo(); vo.setShuttleNo(basShuttle.getShuttleNo()); //四向穿梭车号 list.add(vo); // 获取四向穿梭车信息 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, basShuttle.getShuttleNo()); if (shuttleThread == null) { vo.setStatus(ShuttleProtocolStatusType.OFFLINE.id);//设备离线 vo.setBusyStatus(ShuttleProtocolStatusType.OFFLINE.desc); continue; } ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); if (shuttleProtocol == null || shuttleProtocol.getShuttleNo()==null) { continue; } vo.setTaskNo(shuttleProtocol.getTaskNo().intValue()); // 任务号 vo.setBusyStatus(shuttleProtocol.getBusyStatusType().desc); //四向穿梭车状态 vo.setStatus(shuttleProtocol.getProtocolStatusType().id);//当前任务状态 vo.setCurrentCode(shuttleProtocol.getCurrentCode());//当前二维码 LocMast currentLocMast = locMastService.queryByQrCode(shuttleProtocol.getCurrentCode().toString()); if (currentLocMast == null) { vo.setLocNo("");//获取当前库位号 vo.setLocNoX(0); vo.setLocNoY(0); vo.setLocNoLev(0);//当前库位层高 }else { vo.setLocNo(currentLocMast.getLocNo());//获取当前库位号 int[] locNoXY = NavigatePositionConvert.positionToXY(currentLocMast.getLocNo());//获取库位号XY坐标 vo.setLocNoX(locNoXY[0]); vo.setLocNoY(locNoXY[1]); vo.setLocNoLev(Utils.getLev(currentLocMast.getLocNo()));//当前库位层高 } vo.setBatteryPower(shuttleProtocol.getBatteryPower$() == null ? "" : shuttleProtocol.getBatteryPower$() + "%");//电池电量 vo.setBatteryTemp(shuttleProtocol.getBatteryTemp$() == null ? "" : shuttleProtocol.getBatteryTemp$() + "°");//电池温度 if (!Cools.isEmpty(shuttleProtocol.getErrorCode())) { vo.setErrorCode(shuttleProtocol.getErrorCodeType());//错误编号 } vo.setPlcOutputStatusIO(shuttleProtocol.getPlcOutputStatusIO());//Plc输出状态IO if (!Cools.isEmpty(shuttleProtocol.getPlcOutputLift())) { vo.setPlcOutputLift(shuttleProtocol.getPlcOutputLift()); } if (!Cools.isEmpty(shuttleProtocol.getPlcOutputTransfer())) { vo.setPlcOutputTransfer(shuttleProtocol.getPlcOutputTransfer()); } if (!Cools.isEmpty(shuttleProtocol.getPlcOutputBrake())) { vo.setPlcOutputBrake(shuttleProtocol.getPlcOutputBrake()); } if (!Cools.isEmpty(shuttleProtocol.getPlcOutputCharge())) { vo.setPlcOutputCharge(shuttleProtocol.getPlcOutputCharge()); } if (!Cools.isEmpty(shuttleProtocol.getStatusErrorCode())) { vo.setStatusErrorCode(shuttleProtocol.getStatusErrorCode$());//错误信息码 } vo.setPlcInputStatus(shuttleProtocol.getPlcInputStatus());//PLC输入状态 vo.setCurrentOrBeforeCode(shuttleProtocol.getCurrentOrBeforeCode());//当前或者之前读到的二维码值 vo.setCodeOffsetX(shuttleProtocol.getCodeOffsetX());//读到的二维码X方向偏移量 vo.setCodeOffsetY(shuttleProtocol.getCodeOffsetY());//读到的二维码Y方向偏移量 vo.setCurrentVoltage(shuttleProtocol.getCurrentVoltage() * 0.1);//当前的电压值 vo.setCurrentAnalogValue(shuttleProtocol.getCurrentAnalogValue());//当前的模拟量值 vo.setCurrentLiftServoSpeed(shuttleProtocol.getCurrentLiftServoSpeed());//当前的升降伺服速度 vo.setCurrentMoveServoSpeed(shuttleProtocol.getCurrentMoveServoSpeed());//当前的行走伺服速度 vo.setCurrentLiftServoLoad(shuttleProtocol.getCurrentLiftServoLoad());//当前的升降伺服负载率 vo.setCurrentMoveServoLoad(shuttleProtocol.getCurrentMoveServoLoad());//当前的行走伺服负载率 } return R.ok().add(list); } @PostMapping("/table/shuttle/msg") @ManagerAuth(memo = "四向穿梭车数据表") public R steMsgTable(){ List list = new ArrayList<>(); List shuttles = basShuttleService.selectList(new EntityWrapper().orderBy("shuttle_no")); for (BasShuttle basShuttle : shuttles) { // 表格行 ShuttleMsgTableVo vo = new ShuttleMsgTableVo(); vo.setShuttleNo(basShuttle.getShuttleNo()); // 四向穿梭车号 list.add(vo); // 获取穿梭车信息 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, basShuttle.getShuttleNo()); if (shuttleThread == null) { continue; } ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); if (shuttleProtocol == null) { continue; } if (shuttleProtocol.getShuttleNo() == null) { continue; } vo.setWorkNo(shuttleProtocol.getTaskNo().intValue());//任务号 if (shuttleProtocol.getTaskNo() > 0) { WrkMast wrkMast = wrkMastService.selectById(shuttleProtocol.getTaskNo()); if (wrkMast != null) { vo.setSourceLocNo(wrkMast.getSourceLocNo());//源库位 vo.setDistLocNo(wrkMast.getLocNo());//目标库位 } } if (shuttleProtocol.getProtocolStatusType() != null) { vo.setStatus(shuttleProtocol.getProtocolStatusType().desc);//状态 } vo.setCodeOffsetX(shuttleProtocol.getCodeOffsetX());//读到的二维码X方向偏移量 vo.setCodeOffsetY(shuttleProtocol.getCodeOffsetY());//读到的二维码Y方向偏移量 vo.setCurrentVoltage(shuttleProtocol.getCurrentVoltage());//当前的电压值 vo.setCurrentAnalogValue(shuttleProtocol.getCurrentAnalogValue());//当前的模拟量值 vo.setCurrentMoveServoSpeed(shuttleProtocol.getCurrentMoveServoSpeed());//当前的行走伺服速度 vo.setCurrentMoveServoLoad(shuttleProtocol.getCurrentMoveServoLoad() == null ? "" : shuttleProtocol.getCurrentMoveServoLoad() + "%");//当前的行走伺服负载率 vo.setCurrentLiftServoLoad(shuttleProtocol.getCurrentLiftServoLoad() == null ? "" : shuttleProtocol.getCurrentLiftServoLoad() + "%");//当前的升降伺服负载率 vo.setCurrentLiftServoSpeed(shuttleProtocol.getCurrentLiftServoSpeed());//当前的升降伺服速度 vo.setPakMk(shuttleProtocol.getPakMk()?"Y" : "N"); // 作业标记 vo.setLocNo(shuttleProtocol.getLocNo());//四向穿梭车当前库位号 vo.setLev(shuttleProtocol.getLocNo() == null ? 0 : Utils.getLev(shuttleProtocol.getLocNo()));//四向穿梭车当前层高 vo.setRunSpeed(basShuttle.getRunSpeed());//四向穿梭车运行速度(设置) vo.setChargeLine(basShuttle.getChargeLine());//充电阈值 } return R.ok().add(list); } @PostMapping("/latest/data/shuttle") @ManagerAuth(memo = "四向穿梭车实时数据") public R shuttleLatestData(){ return R.ok(); } @PostMapping("/output/shuttle") @ManagerAuth public R steOutput(){ StringBuilder str = new StringBuilder(); String s; int i = 0; while((s = OutputQueue.SHUTTLE.poll()) != null && i <=10) { str.append("\n").append(s); i++; } return R.ok().add(str.toString()); } @GetMapping("/detl/{shuttleNo}") public R steDetl(@PathVariable("shuttleNo") Integer shuttleNo){ ShuttleDataVo vo = new ShuttleDataVo(); for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { if (shuttleNo.equals(shuttleSlave.getId())) { vo.setShuttleNo(shuttleSlave.getId()); BasShuttle basShuttle = basShuttleService.selectById(shuttleSlave.getId()); if (!Cools.isEmpty(basShuttle)) { vo.setWorkNo(basShuttle.getWrkNo()); vo.setPakMk(basShuttle.getPakMk()); } break; } } return R.ok().add(vo); } @GetMapping("/sensor/detl/{shuttleNo}") public R shuttleSensorDetl(@PathVariable("shuttleNo") Integer shuttleNo){ ShuttleSensorDataVo vo = new ShuttleSensorDataVo(); for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { if (shuttleNo.equals(shuttleSlave.getId())) { vo.setShuttleNo(shuttleSlave.getId()); // 获取穿梭车信息 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId()); if (shuttleThread == null) { return R.error("设备不在线"); } ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); if (shuttleProtocol == null) { return R.error("设备不在线"); } // 穿梭车异常 ----------- // 穿梭车提示信息 ---------------------- // 状态信息 ------------- break; } } return R.ok().add(vo); } @PostMapping("/detl/update") @ManagerAuth public R steUpdate(ShuttleDataVo vo){ BasShuttle basShuttle = basShuttleService.selectById(vo.getShuttleNo()); if (basShuttle == null) { return R.error(); } // 获取四向穿梭车信息 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, vo.getShuttleNo()); ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); if (shuttleProtocol == null) { throw new CoolException(vo.getShuttleNo() + "号四向穿梭车不在线,无法保存"); } // if (!Cools.isEmpty(vo.getRow(), vo.getBay(), vo.getLev())) { // if (!shuttleThread.modifyPosHandle(vo.getRow(), vo.getBay(), vo.getLev())) { // throw new CoolException("服务器错误"); // } // } ShuttleCommand shuttleCommand = new ShuttleCommand(); shuttleCommand.setTaskNo(vo.getWorkNo().shortValue()); if (MessageQueue.offer(SlaveType.Shuttle, vo.getShuttleNo(), new Task(2, shuttleCommand))) { } else { throw new CoolException("命令下发失败"); } basShuttle.setPakMk(vo.getPakMk()); basShuttle.setWrkNo(vo.getWorkNo()); basShuttle.setUpdateTime(new Date()); if (!basShuttleService.updateById(basShuttle)) { throw new CoolException("修改失败"); } return R.ok(); } @PostMapping("/runSpeed/{shuttleNo}") @ManagerAuth public R setRunSpeed(@PathVariable("shuttleNo") String shuttleNo, @RequestParam("runSpeed") Integer runSpeed, @RequestParam("chargeLine") Integer chargeLine) { BasShuttle basShuttle = basShuttleService.selectById(shuttleNo); if (basShuttle == null) { return R.error("四向穿梭车不存在"); } basShuttle.setRunSpeed(runSpeed); basShuttle.setChargeLine(chargeLine); if (!basShuttleService.updateById(basShuttle)) { return R.error(); } return R.ok(); } /****************************************************************/ /************************** 手动操作 ******************************/ /****************************************************************/ @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.getShuttleProtocol(); if (shuttleProtocol == null) { throw new CoolException("四向穿梭车不在线"); } ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode()); assignCommand.setShuttleNo(shuttleSlave.getId().shortValue()); // 四向穿梭车编号 assignCommand.setTaskMode(shuttleTaskModeType.id.shortValue()); assignCommand.setTaskNo((short) 9999); assignCommand.setAuto(false);//手动模式 if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, assignCommand))) { return R.ok(); } else { throw new CoolException("命令下发失败"); } } } return R.error(); } }