fix: 优化组织和菜单原有逻辑

This commit is contained in:
liheng 2026-03-27 11:18:26 +08:00
parent 617d2832ce
commit 504196babe
3 changed files with 90 additions and 30 deletions

View File

@ -14,6 +14,7 @@ import com.yfd.platform.system.mapper.SysRoleMapper;
import com.yfd.platform.system.service.ISysMenuService; import com.yfd.platform.system.service.ISysMenuService;
import com.yfd.platform.utils.FileUtil; import com.yfd.platform.utils.FileUtil;
import com.yfd.platform.config.FileSpaceProperties; import com.yfd.platform.config.FileSpaceProperties;
import com.yfd.platform.utils.ObjectConverterUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -64,12 +65,13 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
public List<Map<String, Object>> getMenuButtonTree(String systemcode, public List<Map<String, Object>> getMenuButtonTree(String systemcode,
String name, String name,
String isdisplay) { String isdisplay) {
List<Map<String, Object>> listMap=null; List<Map<String, Object>> mapList=null;
List<Map<String, Object>> listMap =new ArrayList<>();
if(StrUtil.isEmpty(name)){//不带名称查询返回树结构 if(StrUtil.isEmpty(name)){//不带名称查询返回树结构
QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).orderByAsc("orderno"); 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++) { for (int i = 0; i < listMap.size(); i++) {
//查询下一子集 //查询下一子集
List<Map<String, Object>> childList = child(listMap.get(i).get( List<Map<String, Object>> childList = child(listMap.get(i).get(
@ -79,11 +81,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
}else{ //根据菜单名称查询直接返回类别 }else{ //根据菜单名称查询直接返回类别
QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", name).eq("systemcode", systemcode).orderByAsc("name"); 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; return listMap;
} }
@ -129,7 +129,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
private List<Map<String, Object>> child(String parentid, private List<Map<String, Object>> child(String parentid,
String systemcode, String name, String systemcode, String name,
String isdisplay, String type) { String isdisplay, String type) {
List<Map<String, Object>> listMap = new ArrayList<>(); List<Map<String, Object>> mapList;
QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode); queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode);
//根据上级id 系统 查询 //根据上级id 系统 查询
@ -140,8 +140,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
if (StrUtil.isNotEmpty(name)) { //根据菜单名称查询 if (StrUtil.isNotEmpty(name)) { //根据菜单名称查询
queryWrapper.like("name", name); queryWrapper.like("name", name);
} }
listMap = this.listMaps(queryWrapper.orderByAsc("orderno")); mapList = this.listMaps(queryWrapper.orderByAsc("orderno"));
if (listMap.size() > 0) { //判断是否存在子集 List<Map<String, Object>> listMap = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList);
if (!listMap.isEmpty()) { //判断是否存在子集
for (int i = 0; i < listMap.size(); i++) { //遍历表数据 for (int i = 0; i < listMap.size(); i++) { //遍历表数据
List<Map<String, Object>> childList = List<Map<String, Object>> childList =
child(listMap.get(i).get("id").toString(), systemcode child(listMap.get(i).get("id").toString(), systemcode
@ -170,14 +171,16 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
sysMenu.setOrderno((int) orderno); sysMenu.setOrderno((int) orderno);
// 生成编号 // 生成编号
QueryWrapper<SysMenu> queryMaxCode = new QueryWrapper<>(); QueryWrapper<SysMenu> queryMaxCode = new QueryWrapper<>();
queryMaxCode.eq("parentid", queryMaxCode.eq("parentid", parentId);
parentId);
// 查询最大的编号 // 使用 Oracle 兼容的 NVL 函数处理空值
List<Object> maxList = this.listObjs(queryMaxCode.select("max(code) " + List<Object> maxList = this.listObjs(
"code").eq("systemcode", sysMenu.getSystemcode())); queryMaxCode.select("NVL(MAX(code), '0') as code")
.eq("systemcode", sysMenu.getSystemcode())
);
SysMenu parentMenu = sysMenuMapper.selectById(parentId); SysMenu parentMenu = sysMenuMapper.selectById(parentId);
// 最大编号转换成int类型 // 最大编号转换成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 : int max = ObjectUtil.isEmpty(maxList) ? 0 :
Integer.parseInt(maxCode); Integer.parseInt(maxCode);
DecimalFormat df; DecimalFormat df;

View File

@ -128,7 +128,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl<SysOrganizationMappe
QueryWrapper<SysOrganization> queryWrapper = new QueryWrapper<>(); QueryWrapper<SysOrganization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parentid", parentid); //根据上级id 查询 queryWrapper.eq("parentid", parentid); //根据上级id 查询
listMap = this.listMaps(queryWrapper.orderByAsc("orgcode")); listMap = this.listMaps(queryWrapper.orderByAsc("orgcode"));
if (listMap.size() > 0) { //判断是否存在子集 if (!listMap.isEmpty()) { //判断是否存在子集
for (int i = 0; i < listMap.size(); i++) { //遍历表数据 for (int i = 0; i < listMap.size(); i++) { //遍历表数据
List<Map<String, Object>> childList = List<Map<String, Object>> childList =
child(listMap.get(i).get("id").toString()); //循环获取下一子集 child(listMap.get(i).get("id").toString()); //循环获取下一子集

View File

@ -1,14 +1,22 @@
package com.yfd.platform.utils; package com.yfd.platform.utils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class ObjectConverterUtil { public class ObjectConverterUtil {
// 日期时间格式
private static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/** /**
* List<Map> 中的大写字段名转换为与实体类一致的小写格式 * List<Map> 中的大写字段名转换为与实体类一致的小写格式
* 适用于 Oracle 数据库查询结果转换 * 适用于 Oracle 数据库查询结果转换
* 时间类型字段会转换为字符串格式
* *
* @param entityClass 实体类 Class 对象 * @param entityClass 实体类 Class 对象
* @param sourceList 源数据列表字段名为大写 * @param sourceList 源数据列表字段名为大写
@ -22,10 +30,11 @@ public class ObjectConverterUtil {
return sourceList; return sourceList;
} }
// 获取实体类的所有字段名小写驼峰命名 // 获取实体类的所有字段及类型
Set<String> entityFieldNames = Arrays.stream(entityClass.getDeclaredFields()) Map<String, Field> fieldMap = new HashMap<>();
.map(field -> field.getName()) for (Field field : entityClass.getDeclaredFields()) {
.collect(Collectors.toSet()); fieldMap.put(field.getName(), field);
}
// 转换每个 Map // 转换每个 Map
return sourceList.stream().map(sourceMap -> { return sourceList.stream().map(sourceMap -> {
@ -38,9 +47,18 @@ public class ObjectConverterUtil {
// 将大写列名转为小写 // 将大写列名转为小写
String lowerCaseName = dbColumnName.toLowerCase(); String lowerCaseName = dbColumnName.toLowerCase();
// 如果实体类中有对应的字段使用实体类的字段名 // 如果实体类中有对应的字段
if (entityFieldNames.contains(lowerCaseName)) { 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); targetMap.put(lowerCaseName, value);
}
} else { } else {
// 如果实体类中没有对应字段保留原列名转小写 // 如果实体类中没有对应字段保留原列名转小写
targetMap.put(lowerCaseName, value); targetMap.put(lowerCaseName, value);
@ -53,6 +71,7 @@ public class ObjectConverterUtil {
/** /**
* 通用方法将单个 Map 的大写字段转换为实体类格式 * 通用方法将单个 Map 的大写字段转换为实体类格式
* 时间类型字段会转换为字符串格式
* *
* @param entityClass 实体类 Class 对象 * @param entityClass 实体类 Class 对象
* @param sourceMap Map字段名为大写 * @param sourceMap Map字段名为大写
@ -66,10 +85,11 @@ public class ObjectConverterUtil {
return sourceMap; return sourceMap;
} }
// 获取实体类的所有字段名 // 获取实体类的所有字段及类型
Set<String> entityFieldNames = Arrays.stream(entityClass.getDeclaredFields()) Map<String, Field> fieldMap = new HashMap<>();
.map(Field::getName) for (Field field : entityClass.getDeclaredFields()) {
.collect(Collectors.toSet()); fieldMap.put(field.getName(), field);
}
Map<String, Object> targetMap = new HashMap<>(); Map<String, Object> targetMap = new HashMap<>();
@ -81,12 +101,49 @@ public class ObjectConverterUtil {
String lowerCaseName = dbColumnName.toLowerCase(); String lowerCaseName = dbColumnName.toLowerCase();
// 验证字段是否存在于实体类中 // 验证字段是否存在于实体类中
if (entityFieldNames.contains(lowerCaseName)) { 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); targetMap.put(lowerCaseName, value);
} }
} }
}
return targetMap; return targetMap;
} }
/**
* 格式化时间类型值为字符串
*
* @param value 时间值可能是 TimestampDate 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();
}
}
} }