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.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<SysMenuMapper, SysMenu> impl
public List<Map<String, Object>> getMenuButtonTree(String systemcode,
String name,
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)){//不带名称查询返回树结构
QueryWrapper<SysMenu> 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<Map<String, Object>> childList = child(listMap.get(i).get(
@ -79,11 +81,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
}else{ //根据菜单名称查询直接返回类别
QueryWrapper<SysMenu> 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<SysMenuMapper, SysMenu> impl
private List<Map<String, Object>> child(String parentid,
String systemcode, String name,
String isdisplay, String type) {
List<Map<String, Object>> listMap = new ArrayList<>();
List<Map<String, Object>> mapList;
QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode);
//根据上级id 系统 查询
@ -140,8 +140,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> 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<Map<String, Object>> listMap = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList);
if (!listMap.isEmpty()) { //判断是否存在子集
for (int i = 0; i < listMap.size(); i++) { //遍历表数据
List<Map<String, Object>> childList =
child(listMap.get(i).get("id").toString(), systemcode
@ -170,14 +171,16 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
sysMenu.setOrderno((int) orderno);
// 生成编号
QueryWrapper<SysMenu> queryMaxCode = new QueryWrapper<>();
queryMaxCode.eq("parentid",
parentId);
// 查询最大的编号
List<Object> maxList = this.listObjs(queryMaxCode.select("max(code) " +
"code").eq("systemcode", sysMenu.getSystemcode()));
queryMaxCode.eq("parentid", parentId);
// 使用 Oracle 兼容的 NVL 函数处理空值
List<Object> 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;

View File

@ -128,7 +128,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl<SysOrganizationMappe
QueryWrapper<SysOrganization> 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<Map<String, Object>> childList =
child(listMap.get(i).get("id").toString()); //循环获取下一子集

View File

@ -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<Map> 中的大写字段名转换为与实体类一致的小写格式
* 适用于 Oracle 数据库查询结果转换
* 时间类型字段会转换为字符串格式
*
* @param entityClass 实体类 Class 对象
* @param sourceList 源数据列表字段名为大写
@ -22,10 +30,11 @@ public class ObjectConverterUtil {
return sourceList;
}
// 获取实体类的所有字段名小写驼峰命名
Set<String> entityFieldNames = Arrays.stream(entityClass.getDeclaredFields())
.map(field -> field.getName())
.collect(Collectors.toSet());
// 获取实体类的所有字段及类型
Map<String, Field> 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)) {
// 如果实体类中有对应的字段
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<String> entityFieldNames = Arrays.stream(entityClass.getDeclaredFields())
.map(Field::getName)
.collect(Collectors.toSet());
// 获取实体类的所有字段及类型
Map<String, Field> fieldMap = new HashMap<>();
for (Field field : entityClass.getDeclaredFields()) {
fieldMap.put(field.getName(), field);
}
Map<String, Object> targetMap = new HashMap<>();
@ -81,12 +101,49 @@ public class ObjectConverterUtil {
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);
}
}
}
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();
}
}
}