From 504196babe6dc8c7e11d9b925bd8f118e76889c8 Mon Sep 17 00:00:00 2001 From: liheng Date: Fri, 27 Mar 2026 11:18:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E5=92=8C=E8=8F=9C=E5=8D=95=E5=8E=9F=E6=9C=89=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysMenuServiceImpl.java | 35 ++++---- .../impl/SysOrganizationServiceImpl.java | 2 +- .../platform/utils/ObjectConverterUtil.java | 83 ++++++++++++++++--- 3 files changed, 90 insertions(+), 30 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java index f497044..56a1e02 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java @@ -14,6 +14,7 @@ import com.yfd.platform.system.mapper.SysRoleMapper; import com.yfd.platform.system.service.ISysMenuService; import com.yfd.platform.utils.FileUtil; import com.yfd.platform.config.FileSpaceProperties; +import com.yfd.platform.utils.ObjectConverterUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -64,12 +65,13 @@ public class SysMenuServiceImpl extends ServiceImpl impl public List> getMenuButtonTree(String systemcode, String name, String isdisplay) { - List> listMap=null; + List> mapList=null; + List> listMap =new ArrayList<>(); if(StrUtil.isEmpty(name)){//不带名称查询,返回树结构 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).orderByAsc("orderno"); - listMap = this.listMaps(queryWrapper); - + mapList = this.listMaps(queryWrapper); + listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); for (int i = 0; i < listMap.size(); i++) { //查询下一子集 List> childList = child(listMap.get(i).get( @@ -79,11 +81,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl }else{ //根据菜单名称查询,直接返回类别 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", name).eq("systemcode", systemcode).orderByAsc("name"); - listMap = this.listMaps(queryWrapper); + mapList = this.listMaps(queryWrapper); + listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); } - - - return listMap; } @@ -129,7 +129,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl private List> child(String parentid, String systemcode, String name, String isdisplay, String type) { - List> listMap = new ArrayList<>(); + List> mapList; QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode); //根据上级id 系统 查询 @@ -140,8 +140,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl if (StrUtil.isNotEmpty(name)) { //根据菜单名称查询 queryWrapper.like("name", name); } - listMap = this.listMaps(queryWrapper.orderByAsc("orderno")); - if (listMap.size() > 0) { //判断是否存在子集 + mapList = this.listMaps(queryWrapper.orderByAsc("orderno")); + List> listMap = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList); + if (!listMap.isEmpty()) { //判断是否存在子集 for (int i = 0; i < listMap.size(); i++) { //遍历表数据 List> childList = child(listMap.get(i).get("id").toString(), systemcode @@ -170,14 +171,16 @@ public class SysMenuServiceImpl extends ServiceImpl impl sysMenu.setOrderno((int) orderno); // 生成编号 QueryWrapper queryMaxCode = new QueryWrapper<>(); - queryMaxCode.eq("parentid", - parentId); - // 查询最大的编号 - List maxList = this.listObjs(queryMaxCode.select("max(code) " + - "code").eq("systemcode", sysMenu.getSystemcode())); + queryMaxCode.eq("parentid", parentId); + + // 使用 Oracle 兼容的 NVL 函数处理空值 + List maxList = this.listObjs( + queryMaxCode.select("NVL(MAX(code), '0') as code") + .eq("systemcode", sysMenu.getSystemcode()) + ); SysMenu parentMenu = sysMenuMapper.selectById(parentId); // 最大编号转换成int类型 - String maxCode = maxList.size() > 0 ? maxList.get(0).toString() : "0"; + String maxCode = !maxList.isEmpty() ? maxList.getFirst().toString() : "0"; int max = ObjectUtil.isEmpty(maxList) ? 0 : Integer.parseInt(maxCode); DecimalFormat df; diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java index 66f88eb..762612b 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java @@ -128,7 +128,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", parentid); //根据上级id 查询 listMap = this.listMaps(queryWrapper.orderByAsc("orgcode")); - if (listMap.size() > 0) { //判断是否存在子集 + if (!listMap.isEmpty()) { //判断是否存在子集 for (int i = 0; i < listMap.size(); i++) { //遍历表数据 List> childList = child(listMap.get(i).get("id").toString()); //循环获取下一子集 diff --git a/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java b/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java index dc4d600..da72785 100644 --- a/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java +++ b/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java @@ -1,14 +1,22 @@ package com.yfd.platform.utils; import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; public class ObjectConverterUtil { + // 日期时间格式 + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + /** * 将 List 中的大写字段名转换为与实体类一致的小写格式 * 适用于 Oracle 数据库查询结果转换 + * 时间类型字段会转换为字符串格式 * * @param entityClass 实体类 Class 对象 * @param sourceList 源数据列表(字段名为大写) @@ -22,10 +30,11 @@ public class ObjectConverterUtil { return sourceList; } - // 获取实体类的所有字段名(小写驼峰命名) - Set entityFieldNames = Arrays.stream(entityClass.getDeclaredFields()) - .map(field -> field.getName()) - .collect(Collectors.toSet()); + // 获取实体类的所有字段及类型 + Map fieldMap = new HashMap<>(); + for (Field field : entityClass.getDeclaredFields()) { + fieldMap.put(field.getName(), field); + } // 转换每个 Map return sourceList.stream().map(sourceMap -> { @@ -38,9 +47,18 @@ public class ObjectConverterUtil { // 将大写列名转为小写 String lowerCaseName = dbColumnName.toLowerCase(); - // 如果实体类中有对应的字段,使用实体类的字段名 - if (entityFieldNames.contains(lowerCaseName)) { - targetMap.put(lowerCaseName, value); + // 如果实体类中有对应的字段 + if (fieldMap.containsKey(lowerCaseName)) { + Field field = fieldMap.get(lowerCaseName); + String fieldType = field.getType().getSimpleName(); + + // 处理时间类型,转换为字符串 + if ("Timestamp".equals(fieldType) || "Date".equals(fieldType) || + "LocalDateTime".equals(fieldType)) { + targetMap.put(lowerCaseName, formatDateTimeValue(value)); + } else { + targetMap.put(lowerCaseName, value); + } } else { // 如果实体类中没有对应字段,保留原列名(转小写) targetMap.put(lowerCaseName, value); @@ -53,6 +71,7 @@ public class ObjectConverterUtil { /** * 通用方法:将单个 Map 的大写字段转换为实体类格式 + * 时间类型字段会转换为字符串格式 * * @param entityClass 实体类 Class 对象 * @param sourceMap 源 Map(字段名为大写) @@ -66,10 +85,11 @@ public class ObjectConverterUtil { return sourceMap; } - // 获取实体类的所有字段名 - Set entityFieldNames = Arrays.stream(entityClass.getDeclaredFields()) - .map(Field::getName) - .collect(Collectors.toSet()); + // 获取实体类的所有字段及类型 + Map fieldMap = new HashMap<>(); + for (Field field : entityClass.getDeclaredFields()) { + fieldMap.put(field.getName(), field); + } Map targetMap = new HashMap<>(); @@ -81,12 +101,49 @@ public class ObjectConverterUtil { String lowerCaseName = dbColumnName.toLowerCase(); // 验证字段是否存在于实体类中 - if (entityFieldNames.contains(lowerCaseName)) { - targetMap.put(lowerCaseName, value); + if (fieldMap.containsKey(lowerCaseName)) { + Field field = fieldMap.get(lowerCaseName); + String fieldType = field.getType().getSimpleName(); + + // 处理时间类型,转换为字符串 + if ("Timestamp".equals(fieldType) || "Date".equals(fieldType) || + "LocalDateTime".equals(fieldType)) { + targetMap.put(lowerCaseName, formatDateTimeValue(value)); + } else { + targetMap.put(lowerCaseName, value); + } } } return targetMap; } + /** + * 格式化时间类型值为字符串 + * + * @param value 时间值(可能是 Timestamp、Date 或 LocalDateTime) + * @return 格式化后的字符串,如果为 null 则返回 null + */ + private static String formatDateTimeValue(Object value) { + if (value == null) { + return null; + } + + if (value instanceof Timestamp) { + LocalDateTime localDateTime = ((Timestamp) value).toLocalDateTime(); + return localDateTime.format(DATE_TIME_FORMATTER); + } else if (value instanceof java.util.Date) { + // 包括 java.sql.Date 和 java.util.Date + LocalDateTime localDateTime = ((java.util.Date) value).toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + return localDateTime.format(DATE_TIME_FORMATTER); + } else if (value instanceof LocalDateTime) { + return ((LocalDateTime) value).format(DATE_TIME_FORMATTER); + } else { + // 其他类型直接转字符串 + return value.toString(); + } + } + }