From 42af11ca3a84e13d1f55207b2770e2454a861983 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 01 八月 2025 17:05:03 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java |  262 ++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 174 insertions(+), 88 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
index 7fccedc..1f3f4f2 100644
--- a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
+++ b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
@@ -1,13 +1,8 @@
 package com.zy.core.thread.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.core.common.SpringUtils;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.model.NavigateNode;
-import com.zy.common.model.enums.NavigationMapType;
-import com.zy.common.utils.NavigatePositionConvert;
-import com.zy.common.utils.NavigateUtils;
 import com.zy.common.utils.RedisUtil;
 import com.zy.common.utils.ShuttleOperaUtils;
 import com.zy.core.News;
@@ -15,16 +10,14 @@
 import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
 import com.zy.core.model.TrafficControlDataModel;
-import com.zy.core.model.command.ShuttleAssignCommand;
-import com.zy.core.model.command.ShuttleRedisCommand;
+import com.zy.core.model.param.OperateTrafficControlParam;
 import com.zy.core.model.protocol.ShuttleProtocol;
 import com.zy.core.thread.ShuttleThread;
 import com.zy.core.thread.TrafficControlThread;
-import com.zy.core.utils.TrafficControlUtils;
+import org.springframework.scheduling.annotation.Async;
 
-import java.io.IOException;
 import java.util.*;
-import java.util.function.Function;
+import java.util.stream.Collectors;
 
 public class TrafficControlImplThread implements TrafficControlThread {
 
@@ -36,6 +29,7 @@
     private HashMap<Integer,Long> applyRecordsMap = new HashMap<>();
     private HashMap<String, List<NavigateNode>> taskNodesMap = new HashMap<>();
     private List<TrafficControlDataModel> trafficControlDataList = new ArrayList<>();
+    private List<TrafficControlDataModel> trafficControlDataListRead = new ArrayList<>();
 
     public TrafficControlImplThread(RedisUtil redisUtil) {
         this.redisUtil = redisUtil;
@@ -47,17 +41,22 @@
         Object object = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_MAP.key);
         if(object != null) {
             trafficControlDataList = (List<TrafficControlDataModel>) object;
+            trafficControlDataListRead = trafficControlDataList.stream()
+                    .map(model -> new TrafficControlDataModel(
+                            model.getShuttleNo(),
+                            model.getTaskNo(),
+                            new ArrayList<>(model.getNodeList()),
+                            new ArrayList<>(model.getTotalNodeList())
+                    ))
+                    .collect(Collectors.toList());
         }
 
         while (true) {
             try {
-                if (applyList.isEmpty()) {
-                    continue;
-                }
-
-                TrafficControlDataModel dataModel = applyList.get(0);
-                processApply(dataModel);
-                applyList.remove(0);
+                List<TrafficControlDataModel> allTrafficControl = getAllTrafficControl();
+                //鏇存柊浜ょ淇℃伅
+                redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_MAP.key, allTrafficControl);
+                Thread.sleep(200);
             }catch (Exception e){
                 e.printStackTrace();
             }
@@ -65,6 +64,7 @@
 
     }
 
+    @Override
     public synchronized boolean processApply(TrafficControlDataModel applyData) {
         ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class);
         if (shuttleOperaUtils == null) {
@@ -79,13 +79,12 @@
             return false;
         }
 
+        List<TrafficControlDataModel> allTrafficControlList = getAllTrafficControl();
+
         Integer shuttleNo = applyData.getShuttleNo();
         Integer taskNo = applyData.getTaskNo();
         List<NavigateNode> nodeList = applyData.getNodeList();
         List<NavigateNode> totalNodeList = applyData.getTotalNodeList();
-
-        //鏇存柊浜ょ淇℃伅
-        redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_MAP.key, trafficControlDataList);
 
         NavigateNode startNode = totalNodeList.get(0);
         List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleNo, startNode.getZ());
@@ -103,8 +102,8 @@
         }
 
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
-        for (int i = 0; i < trafficControlDataList.size(); i++) {
-            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+        for (int i = 0; i < allTrafficControlList.size(); i++) {
+            TrafficControlDataModel controlDataModel = allTrafficControlList.get(i);
             if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
                 //瀛樺湪绠″埗
                 if(!controlDataModel.getTaskNo().equals(taskNo)) {
@@ -178,7 +177,7 @@
         }
 
         //妫�娴嬭妭鐐规槸鍚﹁浣跨敤
-        for (TrafficControlDataModel controlDataModel : trafficControlDataList) {
+        for (TrafficControlDataModel controlDataModel : allTrafficControlList) {
             List<NavigateNode> list = controlDataModel.getTotalNodeList();
             for (int i = 0; i < list.size(); i++) {
                 NavigateNode node = list.get(i);
@@ -194,7 +193,10 @@
         }
 
         //浜ょ鎺ユ敹
-        trafficControlDataList.add(applyData);
+        OperateTrafficControlParam param = new OperateTrafficControlParam();
+        param.setDataModel(applyData);
+        param.setOperaType("add");
+        operateTrafficControl(param);
 
         applyRecordsMap.remove(shuttleNo);
         News.info("receipt traffic {},{}", shuttleNo, taskNo);
@@ -202,55 +204,34 @@
     }
 
     @Override
-    public synchronized boolean applyTrafficControl(List<NavigateNode> totalNodeList, List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
-        boolean add = true;
-        for (TrafficControlDataModel controlDataModel : applyList) {
-            if(controlDataModel.getShuttleNo().equals(shuttleNo)) {
-                add = false;
-                break;
-            }
-        }
-
-        if (add) {
-            TrafficControlDataModel model = new TrafficControlDataModel();
-            model.setShuttleNo(shuttleNo);
-            model.setTaskNo(taskNo);
-            model.setNodeList(nodeList);
-            model.setTotalNodeList(totalNodeList);
-            applyList.add(model);
-        }else {
+    public boolean applyTrafficControl(List<NavigateNode> totalNodeList, List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
+        Set<String> keys = redisUtil.searchKeys(RedisKeyType.TRAFFIC_CONTROL_APPLY.key + shuttleNo + "_");
+        if (!keys.isEmpty()) {
             return false;
         }
 
+        TrafficControlDataModel model = new TrafficControlDataModel();
+        model.setShuttleNo(shuttleNo);
+        model.setTaskNo(taskNo);
+        model.setNodeList(nodeList);
+        model.setTotalNodeList(totalNodeList);
+        redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_APPLY.key + shuttleNo + "_" + System.currentTimeMillis(), model);
         return true;
     }
 
     @Override
-    public synchronized boolean trafficReport(List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
+    public boolean trafficReport(List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
-        for (int i = 0; i < trafficControlDataList.size(); i++) {
-            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+        List<TrafficControlDataModel> allTrafficControlList = getAllTrafficControl();
+        for (int i = 0; i < allTrafficControlList.size(); i++) {
+            TrafficControlDataModel controlDataModel = allTrafficControlList.get(i);
             if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
                 if(controlDataModel.getTaskNo().equals(taskNo)) {
-                    List<NavigateNode> newTotalNodeList = new ArrayList<>();
-                    List<NavigateNode> totalNodeList = controlDataModel.getTotalNodeList();
-
-                    List<String> reportList = new ArrayList<>();
-                    for (NavigateNode node : nodeList) {
-                        reportList.add(Utils.getLocNo(node.getX(), node.getY(), node.getZ()));
-                    }
-
-                    for (NavigateNode node : totalNodeList) {
-                        String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
-                        if(reportList.contains(locNo)) {
-                            continue;
-                        }
-                        newTotalNodeList.add(node);
-                    }
-
-                    controlDataModel.setTotalNodeList(newTotalNodeList);
-                    trafficControlDataList.set(i, controlDataModel);
-                    shuttleReportErrorMap.remove(shuttleNo);
+                    OperateTrafficControlParam param = new OperateTrafficControlParam();
+                    param.setDataModel(controlDataModel);
+                    param.setOperaType("report");
+                    param.setReportNodeList(nodeList);
+                    redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_REPORT_LIST.key + shuttleNo + "_" + System.currentTimeMillis(), param);
                     return true;
                 }
             }
@@ -259,7 +240,7 @@
     }
 
     @Override
-    public boolean trafficReportError(Integer shuttleNo, Integer taskNo) {
+    public synchronized boolean trafficReportError(Integer shuttleNo, Integer taskNo) {
         ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
         if (shuttleThread == null) {
             return false;
@@ -279,37 +260,38 @@
 
     @Override
     public synchronized boolean cancelTrafficControl(Integer shuttleNo, Integer taskNo) {
-        //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
-        for (int i = 0; i < trafficControlDataList.size(); i++) {
-            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
-            if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
-                if(controlDataModel.getTaskNo().equals(taskNo)) {
-                    trafficControlDataList.remove(i);//鍙栨秷绠″埗
-                    return true;
-                }
-            }
+        TrafficControlDataModel dataModel = queryTrafficControl(shuttleNo, taskNo);
+        if (dataModel == null) {
+            return false;
         }
-        return false;
+
+        OperateTrafficControlParam param = new OperateTrafficControlParam();
+        param.setDataModel(dataModel);
+        param.setOperaType("cancel");
+        param.setForceCancel(false);
+        return operateTrafficControl(param);
     }
 
     @Override
-    public boolean forceCancelTrafficControl(Integer shuttleNo) {
-        //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
-        for (int i = 0; i < trafficControlDataList.size(); i++) {
-            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
-            if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
-                trafficControlDataList.remove(i);//鍙栨秷绠″埗
-                return true;
-            }
+    public synchronized boolean forceCancelTrafficControl(Integer shuttleNo) {
+        TrafficControlDataModel dataModel = queryTrafficControl(shuttleNo);
+        if (dataModel == null) {
+            return false;
         }
-        return false;
+
+        OperateTrafficControlParam param = new OperateTrafficControlParam();
+        param.setDataModel(dataModel);
+        param.setOperaType("cancel");
+        param.setForceCancel(true);
+        return operateTrafficControl(param);
     }
 
     @Override
     public TrafficControlDataModel queryTrafficControl(Integer shuttleNo, Integer taskNo) {
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
-        for (int i = 0; i < trafficControlDataList.size(); i++) {
-            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+        List<TrafficControlDataModel> allTrafficControlList = getAllTrafficControl();
+        for (int i = 0; i < allTrafficControlList.size(); i++) {
+            TrafficControlDataModel controlDataModel = allTrafficControlList.get(i);
             if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
                 if(controlDataModel.getTaskNo().equals(taskNo)) {
                     return controlDataModel;
@@ -322,8 +304,9 @@
     @Override
     public TrafficControlDataModel queryTrafficControl(Integer shuttleNo) {
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
-        for (int i = 0; i < trafficControlDataList.size(); i++) {
-            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+        List<TrafficControlDataModel> allTrafficControlList = getAllTrafficControl();
+        for (int i = 0; i < allTrafficControlList.size(); i++) {
+            TrafficControlDataModel controlDataModel = allTrafficControlList.get(i);
             if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
                 return controlDataModel;
             }
@@ -333,7 +316,110 @@
 
     @Override
     public List<TrafficControlDataModel> getAllTrafficControl() {
-        return trafficControlDataList;
+        return trafficControlDataListRead;
+    }
+
+    @Override
+    public synchronized boolean operateTrafficControl(OperateTrafficControlParam param) {
+        long startTime = System.currentTimeMillis();
+        String operaType = param.getOperaType();
+        News.info("Operate Traffic Control is Start " + operaType);
+
+        boolean result = false;
+        if (operaType.equals("add")) {
+            result = addTrafficControlDataList(param);
+        } else if (operaType.equals("cancel")) {
+            result = removeTrafficControlDataList(param);
+        } else if (operaType.equals("report")) {
+            result = reportTrafficControlDataList(param);
+        }
+
+        this.trafficControlDataListRead = trafficControlDataList.stream()
+                .map(model -> new TrafficControlDataModel(
+                        model.getShuttleNo(),
+                        model.getTaskNo(),
+                        new ArrayList<>(model.getNodeList()),
+                        new ArrayList<>(model.getTotalNodeList())
+                ))
+                .collect(Collectors.toList());
+        News.info("Operate Traffic Control is end " + (System.currentTimeMillis() - startTime) + "ms");
+        return result;
+    }
+
+    public synchronized boolean addTrafficControlDataList(OperateTrafficControlParam param) {
+        TrafficControlDataModel dataModel = param.getDataModel();
+        trafficControlDataList.add(dataModel);
+        return true;
+    }
+
+    public synchronized boolean removeTrafficControlDataList(OperateTrafficControlParam param) {
+        //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
+        TrafficControlDataModel dataModel = param.getDataModel();
+        Boolean forceCancel = param.getForceCancel();
+
+        Integer shuttleNo = dataModel.getShuttleNo();
+        Integer taskNo = dataModel.getTaskNo();
+
+        int idx = -1;
+        for (int i = 0; i < trafficControlDataList.size(); i++) {
+            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+            if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
+                if (forceCancel) {
+                    idx = i;
+                    break;
+                }else {
+                    if(controlDataModel.getTaskNo().equals(taskNo)) {
+                        idx = i;
+                        break;
+                    }
+                }
+            }
+        }
+
+        if(idx == -1) {
+            return false;
+        }
+
+        trafficControlDataList.remove(idx);//鍙栨秷绠″埗
+        return true;
+    }
+
+    public synchronized boolean reportTrafficControlDataList(OperateTrafficControlParam param) {
+        //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
+        TrafficControlDataModel dataModel = param.getDataModel();
+        List<NavigateNode> reportNodeList = param.getReportNodeList();
+
+        Integer shuttleNo = dataModel.getShuttleNo();
+        Integer taskNo = dataModel.getTaskNo();
+
+        for (int i = 0; i < trafficControlDataList.size(); i++) {
+            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+            if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
+                if(controlDataModel.getTaskNo().equals(taskNo)) {
+                    List<NavigateNode> newTotalNodeList = new ArrayList<>();
+                    List<NavigateNode> totalNodeList = controlDataModel.getTotalNodeList();
+
+                    List<String> reportList = new ArrayList<>();
+                    for (NavigateNode node : reportNodeList) {
+                        reportList.add(Utils.getLocNo(node.getX(), node.getY(), node.getZ()));
+                    }
+
+                    for (NavigateNode node : totalNodeList) {
+                        String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
+                        if(reportList.contains(locNo)) {
+                            continue;
+                        }
+                        newTotalNodeList.add(node);
+                    }
+
+                    controlDataModel.setTotalNodeList(newTotalNodeList);
+                    trafficControlDataList.set(i, controlDataModel);
+                    shuttleReportErrorMap.remove(shuttleNo);
+                    return true;
+                }
+            }
+        }
+        return false;
     }
 
     @Override

--
Gitblit v1.9.1