From cc1f07604727a966181334ef76b8445750ddadd2 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期日, 30 八月 2026 18:55:35 +0800
Subject: [PATCH] 修正模拟器开机后的异常状态同步

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/device/BtsDevelopmentSimulatorController.java |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/device/BtsDevelopmentSimulatorController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/device/BtsDevelopmentSimulatorController.java
index 3938123..5c4d084 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/device/BtsDevelopmentSimulatorController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/device/BtsDevelopmentSimulatorController.java
@@ -15,6 +15,7 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.server.ResponseStatusException;
+import org.springframework.beans.factory.annotation.Autowired;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.device.bts.BtsDevelopmentSimulator;
 import com.ruoyi.device.bts.BtsDevelopmentSimulator.StateSnapshot;
@@ -32,12 +33,23 @@
 {
     private final BtsDevelopmentSimulator simulator;
     private final DeviceDiscoveryCandidateStore candidateStore;
+    private final com.ruoyi.config.DevelopmentCollectorStatusSynchronizer statusSynchronizer;
 
+    @Autowired
     public BtsDevelopmentSimulatorController(BtsDevelopmentSimulator simulator,
-            DeviceDiscoveryCandidateStore candidateStore)
+            DeviceDiscoveryCandidateStore candidateStore,
+            com.ruoyi.config.DevelopmentCollectorStatusSynchronizer statusSynchronizer)
     {
         this.simulator = simulator;
         this.candidateStore = candidateStore;
+        this.statusSynchronizer = statusSynchronizer;
+    }
+
+    /** 保留独立模拟器测试和工具调用的构造入口,不触发数据库同步。 */
+    public BtsDevelopmentSimulatorController(BtsDevelopmentSimulator simulator,
+            DeviceDiscoveryCandidateStore candidateStore)
+    {
+        this(simulator, candidateStore, null);
     }
 
     /** 返回临时控制页;匿名放行后仍由本机拦截器限制来源。 */
@@ -70,6 +82,7 @@
         if (command == null || command.poweredOn() == null)
             throw badRequest(new IllegalArgumentException("poweredOn must be true or false"));
         simulator.setAllDevicesPoweredOn(command.poweredOn());
+        synchronizeOnlineStatusIfConfigured();
         return simulator.snapshot();
     }
 
@@ -146,6 +159,7 @@
         try
         {
             simulator.updateCollector(collectorId, command.ip(), command.channelCount(), command.online());
+            synchronizeOnlineStatusIfConfigured();
             return simulator.snapshot();
         }
         catch (IllegalArgumentException exception)
@@ -256,6 +270,11 @@
         return new ResponseStatusException(HttpStatus.BAD_REQUEST, exception.getMessage(), exception);
     }
 
+    private void synchronizeOnlineStatusIfConfigured()
+    {
+        if (statusSynchronizer != null) statusSynchronizer.synchronizeOnlineStatus();
+    }
+
     public record CreateDeviceCommand(String ip, int channelCount, String model)
     {
         public CreateDeviceCommand(String ip, int channelCount)

--
Gitblit v1.7.1