package com.threecloud.dataserviceyy.service.channel; import com.threecloud.dataserviceyy.entity.MidVoiceChannelConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; /** * 通道配置服务 * 管理多个 ChannelConfigProvider,根据设备类型选择合适的提供者 */ @Service public class ChannelConfigService { private static final Logger logger = LoggerFactory.getLogger(ChannelConfigService.class); @Autowired private List providers = new ArrayList<>(); @Autowired private DatabaseChannelConfigProvider databaseProvider; @PostConstruct public void init() { logger.info("初始化通道配置服务,注册 {} 个提供者", providers.size()); for (ChannelConfigProvider provider : providers) { logger.info("注册通道配置提供者: {}", provider.getProviderName()); } } /** * 获取通道配置 * 优先使用设备特定的提供者,如果没有则使用数据库提供者 * * @param deviceNo 设备编码 * @param channelNo 通道号 * @param deviceIp 设备IP * @param deviceModel 设备型号 * @param authToken 认证令牌 * @return 通道配置 */ public MidVoiceChannelConfig getChannelConfig(String deviceNo, Integer channelNo, String deviceIp, String deviceModel, String authToken) { // 1. 先尝试使用设备特定的提供者(如 EBOX API) ChannelConfigProvider specificProvider = findProvider(deviceModel); if (specificProvider != null && !specificProvider.getProviderName().equals("DATABASE")) { try { MidVoiceChannelConfig config = specificProvider.getChannelConfig(deviceNo, channelNo, deviceIp, authToken); if (config != null) { logger.debug("使用 {} 获取到通道配置", specificProvider.getProviderName()); return config; } } catch (Exception e) { logger.warn("{} 获取通道配置失败,尝试使用数据库: {}", specificProvider.getProviderName(), e.getMessage()); } } // 2. 使用数据库提供者(兜底) return databaseProvider.getChannelConfig(deviceNo, channelNo, deviceIp, authToken); } /** * 获取设备的所有通道配置 * 优先从 API 获取并同步到数据库,失败则从数据库读取 * * @param deviceNo 设备编码 * @param deviceIp 设备IP * @param deviceModel 设备型号 * @param authToken 认证令牌 * @return 通道配置列表 */ public List getChannelConfigs(String deviceNo, String deviceIp, String deviceModel, String authToken) { // 1. 先尝试使用设备特定的提供者(如 EBOX API) ChannelConfigProvider specificProvider = findProvider(deviceModel); if (specificProvider != null && !specificProvider.getProviderName().equals("DATABASE")) { try { List configs = specificProvider.getChannelConfigs(deviceNo, deviceIp, authToken); if (!configs.isEmpty()) { logger.info("从 {} 获取到 {} 条通道配置", specificProvider.getProviderName(), configs.size()); return configs; } } catch (Exception e) { logger.warn("{} 获取通道配置失败,尝试使用数据库: {}", specificProvider.getProviderName(), e.getMessage()); } } // 2. 使用数据库提供者(兜底) return databaseProvider.getChannelConfigs(deviceNo, deviceIp, authToken); } /** * 根据设备型号查找合适的提供者 */ private ChannelConfigProvider findProvider(String deviceModel) { if (deviceModel == null) { return databaseProvider; } // 优先找特定的提供者 for (ChannelConfigProvider provider : providers) { if (provider.supports(deviceModel)) { return provider; } } // 默认使用数据库提供者 return databaseProvider; } }