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
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;
|
||
|
|
}
|
||
|
|
}
|