yeg
2026-08-29 317c4c6a45508ab64461c36aad2c93d4a0d3a15a
修复采集器状态同步与软删除绑定过滤
4个文件已修改
35 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/config/DevelopmentCollectorStatusSynchronizer.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/test/java/com/ruoyi/config/DevelopmentCollectorStatusSynchronizerTest.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/CollectorDiscoveryServiceImplTest.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTestMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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">