From 92571fed910797bd295a483b90d9e653da91a038 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Jul 2026 10:53:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=85=88=E6=9F=A5=E5=90=8E?= =?UTF-8?q?=E6=94=B9=E8=A7=A3=E5=86=B3=E6=89=B9=E9=87=8F=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E5=9C=A8=E5=B9=B6=E5=8F=91=E6=97=B6=E7=9A=84=E6=AD=BB=E9=94=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20=E8=AE=BE=E5=A4=8795=E5=80=BC?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=A4=B1=E8=B4=A5=E7=9A=84=E5=8E=9F=E5=9B=A0?= =?UTF-8?q?=E6=98=AF=E6=95=B0=E6=8D=AE=E5=BA=93mac=5Faddress=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E9=95=BF=E5=BA=A6=E4=B8=8D=E8=B6=B3=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E4=B8=BA500=E5=90=8E=E6=AD=A3=E5=B8=B8=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/mapper/AllInterfaceNameMapper.java | 15 ++++ .../EpsServerRevenueConfigServiceImpl.java | 87 +++++++++++++++---- .../RmResourceRegistrationServiceImpl.java | 2 +- .../mapper/system/AllInterfaceNameMapper.xml | 61 +++++++++++++ 4 files changed, 148 insertions(+), 17 deletions(-) diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/mapper/AllInterfaceNameMapper.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/mapper/AllInterfaceNameMapper.java index 61134a6..26dd96a 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/mapper/AllInterfaceNameMapper.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/mapper/AllInterfaceNameMapper.java @@ -99,4 +99,19 @@ public interface AllInterfaceNameMapper * @return */ Integer countNetChild(AllInterfaceName allInterfaceName); + + /** + * 按唯一键查询已存在的记录 + */ + List selectExisting(@Param("list") List list); + + /** + * 纯批量插入(无 ON DUPLICATE KEY UPDATE) + */ + int batchInsertPure(@Param("list") List list); + + /** + * 按唯一键批量更新 + */ + int batchUpdateByUniqueKey(@Param("list") List list); } diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java index ba4abde..c583c41 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java @@ -15,10 +15,7 @@ import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 服务器收益方式配置Service业务层处理 @@ -379,8 +376,38 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi private String getCompositeKey(String clientId, String interfaceName) { return clientId + "|" + interfaceName; } +// /** +// * 批量处理接口名称 +// */ +// @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED) +// public void processInterfaceNames(List trafficDataList) { +// if (CollectionUtils.isEmpty(trafficDataList)) { +// return; +// } +// +// // 直接转换并过滤 +// List records = new ArrayList<>(); +// for (EpsInitialTrafficData data : trafficDataList) { +// if (isValidData(data)) { +// records.add(convertToInterfaceName(data)); +// } +// } +// +// if (!records.isEmpty()) { +// // 排序防止死锁 +// records.sort(Comparator +// .comparing(AllInterfaceName::getInterfaceName) +// .thenComparing(AllInterfaceName::getClientId) +// .thenComparing(AllInterfaceName::getServerIp) +// .thenComparing(AllInterfaceName::getResourceType)); +// +// allInterfaceNameMapper.batchInsert(records); +// log.info("批量处理完成,记录数: {}", records.size()); +// } +// } + /** - * 批量处理接口名称 + * 批量处理接口名称(不排序,先查后插,彻底避免死锁) */ @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED) public void processInterfaceNames(List trafficDataList) { @@ -388,7 +415,7 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi return; } - // 直接转换并过滤 + // 1. 转换并过滤 List records = new ArrayList<>(); for (EpsInitialTrafficData data : trafficDataList) { if (isValidData(data)) { @@ -396,18 +423,46 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi } } - if (!records.isEmpty()) { - // 排序防止死锁 - records.sort(Comparator - .comparing(AllInterfaceName::getInterfaceName) - .thenComparing(AllInterfaceName::getClientId) - .thenComparing(AllInterfaceName::getServerIp) - .thenComparing(AllInterfaceName::getResourceType)); - - allInterfaceNameMapper.batchInsert(records); - log.info("批量处理完成,记录数: {}", records.size()); + if (records.isEmpty()) { + return; } + + // 2. 先查出数据库里已存在的记录(按唯一键 uk_interface_unified_ip) + List existingKeys = allInterfaceNameMapper.selectExisting(records); + Set existingSet = new HashSet<>(existingKeys); + + // 3. 分离 insert 和 update + List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + + for (AllInterfaceName record : records) { + // 统一按生成列逻辑计算 unified_ip + String unifiedIp = StringUtils.isNotBlank(record.getServerIp()) + ? record.getServerIp() + : record.getSwitchIp(); + + String key = record.getInterfaceName() + "#" + record.getClientId() + + "#" + unifiedIp + "#" + record.getResourceType(); + + if (existingSet.contains(key)) { + toUpdate.add(record); + } else { + toInsert.add(record); + } + } + + // 4. 分别执行 + if (!toInsert.isEmpty()) { + allInterfaceNameMapper.batchInsertPure(toInsert); + } + if (!toUpdate.isEmpty()) { + allInterfaceNameMapper.batchUpdateByUniqueKey(toUpdate); + } + + log.info("批量处理完成,insert={}, update={}, total={}", + toInsert.size(), toUpdate.size(), records.size()); } + private boolean isValidData(EpsInitialTrafficData data) { return StringUtils.isNotBlank(data.getName()) && StringUtils.isNotBlank(data.getMac()) diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java index 9f5c55f..8d0382e 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmResourceRegistrationServiceImpl.java @@ -1121,7 +1121,7 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒 String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", createTime); List networkInfoList = registerMsg.getNetworkInfo(); - if(!networkInfoList.isEmpty()){ + if(networkInfoList != null && !networkInfoList.isEmpty()){ // 查询此数据是否存在 RmResourceRegistration queryParam = new RmResourceRegistration(); queryParam.setClientId(registerMsg.getClientId()); diff --git a/tongran-modules/tongran-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml b/tongran-modules/tongran-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml index ee7105e..9dd2d8d 100644 --- a/tongran-modules/tongran-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml +++ b/tongran-modules/tongran-system/src/main/resources/mapper/system/AllInterfaceNameMapper.xml @@ -320,4 +320,65 @@ select count(1) from rm_network_interface_child where client_id = #{clientId} and parent_interface = SUBSTRING_INDEX(#{interfaceName}, '(', 1) + + + + + + + INSERT INTO all_interface_name + ( + interface_name, client_id, resource_type, + device_sn, node_name, business_code, business_name, + switch_name, interface_device_type, server_port, + switch_sn, switch_ip, server_ip, port_status, + create_time, update_time + ) + VALUES + + ( + #{item.interfaceName}, #{item.clientId}, #{item.resourceType}, + #{item.deviceSn}, #{item.nodeName}, #{item.businessCode}, #{item.businessName}, + #{item.switchName}, #{item.interfaceDeviceType}, #{item.serverPort}, + #{item.switchSn}, #{item.switchIp}, #{item.serverIp}, #{item.portStatus}, + NOW(), NOW() + ) + + + + + + + UPDATE all_interface_name + SET + device_sn = #{item.deviceSn}, + node_name = #{item.nodeName}, + business_code = #{item.businessCode}, + business_name = #{item.businessName}, + switch_name = #{item.switchName}, + interface_device_type = #{item.interfaceDeviceType}, + server_port = #{item.serverPort}, + switch_sn = #{item.switchSn}, + switch_ip = #{item.switchIp}, + server_ip = #{item.serverIp}, + port_status = #{item.portStatus}, + update_time = NOW() + WHERE interface_name = #{item.interfaceName} + AND client_id = #{item.clientId} + AND unified_ip = COALESCE(#{item.serverIp}, #{item.switchIp}) + AND resource_type = #{item.resourceType} + + \ No newline at end of file