ruoyi-admin/src/main/java/com/ruoyi/config/DevelopmentCollectorStatusSynchronizer.java
@@ -11,7 +11,7 @@ import com.ruoyi.device.discovery.DeviceDiscoveryCandidateStore.CollectorCandidate; import com.ruoyi.system.mapper.TCollectorMapper; /** 将模拟采集器的发现和实时状态写入 Redis,不回写正式 MySQL 记录。 */ /** 将模拟采集器的发现写入 Redis,并同步已登记采集器的实时在线事实。 */ @Component public class DevelopmentCollectorStatusSynchronizer { @@ -20,12 +20,6 @@ private final TCollectorMapper collectorMapper; @Autowired public DevelopmentCollectorStatusSynchronizer(BtsDevelopmentSimulator simulator, DeviceDiscoveryCandidateStore candidateStore) { this(simulator, candidateStore, null); } public DevelopmentCollectorStatusSynchronizer(BtsDevelopmentSimulator simulator, DeviceDiscoveryCandidateStore candidateStore, TCollectorMapper collectorMapper) { @@ -46,10 +40,7 @@ observedAt.plus(Duration.ofSeconds(30)))) .toList(); candidateStore.replaceCollectors(BtsDevelopmentSimulator.ADAPTER_CODE, candidates); if (collectorMapper != null) { candidates.forEach(candidate -> collectorMapper.updateRegisteredObservation(candidate.deviceCode(), candidate.online() ? "ONLINE" : "OFFLINE")); } candidates.forEach(candidate -> collectorMapper.updateRegisteredObservation(candidate.deviceCode(), candidate.online() ? "ONLINE" : "OFFLINE")); } } ruoyi-admin/src/test/java/com/ruoyi/config/DevelopmentCollectorStatusSynchronizerTest.java
@@ -15,9 +15,10 @@ @Test void productionConstructorIsExplicitlyAutowired() { assertTrue(java.util.Arrays.stream(DevelopmentCollectorStatusSynchronizer.class.getDeclaredConstructors()) .filter(constructor -> constructor.getParameterCount() == 3) .anyMatch(constructor -> constructor.isAnnotationPresent(Autowired.class))); var constructors = DevelopmentCollectorStatusSynchronizer.class.getDeclaredConstructors(); assertEquals(1, constructors.length); assertTrue(constructors[0].isAnnotationPresent(Autowired.class)); assertEquals(3, constructors[0].getParameterCount()); } @Test void synchronizesOnlyConfiguredCollectorsWithoutRegisteringThem() throws Exception ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/CollectorDiscoveryServiceImplTest.java
@@ -11,6 +11,7 @@ import com.ruoyi.device.bts.BtsDevelopmentSimulator; import com.ruoyi.device.discovery.InMemoryDeviceDiscoveryCandidateStore; import com.ruoyi.system.domain.vo.DiscoveredCollectorVo; import com.ruoyi.system.mapper.TCollectorMapper; import com.ruoyi.system.service.ITCollectorService; /** @@ -28,9 +29,10 @@ InMemoryDeviceDiscoveryCandidateStore store = new InMemoryDeviceDiscoveryCandidateStore(); DevelopmentCollectorDiscoveryService service = new DevelopmentCollectorDiscoveryService(store, collectorService); TCollectorMapper collectorMapper = mock(TCollectorMapper.class); simulator.addDevice("127.0.0.8", 2); simulator.addCollector("127.0.1.3", 6); new DevelopmentCollectorStatusSynchronizer(simulator, store).synchronizeOnlineStatus(); new DevelopmentCollectorStatusSynchronizer(simulator, store, collectorMapper).synchronizeOnlineStatus(); List<DiscoveredCollectorVo> result = service.selectDiscoveredCollectorList(); @@ -57,8 +59,9 @@ InMemoryDeviceDiscoveryCandidateStore store = new InMemoryDeviceDiscoveryCandidateStore(); DevelopmentCollectorDiscoveryService service = new DevelopmentCollectorDiscoveryService(store, collectorService); TCollectorMapper collectorMapper = mock(TCollectorMapper.class); simulator.updateCollector(1, "127.0.1.9", 8, false); new DevelopmentCollectorStatusSynchronizer(simulator, store).synchronizeOnlineStatus(); new DevelopmentCollectorStatusSynchronizer(simulator, store, collectorMapper).synchronizeOnlineStatus(); List<DiscoveredCollectorVo> result = service.selectDiscoveredCollectorList(); @@ -75,7 +78,8 @@ InMemoryDeviceDiscoveryCandidateStore store = new InMemoryDeviceDiscoveryCandidateStore(); DevelopmentCollectorDiscoveryService service = new DevelopmentCollectorDiscoveryService(store, collectorService); new DevelopmentCollectorStatusSynchronizer(simulator, store).synchronizeOnlineStatus(); TCollectorMapper collectorMapper = mock(TCollectorMapper.class); new DevelopmentCollectorStatusSynchronizer(simulator, store, collectorMapper).synchronizeOnlineStatus(); when(collectorService.selectRegisteredCollectorCodes()) .thenReturn(Set.of("dev-sim-collector-1")) .thenReturn(Set.of()); ruoyi-system/src/main/resources/mapper/system/TTestMapper.xml
@@ -254,7 +254,10 @@ channel_fact.devtype, channel_fact.devid, channel_fact.subdevid, channel_fact.chlid, channel_fact.display_no from t_test_channel_binding binding join t_detection_channel channel_fact on channel_fact.channel_id = binding.channel_id and channel_fact.status = '0' and channel_fact.del_flag = 0 join t_detection_cabinet cabinet on cabinet.cabinet_id = channel_fact.cabinet_id and cabinet.status = '0' and cabinet.del_flag = 0 and cabinet.registration_status = 'REGISTERED' where binding.test_id = #{testId} order by binding.binding_id </select> <select id="selectTestCollectorChannels" parameterType="Long" resultMap="TTestCollectorChannelResultMap">