feat(device): 实现设备创建时关联DNS映射配置

- 新增InterfaceDnsMapping实体及Mapper依赖注入
- 设备创建接口支持网络接口地址配置及DNS服务器绑定
- 优化事务管理,增强异常回滚机制
- 空值校验完善,避免空指针异常
- DNS服务查询逻辑优化,使用Map提高查找效率
- 增加数据库DNS记录不存在的错误码定义
This commit is contained in:
Chaos
2025-11-29 07:23:00 +08:00
parent 1e09ce9f54
commit b479304687
3 changed files with 49 additions and 13 deletions

View File

@@ -73,7 +73,8 @@ public enum ErrorCode {
DNS_NOT_EXISTS_OR_PASSWORD_WRONG(401, "DNS-407", "DNS服务器不存在或密码错误"),
DNS_UPDATE_FAILED(400, "DNS-408", "DNS服务器更新失败"),
;
// 数据库
DB_DNS_NOT_FOUND( 404, "DB-401" , "数据库DNS服务器不存在" );
private final int httpStatus;
private final String code; // 业务错误码(领域-编号)

View File

@@ -4,6 +4,7 @@ import cn.nopj.chaos_api.common.constants.ErrorCode;
import cn.nopj.chaos_api.common.exceotion.BizException;
import cn.nopj.chaos_api.domain.entity.Device;
import cn.nopj.chaos_api.domain.entity.InterfaceAddressConfig;
import cn.nopj.chaos_api.domain.entity.InterfaceDnsMapping;
import cn.nopj.chaos_api.domain.entity.NetworkInterface;
import cn.nopj.chaos_api.dto.request.CreateDeviceRequest;
import cn.nopj.chaos_api.dto.request.DeviceQueryRequest;
@@ -11,6 +12,7 @@ import cn.nopj.chaos_api.dto.request.UpdateDeviceRequest;
import cn.nopj.chaos_api.dto.response.DeviceResponse;
import cn.nopj.chaos_api.mapper.DeviceMapper;
import cn.nopj.chaos_api.mapper.InterfaceAddressConfigMapper;
import cn.nopj.chaos_api.mapper.InterfaceDnsMappingMapper;
import cn.nopj.chaos_api.mapper.NetworkInterfaceMapper;
import cn.nopj.chaos_api.service.DeviceService;
import cn.nopj.chaos_api.service.DnsServerService;
@@ -19,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -36,22 +39,24 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
InterfaceAddressConfigMapper interfaceAddressConfigMapper;
@Autowired
DnsServerService dnsServerService;
@Autowired
InterfaceDnsMappingMapper interfaceDnsMappingMapper;
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public DeviceResponse createDevice(CreateDeviceRequest createDeviceRequest) {
Device device = new Device();
device.setName(createDeviceRequest.getName());
device.setModel(createDeviceRequest.getModel());
device.setTypeId(createDeviceRequest.getTypeId());
device.setLocationId(createDeviceRequest.getLocationId());
device.setSnmpCommunity(createDeviceRequest.getSnmpCommunity());
device.setManufacturer(createDeviceRequest.getManufacturer());
device.setPurchaseDate(createDeviceRequest.getPurchaseDate());
device.setRemark(createDeviceRequest.getRemark());
BeanUtils.copyProperties(createDeviceRequest, device);
int rows = this.baseMapper.insert(device);
List<CreateDeviceRequest.NetworkInterfaceRequest> interfaces = createDeviceRequest.getInterfaces();
if (interfaces == null || interfaces.isEmpty()) {
return new DeviceResponse(device);
}
interfaces.forEach(i -> {
NetworkInterface networkInterface = new NetworkInterface();
networkInterface.setDeviceId(device.getId());
@@ -63,8 +68,15 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
networkInterface.setRemark(i.getRemark());
networkInterfaceMapper.insert(networkInterface);
i.getAddressConfigs().forEach(a -> {
List<CreateDeviceRequest.InterfaceAddressConfigRequest> addressConfigs = i.getAddressConfigs();
if (addressConfigs == null || addressConfigs.isEmpty()) {
return;
}
addressConfigs.forEach(a -> {
InterfaceAddressConfig iac = new InterfaceAddressConfig();
iac.setInterfaceId(networkInterface.getId());
iac.setVlanId(a.getVlanId());
iac.setIpAddress(a.getIpAddress());
iac.setGatewayIp(a.getGatewayIp());
@@ -76,8 +88,17 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
interfaceAddressConfigMapper.insert(iac);
List<String> dnsServers = a.getDnsServers();
if (dnsServers == null || dnsServers.isEmpty()) {
return;
}
List<Long> dnsServerIdListByNameList = dnsServerService.getDnsServerIdListByNameList(dnsServers);
for (int j = 0; j < dnsServerIdListByNameList.size(); j++) {
InterfaceDnsMapping mapping = new InterfaceDnsMapping();
mapping.setConfigId(iac.getId());
mapping.setDnsServerId(dnsServerIdListByNameList.get(j));
mapping.setPriority(j);
interfaceDnsMappingMapper.insert(mapping);
}
});
});

View File

@@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class DnsServerServiceImpl extends ServiceImpl<DnsServerMapper, DnsServer> implements DnsServerService {
@@ -31,6 +33,18 @@ public class DnsServerServiceImpl extends ServiceImpl<DnsServerMapper, DnsServer
@Override
public List<Long> getDnsServerIdListByNameList(List<String> nameList) {
return nameList.stream().map(this::getDnsServerIdByName).toList();
List<DnsServer> dnsServers = this.baseMapper.selectList(null);
if (dnsServers == null || dnsServers.isEmpty() ){
throw new BizException(ErrorCode.DB_DNS_NOT_FOUND);
}
Map<String, Long> map = new HashMap<>();
for (DnsServer dnsServer : dnsServers) {
map.put(dnsServer.getName(), dnsServer.getId());
}
return nameList.stream().map(map::get).toList();
}
}