数据同步服务-语音
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
4.4 KiB

1 week ago
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<ChannelConfigProvider> 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<MidVoiceChannelConfig> 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<MidVoiceChannelConfig> 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;
}
}