package com.zy.asrs.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.RgvStatusType; import com.zy.asrs.domain.param.*; import com.zy.asrs.domain.vo.*; import com.zy.asrs.entity.*; import com.zy.asrs.mapper.BasRgvErrMapper; import com.zy.asrs.service.BasCircularShuttleService; import com.zy.asrs.service.BasDevpPositionService; import com.zy.asrs.service.BasRgvService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.asrs.utils.NumUtils; import com.zy.asrs.utils.Utils; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.RgvModeType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.RgvThread; import com.zy.core.thread.SiemensDevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.rmi.CORBA.Util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * RGV接口 * Created by vincent on 2020-06-01 */ @Slf4j @RestController @RequestMapping("/rgv") public class RgvController { @Autowired private SlaveProperties slaveProperties; @Autowired private WrkMastService wrkMastService; @Autowired private BasRgvErrMapper basRgvErrMapper; @Autowired private BasRgvService basRgvService; @Autowired private MainServiceImpl mainService; @Autowired private BasDevpPositionService basDevpPositionService; @Autowired private BasCircularShuttleService basCircularShuttleService; @Value("${constant-parameters.perimeter}") private Long perimeter; @PostMapping("/table/rgv/state") @ManagerAuth(memo = "RGV信息表") public R rgvStateTable(){ List list = new ArrayList<>(); List rgvs = basRgvService.selectList(new EntityWrapper().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.setWalkPos(rgvProtocol.getWalkPos()==1?"不在定位":"在定位"); vo.setWorkNo2(rgvProtocol.getTaskNo2()); // 工位2任务号 vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态 vo.setLoading2(rgvProtocol.getLoaded2()==0?"无物":"有物"); // 工位2有物 vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm())); if (rgvProtocol.getAlarm() > 0) { BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm()); vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName()); } } return R.ok().add(list); } @PostMapping("/table/rgv/msg") @ManagerAuth(memo = "RGV数据表") public R rgvMsgTable(){ List list = new ArrayList<>(); List rgvs = basRgvService.selectList(new EntityWrapper().orderBy("rgv_no")); for (BasRgv basRgv : rgvs) { // 表格行 RgvMsgTableVo vo = new RgvMsgTableVo(); 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.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) } return R.ok().add(list); } @PostMapping("/output/site") @ManagerAuth(memo = "RGV报文日志输出") public R rgvOutput(){ StringBuilder str = new StringBuilder(); String s; int i = 0; while((s = OutputQueue.RGV.poll()) != null && i <=10) { str.append("\n").append(s); i++; } return R.ok().add(str.toString()); } /****************************************************************/ /************************** 手动操作 ******************************/ /****************************************************************/ @ManagerAuth(memo = "取放货") @PostMapping("/operator/put") public R rgvFetchPut(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 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.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); return rgvControl(command)?R.ok():R.error(); } @ManagerAuth(memo = "取货") @PostMapping("/operator/take") 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); return rgvControl(command)?R.ok():R.error(); } @ManagerAuth(memo = "放货") @PostMapping("/operator/stockMove") 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); 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.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 command.setAckFinish2((short) 1); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo2((short) 0); // 源站 command.setDestinationStaNo2((short) 0); // 目标站 command.setCommand((short) 0); return rgvControl(command)?R.ok():R.error(); } @ManagerAuth(memo = "清除命令") @PostMapping("/operator/clearCommand") public R rgvClearCommand(RgvOperatorParam param){ if (param.getRgvNo() == null) { throw new CoolException("请选择RGV号"); } 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); return rgvControl(command)?R.ok():R.error(); } @ManagerAuth(memo = "手动复位") @PostMapping("/operator/handleReset") public R handleReset(RgvOperatorParam param) throws Exception { if (param.getRgvNo() == null) { throw new CoolException("请选择RGV"); } // 获取RGV缓存 for (RgvSlave rgv : slaveProperties.getRgv()) { // 获取RGV信息 if (param.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不在线"); } 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); // 任务完成确认位 // 延时发送 Thread.sleep(1000L); if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, Command))) { return R.ok(); } else { throw new CoolException("命令下发失败"); } } } return R.error(); } private boolean rgvControl(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(2, command))) { return true; } else { throw new CoolException("命令下发失败"); } } } return false; } @PostMapping("/ring/through/rgv/position/data") // @ManagerAuth(memo = "环穿位置信息") public R ringThroughRgv(){ List result = new ArrayList<>(); for (RgvSlave rgv : slaveProperties.getRgv()) { // for (int i = 1;i<2;i++) { // // 获取RGV信息 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); if (rgvThread == null) { continue; } RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } RingThroughParam ringThroughParam = new RingThroughParam(); ringThroughParam.setIndex(rgv.getId()); // ringThroughParam.setIndex(i); // double[] doubles = Utils.RingThroughXY2(perimeter, NumUtils.GetRandomIntInRange(183)); double[] doubles = Utils.RingThroughXYRgv(perimeter, perimeter-rgvProtocol.RgvPos.doubleValue()); // double[] doubles = Utils.RingThroughXY2(183.0, 100*i ); ringThroughParam.setValueX(doubles[0]-2.94); ringThroughParam.setValueY(doubles[1]-2.94); ringThroughParam.setModeColor(rgvProtocol.modeType.color); ringThroughParam.setStatusColor(rgvProtocol.statusType.color); result.add(ringThroughParam); } return R.ok().add(result); } @PostMapping("/ring/through/dev/position/data") // @ManagerAuth(memo = "站点信息") public R ringThroughDev(){ List result = new ArrayList<>(); List basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<>()); for (BasDevpPosition basDevpPosition : basDevpPositions){ RingThroughParam ringThroughParam = new RingThroughParam(); ringThroughParam.setIndex(basDevpPosition.getDevNo()); double[] doubles = Utils.RingThroughXYSta(perimeter, perimeter-basDevpPosition.getPlcPosition()); ringThroughParam.setValueX(doubles[0]>50? doubles[0]+6:doubles[0]-1); ringThroughParam.setValueY(doubles[1]>50? doubles[1]+6:doubles[1]-1); result.add(ringThroughParam); } return R.ok().add(result); } @PostMapping("/ring/through/track/position/data") // @ManagerAuth(memo = "轨道PLC状态信息") public R wnergyGatheringRingParamTrack(){ List result = new ArrayList<>(); try{ for (DevpSlave devp : slaveProperties.getDevp()) { if (devp.getId()!=1){ break; } SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); if (devpThread.isResult()){ if (true){ EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam(); energyGatheringRingParam.setTrackColor("rgba(0, 230, 118, 0.5)"); energyGatheringRingParam.setRadiationColor("rgba(0, 230, 118, 0.5)"); result.add(energyGatheringRingParam); } else { EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam(); energyGatheringRingParam.setTrackColor("rgba(0, 230, 118, 0.5)"); energyGatheringRingParam.setRadiationColor("rgba(0, 230, 118, 0.5)"); result.add(energyGatheringRingParam); } } } if (result.isEmpty()){ EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam(); energyGatheringRingParam.setTrackColor("rgba(0, 0, 0, 81)"); energyGatheringRingParam.setRadiationColor("rgba(0, 0, 0, 81)"); result.add(energyGatheringRingParam); } } catch (Exception e){ EnergyGatheringRingParam energyGatheringRingParam = new EnergyGatheringRingParam(); energyGatheringRingParam.setTrackColor("rgba(0, 0, 0, 81)"); energyGatheringRingParam.setRadiationColor("rgba(0, 0, 0, 81)"); result.add(energyGatheringRingParam); } return R.ok().add(result); } @PostMapping("/ring/through/task/wrk/mast/position/data") // @ManagerAuth(memo = "作业信息") public R ringThroughTaskWrkMast(){ List result = new ArrayList<>(); List wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); for (WrkMast wrkMast : wrkMasts){ RgvWrkMastParam rgvWrkMastParam = new RgvWrkMastParam(wrkMast); if (Cools.isEmpty(rgvWrkMastParam.getRgvNo())){ rgvWrkMastParam.setRgvSts("未绑定"); } else { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvWrkMastParam.getRgvNo()); if (rgvThread == null) { rgvWrkMastParam.setRgvSts("未知"); } else { RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { rgvWrkMastParam.setRgvSts("未知"); } else { rgvWrkMastParam.setRgvSts(rgvProtocol.statusType.desc); } } } result.add(rgvWrkMastParam); } return R.ok().add(result); } @PostMapping("/task/rgv/circular/shuttle/mast/position/data") // @ManagerAuth(memo = "作业信息") public R rgvCircularShuttle(){ List result = new ArrayList<>(); List basCircularShuttleList = basCircularShuttleService.selectList(new EntityWrapper<>()); for (BasCircularShuttle basCircularShuttle : basCircularShuttleList){ RgvCircularShuttleParam rgvCircularShuttleParam = new RgvCircularShuttleParam(basCircularShuttle); if (!Cools.isEmpty(rgvCircularShuttleParam.getRgvNo())){ RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvCircularShuttleParam.getRgvNo()); if (rgvThread != null) { RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol != null) { rgvCircularShuttleParam.setPosition(rgvProtocol.getRgvPos()); if (rgvCircularShuttleParam.getStatus()==0){ rgvCircularShuttleParam.setStatus$(rgvProtocol.statusType.desc); } } } } result.add(rgvCircularShuttleParam); } return R.ok().add(result); } }