From 57270a7ac5510611f570fc22a9a40cab7dc03c6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=8D=E7=BC=96=E8=AF=91=E5=B7=A5=E4=BD=9C=E5=8C=BA?= Date: Sat, 25 Apr 2026 00:41:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(v0.11):=20=E5=85=BC=E5=AE=B9=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=9A=84=E8=B5=B0=E6=9F=A5=E6=95=B4=E6=94=B9=E2=80=94?= =?UTF-8?q?=E2=80=94SnowFlake/BeanCopy=20=E5=8D=AB=E7=94=9F=E4=B8=8E?= =?UTF-8?q?=E7=94=B5=E6=A2=AF=E7=BC=96=E7=A0=81=E6=89=B9=E9=87=8F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 不改 AES 模式、不重命名 KafkaProducter,避免影响旧客户端与二进制兼容。 - SnowFlakeSerialCode:中断等待改恢复中断标志 + Slf4j 替代 printStackTrace。 - BeanCopyUtils:实例化仅捕获 ReflectiveOperationException,copyProperties 异常仍按运行时上抛,对外行为与旧版一致。 - 电梯 39202:新增 MyBatis listByZoneIds 与 AcsElevatorCodeService.mapByZoneIds(增量 API),树接口仍逐条组装 DTO,仅将循环内多次 get 合并为一次 IN 查询,HTTP 契约不变。 验证:maven-cloudwalk-legacy-public 全量 compile;cw-elevator-application-data 单模块 compile 通过。 Made-with: Cursor --- .../cloudwalk/cloud/utils/BeanCopyUtils.java | 13 +++---- .../serial/worker/SnowFlakeSerialCode.java | 6 ++- .../dao/AcsElevatorCodeDao.java | 3 ++ .../impl/AcsElevatorCodeDaoImpl.java | 5 +++ .../mapper/AcsElevatorCodeMapper.java | 4 ++ .../mapper/AcsElevatorCodeMapper.xml | 9 +++++ .../impl/AcsElevatorCodeServiceImpl.java | 21 +++++++++++ .../service/AcsElevatorCodeService.java | 8 ++++ .../AcsElevatorDeviceGetWayController.java | 37 ++++++++++++------- 9 files changed, 85 insertions(+), 21 deletions(-) diff --git a/maven-cloudwalk-legacy-public/cloudwalk-common-result/src/main/java/cn/cloudwalk/cloud/utils/BeanCopyUtils.java b/maven-cloudwalk-legacy-public/cloudwalk-common-result/src/main/java/cn/cloudwalk/cloud/utils/BeanCopyUtils.java index a8e1b861..1e918c72 100644 --- a/maven-cloudwalk-legacy-public/cloudwalk-common-result/src/main/java/cn/cloudwalk/cloud/utils/BeanCopyUtils.java +++ b/maven-cloudwalk-legacy-public/cloudwalk-common-result/src/main/java/cn/cloudwalk/cloud/utils/BeanCopyUtils.java @@ -34,12 +34,11 @@ public static T copyProperties(Object source, Class targetClazz) { /* 34 */ T target = null; try { /* 36 */ target = targetClazz.getDeclaredConstructor().newInstance(); -/* 37 */ BeanUtils.copyProperties(source, target); -/* 38 */ } catch (Exception e) { -/* 39 */ throw new RuntimeException(e); +/* 37 */ } catch (ReflectiveOperationException e) { +/* 38 */ throw new RuntimeException(e); } - -/* 42 */ return target; +/* 40 */ BeanUtils.copyProperties(source, target); +/* 41 */ return target; } @@ -102,10 +101,10 @@ for (V source : list) { E target = null; try { target = clazz.getDeclaredConstructor().newInstance(); -BeanUtils.copyProperties(source, target); -} catch (Exception e) { +} catch (ReflectiveOperationException e) { throw new RuntimeException(e); } +BeanUtils.copyProperties(source, target); result.add(target); } diff --git a/maven-cloudwalk-legacy-public/cloudwalk-common-serial/src/main/java/cn/cloudwalk/serial/worker/SnowFlakeSerialCode.java b/maven-cloudwalk-legacy-public/cloudwalk-common-serial/src/main/java/cn/cloudwalk/serial/worker/SnowFlakeSerialCode.java index 58366731..d92120d1 100644 --- a/maven-cloudwalk-legacy-public/cloudwalk-common-serial/src/main/java/cn/cloudwalk/serial/worker/SnowFlakeSerialCode.java +++ b/maven-cloudwalk-legacy-public/cloudwalk-common-serial/src/main/java/cn/cloudwalk/serial/worker/SnowFlakeSerialCode.java @@ -13,6 +13,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.RedisTemplate; @@ -39,6 +41,7 @@ import org.springframework.data.redis.core.RedisTemplate; public class SnowFlakeSerialCode implements UUIDSerial { +private final Logger log = LoggerFactory.getLogger(getClass()); private static final int LOCK_TRY_MAX_TIME = 5; private static final int THREAD_SLEEP_TIME = 5; /* 44 */ private static final Integer MAX_NODE_ID = Integer.valueOf(31); @@ -218,7 +221,8 @@ return true; try { TimeUnit.SECONDS.sleep(5L); } catch (InterruptedException e) { -e.printStackTrace(); +Thread.currentThread().interrupt(); +this.log.warn("获取雪花 Redis 锁等待被中断", e); } diff --git a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/dao/AcsElevatorCodeDao.java b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/dao/AcsElevatorCodeDao.java index 07602358..1c14aaf6 100644 --- a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/dao/AcsElevatorCodeDao.java +++ b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/dao/AcsElevatorCodeDao.java @@ -3,6 +3,7 @@ package cn.cloudwalk.elevator.codeElevatorArea.dao; import cn.cloudwalk.cloud.exception.ServiceException; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeDTO; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeResultDTO; +import java.util.List; public interface AcsElevatorCodeDao { Integer insertNew(AcsElevatorCodeDTO paramAcsElevatorCodeDTO) throws ServiceException; @@ -12,4 +13,6 @@ public interface AcsElevatorCodeDao { AcsElevatorCodeResultDTO get(AcsElevatorCodeDTO paramAcsElevatorCodeDTO); AcsElevatorCodeResultDTO getFirstByParentId(String paramString); + + List listByZoneIds(List zoneIds); } diff --git a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeDaoImpl.java b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeDaoImpl.java index 2b9658c2..6dd5be9e 100644 --- a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeDaoImpl.java +++ b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeDaoImpl.java @@ -5,6 +5,7 @@ import cn.cloudwalk.elevator.codeElevatorArea.dao.AcsElevatorCodeDao; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeDTO; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeResultDTO; import cn.cloudwalk.elevator.codeElevatorArea.mapper.AcsElevatorCodeMapper; +import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Repository; @@ -28,4 +29,8 @@ public class AcsElevatorCodeDaoImpl implements AcsElevatorCodeDao { public AcsElevatorCodeResultDTO getFirstByParentId(String parentId) { return this.acsElevatorCodeMapper.getFirstByParentId(parentId); } + + public List listByZoneIds(List zoneIds) { + return this.acsElevatorCodeMapper.listByZoneIds(zoneIds); + } } diff --git a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.java b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.java index 553592cf..ac7da30c 100644 --- a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.java +++ b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.java @@ -2,6 +2,8 @@ package cn.cloudwalk.elevator.codeElevatorArea.mapper; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeDTO; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeResultDTO; +import java.util.List; +import org.apache.ibatis.annotations.Param; public interface AcsElevatorCodeMapper { AcsElevatorCodeResultDTO get(AcsElevatorCodeDTO paramAcsElevatorCodeDTO); @@ -11,4 +13,6 @@ public interface AcsElevatorCodeMapper { int updateOld(AcsElevatorCodeDTO paramAcsElevatorCodeDTO); AcsElevatorCodeResultDTO getFirstByParentId(String paramString); + + List listByZoneIds(@Param("zoneIds") List zoneIds); } diff --git a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml index e42dad97..9ac3d30f 100644 --- a/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml +++ b/maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml @@ -25,6 +25,15 @@ and is_first = 1 + + update code_elevator_area diff --git a/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeServiceImpl.java b/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeServiceImpl.java index 278bfe41..0a11fdd0 100644 --- a/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeServiceImpl.java +++ b/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/impl/AcsElevatorCodeServiceImpl.java @@ -7,6 +7,10 @@ import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeDTO; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeResultDTO; import cn.cloudwalk.elevator.codeElevatorArea.param.AcsElevatorCodeParam; import cn.cloudwalk.elevator.codeElevatorArea.service.AcsElevatorCodeService; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,4 +50,21 @@ public class AcsElevatorCodeServiceImpl implements AcsElevatorCodeService { public AcsElevatorCodeResultDTO getFirstByParentId(String parentId) throws ServiceException { return this.acsElevatorCodeDao.getFirstByParentId(parentId); } + + public Map mapByZoneIds(List zoneIds) throws ServiceException { + if (zoneIds == null || zoneIds.isEmpty()) { + return Collections.emptyMap(); + } + List list = this.acsElevatorCodeDao.listByZoneIds(zoneIds); + if (list == null || list.isEmpty()) { + return Collections.emptyMap(); + } + Map map = new HashMap<>(list.size() * 2); + for (AcsElevatorCodeResultDTO row : list) { + if (row != null && row.getZoneId() != null) { + map.put(row.getZoneId(), row); + } + } + return map; + } } diff --git a/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.java b/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.java index 190069a7..a0cbd29f 100644 --- a/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.java +++ b/maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.java @@ -3,6 +3,8 @@ package cn.cloudwalk.elevator.codeElevatorArea.service; import cn.cloudwalk.cloud.exception.ServiceException; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeResultDTO; import cn.cloudwalk.elevator.codeElevatorArea.param.AcsElevatorCodeParam; +import java.util.List; +import java.util.Map; public interface AcsElevatorCodeService { Integer insertNew(AcsElevatorCodeParam paramAcsElevatorCodeParam) throws ServiceException; @@ -12,4 +14,10 @@ public interface AcsElevatorCodeService { AcsElevatorCodeResultDTO get(AcsElevatorCodeParam paramAcsElevatorCodeParam) throws ServiceException; AcsElevatorCodeResultDTO getFirstByParentId(String paramString) throws ServiceException; + + /** + * 按区域 ID 批量查询电梯编码,供树形接口一次拉取,避免循环内逐条查询。 + * 不改变 {@link #get} 语义;入参去重由调用方控制。 + */ + Map mapByZoneIds(List zoneIds) throws ServiceException; } diff --git a/maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java b/maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java index eff2fbe9..ffb604cf 100644 --- a/maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java +++ b/maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java @@ -7,7 +7,6 @@ import cn.cloudwalk.cloud.result.CloudwalkResult; import cn.cloudwalk.cloud.utils.BeanCopyUtils; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeQueryDTO; import cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeResultDTO; -import cn.cloudwalk.elevator.codeElevatorArea.param.AcsElevatorCodeParam; import cn.cloudwalk.elevator.codeElevatorArea.service.AcsElevatorCodeService; import cn.cloudwalk.elevator.common.AbstractCloudwalkController; import cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceQueryFoDTO; @@ -25,7 +24,10 @@ import cn.cloudwalk.elevator.zone.param.ZoneNextTreeParam; import cn.cloudwalk.elevator.zone.result.ZoneTreeResult; import cn.cloudwalk.elevator.zone.service.ZoneService; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.ObjectUtils; @@ -90,6 +92,10 @@ public class AcsElevatorDeviceGetWayController extends AbstractCloudwalkControll CloudwalkResult> query = this.zoneService.tree(zoneNextTreeParam, getCloudwalkContext()); List treeList = (List)query.getData(); + LinkedHashSet zoneIdsForCode = new LinkedHashSet<>(); + collectZoneTreeNodeIds(treeList, zoneIdsForCode); + Map codeByZoneId = + this.elevatorCodeService.mapByZoneIds(new ArrayList<>(zoneIdsForCode)); List treeResultList = new ArrayList<>(); if (treeList != null && treeList.size() > 0) { for (ZoneTreeResult zoneTreeResult : treeList) { @@ -106,9 +112,7 @@ public class AcsElevatorDeviceGetWayController extends AbstractCloudwalkControll querydTO.setId(floor.getId()); querydTO.setZoneName(floor.getName()); querydTO.setZoneType(floor.getType()); - AcsElevatorCodeParam paramCode = new AcsElevatorCodeParam(); - paramCode.setZoneId(floor.getId()); - AcsElevatorCodeResultDTO code = this.elevatorCodeService.get(paramCode); + AcsElevatorCodeResultDTO code = codeByZoneId.get(floor.getId()); if (!ObjectUtils.isEmpty(code)) { querydTO.setCode(code.getCode()); querydTO.setIsFirst(code.getIsFirst()); @@ -123,9 +127,7 @@ public class AcsElevatorDeviceGetWayController extends AbstractCloudwalkControll querydTO.setZoneName(building.getName()); querydTO.setZoneType("FLOOR"); querydTO.setId(building.getId()); - AcsElevatorCodeParam paramCode = new AcsElevatorCodeParam(); - paramCode.setZoneId(zoneTreeResult.getId()); - AcsElevatorCodeResultDTO code = this.elevatorCodeService.get(paramCode); + AcsElevatorCodeResultDTO code = codeByZoneId.get(zoneTreeResult.getId()); if (!ObjectUtils.isEmpty(code)) { querydTO.setCode(code.getCode()); querydTO.setIsFirst(code.getIsFirst()); @@ -144,9 +146,7 @@ public class AcsElevatorDeviceGetWayController extends AbstractCloudwalkControll querydTO.setZoneName(floor.getName()); querydTO.setZoneType(floor.getType()); querydTO.setId(floor.getId()); - AcsElevatorCodeParam paramCode = new AcsElevatorCodeParam(); - paramCode.setZoneId(floor.getId()); - AcsElevatorCodeResultDTO code = this.elevatorCodeService.get(paramCode); + AcsElevatorCodeResultDTO code = codeByZoneId.get(floor.getId()); if (!ObjectUtils.isEmpty(code)) { querydTO.setCode(code.getCode()); querydTO.setIsFirst(code.getIsFirst()); @@ -161,9 +161,7 @@ public class AcsElevatorDeviceGetWayController extends AbstractCloudwalkControll querydTO.setZoneName(zoneTreeResult.getName()); querydTO.setZoneType("FLOOR"); querydTO.setId(zoneTreeResult.getId()); - AcsElevatorCodeParam paramCode = new AcsElevatorCodeParam(); - paramCode.setZoneId(zoneTreeResult.getId()); - AcsElevatorCodeResultDTO code = this.elevatorCodeService.get(paramCode); + AcsElevatorCodeResultDTO code = codeByZoneId.get(zoneTreeResult.getId()); if (!ObjectUtils.isEmpty(code)) { querydTO.setCode(code.getCode()); querydTO.setIsFirst(code.getIsFirst()); @@ -228,4 +226,17 @@ public class AcsElevatorDeviceGetWayController extends AbstractCloudwalkControll this.LOGGER.warn("getKey(39204) 已停用明文密钥下发,调用方应迁移至安全鉴权方式"); return CloudwalkResult.success(result); } + + /** 收集树节点 id,用于与 {@code code_elevator_area.zone_id} 批量对齐查询。 */ + private static void collectZoneTreeNodeIds(List nodes, Set out) { + if (nodes == null || out == null) { + return; + } + for (ZoneTreeResult n : nodes) { + if (StringUtils.isNotBlank(n.getId())) { + out.add(n.getId()); + } + collectZoneTreeNodeIds(n.getChildren(), out); + } + } }