From d3d3857cda8b4307d8f03bf15ec9fb2c98c34b64 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期二, 17 十二月 2024 09:58:39 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 257 +++++++++++++++++++++++++++------------------------ 1 files changed, 136 insertions(+), 121 deletions(-) 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 4fcedee..942003a 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 @@ -15,6 +15,7 @@ import com.zy.acs.common.enums.AgvCompleteType; import com.zy.acs.common.enums.AgvDirectionType; import com.zy.acs.common.enums.AgvSpeedType; +import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.common.utils.Utils; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.SnowflakeIdWorker; @@ -22,7 +23,6 @@ import com.zy.acs.manager.common.domain.TaskDto; import com.zy.acs.manager.common.domain.param.HandlerPublishParam; 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.Lane; import com.zy.acs.manager.core.domain.TaskPosDto; @@ -221,7 +221,7 @@ for (Task task : taskList) { Agv agv = allocateService.execute(task); if (null == agv) { - log.warn("Task[{}] has an issue锛� because it failed to checkout agv which is idle...", task.getSeqNum()); +// log.warn("Task[{}] has an issue锛� because it failed to checkout agv which is idle...", task.getSeqNum()); continue; } task.setAgvId(agv.getId()); @@ -249,10 +249,14 @@ // valid ----------------------------------------------- Agv agv = agvService.getById(agvId); if (!agvService.judgeEnable(agv.getId(), true)) { - throw new CoolException("AGV[" + agv.getUuid() + "]褰撳墠涓嶅彲鐢�..."); + return; } if (!Cools.isEmpty(taskService.selectInSts(agvId, TaskStsType.ASSIGN, TaskStsType.PROGRESS))) { throw new CoolException("AGV[" + agv.getUuid() + "]鍒嗛厤浠诲姟澶辫触锛屽凡瀛樺湪鎵ц浠诲姟..."); + } + if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString())) + || !Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) { + throw new CoolException("AGV[" + agv.getUuid() + "] failed to assign锛宐ecause already has the segment in running..."); } // execute ---------------------------------------------------- @@ -346,13 +350,19 @@ /** * 1.Map<String, List<TaskPosDto>> groups * - * key: 1000 + ORI_LOC + * key: 1000 + ORIGIN * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...] * - * key: 3000 + ORI_LOC + * key: 3000 + ORIGIN * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...] * - * key: 2000 + ORI_LOC + * key: 2000 + ORIGIN + * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...] + * + * key: 1000 + DESTINATION + * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...] + * + * key: 2000 + DESTINATION * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...] * * ...... @@ -370,6 +380,8 @@ * 瀵规墍鏈夊贩閬撹繘琛屾湁搴忔帓搴忥紝鍏堟槸閽堝List涓轰竴涓崟浣嶏紝瀵逛粬浠繘琛孎irstWeight鎺掑簭锛岀浉褰撲簬琛�1鐨刱ey鐨勬暟鍊艰繘琛屾湁搴忔帓搴� * List<TaskPosDto>: task list on the same lane * ArrayList<List<TaskPosDto>>: all the task list by one agv + * + * tip: ORI 鍜� DEST 姘歌繙涓嶄細瀛樺湪鍚屼竴涓� List */ ArrayList<List<TaskPosDto>> list = new ArrayList<>(groups.values()); list.sort((o1, o2) -> { @@ -386,45 +398,32 @@ 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); + List<List<TaskPosDto>> pickGroups = new ArrayList<>(); + List<List<TaskPosDto>> dropGroups = new ArrayList<>(); - 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); - } + for (List<TaskPosDto> group : list) { + // Assume 涓�涓换鍔$粍涓墍鏈塗askPosDto鐨凱osType.brief鐩稿悓 + TaskPosDto.PosType posType = group.get(0).getPosType(); + if (posType == TaskPosDto.PosType.ORI_LOC || posType == TaskPosDto.PosType.ORI_STA) { + pickGroups.add(group); + } else if (posType == TaskPosDto.PosType.DEST_LOC || posType == TaskPosDto.PosType.DEST_STA) { + dropGroups.add(group); } else { - if (distanceByTailOfFirst < distanceByHeadOfFirst) { - Collections.reverse(theFirstOne); - } + // import tip: the list must only contain ORIGIN and DESTINATION + log.error("the list must only contain ORIGIN and DESTINATION"); } } + + currPosition = allocateService.pac(currPosition, pickGroups); + currPosition = allocateService.pac(currPosition, dropGroups); + + List<List<TaskPosDto>> reorderedList = new ArrayList<>(); + reorderedList.addAll(pickGroups); + reorderedList.addAll(dropGroups); + + list.clear(); + list.addAll(reorderedList); + // generate travel Travel travel = new Travel(); @@ -491,17 +490,19 @@ * 鍏呯數 鍥炲緟鏈轰綅浠诲姟 */ @Transactional(propagation = Propagation.REQUIRES_NEW) // although there is a Transactional here that the lock is isolated, but we can't join the caller's Transactional - public boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) { + public boolean buildMinorTask(Agv agv, TaskTypeType taskType, String destination, Jam jam) { if (Cools.isEmpty(agv, taskType)) { return false; } try { - if (null == agvDetail) { - agvDetail = agvDetailService.selectByAgvId(agv.getId()); - } + AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); if (!agvService.judgeEnable(agv.getId())) { return false; } if (!Cools.isEmpty(taskService.selectInSts(agv.getId(), TaskStsType.ASSIGN, TaskStsType.PROGRESS))) { throw new CoolException("AGV[" + agv.getUuid() + "] failed to assign锛宐ecause already has the task in running..."); + } + if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString())) + || !Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) { + throw new CoolException("AGV[" + agv.getUuid() + "] failed to assign锛宐ecause already has the segment in running..."); } Date now = new Date(); @@ -559,7 +560,7 @@ travel.setTravelId(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); travel.setAgvId(agv.getId()); // travel.setTaskContent(JSON.toJSONString(list)); - travel.setTaskIds(JSON.toJSONString(Collections.singletonList(task.getId()))); + travel.setTaskIds(GsonUtils.toJson(Utils.singletonList(task.getId()))); travel.setState(TravelStateType.RUNNING.toString()); if (!travelService.save(travel)) { throw new BusinessException("travel failed to save"); @@ -602,6 +603,11 @@ } if (!segmentService.save(next)) { throw new BusinessException("segment failed to save"); + } else { + if (null != jam && i == 0) { + jam.setAvoSeg(next.getId()); + jam.setAvoCode(endCode.getId()); + } } } @@ -621,10 +627,6 @@ default: break; } - -// if (taskType.equals(TaskTypeType.TO_STANDBY)) { -// redis.setObject(RedisConstant.AGV_TO_STANDBY_FLAG, agv.getUuid(), false); -// } return true; } catch (Exception e) { @@ -1247,77 +1249,8 @@ .orderByAsc(Segment::getSerial) ); - // task - for (Segment segment : segmentList) { - boolean taskComplete = false; - - Task task = taskService.getById(segment.getTaskId()); assert null != task; - TaskTypeType typeType = TaskTypeType.get(task.getTaskTypeEl()); assert null != typeType; - - TaskPosDto.PosType posType = TaskPosDto.queryPosType(segment.getPosType()); - switch (Objects.requireNonNull(posType)) { - case ORI_STA: - case ORI_LOC: - break; - case DEST_STA: - case DEST_LOC: - case TO_CHARGE: - case TO_STANDBY: - if (segment.getEndNode().equals(task.getDestCode())) { - taskComplete = true; - } - break; - case MOVE: - if (segment.getEndNode().equals(task.getDestCode())) { - if (typeType.equals(TaskTypeType.MOVE)) { - taskComplete = true; - } - } - break; - default: - break; - } - - if (taskComplete) { - locService.taskCallBack(task); - - task.setTaskSts(TaskStsType.COMPLETE.val()); - task.setEndTime(now); - task.setUpdateTime(now); - if (!taskService.updateById(task)) { - log.error("Task [{}] 鏇存柊澶辫触 锛侊紒锛�", task.getSeqNum()); - } else { - log.info("Task [{}] 浣滀笟瀹屾瘯 ==========>> ", task.getSeqNum()); - } - - } - } - - // action - List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>() - .eq(Action::getGroupId, serialNo) - .eq(Action::getActionSts, ActionStsType.ISSUED.val()) - ); - for (Action action : actionList) { - action.setActionSts(ActionStsType.FINISH.val()); - action.setEndTime(now); - action.setUpdateTime(now); - if (!actionService.updateById(action)) { - log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName()); - } - } - - // segment - for (Segment segment : segmentList) { - segment.setState(SegmentStateType.FINISH.toString()); - segment.setUpdateTime(now); - if (!segmentService.updateById(segment)) { - log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial()); - } - } - - // segment call back - segmentService.processNext(segmentList); + // settlement + this.settleSegmentList(segmentList, serialNo); log.info("Agv [{}] {}浣滀笟瀹屾瘯 ==========>> ", protocol.getAgvNo(), serialNo); @@ -1332,4 +1265,86 @@ } } + @Transactional + public void settleSegmentList(List<Segment> segmentList, String serialNo) { + if (Cools.isEmpty(segmentList)) { + return; + } + Date now = new Date(); + + // task + for (Segment segment : segmentList) { + boolean taskComplete = false; + + Task task = taskService.getById(segment.getTaskId()); assert null != task; + TaskTypeType typeType = TaskTypeType.get(task.getTaskTypeEl()); assert null != typeType; + + TaskPosDto.PosType posType = TaskPosDto.queryPosType(segment.getPosType()); + switch (Objects.requireNonNull(posType)) { + case ORI_STA: + case ORI_LOC: + break; + case DEST_STA: + case DEST_LOC: + case TO_CHARGE: + case TO_STANDBY: + if (segment.getEndNode().equals(task.getDestCode())) { + taskComplete = true; + } + break; + case MOVE: + if (segment.getEndNode().equals(task.getDestCode())) { + if (typeType.equals(TaskTypeType.MOVE)) { + taskComplete = true; + } + } + break; + default: + break; + } + + if (taskComplete) { + locService.taskCallBack(task); + + task.setTaskSts(TaskStsType.COMPLETE.val()); + task.setEndTime(now); + task.setUpdateTime(now); + if (!taskService.updateById(task)) { + log.error("Task [{}] 鏇存柊澶辫触 锛侊紒锛�", task.getSeqNum()); + } else { + log.info("Task [{}] 浣滀笟瀹屾瘯 ==========>> ", task.getSeqNum()); + } + + } + } + + // action, follow by groupId + if (!Cools.isEmpty(serialNo)) { + List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>() + .eq(Action::getGroupId, serialNo) + .eq(Action::getActionSts, ActionStsType.ISSUED.val()) + ); + for (Action action : actionList) { + action.setActionSts(ActionStsType.FINISH.val()); + action.setEndTime(now); + action.setUpdateTime(now); + if (!actionService.updateById(action)) { + log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName()); + } + } + } + + // segment + for (Segment segment : segmentList) { + segment.setState(SegmentStateType.FINISH.toString()); + segment.setUpdateTime(now); + if (!segmentService.updateById(segment)) { + log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial()); + } + } + + // segment call back + segmentService.processNext(segmentList); + } + } -- Gitblit v1.9.1