| | |
| | | package com.zy.acs.manager.common.utils; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.zy.acs.common.utils.GsonUtils; |
| | | import com.zy.acs.framework.common.Cools; |
| | | |
| | | import java.util.*; |
| | |
| | | } |
| | | |
| | | public static String generateWaveNode(String originStr, String waveNode) { |
| | | List<String> originNode = GsonUtils.fromJsonToList(originStr, String.class); |
| | | List<String> originNode = JSON.parseArray(originStr, String.class); |
| | | Set<String> set = new HashSet<>(originNode); |
| | | set.add(waveNode); |
| | | return GsonUtils.toJson(set); |
| | | return JSON.toJSONString(set); |
| | | } |
| | | |
| | | public static Double getVehicleWaveSafeDistance(Integer diameter, Double factor) { |
| | |
| | | import com.zy.acs.manager.core.constant.MapDataConstant; |
| | | import com.zy.acs.manager.core.domain.BackpackDto; |
| | | import com.zy.acs.manager.core.domain.VehicleFaultDto; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.entity.AgvDetail; |
| | | import com.zy.acs.manager.manager.entity.Code; |
| | | import com.zy.acs.manager.manager.service.*; |
| | |
| | | IMessageBody msgBody = protocol.getMessageBody(); |
| | | assert msgBody != null; |
| | | |
| | | Agv agv = agvService.selectByUuid(protocol.getAgvNo()); |
| | | if (null == agv) { |
| | | Long agvId = agvService.getAgvId(protocol.getAgvNo()); |
| | | if (null == agvId) { |
| | | log.warn("Agv [{}] 尚未鉴权 !!!", protocol.getAgvNo()); |
| | | return; |
| | | } |
| | | AgvDetail detail = agvDetailService.selectByAgvId(agv.getId()); |
| | | AgvDetail detail = agvDetailService.selectByAgvId(agvId); |
| | | if (null == detail) { |
| | | detail = new AgvDetail(); |
| | | detail.setAgvId(agv.getId()); |
| | | detail.setAgvId(agvId); |
| | | if (!agvDetailService.save(detail)) { |
| | | log.error("Agv [{}] 详情更新失败 !!!", protocol.getAgvNo()); |
| | | return; |
| | |
| | | mapService.unlockPath(protocol.getAgvNo(), agv_12_up.getQrCode()); |
| | | }); |
| | | // finish jam |
| | | threadPoolRegulator.getInstance().execute(() -> jamService.checkIfFinish(agv.getId(), agv_12_up.getQrCode())); |
| | | threadPoolRegulator.getInstance().execute(() -> jamService.checkIfFinish(agvId, agv_12_up.getQrCode())); |
| | | |
| | | // websocketService.agvInfoBroadcastOnPos(new WebsocketDto<AGV_12_UP>("agv", agv.getUuid(), agv_12_up)); |
| | | this.sync(agv_12_up, detail); |
| | |
| | | // calculate wight = backpack + distance |
| | | private int calcAllocateWeight(String agvNo, Task task) { |
| | | int weight = 0; |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | Long agvId = agvService.getAgvId(agvNo); |
| | | |
| | | // backpack |
| | | List<Task> transportTasks = taskService.findTransportTasksByAgv(agv.getId()); |
| | | List<Task> transportTasks = taskService.findTransportTasksByAgv(agvId); |
| | | if (!Cools.isEmpty(transportTasks)) { |
| | | weight = weight + transportTasks.size() * 100000; |
| | | } |
| | | |
| | | // distance |
| | | // from |
| | | AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); |
| | | AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId); |
| | | Code agvCurrCode = codeService.getById(agvDetail.getRecentCode()); |
| | | Double[] fromPosition = new Double[]{agvCurrCode.getX(), agvCurrCode.getY()}; |
| | | // to |
| | |
| | | import com.zy.acs.framework.common.RadixTools; |
| | | import com.zy.acs.framework.common.SnowflakeIdWorker; |
| | | import com.zy.acs.manager.core.domain.VehicleFaultDto; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.entity.VehFaultRec; |
| | | import com.zy.acs.manager.manager.service.AgvDetailService; |
| | | import com.zy.acs.manager.manager.service.AgvService; |
| | |
| | | |
| | | AgvErrorType errorType = AgvErrorType.query(agv_04_up.getHexFaultId()); |
| | | |
| | | Agv agv = agvService.selectByUuid(vehicle); |
| | | Long agvId = agvService.getAgvId(vehicle); |
| | | |
| | | VehFaultRec vehFaultRec = new VehFaultRec(); |
| | | vehFaultRec.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | vehFaultRec.setAgvId(agv.getId()); |
| | | vehFaultRec.setAgvId(agvId); |
| | | vehFaultRec.setFaultNo(String.valueOf(agv_04_up.getFaultId())); |
| | | vehFaultRec.setFaultHex(agv_04_up.getHexFaultId()); |
| | | vehFaultRec.setFaultName(null != errorType ? errorType.desc : "undefined"); |
| | |
| | | } |
| | | |
| | | private void patrolOfMove(String agvNo) { |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agv.getId()); |
| | | Long agvId = agvService.getAgvId(agvNo); |
| | | AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agvId); |
| | | if (taskService.count(new LambdaQueryWrapper<Task>() |
| | | .eq(Task::getAgvId, agv.getId()) |
| | | .eq(Task::getAgvId, agvId) |
| | | .in(Task::getTaskSts, TaskStsType.ASSIGN.val(), TaskStsType.PROGRESS.val()) |
| | | ) > 0) { |
| | | return; |
| | | } |
| | | if (!agvService.judgeEnable(agv.getId())) { |
| | | if (!agvService.judgeEnable(agvId)) { |
| | | return; |
| | | } |
| | | Agv agv = agvService.getById(agvId); |
| | | Code destinationCode = this.getDestinationCode(agv, agvDetail); |
| | | if (null == destinationCode) { |
| | | return; |
| | |
| | | } else { |
| | | |
| | | // block vehicle info |
| | | Agv blockAgv = agvService.selectByUuid(blockAgvNo); |
| | | String blockAgvCode = codeService.getById(agvDetailService.selectByAgvId(blockAgv.getId()).getRecentCode()).getData(); |
| | | Long blockAgvId = agvService.getAgvId(blockAgvNo); |
| | | String blockAgvCode = codeService.getById(agvDetailService.selectByAgvId(blockAgvId).getRecentCode()).getData(); |
| | | |
| | | // create new jam if already notify the avoid vehicle |
| | | if (!Cools.isEmpty(jam.getAvoAgv(), jam.getAvoSeg()) && !blockAgv.getId().equals(jam.getAvoAgv())) { |
| | | if (!Cools.isEmpty(jam.getAvoAgv(), jam.getAvoSeg()) && !blockAgvId.equals(jam.getAvoAgv())) { |
| | | jam = this.setupNewJam(jam, agv, startCode, segment, draftPath); |
| | | } |
| | | |
| | | do { |
| | | |
| | | // 阻塞车辆正在原地作业,等待 ===>> 超过等待时间,绕路 |
| | | List<Segment> runningSegList = segmentService.getByAgvAndState(blockAgv.getId(), SegmentStateType.RUNNING.toString()); |
| | | List<Segment> runningSegList = segmentService.getByAgvAndState(blockAgvId, SegmentStateType.RUNNING.toString()); |
| | | if (!Cools.isEmpty(runningSegList)) { |
| | | maxJamTimeoutFactor = 1; |
| | | break; |
| | | } |
| | | |
| | | // 判断下个任务是否为原地任务,如果是则等待 ===>> 超过等待时间,绕路;如果不是,让阻塞车辆避让 |
| | | List<Segment> waitingSegList = segmentService.getJustWaitingSeg(blockAgv.getId()); |
| | | List<Segment> waitingSegList = segmentService.getJustWaitingSeg(blockAgvId); |
| | | if (null != waitingSegList |
| | | && waitingSegList.stream().anyMatch( |
| | | waitingSeg -> waitingSeg.getEndNode().equals(codeService.selectByData(blockAgvCode).getId()) |
| | |
| | | if (jam.getCycleAvo() == 1) { |
| | | jam.setCycleCode(endCode.getId()); |
| | | } |
| | | jam.setAvoAgv(blockAgv.getId()); |
| | | jam.setAvoAgv(blockAgvId); |
| | | jam.setNotifyTime(new Date()); |
| | | if (!jamService.updateById(jam)) { |
| | | throw new CoolException(jam.getUuid() + "-jam failed to update!!!"); |
| | |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Objects; |
| | | import java.util.Optional; |
| | | |
| | | /** |
| | | * A*寻路算法Node节点 |
| | | * Node节点 |
| | | */ |
| | | @Data |
| | | public class NavigateNode implements Comparable<NavigateNode>, Cloneable, Serializable { |
| | |
| | | private int z; //坐标z(高度) |
| | | |
| | | private int F; //综合花费的步数 |
| | | private int G; //已经花费的步数 |
| | | private int H; //将要花费的步数 |
| | | |
| | | private NavigateNode parent; //父节点 |
| | | private Boolean turningPoint; //是否为拐点 |
| | | private String direction; //行走方向 |
| | | private Integer lastDistance; // 距离上个节点距离 |
| | | private Integer moveDistance; // 总行走距离 |
| | | private Integer weight; // G 权重 |
| | | |
| | | private String codeData; |
| | |
| | | this.x = x; |
| | | this.y = y; |
| | | this.codeData = codeData; |
| | | } |
| | | |
| | | //通过结点的坐标和目标结点的坐标可以计算出F, G, H三个属性 |
| | | //需要传入这个节点的上一个节点和最终的结点 |
| | | public void initNode(NavigateNode father, NavigateNode end) { |
| | | this.parent = father; |
| | | if (this.parent != null) { |
| | | //走过的步数等于父节点走过的步数加一 |
| | | this.G = father.G |
| | | + Optional.ofNullable(this.lastDistance).orElse(0) |
| | | + Optional.ofNullable(this.weight).orElse(0); |
| | | } else { //父节点为空代表它是第一个结点 |
| | | this.G = 0; |
| | | } |
| | | |
| | | //以下计算方案为算法原始方案,没有去拐点方案。已被Solution计算时自动覆盖。 |
| | | //计算通过现在的结点的位置和最终结点的位置计算H值(曼哈顿法:坐标分别取差值相加) |
| | | this.H = Math.abs(this.x - end.x) + Math.abs(this.y - end.y); |
| | | this.F = this.G + this.H; |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public int hashCode() { |
| | | return Objects.hash(x, y); |
| | | } |
| | | |
| | | public void reset() { |
| | | this.F = 0; |
| | | this.G = 0; |
| | | this.H = 0; |
| | | this.parent = null; |
| | | this.turningPoint = null; |
| | | this.direction = null; |
| | | this.lastDistance = null; |
| | | this.moveDistance = null; |
| | | this.weight = null; |
| | | this.codeData = null; |
| | | } |
| | | |
| | | } |
| | |
| | | import com.zy.acs.manager.core.domain.VehicleDto; |
| | | import com.zy.acs.manager.manager.controller.result.AgvResult; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.entity.Task; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | Agv selectByUuid(String uuid); |
| | | |
| | | Agv queryIdle(Task task); |
| | | Long getAgvId(String uuid); |
| | | |
| | | String getAgvNo(Long agvId); |
| | | |
| | | Boolean judgeEnable(Long agvId); |
| | | |
| | |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.zy.acs.manager.manager.entity.Action; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.enums.ActionStsType; |
| | | import com.zy.acs.manager.manager.enums.ActionTypeType; |
| | | import com.zy.acs.manager.manager.mapper.ActionMapper; |
| | |
| | | |
| | | @Override |
| | | public List<String> getPathListByAgv(String agvNo) { |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | return this.baseMapper.selectSortCodeByAgv(agv.getId()); |
| | | Long agvId = agvService.getAgvId(agvNo); |
| | | return this.baseMapper.selectSortCodeByAgv(agvId); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public AgvDetail selectByAgvNo(String agvNo) { |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | return this.selectByAgvId(agv.getId()); |
| | | return this.selectByAgvId(agvService.getAgvId(agvNo)); |
| | | } |
| | | |
| | | @Override |
| | |
| | | import com.zy.acs.manager.common.domain.PageResult; |
| | | import com.zy.acs.manager.core.domain.VehicleDto; |
| | | import com.zy.acs.manager.manager.controller.result.AgvResult; |
| | | import com.zy.acs.manager.manager.entity.*; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.entity.AgvDetail; |
| | | import com.zy.acs.manager.manager.entity.AgvModel; |
| | | import com.zy.acs.manager.manager.entity.Segment; |
| | | import com.zy.acs.manager.manager.enums.SegmentStateType; |
| | | import com.zy.acs.manager.manager.mapper.AgvMapper; |
| | | import com.zy.acs.manager.manager.service.*; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 字典数据Service实现 |
| | |
| | | public class AgvServiceImpl extends ServiceImpl<AgvMapper, Agv> implements AgvService { |
| | | |
| | | private final RedisSupport redis = RedisSupport.defaultRedisSupport; |
| | | |
| | | private static final Map<String, Long> AGV_ID_MAP = new HashMap<>(); |
| | | |
| | | private static final Map<Long, String> AGV_NO_MAP = new HashMap<>(); |
| | | |
| | | @Autowired |
| | | private AgvDetailService agvDetailService; |
| | |
| | | @Autowired |
| | | private TaskService taskService; |
| | | |
| | | @PostConstruct |
| | | public void init() { |
| | | for (Agv agv : this.list()) { |
| | | AGV_ID_MAP.put(agv.getUuid(), agv.getId()); |
| | | AGV_NO_MAP.put(agv.getId(), agv.getUuid()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<AgvResult> pageRel(PageParam<Agv, BaseParam> pageParam) { |
| | | return new PageResult<>(this.baseMapper.selectPageRel(pageParam, pageParam.checkoutMap()), pageParam.getTotal()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Agv queryIdle(Task task) { |
| | | if (Cools.isEmpty(task)) { |
| | | public Long getAgvId(String uuid) { |
| | | if (Cools.isEmpty(uuid)) { |
| | | return null; |
| | | } |
| | | return AGV_ID_MAP.get(uuid); |
| | | } |
| | | |
| | | @Override |
| | | public String getAgvNo(Long agvId) { |
| | | if (Cools.isEmpty(agvId)) { |
| | | return null; |
| | | } |
| | | return AGV_NO_MAP.get(agvId); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public Boolean judgeEnable(Long agvId) { |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.entity.Code; |
| | | import com.zy.acs.manager.manager.entity.Jam; |
| | | import com.zy.acs.manager.manager.entity.Segment; |
| | |
| | | List<Jam> jams = this.list(new LambdaQueryWrapper<Jam>() |
| | | .eq(Jam::getJamAgv, jamAgv) |
| | | .eq(Jam::getJamSeg, jamSeg) |
| | | .eq(Jam::getAvoAgv, agvService.selectByUuid(avoAgvNo).getId()) |
| | | .eq(Jam::getAvoAgv, agvService.getAgvId(avoAgvNo)) |
| | | .eq(Jam::getCycleAvo, 1) |
| | | .ne(Jam::getState, JamStateType.DEPRECATED.toString()) |
| | | // .eq(Jam::getState, JamStateType.RUNNING.toString()) |
| | |
| | | |
| | | @Override |
| | | public List<Jam> getJamFromSegmentByAvo(Segment jamSeg, String avoAgvNo) { |
| | | Agv avoAgv = agvService.selectByUuid(avoAgvNo); |
| | | return this.baseMapper.selectJamFromSegmentByAvo(jamSeg.getId(), avoAgv.getId()); |
| | | Long avoAgvId = agvService.getAgvId(avoAgvNo); |
| | | return this.baseMapper.selectJamFromSegmentByAvo(jamSeg.getId(), avoAgvId); |
| | | } |
| | | |
| | | @Override |
| | | public List<Jam> getUnfinishedAvoSegByAvo(String avoAgvNo, Segment currSeg) { |
| | | Agv avoAgv = agvService.selectByUuid(avoAgvNo); |
| | | return this.baseMapper.selectUnfinishedAvoSegByAvo(avoAgv.getId(), null); |
| | | Long agvId = agvService.getAgvId(avoAgvNo); |
| | | return this.baseMapper.selectUnfinishedAvoSegByAvo(agvId, null); |
| | | } |
| | | |
| | | @Override |