diff --git a/src/main/java/com/nov/KgLowDurable/controller/MenuController.java b/src/main/java/com/nov/KgLowDurable/controller/MenuController.java index f98925d..8748ea9 100644 --- a/src/main/java/com/nov/KgLowDurable/controller/MenuController.java +++ b/src/main/java/com/nov/KgLowDurable/controller/MenuController.java @@ -27,6 +27,7 @@ package com.nov.KgLowDurable.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.nov.KgLowDurable.common.TreeNode; +import com.nov.KgLowDurable.pojo.entity.Kv; import com.nov.KgLowDurable.pojo.entity.Menu; import com.nov.KgLowDurable.pojo.vo.MenuVO; import com.nov.KgLowDurable.service.IMenuService; @@ -128,7 +129,9 @@ public class MenuController { @ApiOperation(value = "新增或修改", notes = "传入menu") public Result submit( @RequestBody Menu menu) { if (menuService.submit(menu)) { - return Result.OK(); + // 返回懒加载树更新节点所需字段 + Kv kv = Kv.create().set("id", String.valueOf(menu.getId())); + return Result.OK(kv); } return Result.error("操作失败"); } diff --git a/src/main/java/com/nov/KgLowDurable/controller/RoleController.java b/src/main/java/com/nov/KgLowDurable/controller/RoleController.java index 8f78950..1e72a24 100644 --- a/src/main/java/com/nov/KgLowDurable/controller/RoleController.java +++ b/src/main/java/com/nov/KgLowDurable/controller/RoleController.java @@ -147,11 +147,10 @@ public class RoleController { /** * 获取现有角色别名列表 */ -// @GetMapping("/alias") -// @ApiOperationSupport(order = 9) -// @Operation(summary = "获取角色别名", description = "获取角色别名") -// public R> alias() { -// return R.data(roleService.alias(AuthUtil.getTenantId())); -// } + @GetMapping("/alias") + @ApiOperation(value = "获取角色别名", notes = "获取角色别名") + public Result> alias() { + return Result.OK(roleService.alias()); + } } diff --git a/src/main/java/com/nov/KgLowDurable/service/IRoleService.java b/src/main/java/com/nov/KgLowDurable/service/IRoleService.java index 9caf2e3..541ea73 100644 --- a/src/main/java/com/nov/KgLowDurable/service/IRoleService.java +++ b/src/main/java/com/nov/KgLowDurable/service/IRoleService.java @@ -124,7 +124,7 @@ public interface IRoleService extends IService { * @param tenantId 租户id * @return 别名列表 */ - List alias(String tenantId); + List alias(); } diff --git a/src/main/java/com/nov/KgLowDurable/service/Impl/LdDictServiceImpl.java b/src/main/java/com/nov/KgLowDurable/service/Impl/LdDictServiceImpl.java index 58b8f0b..eca1998 100644 --- a/src/main/java/com/nov/KgLowDurable/service/Impl/LdDictServiceImpl.java +++ b/src/main/java/com/nov/KgLowDurable/service/Impl/LdDictServiceImpl.java @@ -36,10 +36,7 @@ import com.nov.KgLowDurable.mapper.LdDictMapper; import com.nov.KgLowDurable.pojo.entity.LdDict; import com.nov.KgLowDurable.pojo.vo.LdDictVO; import com.nov.KgLowDurable.service.ILdDictService; -import com.nov.KgLowDurable.util.CommonConstant; -import com.nov.KgLowDurable.util.Condition; -import com.nov.KgLowDurable.util.ForestNodeMerger; -import com.nov.KgLowDurable.util.Query; +import com.nov.KgLowDurable.util.*; import com.nov.KgLowDurable.wrapper.LdDictWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -89,7 +86,15 @@ public class LdDictServiceImpl extends ServiceImpl impleme throw new MybatisPlusException("当前字典键值已存在!"); } } - dict.setIsDeleted(0); + // 修改顶级字典后同步更新下属字典的编号 + if (Func.isNotEmpty(dict.getId()) && dict.getParentId().longValue() == BladeConstant.TOP_PARENT_ID) { + LdDict parent = baseMapper.selectById(dict.getId()); + this.update(Wrappers.update().lambda().set(LdDict::getCode, dict.getCode()).eq(LdDict::getCode, parent.getCode()).ne(LdDict::getParentId, BladeConstant.TOP_PARENT_ID)); + } + if (Func.isEmpty(dict.getParentId())) { + dict.setParentId(BladeConstant.TOP_PARENT_ID); + } + dict.setIsDeleted(BladeConstant.DB_NOT_DELETED); //CacheUtil.clear(DICT_CACHE, Boolean.FALSE); return saveOrUpdate(dict); } diff --git a/src/main/java/com/nov/KgLowDurable/service/Impl/RoleServiceImpl.java b/src/main/java/com/nov/KgLowDurable/service/Impl/RoleServiceImpl.java index 9e7ff30..98cea1b 100644 --- a/src/main/java/com/nov/KgLowDurable/service/Impl/RoleServiceImpl.java +++ b/src/main/java/com/nov/KgLowDurable/service/Impl/RoleServiceImpl.java @@ -237,9 +237,9 @@ public class RoleServiceImpl extends ServiceImpl implements IR } @Override - public List alias(String tenantId) { + public List alias() { // 获取所有角色数据 - List roles = baseMapper.selectList(Wrappers.lambdaQuery().eq(Role::getTenantId, tenantId)); + List roles = baseMapper.selectList(Wrappers.lambdaQuery()); // 根据 roleAlias 对角色进行分组 Map> aliasToNamesMap = roles.stream() diff --git a/src/main/java/com/nov/KgLowDurable/util/ConcurrentDateFormat.java b/src/main/java/com/nov/KgLowDurable/util/ConcurrentDateFormat.java new file mode 100644 index 0000000..4377526 --- /dev/null +++ b/src/main/java/com/nov/KgLowDurable/util/ConcurrentDateFormat.java @@ -0,0 +1,64 @@ +package com.nov.KgLowDurable.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Queue; +import java.util.TimeZone; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class ConcurrentDateFormat { + private final String format; + private final Locale locale; + private final TimeZone timezone; + private final Queue queue = new ConcurrentLinkedQueue(); + + private ConcurrentDateFormat(String format, Locale locale, TimeZone timezone) { + this.format = format; + this.locale = locale; + this.timezone = timezone; + SimpleDateFormat initial = this.createInstance(); + this.queue.add(initial); + } + + public static ConcurrentDateFormat of(String format) { + return new ConcurrentDateFormat(format, Locale.getDefault(), TimeZone.getDefault()); + } + + public static ConcurrentDateFormat of(String format, TimeZone timezone) { + return new ConcurrentDateFormat(format, Locale.getDefault(), timezone); + } + + public static ConcurrentDateFormat of(String format, Locale locale, TimeZone timezone) { + return new ConcurrentDateFormat(format, locale, timezone); + } + + public String format(Date date) { + SimpleDateFormat sdf = (SimpleDateFormat)this.queue.poll(); + if (sdf == null) { + sdf = this.createInstance(); + } + + String result = sdf.format(date); + this.queue.add(sdf); + return result; + } + + public Date parse(String source) throws ParseException { + SimpleDateFormat sdf = (SimpleDateFormat)this.queue.poll(); + if (sdf == null) { + sdf = this.createInstance(); + } + + Date result = sdf.parse(source); + this.queue.add(sdf); + return result; + } + + private SimpleDateFormat createInstance() { + SimpleDateFormat sdf = new SimpleDateFormat(this.format, this.locale); + sdf.setTimeZone(this.timezone); + return sdf; + } +} \ No newline at end of file diff --git a/src/main/java/com/nov/KgLowDurable/util/Condition.java b/src/main/java/com/nov/KgLowDurable/util/Condition.java index 3ad5b2a..7d522ef 100644 --- a/src/main/java/com/nov/KgLowDurable/util/Condition.java +++ b/src/main/java/com/nov/KgLowDurable/util/Condition.java @@ -63,7 +63,7 @@ public class Condition { }); QueryWrapper qw = new QueryWrapper(); qw.setEntity(BeanUtil.newInstance(clazz)); - buildCondition(query, qw); + SqlKeyword.buildCondition(query, qw); return qw; } public static Set getClassFieldNames(Class clazz) { diff --git a/src/main/java/com/nov/KgLowDurable/util/DateUtil.java b/src/main/java/com/nov/KgLowDurable/util/DateUtil.java new file mode 100644 index 0000000..29bfef8 --- /dev/null +++ b/src/main/java/com/nov/KgLowDurable/util/DateUtil.java @@ -0,0 +1,25 @@ +package com.nov.KgLowDurable.util; + +import com.nov.KgLowDurable.exception.CustomerException; + +import java.text.ParseException; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class DateUtil { + + public static final ConcurrentDateFormat DATETIME_FORMAT = ConcurrentDateFormat.of("yyyy-MM-dd HH:mm:ss"); + public static final ConcurrentDateFormat DATETIME_MINI_FORMAT = ConcurrentDateFormat.of("yyyyMMddHHmmss"); + public static final ConcurrentDateFormat DATE_FORMAT = ConcurrentDateFormat.of("yyyy-MM-dd"); + public static final ConcurrentDateFormat TIME_FORMAT = ConcurrentDateFormat.of("HH:mm:ss"); + + public static Date parse(String dateStr, String pattern) { + ConcurrentDateFormat format = ConcurrentDateFormat.of(pattern); + + try { + return format.parse(dateStr); + } catch (ParseException var4) { + throw new CustomerException("系统错误"); + } + } +} diff --git a/src/main/java/com/nov/KgLowDurable/util/Func.java b/src/main/java/com/nov/KgLowDurable/util/Func.java index 85d937f..50ed853 100644 --- a/src/main/java/com/nov/KgLowDurable/util/Func.java +++ b/src/main/java/com/nov/KgLowDurable/util/Func.java @@ -70,4 +70,24 @@ public class Func { public static List toStrList(String str) { return Arrays.asList(toStrArray(str)); } + + public static boolean isEmpty(@Nullable Object obj) { + return ObjectUtil.isEmpty(obj); + } + public static boolean hasEmpty(Object... os) { + Object[] var1 = os; + int var2 = os.length; + + for(int var3 = 0; var3 < var2; ++var3) { + Object o = var1[var3]; + if (isEmpty(o)) { + return true; + } + } + + return false; + } + public static boolean isNotEmpty(@Nullable Object obj) { + return !ObjectUtil.isEmpty(obj); + } } diff --git a/src/main/java/com/nov/KgLowDurable/util/ObjectUtil.java b/src/main/java/com/nov/KgLowDurable/util/ObjectUtil.java new file mode 100644 index 0000000..1bea38c --- /dev/null +++ b/src/main/java/com/nov/KgLowDurable/util/ObjectUtil.java @@ -0,0 +1,14 @@ +package com.nov.KgLowDurable.util; + +import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; + +public class ObjectUtil extends ObjectUtils { + public ObjectUtil() { + } + + public static boolean isNotEmpty(@Nullable Object obj) { + return !isEmpty(obj); + } +} + diff --git a/src/main/java/com/nov/KgLowDurable/util/SqlKeyword.java b/src/main/java/com/nov/KgLowDurable/util/SqlKeyword.java new file mode 100644 index 0000000..8ed3215 --- /dev/null +++ b/src/main/java/com/nov/KgLowDurable/util/SqlKeyword.java @@ -0,0 +1,109 @@ +package com.nov.KgLowDurable.util; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.nov.KgLowDurable.exception.CustomerException; + +import java.sql.SQLException; +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.regex.Pattern; + +public class SqlKeyword { + private static final String SQL_REGEX = "(?i)(? query, QueryWrapper qw) { + if (!Func.isEmpty(query)) { + query.forEach((k, v) -> { + if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) { + k = filter(k); + if (k.endsWith("_equal")) { + qw.eq(getColumn(k, "_equal"), v); + } else if (k.endsWith("_notequal")) { + qw.ne(getColumn(k, "_notequal"), v); + } else if (k.endsWith("_likeleft")) { + qw.likeLeft(getColumn(k, "_likeleft"), v); + } else if (k.endsWith("_likeright")) { + qw.likeRight(getColumn(k, "_likeright"), v); + } else if (k.endsWith("_notlike")) { + qw.notLike(getColumn(k, "_notlike"), v); + } else if (k.endsWith("_ge")) { + qw.ge(getColumn(k, "_ge"), v); + } else if (k.endsWith("_le")) { + qw.le(getColumn(k, "_le"), v); + } else if (k.endsWith("_gt")) { + qw.gt(getColumn(k, "_gt"), v); + } else if (k.endsWith("_lt")) { + qw.lt(getColumn(k, "_lt"), v); + } else if (k.endsWith("_datege")) { + qw.ge(getColumn(k, "_datege"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); + } else if (k.endsWith("_dategt")) { + qw.gt(getColumn(k, "_dategt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); + } else if (k.endsWith("_dateequal")) { + qw.eq(getColumn(k, "_dateequal"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); + } else if (k.endsWith("_datele")) { + qw.le(getColumn(k, "_datele"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); + } else if (k.endsWith("_datelt")) { + qw.lt(getColumn(k, "_datelt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); + } else if (k.endsWith("_null")) { + qw.isNull(getColumn(k, "_null")); + } else if (k.endsWith("_notnull")) { + qw.isNotNull(getColumn(k, "_notnull")); + } else { + qw.like(getColumn(k, "_like"), v); + } + + } + }); + } + } + + private static String getColumn(String column, String keyword) { + return StringUtil.humpToUnderline(StringUtil.removeSuffix(column, keyword)); + } + + public static String filter(String param) { + try { + String cleaned = StringUtil.cleanIdentifier(param); + if (cleaned == null) { + throw new SQLException("SQL keyword is empty!"); + } else { + String sql = cleaned.replaceAll("(?i)(? { public List listNodeVO(List list) { List collect = list.stream().map(LdDict -> BeanUtil.copyProperties(LdDict, LdDictVO.class)).collect(Collectors.toList()); return ForestNodeMerger.mergeDict(collect); - //return collect; } }