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.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;
|
||||
|
||||
@ -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()); //循环获取下一子集
|
||||
|
||||
@ -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)) {
|
||||
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<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)) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user