diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/rest/MenuController.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/rest/MenuController.java index 5893b37bb..e4ef2e15f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/sso/system/rest/MenuController.java +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/rest/MenuController.java @@ -100,14 +100,14 @@ public class MenuController { @ApiOperation("查询菜单") @SaCheckPermission("menu:list") public ResponseEntity pageQuery(@RequestParam Map whereJson, Pageable page) throws Exception { - Object system_type = whereJson.get("system_type"); - if (system_type!=null && whereJson.get("pid") == null){ - JSONObject jsonObject = WQLObject.getWQLObject("sys_dict").query("code = 'system_type' and value = '" + system_type + "'").uniqueResult(0); - if (jsonObject==null || jsonObject.getString("para1") ==null){ - throw new BadRequestException("字典表没有配置system_type系统相关参数"); - } - whereJson.put("pid",jsonObject.getString("para1")); - } +// Object system_type = whereJson.get("system_type"); +// if (system_type!=null && whereJson.get("pid") == null){ +// JSONObject jsonObject = WQLObject.getWQLObject("sys_dict").query("code = 'system_type' and value = '" + system_type + "'").uniqueResult(0); +// if (jsonObject==null || jsonObject.getString("para1") ==null){ +// throw new BadRequestException("字典表没有配置system_type系统相关参数"); +// } +// whereJson.put("pid",jsonObject.getString("para1")); +// } JSONObject param = JSONObject.parseObject(JSON.toJSONString(whereJson)); JSONObject menuDtoList = menuService.queryAll(param, page); return new ResponseEntity<>(menuDtoList, HttpStatus.OK); diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/impl/MenuServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/impl/MenuServiceImpl.java index 959fda828..582ff4a00 100644 --- a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/impl/MenuServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/impl/MenuServiceImpl.java @@ -5,18 +5,24 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.util.SpringContextHolder; import org.nl.sso.system.domain.vo.MenuMetaVo; import org.nl.sso.system.domain.vo.MenuVo; import org.nl.sso.system.service.MenuService; import org.nl.sso.system.service.dto.MenuDto; +import org.nl.sso.system.service.menushook.event.CE; +import org.nl.sso.system.service.menushook.event.DE; +import org.nl.sso.system.service.menushook.event.UE; import org.nl.sso.tools.IdUtil; import org.nl.sso.tools.SecurityUtils; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; -import org.springframework.cache.annotation.CacheConfig; +import org.springframework.context.ApplicationContext; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,7 +40,12 @@ public class MenuServiceImpl implements MenuService { @Override public JSONObject queryAll(JSONObject param, Pageable page) throws Exception { - JSONObject json = WQL.getWO("QSYS_MENU01").addParam("flag", "1").addParam("system_type",param.getString("system_type")).addParam("pid", param.getString("pid")).pageQuery(WqlUtil.getHttpContext(page), ""); + param.put("flag", "1"); + String blutty = param.getString("blurry"); + if (StringUtils.isNotEmpty(blutty)){ + param.put("blurry","%"+blutty+"%"); + } + JSONObject json = WQL.getWO("QSYS_MENU01").addParamMap(param).pageQuery(WqlUtil.getHttpContext(page), ""); JSONArray content = json.getJSONArray("content"); JSONArray res = new JSONArray(); @@ -139,6 +150,7 @@ public class MenuServiceImpl implements MenuService { //根节点数据库存为null if ("0".equals(form.getString("pid"))) { form.remove("pid"); + SpringContextHolder.getApplicationContext().publishEvent(new CE(form)); } //外链外联菜单 if ("1".equals(form.getString("i_frame"))) { @@ -191,12 +203,19 @@ public class MenuServiceImpl implements MenuService { @Override @Transactional(rollbackFor = Exception.class) public void update(JSONObject form) { - WQLObject menuTab = WQLObject.getWQLObject("sys_menu"); - MenuDto newMenu = this.menuJsonToMenuDto(form); - if (newMenu.getMenu_id().equals(newMenu.getPid())) { + WQLObject menuTab = WQLObject.getWQLObject("sys_menu"); + if (form.getString("menu_id").equals(form.getString("pid"))) { throw new BadRequestException("上级不能为自己"); } + //根节点数据库存为null + if ("0".equals(form.getString("pid"))) { + form.put("pid",null); + SpringContextHolder.getApplicationContext().publishEvent(new UE(form)); + }else { + SpringContextHolder.getApplicationContext().publishEvent(new DE(Lists.newArrayList(form.getString("menu_id")))); + } + MenuDto newMenu = this.menuJsonToMenuDto(form); if (newMenu.getI_frame()) { String http = "http://", https = "https://"; @@ -204,10 +223,7 @@ public class MenuServiceImpl implements MenuService { throw new BadRequestException("外链必须以http://或者https://开头"); } } - //根节点数据库存为null - if ("0".equals(form.getString("pid"))) { - form.remove("pid"); - } + JSONObject oldMenuJson = menuTab.query("menu_id = '" + form.getString("menu_id") + "'").uniqueResult(0); MenuDto oldMenu = this.menuJsonToMenuDto(oldMenuJson); @@ -242,13 +258,17 @@ public class MenuServiceImpl implements MenuService { @Override @Transactional(rollbackFor = Exception.class) public void delete(Set menuSet) { + List list = new ArrayList<>(); for (MenuDto menu : menuSet) { // 清理缓存 + list.add(menu.getMenu_id()); delCaches(menu.getMenu_id()); // roleService.untiedMenu(menu.getMenu_id()); WQLObject.getWQLObject("sys_menu").delete("menu_id = '" + menu.getMenu_id() + "'"); updateSubCnt(menu.getPid()); + } + SpringContextHolder.getApplicationContext().publishEvent(new DE(list)); } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/SysMenuCUDHook.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/SysMenuCUDHook.java new file mode 100644 index 000000000..797be73d9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/SysMenuCUDHook.java @@ -0,0 +1,77 @@ +package org.nl.sso.system.service.menushook; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.sso.security.dto.CurrentUser; +import org.nl.sso.system.service.dto.MenuDto; +import org.nl.sso.system.service.menushook.event.CE; +import org.nl.sso.system.service.menushook.event.DE; +import org.nl.sso.system.service.menushook.event.SysTypeEvent; +import org.nl.sso.system.service.menushook.event.UE; +import org.nl.sso.tools.IdUtil; +import org.nl.sso.tools.MapOf; +import org.nl.sso.tools.SecurityUtils; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/* + * @author ZZQ + * @Date 2022/12/12 9:29 上午 + */ +@Component +public class SysMenuCUDHook implements ApplicationListener { + private static final String SYNC = "lock"; + + @Override + @Transactional + public void onApplicationEvent(SysTypeEvent event) { + if (event instanceof CE){ + JSONObject menu = (JSONObject)event.getSource(); + synchronized (SYNC){ + JSONArray arr = WQLObject.getWQLObject("sys_dict").query("code = 'system_type'", "value desc").getResultJSONArray(0); + Integer currentType = 0; + if (arr.size()>0){ + currentType = arr.getJSONObject(0).getInteger("value"); + } + HashMap map = MapOf.of("dict_id", IdUtil.getLongId() + , "label", menu.get("title") + , "value", currentType + 1 + , "para1", menu.get("menu_id") + , "code", "system_type" + ,"name","所属系统" + ,"create_id", SecurityUtils.getCurrentUserId() + ,"create_name",SecurityUtils.getCurrentUsername(), DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + WQLObject.getWQLObject("sys_dict").insert(map); + menu.put("system_type",currentType+1); + } + } + if (event instanceof UE){ + JSONObject menu = (JSONObject)event.getSource(); + String pid = menu.getString("menu_id"); + JSONArray arr = WQLObject.getWQLObject("sys_dict").query("code = 'system_type'", "value desc").getResultJSONArray(0); + if (!arr.stream().filter(a->pid.equals(((JSONObject)a).getString("para1"))).findAny().isPresent()){ + JSONObject dict = arr.getJSONObject(0); + Integer currentType = dict.getInteger("value"); + menu.put("system_type",currentType+1); + dict.put("dict_id", IdUtil.getLongId()); + dict.put("label",menu.get("title")); + dict.put("value",currentType+1); + dict.put("para1",menu.get("menu_id")); + WQLObject.getWQLObject("sys_dict").insert(dict); + } + } + if (event instanceof DE){ + Collection source = (Collection) event.getSource(); + String sql = source.stream().collect(Collectors.joining("','")); + WQLObject.getWQLObject("sys_dict"). + delete("code = 'system_type' and para1 in ('"+sql+"')"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/CE.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/CE.java new file mode 100644 index 000000000..f9983d6cf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/CE.java @@ -0,0 +1,20 @@ +package org.nl.sso.system.service.menushook.event; + +import com.alibaba.fastjson.JSONObject; + +/* + * @author ZZQ + * @Date 2022/12/12 9:31 上午 + */ +public class CE extends SysTypeEvent { + + /** + * Create a new {@code ApplicationEvent}. + * + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public CE(JSONObject source) { + super(source); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/DE.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/DE.java new file mode 100644 index 000000000..7625d2278 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/DE.java @@ -0,0 +1,24 @@ +package org.nl.sso.system.service.menushook.event; + +import com.alibaba.fastjson.JSONObject; +import org.nl.sso.system.service.dto.MenuDto; + +import java.util.Collection; +import java.util.Set; + +/* + * @author ZZQ + * @Date 2022/12/12 9:31 上午 + */ +public class DE extends SysTypeEvent { + + /** + * Create a new {@code ApplicationEvent}. + * + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public DE(Collection source) { + super(source); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/SysTypeEvent.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/SysTypeEvent.java new file mode 100644 index 000000000..43f98e554 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/SysTypeEvent.java @@ -0,0 +1,20 @@ +package org.nl.sso.system.service.menushook.event; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.context.ApplicationEvent; + +/* + * @author ZZQ + * @Date 2022/12/12 9:32 上午 + */ +public class SysTypeEvent extends ApplicationEvent { + /** + * Create a new {@code ApplicationEvent}. + * + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public SysTypeEvent(Object source) { + super(source); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/UE.java b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/UE.java new file mode 100644 index 000000000..b2ba96f3d --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/service/menushook/event/UE.java @@ -0,0 +1,20 @@ +package org.nl.sso.system.service.menushook.event; + +import com.alibaba.fastjson.JSONObject; + +/* + * @author ZZQ + * @Date 2022/12/12 9:31 上午 + */ +public class UE extends SysTypeEvent { + + /** + * Create a new {@code ApplicationEvent}. + * + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public UE(JSONObject source) { + super(source); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/sso/system/wql/QSYS_MENU01.wql b/lms/nladmin-system/src/main/java/org/nl/sso/system/wql/QSYS_MENU01.wql index 7a779cf86..8e0382c64 100644 --- a/lms/nladmin-system/src/main/java/org/nl/sso/system/wql/QSYS_MENU01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/sso/system/wql/QSYS_MENU01.wql @@ -56,11 +56,14 @@ OPTION 输入.system_type <> "" system_type = 输入.system_type ENDOPTION - OPTION 输入.blurry <> "" - title like "%" 输入.blurry "%" - ENDOPTION - OPTION 输入.pid <> "" + OPTION 输入.pid <> "" pid = 输入.pid + ENDOPTION + OPTION 输入.pid = "" + pid is null + ENDOPTION + OPTION 输入.blurry <> "" + title like 输入.blurry ENDOPTION ENDSELECT ENDPAGEQUERY