From 3e77828236068dd269e43aa33106f6b9c781775e Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期一, 11 十一月 2024 16:55:17 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java | 170 ++++++++++++++++++++++++++++++++++++++++++ zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java | 58 ++++++++++--- zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvCompleteType.java | 7 + zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java | 3 4 files changed, 223 insertions(+), 15 deletions(-) diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvCompleteType.java b/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvCompleteType.java index fcc9fce..e61772b 100644 --- a/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvCompleteType.java +++ b/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvCompleteType.java @@ -50,4 +50,11 @@ return null; } + public int getCode() { + return code; + } + + public String getDesc() { + return desc; + } } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java index 3a017d3..fbe7b23 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java @@ -34,8 +34,11 @@ public class PatrolService { private static final int SCHEDULE_TIME_INTERVAL = 1; + private static final Map<String, ScheduledFuture<?>> AGV_PATROL_MAP = new ConcurrentHashMap<>(); + private final RedisSupport redis = RedisSupport.defaultRedisSupport; + private ScheduledExecutorService scheduler = null; @Autowired diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java new file mode 100644 index 0000000..6287237 --- /dev/null +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java @@ -0,0 +1,170 @@ +package com.zy.acs.manager.fake; + +import com.zy.acs.common.constant.RedisConstant; +import com.zy.acs.common.domain.AgvProtocol; +import com.zy.acs.common.domain.protocol.AGV_11_UP; +import com.zy.acs.common.enums.AgvCompleteType; +import com.zy.acs.common.utils.RedisSupport; +import com.zy.acs.manager.manager.entity.Action; +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.enums.ActionStsType; +import com.zy.acs.manager.manager.enums.ActionTypeType; +import com.zy.acs.manager.manager.service.ActionService; +import com.zy.acs.manager.manager.service.AgvDetailService; +import com.zy.acs.manager.manager.service.CodeService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Objects; + +/** + * Created by vincent on 11/11/2024 + */ +@Slf4j +public class AgvSimulatorTask implements Runnable { + + private final Agv agv; + private final AgvDetailService agvDetailService; + private final ActionService actionService; + private final CodeService codeService; + private final List<Action> actionList; + + private final RedisSupport redis; + + private final String groupId; + + public AgvSimulatorTask( + Agv agv + , RedisSupport redis + , AgvDetailService agvDetailService + , ActionService actionService + , CodeService codeService + , List<Action> actionList + ) { + this.agv = agv; + this.redis = redis; + this.agvDetailService = agvDetailService; + this.actionService = actionService; + this.codeService = codeService; + this.actionList = actionList; + + this.groupId = actionList.get(0).getGroupId(); + } + + @Override + public void run() { + try { + FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), true); + String qrCode = null; + for (Action action : actionList) { + processAction(agv, action); + qrCode = action.getCode(); + } + this.finishActionList(qrCode); + } catch (Exception e) { + log.error("AgvSimulatorTask AGV[{}]", agv.getUuid(), e); + } finally { + FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), false); + } + } + + private void processAction(Agv agv, Action action) throws InterruptedException { + AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); + if (agvDetail == null) { + return; + } + + switch (Objects.requireNonNull(ActionTypeType.get(action.getActionTypeEl()))) { + case TurnCorner: + simulateRotating(agv, agvDetail, action); + break; + case StraightBackUnturnable: + case StraightBackTurnable: + case StraightAheadUnturnable: + case StraightAheadTurnable: + simulateWalking(agv, agvDetail, action); + break; + case ReadyTakeFromShelvesLoc: + case ReadyReleaseToShelvesLoc: + break; + default: + log.warn("Unknown action type {} for AGV ID {}.", action.getActionType(), agv.getId()); + break; + } + } + + + private void simulateWalking(Agv agv, AgvDetail agvDetail, Action action) throws InterruptedException { + Code currCode = codeService.getById(agvDetail.getRecentCode()); + Code code = codeService.selectByData(action.getCode()); + + agvDetail.setPos(1); + agvDetail.setCode(code.getId()); + + // 妯℃嫙鐢甸噺娑堣�� +// agvDetail.setVol(agvDetail.getVol() - 0.1 * distanceToMove); // 鏍规嵁璺濈娑堣�楃數閲� + + agvDetailService.updateById(agvDetail); + + Thread.sleep(1000); + + action.setActionSts(ActionStsType.FINISH.val()); + actionService.updateById(action); + + + } + + /** + * 妯℃嫙AGV鏃嬭浆 + * + * @param agv 褰撳墠AGV + * @param agvDetail AGV璇︾粏淇℃伅 + * @param action 褰撳墠鍔ㄤ綔 + */ + private void simulateRotating(Agv agv, AgvDetail agvDetail, Action action) throws InterruptedException { +// Double agvAngle = agvDetail.getAgvAngle(); +// double actionAngle = Double.parseDouble(action.getParams()); + + + + double totalAngle = Double.parseDouble(action.getParams()); // 鍋囪Action鏈塧ngle灞炴�� + double stepAngle = 45.0; // 姣忕鏃嬭浆15搴︼紝鍏蜂綋鍊兼牴鎹渶姹傝皟鏁� + double actionProgress = 0.0; + + while (actionProgress < totalAngle) { + double angleToRotate = Math.min(stepAngle, totalAngle - actionProgress); + // 鏇存柊AGV鐨勮搴� + double newAngle = (agvDetail.getAgvAngle() + angleToRotate) % 360; + agvDetail.setAgvAngle(newAngle); + + // 妯℃嫙鐢甸噺娑堣�� +// agvDetail.setVol(agvDetail.getVol() - 0.05 * (angleToRotate / 15.0)); // 鏍规嵁瑙掑害娑堣�楃數閲� + + // 鏇存柊AGV璇︾粏淇℃伅 + agvDetailService.updateById(agvDetail); + + // 妯℃嫙瀹為檯鎵ц鏃堕棿 + Thread.sleep(1000); // 姣忕鎵ц涓�娆� + + actionProgress += angleToRotate; + } + + // 鍔ㄤ綔瀹屾垚锛屾洿鏂扮姸鎬� + action.setActionSts(ActionStsType.FINISH.val()); + actionService.updateById(action); + } + + private void finishActionList(String qrCode) { + // 1.complete data + AGV_11_UP agv_11_up = new AGV_11_UP(); + agv_11_up.setSerialNo(groupId); + agv_11_up.setCompleteCode(AgvCompleteType.ENTIRE_PATH_COMPLETE.getCode()); + agv_11_up.setCompleteType(AgvCompleteType.ENTIRE_PATH_COMPLETE); + agv_11_up.setQrCode(qrCode); + + AgvProtocol agvProtocol = AgvProtocol.build(this.agv.getUuid()).setMessageBody(agv_11_up); + redis.push(RedisConstant.AGV_COMPLETE_FLAG, agvProtocol); + } +} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java index 11bd3a9..5570441 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java @@ -3,30 +3,42 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.domain.AgvProtocol; +import com.zy.acs.common.domain.protocol.AGV_01_DOWN; +import com.zy.acs.common.domain.protocol.AGV_01_UP; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.manager.entity.Action; import com.zy.acs.manager.manager.entity.Agv; -import com.zy.acs.manager.manager.entity.AgvDetail; import com.zy.acs.manager.manager.enums.ActionStsType; import com.zy.acs.manager.manager.enums.StatusType; import com.zy.acs.manager.manager.service.ActionService; import com.zy.acs.manager.manager.service.AgvDetailService; import com.zy.acs.manager.manager.service.AgvService; +import com.zy.acs.manager.manager.service.CodeService; import com.zy.acs.manager.system.service.ConfigService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Created by vincent on 11/9/2024 */ +@Slf4j @Component public class FakeProcessor { private final RedisSupport redis = RedisSupport.defaultRedisSupport; + + public static final Map<Long, Boolean> AGV_PROCESSING_MAP = new ConcurrentHashMap<>(); + + private ExecutorService executorService; @Autowired private AgvService agvService; @@ -36,6 +48,8 @@ private ActionService actionService; @Autowired private ConfigService configService; + @Autowired + private CodeService codeService; /** * 1.AgvDataService.dataProcess [ agvDetail: vol, code, agvAngle, agvStatus ] @@ -52,22 +66,33 @@ } List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val)); - for (Agv agv : agvList) { - AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); + // init executorService + if (null == this.executorService) { + int count = agvList.size() > 30 ? agvList.size() : 20; + this.executorService = Executors.newFixedThreadPool(count); + } - this.processRunning(agv); + this.responseTheRequest(); + + for (Agv agv : agvList) { + AGV_PROCESSING_MAP.putIfAbsent(agv.getId(), false); this.processOnline(agv); - } - } - - private void processRunning(Agv agv) { - List<Action> actionList = actionService.queryLatestGroup(agv.getId(), ActionStsType.ISSUED); - if (!Cools.isEmpty(actionList)) { - for (Action action : actionList) { - + if (!AGV_PROCESSING_MAP.get(agv.getId())) { + List<Action> actionList = actionService.queryLatestGroup(agv.getId(), ActionStsType.ISSUED); + if (!Cools.isEmpty(actionList)) { + executorService.submit(new AgvSimulatorTask( + agv + , redis + , agvDetailService + , actionService + , codeService + , actionList + )); + } } + } } @@ -82,11 +107,14 @@ Thread.sleep(100); } catch (InterruptedException ignore) {} + AGV_01_DOWN agv_01_down = (AGV_01_DOWN) protocol.getMessageBody(); -// redis.setObject(RedisConstant.AGV_PATH_UP_FLAG -// , protocol.getAgvNo() + "_" + agv_01_up.getSerialNo() -// , agv_01_up); + AGV_01_UP agv_01_up = new AGV_01_UP(); + agv_01_up.setSerialNo(agv_01_down.getSerialNo()); + redis.setObject(RedisConstant.AGV_PATH_UP_FLAG + , protocol.getAgvNo() + "_" + agv_01_up.getSerialNo() + , agv_01_up); } } -- Gitblit v1.9.1