fix: 优化组织和菜单原有逻辑
This commit is contained in:
parent
617d2832ce
commit
504196babe
@ -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;
|
||||||
|
|||||||
@ -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()); //循环获取下一子集
|
||||||
|
|||||||
@ -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)) {
|
||||||
targetMap.put(lowerCaseName, value);
|
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 {
|
} 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)) {
|
||||||
targetMap.put(lowerCaseName, value);
|
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;
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user