| | |
| | | import com.zy.asrs.domain.vo.RgvStateTableVo; |
| | | 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.*; |
| | | import com.zy.asrs.service.impl.MainServiceImpl; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.core.cache.MessageQueue; |
| | |
| | | private BasRgvErrMapper basRgvErrMapper; |
| | | @Autowired |
| | | private BasRgvService basRgvService; |
| | | @Autowired |
| | | private BasDevpService basDevpService; |
| | | @Autowired |
| | | private MainServiceImpl mainService; |
| | | @Autowired |
| | |
| | | List<RingThroughParam> result = new ArrayList<>(); |
| | | List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<>()); |
| | | for (BasDevpPosition basDevpPosition : basDevpPositions){ |
| | | if (basDevpPosition.getDevNo() == 134){ |
| | | continue; |
| | | } |
| | | RingThroughParam ringThroughParam = new RingThroughParam(); |
| | | |
| | | ringThroughParam.setModeColor("#FFFFFF"); |
| | | ringThroughParam.setStatusColor("#FFFFFF"); |
| | | try{ |
| | | BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no",basDevpPosition.getDevNo())); |
| | | if (basDevp.getAutoing().equals("Y")){ |
| | | if (basDevp.getLoading().equals("Y")){ |
| | | ringThroughParam.setModeColor("#ab1839"); |
| | | ringThroughParam.setStatusColor("#ab1839"); |
| | | } |
| | | if (basDevp.getLoading().equals("N")){ |
| | | ringThroughParam.setModeColor("#27AE60"); |
| | | ringThroughParam.setStatusColor("#27AE60"); |
| | | } |
| | | } else { |
| | | ringThroughParam.setModeColor("#C0392B"); |
| | | ringThroughParam.setStatusColor("#C0392B"); |
| | | } |
| | | |
| | | } catch (Exception e){ |
| | | System.out.println(e.getMessage()); |
| | | ringThroughParam.setModeColor("#000000"); |
| | | ringThroughParam.setStatusColor("#000000"); |
| | | |
| | | } |
| | | ringThroughParam.setIndex(basDevpPosition.getDevNo()); |
| | | // double[] doubles = Utils.RingThroughXYSta(perimeter, perimeter-basDevpPosition.getPlcPosition()); |
| | | // ringThroughParam.setValueX(doubles[0]>50? doubles[0]+6:doubles[0]-1); |
| | |
| | | runRgv: |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | Integer rgvSstaNo = wrkMast.getRgvSstaNo(); |
| | | // 1090,1089,1086,1083 按1083站点位置计算,能取1083,就能取1090,1089,1086,避免任务延迟下发方案一直给1083发 |
| | | // if (rgvSstaNo == 1090 || rgvSstaNo == 1089 || rgvSstaNo == 1086 || rgvSstaNo == 1105) { |
| | | // rgvSstaNo = 1083; |
| | | // } |
| | | BasDevpPosition basDevpPositions = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", rgvSstaNo)); // 站点 |
| | | long position = basDevpPositions.getPlcPosition(); // 起始站位置 |
| | | position += 50; // 小车取货定位精度 +- 50,站点位置10000,小车在10050也是可以取的 |
| | |
| | | } |
| | | map.put(distance, rgvProtocol); |
| | | } |
| | | position -= 50; |
| | | log.info("取货站点:{},后面小车排序", basDevpPositions.getDevNo()); |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) { |
| | |
| | | RgvProtocol rgvProtocol = rgvProtocolMap.getValue(); // 最近距离小车 |
| | | // log.info("取货站点:{},后面最近小车:{},状态:{}", basDevpPositions.getDevNo(), rgvProtocol.getRgvNo(), rgvProtocol.getStatusType().desc); |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts", 10)); |
| | | if(wrkMast.getIoType() == 10 || wrkMast.getIoType() == 110 || wrkMast.getSourceStaNo() == 1034) { |
| | | if (rgvProtocol.modeType == RgvModeType.AUTO |
| | | && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM) |
| | | && rgvProtocol.getTaskNo1() == 0 |
| | |
| | | // 当前rgv任务目标站点 |
| | | BasDevpPosition rgvDstaNoDevPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast1.getRgvDstaNo())); |
| | | long rgvDstaNoPosition = rgvDstaNoDevPosition.getPlcPosition(); // 当前rgv任务目标站点位置 |
| | | if(rgvProtocol.getRgvPos() < rgvDstaNoPosition || Math.abs(rgvProtocol.getRgvPos() - rgvDstaNoPosition) <= 50) { // 小车当前位置 < rgv目标位置 |
| | | if(!(rgvProtocol.getRgvPos() < position && position < rgvDstaNoPosition)) { // 这个任务位置是在当前rgv位置前面并且这个任务起点在当前rgv目标站点之后 |
| | | // 获取RGV当前位置和状态 |
| | | long currentRgvPos = rgvProtocol.getRgvPos(); |
| | | int rgvStatus = rgvProtocol.getStatusType().id; |
| | | |
| | | // 定义浮动范围(仅停靠状态适用) |
| | | long posTolerance = (rgvStatus == 0 || rgvStatus == 2 || rgvStatus == 3 || rgvStatus == 6 || rgvStatus == 7 || rgvStatus == 8 || rgvStatus == 100) ? 50 : 0; |
| | | if(currentRgvPos < rgvDstaNoPosition + posTolerance) { // 小车当前位置 < rgv目标位置 |
| | | if(!(currentRgvPos - posTolerance < position && position < rgvDstaNoPosition + posTolerance)) { // 这个任务位置是在当前rgv位置前面并且这个任务起点在当前rgv目标站点之后 |
| | | break; // 当前rgv放货完成后,可以取当前任务 |
| | | } |
| | | } else { |
| | | if(!(rgvProtocol.getRgvPos() < position || position < rgvDstaNoPosition)) { |
| | | if(!(currentRgvPos + posTolerance < position || position < rgvDstaNoPosition - posTolerance)) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } else { |
| | | if (rgvProtocol.modeType == RgvModeType.AUTO |
| | | && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM) |
| | | && rgvProtocol.getTaskNo1() == 0 |
| | | && rgvProtocol.getAlarm() == 0) { |
| | | if (count != 0) { |
| | | log.error("{}呼叫小车:{}号小车空闲,但工作档显示该小车有任务",wrkMast.getWrkNo(),rgvProtocol.getRgvNo()); |
| | | break; |
| | | } |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo()); |
| | | rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 |
| | | rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue()); //工位1起点 |
| | | rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue()); //工位1目标站点 |
| | | rgvCommand.setCommand((short) 1); //工位1任务确认 |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | break runRgv; |
| | | } |
| | | log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | Date now = new Date(); |
| | | wrkMast.setRgvNo(rgvProtocol.getRgvNo()); |
| | | wrkMast.setWrkSts(10L); |
| | | wrkMast.setRgvCreateTime(now); |
| | | wrkMastService.updateById(wrkMast); |
| | | break runRgv; |
| | | } else if(rgvProtocol.modeType == RgvModeType.AUTO |
| | | && rgvProtocol.getTaskNo1() != 0){ // 当前小车放货目标位置在当前任务取货点之后,跳过任务分配,不再则判断下个小车目标位置 |
| | | WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1())); // 当前rgv任务 |
| | | if(wrkMast1!= null && !Cools.isEmpty(wrkMast1.getRgvDstaNo())) { |
| | | // 当前rgv任务目标站点 |
| | | BasDevpPosition rgvDstaNoDevPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast1.getRgvDstaNo())); |
| | | long rgvDstaNoPosition = rgvDstaNoDevPosition.getPlcPosition(); // 当前rgv任务目标站点位置 |
| | | if(rgvProtocol.getRgvPos() <= rgvDstaNoPosition || Math.abs(rgvProtocol.getRgvPos() - rgvDstaNoPosition) <= 50) { // 小车当前位置 < rgv目标位置 |
| | | if(!(rgvProtocol.getRgvPos() < position && position < rgvDstaNoPosition)) { // 这个任务位置是在当前rgv位置前面并且这个任务起点在当前rgv目标站点之后 |
| | | break; // 当前rgv放货完成后,可以取当前任务 |
| | | } |
| | | } else { |
| | | if(!(rgvProtocol.getRgvPos() < position || position < rgvDstaNoPosition)) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | public enum RgvModeType { |
| | | |
| | | NONE(-1, "离线","#4A4035"), |
| | | STOP(0, "维修","#E2C027"), |
| | | HAND(1, "手动","#2196F3"), |
| | | HALF_AUTO(2, "半自动","#E2C027"), |
| | | AUTO(3, "自动","#4B5CC4"), |
| | | STOP(0, "维修","#FFA500"), |
| | | HAND(1, "手动","#FFD700"), |
| | | HALF_AUTO(2, "半自动","#20B2AA"), |
| | | AUTO(3, "自动","#4169E1"), |
| | | AUTO2(100, "其它","#2196F3"), |
| | | SOS(999, "其它","#2196F3") |
| | | SOS(999, "其它","#FF0000") |
| | | ; |
| | | |
| | | public Integer id; |
| | |
| | | |
| | | public enum RgvStatusType { |
| | | |
| | | NONE(-1, "离线","#4A4035"), |
| | | IDLE(0, "无任务","#1F3696"), |
| | | PICK_UP_WALK(1, "取货行走","#2196F3"), |
| | | IN_STATION_OPERATION(2, "进站运行中","#2196F3"), |
| | | STATION_ENTRY_COMPLETED(3, "进站完成","#2196F3"), |
| | | There_IS_something_waiting_to_leave_the_station(4, "有物待出站","#2196F3"), |
| | | Exit_walking(5, "出站行走","#E2C027"), |
| | | Outbound_request(6, "出站请求","#2196F3"), |
| | | Outbound_operation_in_progress(7, "出站运行中","#2196F3"), |
| | | Outbound_completed(8, "出站完成","#2196F3"), |
| | | PICK_UP_OFFSIDE(9, "小车取货越位","#2196F3"), |
| | | ROAM(11, "漫游","#2196F3"), |
| | | WAITING(100, "任务执行完成等待确认","#2196F3"), |
| | | SOS110(110, "报警","#2196F3"), |
| | | SOS(999, "未知","#2196F3") |
| | | |
| | | NONE(-1, "离线","#C0392B"), |
| | | IDLE(0, "无任务","#27AE60"), |
| | | PICK_UP_WALK(1, "取货行走","#F39C12"), |
| | | IN_STATION_OPERATION(2, "进站运行中","#3498DB"), |
| | | STATION_ENTRY_COMPLETED(3, "进站完成","#2980B9"), |
| | | There_IS_something_waiting_to_leave_the_station(4, "有物待出站","#5DADE2"), |
| | | Exit_walking(5, "出站行走","#E67E22"), |
| | | Outbound_request(6, "出站请求","#2196F3"), |
| | | Outbound_operation_in_progress(7, "出站运行中","#21618C"), |
| | | Outbound_completed(8, "出站完成","#85C1E9"), |
| | | ROAM(11, "漫游","#95A5A6"), |
| | | CANCEL(12, "等待取消","#95A5A6"), |
| | | WALK(20, "走行","#F1C40F"), |
| | | WAITING(100, "任务执行完成等待确认","#AED6F1"), |
| | | WAITING101(101, "任务执行完成等待确认","#AED6F1"), |
| | | SOS110(110, "报警","#E74C3C"), |
| | | SOS(999, "未知","#FF0000") |
| | | ; |
| | | |
| | | public Integer id; |
| | |
| | | } |
| | | .station { |
| | | position: absolute; |
| | | width: 20px; |
| | | width: 26px; |
| | | height: 14px; |
| | | text-align: center; |
| | | line-height: 1.5; /* 调整行高与字体大小的比值 */ |
| | |
| | | <!-- <div v-for="(item,i) in devpPos3" class="bus-item-left2" :style="'top:' + (100 + i * 10) + 'px'">{{item.dev_no}}</div>--> |
| | | <!-- </div>--> |
| | | <!-- Stations on outer ring--> |
| | | <div v-for="station in tableDataDev" class="station" :style="{ top: station.valueY + 'px', left: station.valueX + 'px' }">{{ station.index }}</div> |
| | | <div v-for="station in tableDataDev" class="station" :style="{ top: station.valueY + 'px', left: station.valueX + 'px' , backgroundColor: station.modeColor}">{{ station.index }}</div> |
| | | <!-- <div>--> |
| | | <!-- <el-switch--> |
| | | <!-- style="display: block"--> |