zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -53,7 +53,7 @@ List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val)); for (Agv agv : agvList) { AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); if (null == agvDetail || null == agvDetail.getVol() || null == agvDetail.getAgvStatus()) { continue; } @@ -95,7 +95,7 @@ List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val)); for (Agv agv : agvList) { AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); if (null == agvDetail || null == agvDetail.getVol() || null == agvDetail.getAgvStatus() || null == agvDetail.getRecentCode()) { continue; } zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java
@@ -80,7 +80,7 @@ for (Agv agv : agvList) { AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); if (null == agvDetail) { continue; } Long recentCode = agvDetail.getRecentCode(); if (null == recentCode) { continue; } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -178,7 +178,7 @@ } return agvNoList.stream().filter(agvNo -> { Agv agv = agvService.selectByUuid(agvNo); AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvNo(agvNo); List<Task> transportTasks = taskService.findTransportTasksByAgv(agv.getId()); return transportTasks.size() < agvModel.getBackpack(); }).collect(Collectors.toList()); zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AvoidWaveCalculator.java
@@ -115,7 +115,7 @@ } stopWatch.stop(); if (stopWatch.getTime() > 100) { if (stopWatch.getTime() > 0) { log.info("滤波函数花费时间为:{}毫秒......", stopWatch.getTime()); } } @@ -241,7 +241,7 @@ } Agv agv = agvService.selectByUuid(agvNo); AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvNo(agvNo); Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev); zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -1,7 +1,6 @@ package com.zy.acs.manager.core.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.domain.AgvAction; import com.zy.acs.common.domain.AgvActionItem; @@ -646,28 +645,31 @@ try { if (Cools.isEmpty(agvId, segmentList)) { return; } Date now = new Date(); JSONObject storeDirection = configService.getVal("storeDirection", JSONObject.class); Agv agv = agvService.getById(agvId); if (!agvService.judgeEnable(agv.getId())) { throw new CoolException("AGV[" + agv.getUuid() + "]当前不可用..."); long actionPrepareSts = ActionStsType.PREPARE.val(); // JSONObject storeDirection = configService.getVal("storeDirection", JSONObject.class); int angleOffsetVal = configService.getVal("mapAngleOffsetVal", Integer.class); String agvNo = agvService.getAgvNo(agvId); if (!agvService.judgeEnable(agvId)) { throw new CoolException("AGV[" + agvNo + "]当前不可用..."); } AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agvId); Double workDirection = agvModel.getWorkDirection(); AgvSpeedType agvSpeedType = AgvSpeedType.query(agvModel.getTravelSpeed()); assert agvSpeedType != null; AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId); AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agvId); List<Action> actionList = new ArrayList<>(); // start node Code lastCode = codeService.getById(agvDetail.getRecentCode()); Double lastDirection = agvDetail.getAgvAngle(); if (!lastCode.getData().equals(pathList.get(0))) { throw new CoolException("AGV[" + agv.getUuid() + "]定位偏移..."); throw new CoolException("AGV[" + agvNo + "]定位偏移..."); } boolean first = true; long startTime = System.currentTimeMillis(); for (Segment segment : segmentList) { // 分段所属的Task @@ -689,7 +691,7 @@ String next = pathListPart.get(i); Code nextCode = codeService.selectByData(next); Double nextDirection = mapService.calculateDirection(lastCode, nextCode); Double nextDirection = mapService.calculateDirection(lastCode, nextCode, angleOffsetVal); boolean reverse = false; if (nextDirection.equals((workDirection + 180) % 360)) { @@ -709,7 +711,7 @@ lastCode.getData(), // 地面码 String.valueOf(nextDirection), // 动作参数 ActionTypeType.TurnCorner.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -735,7 +737,7 @@ lastCode.getData(), // 地面码 String.valueOf(gap.getDistance()), // 动作参数 actionType.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -761,7 +763,7 @@ lastCode.getData(), // 地面码 String.valueOf(workDirection), // 动作参数 ActionTypeType.TurnCorner.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -792,7 +794,7 @@ lastCode.getData(), // 地面码 String.valueOf(workDirection), // 动作参数 ActionTypeType.TurnCorner.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -801,7 +803,7 @@ // 货架取货 Loc oriLoc = locService.getById(task.getOriLoc()); // 计算左右方向 agvDirectionType = mapService.calculateAgvWorkDirection(storeDirection, oriLoc, lastCode); agvDirectionType = mapService.calculateAgvWorkDirection(oriLoc, lastCode); actionList.add(new Action( null, // 编号 task.getBusId(), // 总线 @@ -813,7 +815,7 @@ lastCode.getData(), // 地面码 String.valueOf(oriLoc.getOffset()), // 动作参数 ActionTypeType.ReadyTakeFromShelvesLoc.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -829,7 +831,7 @@ lastCode.getData(), // 地面码 String.valueOf(backpackType.height), // 动作参数 ActionTypeType.ReadyReleaseToAgvSite.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -850,7 +852,7 @@ lastCode.getData(), // 地面码 String.valueOf(workDirection), // 动作参数 ActionTypeType.TurnCorner.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -868,7 +870,7 @@ lastCode.getData(), // 地面码 String.valueOf(backpackType.height), // 动作参数 ActionTypeType.ReadyTakeFromAgvSite.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -876,7 +878,7 @@ // 货架放货 Loc destLoc = locService.getById(task.getDestLoc()); // 计算左右方向 agvDirectionType = mapService.calculateAgvWorkDirection(storeDirection, destLoc, lastCode); agvDirectionType = mapService.calculateAgvWorkDirection(destLoc, lastCode); actionList.add(new Action( null, // 编号 task.getBusId(), // 总线 @@ -888,7 +890,7 @@ lastCode.getData(), // 地面码 String.valueOf(destLoc.getOffset()), // 动作参数 ActionTypeType.ReadyReleaseToShelvesLoc.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -913,7 +915,7 @@ lastCode.getData(), // 地面码 String.valueOf(chargeDirection), // 动作参数 ActionTypeType.TurnCorner.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -932,7 +934,7 @@ lastCode.getData(), // 地面码 null, // 动作参数 ActionTypeType.DockingCharge.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -952,7 +954,7 @@ // lastCode.getData(), // 地面码 // String.valueOf(standByDirection), // 动作参数 // ActionTypeType.TurnCorner.val(), // 动作类型 // ActionStsType.PREPARE.val(), // 动作进度 // actionPrepareSts, // 动作进度 // agvId, // AGV // now // 工作时间 // )); @@ -966,6 +968,7 @@ } } System.out.println("save data: " + (System.currentTimeMillis() - startTime)); // finish actionList.add(new Action( @@ -979,7 +982,7 @@ lastCode.getData(), // 地面码 null, // 动作参数 ActionTypeType.FinishPath.val(), // 动作类型 ActionStsType.PREPARE.val(), // 动作进度 actionPrepareSts, // 动作进度 agvId, // AGV now // 工作时间 )); @@ -1018,7 +1021,7 @@ } } log.info(agv.getUuid() + "号Agv动作组装完成,指令数量:" + newActionList.size()); log.info(agvNo + "号Agv动作组装完成,指令数量:" + newActionList.size()); } catch (Exception e) { log.error("mainService.generateAction", e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
@@ -1,6 +1,5 @@ package com.zy.acs.manager.core.service; import com.alibaba.fastjson.JSONObject; import com.zy.acs.common.enums.AgvDirectionType; import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.common.utils.MapDataUtils; @@ -125,7 +124,7 @@ // 角度计算 public Double calculateDirection(Code startCode, Code endCode) { public Double calculateDirection(Code startCode, Code endCode, int angleOffsetVal) { Double x0 = startCode.getX(); Double y0 = startCode.getY(); @@ -135,7 +134,6 @@ double deltaX = x1 - x0; double deltaY = y1 - y0; double angle = -Math.atan2(deltaX, deltaY); int angleOffsetVal = configService.getVal("mapAngleOffsetVal", Integer.class); angle = Math.toDegrees(angle) + angleOffsetVal; angle = (angle + 360) % 360; // 将角度转换为正值 @@ -143,8 +141,7 @@ } // 坐标货架阈值 todo:luxiaotao public AgvDirectionType calculateAgvWorkDirection(JSONObject storeDirection, Loc loc, Code code) { storeDirection.getString("key"); public AgvDirectionType calculateAgvWorkDirection(Loc loc, Code code) { Integer compDirect = loc.getCompDirect(); AgvDirectionType agvDirectionType = null; if (compDirect == 0) { zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
@@ -67,7 +67,7 @@ String breakPoint = avoidPathList.stream().findFirst().orElse(null); List<String> blackList = Utils.singletonList(sponsor); Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModelService.getById(agvService.selectByUuid(sponsor).getAgvModel()).getDiameter() Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModelService.getByAgvNo(sponsor).getDiameter() , MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); List<String> avoidPathListWave = mapService.getWaveScopeByCodeList(lev, avoidPathList, avoidDistance); zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -135,7 +135,9 @@ // checkout path Code startCode = codeService.getById(agvDetail.getRecentCode()); Code endCode = codeService.getById(endNode); long startTime = System.currentTimeMillis(); List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment); System.out.println("checkoutPath: " + (System.currentTimeMillis() - startTime)); if (Cools.isEmpty(pathList)) { return; } @@ -200,7 +202,9 @@ mapService.lockPath(null, pathList, agv.getUuid()); startTime = System.currentTimeMillis(); mainService.generateAction(segment.getAgvId(), segmentList, pathList, now); System.out.println("generateAction: " + (System.currentTimeMillis() - startTime)); } catch (Exception e) { log.error("TrafficService.trigger", e); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvController.java
@@ -92,7 +92,7 @@ if (null != agvDetail) { agv.setAgvDetail(agvDetail); } AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); if (null != agvModel) { agv.setAgvModelData(agvModel); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvModelController.java
@@ -12,6 +12,7 @@ import com.zy.acs.manager.common.utils.ExcelUtil; import com.zy.acs.manager.manager.entity.AgvModel; import com.zy.acs.manager.manager.service.AgvModelService; import com.zy.acs.manager.manager.service.impl.AgvModelServiceImpl; import com.zy.acs.manager.system.controller.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -101,6 +102,18 @@ agvModel.setUpdateTime(new Date()); if (!agvModelService.updateById(agvModel)) { return R.error("Update Fail"); } else { // update cache for (Map.Entry<Long, AgvModel> entry : AgvModelServiceImpl.AGV_ID_MODEL_CACHE.entrySet()) { if (entry.getValue().getId().equals(agvModel.getId())) { entry.setValue(agvModel); } } for (Map.Entry<String, AgvModel> entry : AgvModelServiceImpl.AGV_NO_MODEL_CACHE.entrySet()) { if (entry.getValue().getId().equals(agvModel.getId())) { entry.setValue(agvModel); } } } return R.ok("Update Success").add(agvModel); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvModelService.java
@@ -7,4 +7,8 @@ AgvModel selectByType(String type); AgvModel getByAgvId(Long agvId); AgvModel getByAgvNo(String agvNo); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvDetailServiceImpl.java
@@ -66,7 +66,7 @@ agvDetail = this.selectByAgvId(agv.getId()); } if (null == agvModel) { agvModel = agvModelService.getById(agv.getAgvModel()); agvModel = agvModelService.getByAgvId(agv.getId()); } if (null == agv.getChargeLine()) { return agvDetail.getVol() < agvModel.getLowBattery(); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvModelServiceImpl.java
@@ -2,17 +2,65 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zy.acs.manager.manager.entity.Agv; import com.zy.acs.manager.manager.entity.AgvModel; import com.zy.acs.manager.manager.mapper.AgvModelMapper; import com.zy.acs.manager.manager.service.AgvModelService; import com.zy.acs.manager.manager.service.AgvService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.HashMap; import java.util.Map; @Service("agvModelService") public class AgvModelServiceImpl extends ServiceImpl<AgvModelMapper, AgvModel> implements AgvModelService { public static final Map<Long, AgvModel> AGV_ID_MODEL_CACHE = new HashMap<>(); public static final Map<String, AgvModel> AGV_NO_MODEL_CACHE = new HashMap<>(); @Autowired private AgvService agvService; @PostConstruct public void init() { for (Agv agv : agvService.list()) { AgvModel agvModel = this.getById(agv.getAgvModel()); AGV_ID_MODEL_CACHE.put(agv.getId(), agvModel); AGV_NO_MODEL_CACHE.put(agv.getUuid(), agvModel); } } @Override public AgvModel selectByType(String type) { return this.getOne(new LambdaQueryWrapper<AgvModel>().eq(AgvModel::getType, type)); } @Override public AgvModel getByAgvId(Long agvId) { AgvModel agvModel = AGV_ID_MODEL_CACHE.get(agvId); if (agvModel == null) { Agv agv = agvService.getById(agvId); agvModel = this.getById(agv.getAgvModel()); if(agvModel != null) { AGV_ID_MODEL_CACHE.put(agv.getId(), agvModel); } } return agvModel; } @Override public AgvModel getByAgvNo(String agvNo) { AgvModel agvModel = AGV_NO_MODEL_CACHE.get(agvNo); if (agvModel == null) { Agv agv = agvService.selectByUuid(agvNo); agvModel = this.getById(agv.getAgvModel()); if(agvModel != null) { AGV_NO_MODEL_CACHE.put(agvNo, agvModel); } } return agvModel; } } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -100,29 +100,29 @@ @Override public Boolean judgeEnable(Long agvId, Boolean isLowBattery) { Agv agv = this.getById(agvId); AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); String agvNo = this.getAgvNo(agvId); AgvModel agvModel = agvModelService.getByAgvId(agvId); if (0 < segmentService.count(new LambdaQueryWrapper<Segment>() .eq(Segment::getAgvId, agvId) .eq(Segment::getState, SegmentStateType.RUNNING.toString()) )) { log.warn("[{}]号Agv正在忙碌 - segment......", agv.getUuid()); log.warn("[{}]号Agv正在忙碌 - segment......", agvNo); return false; } if (!this.judgeOnline(agv.getId())) { log.warn("[{}]号Agv不是在线状态......", agv.getUuid()); if (!this.judgeOnline(agvId)) { log.warn("[{}]号Agv不是在线状态......", agvNo); return false; } AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agv.getId()); AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agvId); if (null == agvDetail) { log.warn("[{}]号Agv未收到状态包......", agv.getUuid()); log.warn("[{}]号Agv未收到状态包......", agvNo); return false; } if (agvDetail.getVol() == 0) { return false; } if (!agvDetail.getAgvStatus().equals(AgvStatusType.IDLE) && !agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { log.warn("[{}]号Agv不是空闲状态......", agv.getUuid()); log.warn("[{}]号Agv不是空闲状态......", agvNo); return false; } if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { @@ -132,18 +132,19 @@ } if (!agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { if (agvDetail.getPos() != 1) { log.warn("[{}]号Agv当前不在定位......", agv.getUuid()); log.warn("[{}]号Agv当前不在定位......", agvNo); return false; } if (null == agvDetail.getRecentCode()) { log.warn("[{}]号Agv当前不在定位......", agv.getUuid()); log.warn("[{}]号Agv当前不在定位......", agvNo); return false; } } // with battery if (isLowBattery) { Agv agv = this.getById(agvId); if (agvDetailService.isPowerLoss(agv, agvDetail, agvModel)) { log.warn("[{}]号Agv电量不足......", agv.getUuid()); log.warn("[{}]号Agv电量不足......", agvNo); return false; } } @@ -181,7 +182,7 @@ // if (null != agv.getStage()) { // return agv.getStage(); // } AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); assert null != agvModel; return agvModel.getBackpack(); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java
@@ -74,7 +74,7 @@ if (funcSta.getType().equals(FuncStaType.CHARGE.toString())) { // if the type of this funSta is charge and the existing agv is in charge status, then that means this funSta is occupied if (null != agv && !agv.getId().equals(agvId)) { AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { if (agvDetail.getVol() < agvModel.getQuaBattery()) { @@ -189,7 +189,7 @@ agv = agvService.findByPosition(funcSta.getCode()); if (null != agv) { AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { return false;