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.WrkMast; import com.zy.asrs.service.BasShuttleService; import com.zy.asrs.service.WrkMastService; 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; import java.util.Random; /** * 四向穿梭车接口 */ @Slf4j @RestController @RequestMapping("/shuttle") public class ShuttleController { @Autowired private SlaveProperties slaveProperties; @Autowired private BasShuttleService basShuttleService; @Autowired private WrkMastService wrkMastService; @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) { continue; } ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); if (shuttleProtocol == null || shuttleProtocol.getShuttleNo()==null) { continue; } vo.setTaskNo(shuttleProtocol.getTaskNo().intValue()); // 任务号 if (!Cools.isEmpty(shuttleProtocol.getBusyStatus())) { vo.setStatus(shuttleProtocol.getBusyStatusType().desc); // 状态 } vo.setBatteryPower(shuttleProtocol.getBatteryPower() + "%"); vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed()); if (!Cools.isEmpty(shuttleProtocol.getErrorCode())) { vo.setAlarm1(String.valueOf(shuttleProtocol.getErrorCode())); } if (!Cools.isEmpty(shuttleProtocol.getStatusErrorCode())) { vo.setAlarm2(String.valueOf(shuttleProtocol.getStatusErrorCode())); } } 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; } vo.setWorkNo(shuttleProtocol.getTaskNo().intValue()); // 任务号 if (shuttleProtocol.getTaskNo() > 0) { WrkMast wrkMast = wrkMastService.selectById(shuttleProtocol.getTaskNo()); if (wrkMast != null) { //vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 源站 vo.setStaNo(wrkMast.getStaNo$()); // 目标站 vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 源库位 vo.setLocNo(wrkMast.getLocNo()); // 目标库位 } } vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed()); // 速度 vo.setPakMk(shuttleProtocol.getPakMk()?"Y" : "N"); // 作业标记 } 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.setRow(basShuttle.getRow()); vo.setBay(basShuttle.getBay()); vo.setLev(basShuttle.getLev()); 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("设备不在线"); } // 穿梭车异常 ----------- // 穿梭车提示信息 ---------------------- // 任务信息 ---------------- vo.setPakInTask(shuttleProtocol.isPakInTask()); vo.setPakOutTask(shuttleProtocol.isPakOutTask()); vo.setPakMoveTask(shuttleProtocol.isPakMoveTask()); vo.setGoHpTask(shuttleProtocol.isGoHpTask()); vo.setGoOHpTask(shuttleProtocol.isGoOHpTask()); vo.setGoHpAvoid(shuttleProtocol.isGoHpAvoid()); vo.setGoOHpAvoid(shuttleProtocol.isGoOHpAvoid()); vo.setPakInEmpty(shuttleProtocol.isPakInEmpty()); vo.setPakInFinish(shuttleProtocol.isPakInFinish()); vo.setPakOutEmpty(shuttleProtocol.isPakOutEmpty()); vo.setPakOutFinish(shuttleProtocol.isPakOutFinish()); vo.setGoHpAvoidFinish(shuttleProtocol.isGoHpAvoidFinish()); vo.setGoOHpAvoidFinish(shuttleProtocol.isGoOHpAvoidFinish()); vo.setGoHpAvoidErr(shuttleProtocol.isGoHpAvoidErr()); vo.setGoOHpAvoidErr(shuttleProtocol.isGoOHpAvoidErr()); // 状态信息 ------------- 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.setRow(vo.getRow()); basShuttle.setBay(vo.getBay()); basShuttle.setLev(vo.getLev()); basShuttle.setPakMk(vo.getPakMk()); basShuttle.setWrkNo(vo.getWorkNo()); basShuttle.setUpdateTime(new Date()); if (!basShuttleService.updateById(basShuttle)) { throw new CoolException("修改失败"); } 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); } 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()); ShuttleAssignCommand command = new ShuttleAssignCommand(); command.setShuttleNo(shuttleSlave.getId().shortValue()); // 四向穿梭车编号 command.setTaskMode(shuttleTaskModeType.id.shortValue()); command.setSourceLocNo(param.getSourceLocNo()); command.setDistLocNo(param.getDistLocNo()); command.setTaskNo((short) 9999); if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, command))) { return R.ok(); } else { throw new CoolException("命令下发失败"); } } } return R.error(); } }