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