From 2fa6b113248685c6569194e31aa10031d5c114c0 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期三, 30 十月 2024 15:57:34 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 60 +++++++++++++++++++++++++++--- zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java | 9 +--- zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/CommonUtil.java | 4 ++ zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvDataSubscriber.java | 1 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java | 7 +-- 5 files changed, 64 insertions(+), 17 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/CommonUtil.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/CommonUtil.java index f82ff5d..ee96b10 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/CommonUtil.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/CommonUtil.java @@ -171,4 +171,8 @@ } } + public static int calcDistance(Double[] from, Double[] to) { + return (int) (Math.abs(to[0] - from[0]) + Math.abs(to[1] - from[1])); + } + } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvDataSubscriber.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvDataSubscriber.java index 85c49c5..d22c727 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvDataSubscriber.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvDataSubscriber.java @@ -26,6 +26,7 @@ @PostConstruct private void start(){ +// redis.deleteList(RedisConstant.AGV_DATA_FLAG); thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { try { diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java index c62fe74..f63a66e 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.framework.common.Cools; +import com.zy.acs.manager.common.utils.CommonUtil; import com.zy.acs.manager.common.utils.LocUtils; import com.zy.acs.manager.core.domain.Lane; import com.zy.acs.manager.manager.entity.*; @@ -224,14 +225,10 @@ assert null != firstCode; Double[] toPosition = new Double[]{firstCode.getX(), firstCode.getY()}; // calculate distance - weight = weight + this.calcPositionDistance(fromPosition, toPosition); + weight = weight + CommonUtil.calcDistance(fromPosition, toPosition); // return opposite return -weight; - } - - private int calcPositionDistance(Double[] from, Double[] to) { - return (int) (Math.abs(to[0] - from[0]) + Math.abs(to[1] - from[1])); } public synchronized Agv execute(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) { diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java index e55da25..351573d 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java @@ -18,6 +18,7 @@ import com.zy.acs.common.utils.Utils; import com.zy.acs.manager.common.domain.TaskDto; import com.zy.acs.manager.common.exception.BusinessException; +import com.zy.acs.manager.common.utils.CommonUtil; import com.zy.acs.manager.core.domain.AgvBackpackDto; import com.zy.acs.manager.core.domain.TaskPosDto; import com.zy.acs.manager.core.service.astart.MapDataDispatcher; @@ -290,7 +291,7 @@ taskList.sort(new Comparator<Task>() { @Override public int compare(Task o1, Task o2) { - return o1.getPriority() - o2.getPriority(); + return o2.getPriority() - o1.getPriority(); } }); Integer backpack = agvService.getBackpack(agv); @@ -298,6 +299,7 @@ taskList = taskList.subList(0, backpack); } + AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId); List<AgvBackpackDto> backpackDtoList = new ArrayList<>(); /** @@ -410,6 +412,50 @@ taskPosDtoList.sort((o1, o2) -> (int) (o1.getSecondWeight(sameGroupXy) * 100 - o2.getSecondWeight(sameGroupXy) * 100)); } + // re-order by agv current position + Code currCode = codeService.getById(agvDetail.getRecentCode()); + Double[] currPosition = new Double[] {currCode.getX(), currCode.getY()}; + + List<TaskPosDto> theFirstOne = list.get(0); + List<TaskPosDto> theLastOne = list.get(list.size() - 1); + + if (list.size() == 1) { + TaskPosDto head = theFirstOne.get(0); + TaskPosDto tail = theFirstOne.get(theFirstOne.size() - 1); + + int distanceByHead = CommonUtil.calcDistance(currPosition, head.getXy()); + int distanceByTail = CommonUtil.calcDistance(currPosition, tail.getXy()); + + if (distanceByTail < distanceByHead) { + Collections.reverse(theFirstOne); + } + + } else { + TaskPosDto headOfFirst = theFirstOne.get(0); + TaskPosDto tailOfFirst = theFirstOne.get(theFirstOne.size() - 1); + + TaskPosDto headOfLast = theLastOne.get(0); + TaskPosDto tailOfLast = theLastOne.get(theLastOne.size() - 1); + + int distanceByHeadOfFirst = CommonUtil.calcDistance(currPosition, headOfFirst.getXy()); + int distanceByTailOfFirst = CommonUtil.calcDistance(currPosition, tailOfFirst.getXy()); + + int distanceByHeadOfLast = CommonUtil.calcDistance(currPosition, headOfLast.getXy()); + int distanceByTailOfLast = CommonUtil.calcDistance(currPosition, tailOfLast.getXy()); + + if (Math.min(distanceByHeadOfLast, distanceByTailOfLast) < Math.min(distanceByHeadOfFirst, distanceByTailOfFirst)) { + Collections.reverse(list); + + if (distanceByTailOfLast < distanceByHeadOfLast) { + Collections.reverse(theLastOne); + } + } else { + if (distanceByTailOfFirst < distanceByHeadOfFirst) { + Collections.reverse(theFirstOne); + } + } + } + // generate travel Travel travel = new Travel(); travel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); @@ -504,6 +550,9 @@ FuncSta funcSta = funcStaService.checkoutClosestFunSta(agvDetail.getRecentCode(), idleFunStaList); endCode = codeService.getById(funcSta.getCode()); } + if (null == endCode) { + log.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", agv.getUuid(), taskType.toString()); + } break; case MOVE: endCode = codeService.selectByData(destination); @@ -513,7 +562,6 @@ } if (null == endCode) { - log.error("{}鍙疯溅杈嗗缓绔嬪姛鑳戒换鍔″け璐ワ紝鏃犳硶妫�绱㈠埌鐩爣瀹氫綅锛孴askTypeType锛歿}", agv.getUuid(), taskType.toString()); return false; } @@ -530,7 +578,7 @@ task.setIoTime(now); task.setStartTime(now); if (!taskService.save(task)) { - throw new BusinessException(task.getSeqNum() + "浠诲姟淇濆瓨澶辫触"); + throw new BusinessException(task.getSeqNum() + " failed to save"); } // generate travel @@ -542,7 +590,7 @@ travel.setTaskIds(JSON.toJSONString(Collections.singletonList(task.getId()))); travel.setState(TravelStateType.RUNNING.toString()); if (!travelService.save(travel)) { - throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�"); + throw new BusinessException("travel failed to save"); } // generate segment @@ -581,7 +629,7 @@ next.setState(SegmentStateType.WAITING.toString()); } if (!segmentService.save(next)) { - throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�"); + throw new BusinessException("segment failed to save"); } } @@ -593,7 +641,7 @@ destFuncSta.setState(FuncStaStateType.OCCUPIED.toString()); destFuncSta.setUpdateTime(now); if (!funcStaService.updateById(destFuncSta)) { - log.error("FuncSta [{}] 鏇存柊鐘舵�佸け璐� 锛侊紒锛�", destFuncSta.getName()); + log.error("FuncSta [{}] failed to update 锛侊紒锛�", destFuncSta.getName()); } break; case MOVE: diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java index 6ad0dcf..d9358ea 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zy.acs.common.enums.AgvStatusType; import com.zy.acs.framework.common.Cools; +import com.zy.acs.manager.common.utils.CommonUtil; import com.zy.acs.manager.manager.entity.*; import com.zy.acs.manager.manager.enums.FuncStaType; import com.zy.acs.manager.manager.enums.StatusType; @@ -152,10 +153,10 @@ @Override public int compare(FuncSta o1, FuncSta o2) { Code o1Code = codeService.getById(o1.getCode()); - int o1Distance = calcPositionDistance(startPos, new Double[]{o1Code.getX(), o1Code.getY()}); + int o1Distance = CommonUtil.calcDistance(startPos, new Double[]{o1Code.getX(), o1Code.getY()}); Code o2Code = codeService.getById(o2.getCode()); - int o2Distance = calcPositionDistance(startPos, new Double[]{o2Code.getX(), o2Code.getY()}); + int o2Distance = CommonUtil.calcDistance(startPos, new Double[]{o2Code.getX(), o2Code.getY()}); return o1Distance - o2Distance; } @@ -164,10 +165,6 @@ } return funcStaList.stream().findFirst().orElse(null); - } - - private int calcPositionDistance(Double[] from, Double[] to) { - return (int) (Math.abs(to[0] - from[0]) + Math.abs(to[1] - from[1])); } } -- Gitblit v1.9.1