Browse Source

优化层级菜单获取

lighter 4 years ago
parent
commit
971c44aa99

+ 3 - 0
src/main/java/thyyxxk/webserver/dao/his/settings/SettingsDao.java

@@ -85,6 +85,9 @@ public interface SettingsDao {
     @Select("select * from dj_dict_menu where parent=#{code}")
     List<MenuItem> getMenusByParent(@Param("code") Integer code);
 
+    @Select("select * from dj_dict_menu")
+    List<MenuItem> selectAllMenus();
+
     @Select("select code from dj_dict_menu where code in (select menu_code from dj_role_menu where role_id=#{id})")
     List<Integer> getRoleMenus(@Param("id") Integer id);
 

+ 3 - 62
src/main/java/thyyxxk/webserver/service/LoginService.java

@@ -13,6 +13,7 @@ import thyyxxk.webserver.entity.settings.permissions.MenuItem;
 import thyyxxk.webserver.utils.ResultVoUtil;
 import thyyxxk.webserver.utils.SnowFlakeId;
 import thyyxxk.webserver.utils.TokenUtil;
+import thyyxxk.webserver.utils.TreeUtil;
 
 import java.util.*;
 
@@ -55,72 +56,12 @@ public class LoginService {
     }
 
     public ResultVo<List<MenuItem>> fetchMenus() {
-        Map<Integer, MenuItem> finalMap = new HashMap<>(Capacity.DEFAULT);
         List<Integer> roles = dao.getUserRoles(TokenUtil.getTokenUserId());
         if (null == roles || roles.isEmpty()) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请联系管理员为您分配角色权限。");
         }
-        List<MenuItem> userMenus = dao.selectMenusByRoles(roles);
-        List<MenuItem> doubleLevelMenus = new ArrayList<>();
-        List<MenuItem> tripleLevelMenus = new ArrayList<>();
-        userMenus.forEach(item -> {
-            if (item.getParent() > DOUBLE_LEVEL_MAX) {
-                tripleLevelMenus.add(item);
-            } else {
-                doubleLevelMenus.add(item);
-            }
-        });
-        if (!doubleLevelMenus.isEmpty()) {
-            Map<Integer, List<MenuItem>> doubleLevelMap = new HashMap<>(Capacity.DEFAULT);
-            doubleLevelMenus.forEach(item -> {
-                if (doubleLevelMap.containsKey(item.getParent())) {
-                    doubleLevelMap.get(item.getParent()).add(item);
-                } else {
-                    List<MenuItem> tempList = new ArrayList<>();
-                    tempList.add(item);
-                    doubleLevelMap.put(item.getParent(), tempList);
-                }
-            });
-            for (Map.Entry<Integer, List<MenuItem>> entry : doubleLevelMap.entrySet()) {
-                MenuItem item = dao.selectMenuByCode(entry.getKey());
-                item.setChildren(entry.getValue());
-                finalMap.put(item.getCode(), item);
-            }
-        }
-        if (!tripleLevelMenus.isEmpty()) {
-            Map<Integer, List<MenuItem>> tripleLevelMap = new HashMap<>(Capacity.DEFAULT);
-            tripleLevelMenus.forEach(item -> {
-                if (tripleLevelMap.containsKey(item.getParent())) {
-                    tripleLevelMap.get(item.getParent()).add(item);
-                } else {
-                    List<MenuItem> tempList = new ArrayList<>();
-                    tempList.add(item);
-                    tripleLevelMap.put(item.getParent(), tempList);
-                }
-            });
-            for (Map.Entry<Integer, List<MenuItem>> entry : tripleLevelMap.entrySet()) {
-                MenuItem item = dao.selectMenuByCode(entry.getKey());
-                item.setChildren(entry.getValue());
-                if (null == finalMap.get(item.getParent())) {
-                    finalMap.put(item.getParent(), item);
-                } else {
-                    finalMap.get(item.getParent()).getChildren().add(item);
-                }
-            }
-        }
-        List<MenuItem> list = new ArrayList<>();
-        MenuItem settings = null;
-        for (Map.Entry<Integer, MenuItem> entry : finalMap.entrySet()) {
-            if (entry.getValue().getCode() == SETTINGS_CODE) {
-                settings = entry.getValue();
-            } else {
-                list.add(entry.getValue());
-            }
-        }
-        if (null != settings) {
-            list.add(settings);
-        }
-        return ResultVoUtil.success(list);
+        List<MenuItem> tempList = dao.selectMenusByRoles(roles);
+        return TreeUtil.getMenuTree(tempList);
     }
 
     public ResultVo<List<CodeName>> getWards() {

+ 6 - 25
src/main/java/thyyxxk/webserver/service/settings/SettingsService.java

@@ -10,6 +10,7 @@ import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.dao.his.settings.SettingsDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.login.UserInfo;
+import thyyxxk.webserver.entity.reports.illegalchargesanalysis.IllegalChargeTemplate;
 import thyyxxk.webserver.entity.settings.deptphones.DeptPhones;
 import thyyxxk.webserver.entity.settings.permissions.*;
 import thyyxxk.webserver.entity.settings.users.ChangePwdParam;
@@ -17,10 +18,13 @@ import thyyxxk.webserver.entity.settings.users.WorkIntegrationPlatformAdvice;
 import thyyxxk.webserver.utils.ResultVoUtil;
 import thyyxxk.webserver.utils.StringUtil;
 import thyyxxk.webserver.utils.TokenUtil;
+import thyyxxk.webserver.utils.TreeUtil;
 import thyyxxk.webserver.websocket.WebSocketServer;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author dj
@@ -128,31 +132,8 @@ public class SettingsService {
     }
 
     public ResultVo<List<MenuItem>> getAllMenus() {
-        List<MenuItem> tree = new ArrayList<>();
-        List<MenuItem> topLevelMenus = dao.getMenusByParent(0);
-        for (MenuItem topLevel : topLevelMenus) {
-            List<MenuItem> secondLevelMenus = dao.getMenusByParent(topLevel.getCode());
-            if (null == secondLevelMenus || secondLevelMenus.isEmpty()) {
-                continue;
-            }
-            for (MenuItem second : secondLevelMenus) {
-                List<MenuItem> thirdLevelMenus = dao.getMenusByParent(second.getCode());
-                if (null == thirdLevelMenus || thirdLevelMenus.isEmpty()) {
-                    continue;
-                }
-                for (MenuItem third : thirdLevelMenus) {
-                    List<MenuItem> forthLevelMenus = dao.getMenusByParent(third.getCode());
-                    if (null == forthLevelMenus || forthLevelMenus.isEmpty()) {
-                        continue;
-                    }
-                    third.setChildren(forthLevelMenus);
-                }
-                second.setChildren(thirdLevelMenus);
-            }
-            topLevel.setChildren(secondLevelMenus);
-            tree.add(topLevel);
-        }
-        return ResultVoUtil.success(tree);
+        List<MenuItem> tempList = dao.selectAllMenus();
+        return TreeUtil.getMenuTree(tempList);
     }
 
     public ResultVo<List<Integer>> getRoleMenus(Integer id) {

+ 38 - 0
src/main/java/thyyxxk/webserver/utils/TreeUtil.java

@@ -0,0 +1,38 @@
+package thyyxxk.webserver.utils;
+
+import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.settings.permissions.MenuItem;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description: 层级菜单工具
+ * @author: DingJie
+ * @create: 2021/8/1016:09
+ */
+public class TreeUtil {
+
+    public static ResultVo<List<MenuItem>> getMenuTree(List<MenuItem> tempList) {
+        List<MenuItem> resultList = new ArrayList<>();
+        Map<Integer, MenuItem> treeMap = new HashMap<>(tempList.size());
+        for (MenuItem item : tempList) {
+            treeMap.put(item.getCode(), item);
+            if (0 == item.getParent()) {
+                resultList.add(item);
+            }
+        }
+        for (MenuItem item : tempList) {
+            MenuItem template = treeMap.get(item.getParent());
+            if (null != template) {
+                if (null == template.getChildren()) {
+                    template.setChildren(new ArrayList<>());
+                }
+                template.getChildren().add(item);
+            }
+        }
+        return ResultVoUtil.success(resultList);
+    }
+}

+ 0 - 58
src/main/java/thyyxxk/webserver/ztest/circleQueue/TaskHolder.java

@@ -1,58 +0,0 @@
-package thyyxxk.webserver.ztest.circleQueue;
-
-/**
- * @description: task holder
- * @author: DingJie
- * @create: 2021-05-08 15:43:13
- **/
-public class TaskHolder {
-    /** 任务所需等待的圈数,即任务需要走几圈**/
-    private int cycles;
-    private int delays;
-    private Runnable task;
-
-    public TaskHolder() {}
-
-    public TaskHolder(int cycles, int delays, Runnable task) {
-        this.cycles = cycles;
-        this.delays = delays;
-        this.task = task;
-    }
-
-    public boolean isTimeOut() {
-        return cycles <= 0;
-    }
-
-    public void cutDown() {
-        cycles --;
-    }
-
-    public int getCycles() {
-        return cycles;
-    }
-
-    public void setCycles(int cycles) {
-        this.cycles = cycles;
-    }
-
-    public int getDelays() {
-        return delays;
-    }
-
-    public void setDelays(int delays) {
-        this.delays = delays;
-    }
-
-    public Runnable getTask() {
-        return task;
-    }
-
-    public void setTask(Runnable task) {
-        this.task = task;
-    }
-
-    @Override
-    public String toString() {
-        return "TaskHolder[cycles=" + cycles + ", delays=" + delays + "]";
-    }
-}

+ 0 - 99
src/main/java/thyyxxk/webserver/ztest/circleQueue/TimerContext.java

@@ -1,99 +0,0 @@
-package thyyxxk.webserver.ztest.circleQueue;
-
-import java.util.Map;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- * @description: timer context
- * @author: DingJie
- * @create: 2021-05-08 15:44:36
- **/
-public class TimerContext {
-    public static final int DEFAULT_TICKS = 60;
-    public static final int DEFAULT_TICK_DURATION = 1;
-
-    private Map<Integer, Queue<TaskHolder>> taskHolders;
-    private volatile int currentTick = 0;
-
-    /** tick一圈的长度 **/
-    private int ticks = DEFAULT_TICKS;
-
-    /** 每tick一次的时间间隔,单位:秒**/
-    private int tickDuration = DEFAULT_TICK_DURATION;
-
-    public TimerContext() {
-        init();
-    }
-
-    public TimerContext(int ticks, int tickDuration) {
-        if (ticks <= 0) {
-            throw new IllegalArgumentException("ticks must be greater than 0");
-        }
-
-        if (tickDuration <= 0) {
-            throw new IllegalArgumentException("tickDuration must be greater than 0");
-        }
-
-        this.ticks = ticks;
-        this.tickDuration = tickDuration;
-        init();
-    }
-
-    private void init() {
-        taskHolders = new ConcurrentHashMap<>();
-        for (int i = 0; i < ticks; i ++) {
-            taskHolders.put(i, new ConcurrentLinkedQueue<>());
-        }
-    }
-
-    /**
-     * 添加一个定时任务并计算需要走的圈数和落脚的index
-     */
-    public void addTask(Runnable task, int delays) {
-        if (task == null) {
-            throw new NullPointerException("task must not be null");
-        }
-
-        if (delays <=0) {
-            throw new IllegalArgumentException("delays must be greater than 0");
-        }
-
-        int allSeconds = ticks * tickDuration;
-        int cycles = delays / allSeconds;
-        int index = ((delays % allSeconds) / tickDuration) + currentTick;
-        TaskHolder metaData = new TaskHolder(cycles, delays, task);
-        Queue<TaskHolder> tasks = taskHolders.get(index);
-        synchronized (this) {
-            tasks.add(metaData);
-        }
-    }
-
-    public int tick() {
-        currentTick = (currentTick + 1) % ticks;
-        return currentTick;
-    }
-
-    public Queue<TaskHolder> getCurrentTasks() {
-        return taskHolders.get(currentTick);
-    }
-
-    public int getCurrentTick() {
-        return currentTick;
-    }
-
-    public int getTicks() {
-        return ticks;
-    }
-
-    public int getTickDuration() {
-        return tickDuration;
-    }
-
-    @Override
-    public String toString() {
-        return "TimerContext [timers=" + taskHolders + ", ticks=" + ticks + ", tickDuration=" + tickDuration
-                + ", currentTick=" + currentTick + "]";
-    }
-}

+ 0 - 71
src/main/java/thyyxxk/webserver/ztest/circleQueue/TimerScheduler.java

@@ -1,71 +0,0 @@
-package thyyxxk.webserver.ztest.circleQueue;
-
-import thyyxxk.webserver.utils.DateUtil;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Queue;
-import java.util.TimerTask;
-import java.util.concurrent.*;
-
-/**
- * @description: timer scheduler
- * @author: DingJie
- * @create: 2021-05-08 15:47:58
- **/
-public class TimerScheduler extends TimerTask {
-    private TimerContext timerContext;
-
-    public TimerScheduler(TimerContext timerContext) {
-        this.timerContext = timerContext;
-    }
-
-    /**
-     * 定时检测,如果定时器触发时间到了就从集合中删除并执行任务,否则圈数减一。
-     */
-    @Override
-    public void run() {
-        if (timerContext == null) {
-            return;
-        }
-        Queue<TaskHolder> tasks = timerContext.getCurrentTasks();
-        synchronized (this) {
-            Iterator<TaskHolder> iterator = tasks.iterator();
-            while (iterator.hasNext()) {
-                TaskHolder timer = iterator.next();
-                if (timer.isTimeOut()) {
-                    iterator.remove();
-                    new Thread(timer.getTask()).start();
-                } else {
-                    timer.cutDown();
-                }
-            }
-
-        }
-        timerContext.tick();
-    }
-
-    public void addTask(Runnable task, int delays) {
-        timerContext.addTask(task, delays);
-    }
-
-    public TimerContext getTimerContext() {
-        return timerContext;
-    }
-
-    public void setTimerContext(TimerContext timerContext) {
-        this.timerContext = timerContext;
-    }
-
-    public static void main(String[] args) throws IOException {
-        TimerContext context = new TimerContext(60, 1);
-        TimerScheduler scheduler = new TimerScheduler(context);
-
-        scheduler.addTask(() -> System.out.println(DateUtil.now()), 3);
-
-        System.out.println(DateUtil.now());
-
-        ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1);
-        scheduledService.scheduleAtFixedRate(scheduler, 0, context.getTickDuration(), TimeUnit.SECONDS);
-    }
-}