| package com.moral.api.service.impl; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| import com.moral.api.entity.ManageMenu; | 
| import com.moral.api.entity.ManageRole; | 
| import com.moral.api.mapper.ManageMenuMapper; | 
| import com.moral.api.mapper.ManageRoleMenuMapper; | 
| import com.moral.api.service.ManageMenuService; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import com.moral.api.util.LogUtils; | 
| import com.moral.constant.Constants; | 
| import com.moral.constant.ResponseCodeEnum; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
| import org.springframework.util.ObjectUtils; | 
| import org.springframework.web.context.request.RequestContextHolder; | 
| import org.springframework.web.context.request.ServletRequestAttributes; | 
|   | 
| import javax.annotation.Resource; | 
| import javax.servlet.http.HttpServletRequest; | 
| import java.text.SimpleDateFormat; | 
| import java.util.ArrayList; | 
| import java.util.HashMap; | 
| import java.util.List; | 
| import java.util.Map; | 
| import java.util.function.Predicate; | 
|   | 
| /** | 
|  * <p> | 
|  * 后台菜单 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author moral | 
|  * @since 2021-03-09 | 
|  */ | 
| @Service | 
| public class ManageMenuServiceImpl extends ServiceImpl<ManageMenuMapper, ManageMenu> implements ManageMenuService { | 
|   | 
|     @Autowired(required = false) | 
|     private ManageMenuMapper manageMenuMapper; | 
|   | 
|     @Autowired(required = false) | 
|     private ManageRoleMenuMapper manageRoleMenuMapper; | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public Map<String, Object> insertManageMenu(ManageMenu manageMenu) { | 
|         Map<String, Object> resultMap = new HashMap<>(); | 
|         if (manageMenu.getName() == null) { | 
|             resultMap.put("code", ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); | 
|             return resultMap; | 
|         } | 
|         if (manageMenuMapper.getManageMenuByName(manageMenu.getName()) != null) { | 
|             resultMap.put("code", ResponseCodeEnum.MENU_IS_EXIST.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.MENU_IS_EXIST.getMsg()); | 
|             return resultMap; | 
|         } | 
|         QueryWrapper<ManageMenu> wrapper_url = new QueryWrapper(); | 
|         wrapper_url.eq("url",manageMenu.getUrl()); | 
|         wrapper_url.eq("is_delete",Constants.NOT_DELETE); | 
|         if (manageMenuMapper.selectCount(wrapper_url) != 0) { | 
|             resultMap.put("code", ResponseCodeEnum.URL_IS_EXIST.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.URL_IS_EXIST.getMsg()); | 
|             return resultMap; | 
|         } | 
|         manageMenuMapper.insertOne(manageMenu); | 
|         //操作插入日志 | 
|         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | 
|         String content = "添加菜单:"+manageMenu.getName()+";"; | 
|         LogUtils.saveOperationForManage(request,content,Constants.INSERT_OPERATE_TYPE); | 
|         resultMap.put("code", ResponseCodeEnum.SUCCESS.getCode()); | 
|         resultMap.put("msg", ResponseCodeEnum.SUCCESS.getMsg()); | 
|         return resultMap; | 
|     } | 
|   | 
|     @Override | 
|     @Transactional | 
|     public Map<String, Object> updateManageMenu(Map map) { | 
|         Map<String, Object> resultMap = new HashMap<>(); | 
|         if (!map.containsKey("id")) { | 
|             resultMap.put("code", ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); | 
|             return resultMap; | 
|         } | 
|         if (manageMenuMapper.getManageMenuById(Integer.parseInt(map.get("id").toString())) == null) { | 
|             resultMap.put("code", ResponseCodeEnum.MENU_IS_NULL.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.MENU_IS_NULL.getMsg()); | 
|             return resultMap; | 
|         } | 
|         if (map.get("name")!=null && manageMenuMapper.getManageMenuByName(map.get("name").toString()) != null) { | 
|             resultMap.put("code", ResponseCodeEnum.MENU_IS_EXIST.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.MENU_IS_EXIST.getMsg()); | 
|             return resultMap; | 
|         } | 
|         QueryWrapper<ManageMenu> wrapper_url = new QueryWrapper(); | 
|         wrapper_url.eq("url",map.get("url")); | 
|         wrapper_url.eq("is_delete",Constants.NOT_DELETE); | 
|         if (manageMenuMapper.selectCount(wrapper_url) != 0) { | 
|             resultMap.put("code", ResponseCodeEnum.URL_IS_EXIST.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.URL_IS_EXIST.getMsg()); | 
|             return resultMap; | 
|         } | 
|         //更新之前获取原来的菜单信息 | 
|         ManageMenu manageMenuOld = manageMenuMapper.getManageMenuById(Integer.parseInt(map.get("id").toString())); | 
|         manageMenuMapper.updateManageMenuById(map); | 
|         //操作插入日志 | 
|         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | 
|         String content = "修改了菜单:"+manageMenuOld.getName()+";"; | 
|         for (Object key:map.keySet()) { | 
|             if (key.toString().equals("name")&&map.get(key)!=null){ | 
|                 content = content+"菜单名:"+manageMenuOld.getName()+"->"+map.get(key)+";"; | 
|             } | 
|             if (key.toString().equals("url")&&map.get(key)!=null){ | 
|                 content = content+"url地址:"+manageMenuOld.getUrl()+"->"+map.get(key)+";"; | 
|             } | 
|             if (key.toString().equals("icon")&&map.get(key)!=null){ | 
|                 content = content+"图标地址:"+manageMenuOld.getIcon()+"->"+map.get(key)+";"; | 
|             } | 
|             if (key.toString().equals("parent_id")&&map.get(key)!=null){ | 
|                 if (map.get(key).toString().equals("0")){ | 
|                     content = content+"父菜单:"+manageMenuMapper.getManageMenuById(manageMenuOld.getId()).getName()+"->0"+";"; | 
|                 }else if (manageMenuOld.getId().toString().equals("0")){ | 
|                     content = content+"父菜单:"+"0->"+manageMenuMapper.getManageMenuById(Integer.parseInt(map.get(key).toString())).getName()+";"; | 
|                 }else { | 
|                     content = content+"父菜单:"+manageMenuMapper.getManageMenuById(manageMenuOld.getId()).getName()+"->"+manageMenuMapper.getManageMenuById(Integer.parseInt(map.get(key).toString())).getName()+";"; | 
|                 } | 
|             } | 
|             if (key.toString().equals("order")&&map.get(key)!=null){ | 
|                 content = content+"同一级别菜单顺序:"+manageMenuOld.getOrder()+"->"+map.get(key)+";"; | 
|             } | 
|             if (key.toString().equals("desc")&&map.get(key)!=null){ | 
|                 content = content+"描述:"+manageMenuOld.getDesc()+"->"+map.get(key)+";"; | 
|             } | 
|         } | 
|         LogUtils.saveOperationForManage(request,content,Constants.UPDATE_OPERATE_TYPE); | 
|         resultMap.put("code", ResponseCodeEnum.SUCCESS.getCode()); | 
|         resultMap.put("msg", ResponseCodeEnum.SUCCESS.getMsg()); | 
|         return resultMap; | 
|     } | 
|   | 
|     @Override | 
|     @Transactional | 
|     public Map<String, Object> deleteManageMenu(Map map) { | 
|         Map<String, Object> resultMap = new HashMap<>(); | 
|         if (!map.containsKey("id")) { | 
|             resultMap.put("code", ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); | 
|             return resultMap; | 
|         } | 
|         if (manageMenuMapper.getManageMenuById(Integer.parseInt(map.get("id").toString())) == null) { | 
|             resultMap.put("code", ResponseCodeEnum.MENU_IS_NULL.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.MENU_IS_NULL.getMsg()); | 
|         } else { | 
|             //删除之前获取数据信息 | 
|             ManageMenu manageMenuDelete = manageMenuMapper.getManageMenuById(Integer.parseInt(map.get("id").toString())); | 
|             Map deleteMap = new HashMap(); | 
|             int id = Integer.parseInt(map.get("id").toString()); | 
|             deleteMap.put("id", id); | 
|             deleteMap.put("is_delete", 1); | 
|             manageMenuMapper.updateManageMenuById(deleteMap); | 
|             Map role_menuDeleteMap = new HashMap(); | 
|             role_menuDeleteMap.put("menu_id", id); | 
|             manageRoleMenuMapper.updateDeleteStateByMenu_id(role_menuDeleteMap); | 
|             //操作插入日志 | 
|             HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | 
|             String content = "删除菜单:"+manageMenuDelete.getName()+";"; | 
|             LogUtils.saveOperationForManage(request,content,Constants.DELETE_OPERATE_TYPE); | 
|             resultMap.put("code", ResponseCodeEnum.SUCCESS.getCode()); | 
|             resultMap.put("msg", ResponseCodeEnum.SUCCESS.getMsg()); | 
|         } | 
|         return resultMap; | 
|     } | 
|   | 
|     @Override | 
|     public List<Map<String,Object>> getAllWithPagingQuery(Map map) { | 
|         Map limitMap = new HashMap(); | 
|         limitMap.put("start", (Integer.parseInt(map.get("current").toString()) - 1) * Integer.parseInt(map.get("size").toString())); | 
|         limitMap.put("number", Integer.parseInt(map.get("size").toString())); | 
|         List<ManageMenu> manageMenus = manageMenuMapper.getDataWithPage(limitMap); | 
|         SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|         List<Map<String,Object>> resultList = new ArrayList<>(); | 
|         for (ManageMenu manageMenu:manageMenus) { | 
|             Map manegeMenuMap = JSON.parseObject(JSON.toJSONString(manageMenu)); | 
|             if (manageMenu.getParentId().equals(0)){ | 
|                 manegeMenuMap.put("parent_name",""); | 
|             }else { | 
|                 ManageMenu parentMenu = manageMenuMapper.getManageMenuById(manageMenu.getParentId()); | 
|                 if (ObjectUtils.isEmpty(parentMenu)){ | 
|                     manegeMenuMap.put("parent_name",""); | 
|                 }else { | 
|                     String parent_name = parentMenu.getName(); | 
|                     manegeMenuMap.put("parent_name",parent_name); | 
|                 } | 
|             } | 
|             String createTime = SDF.format(manageMenu.getCreateTime()); | 
|             String updateTime = SDF.format(manageMenu.getUpdateTime()); | 
|             manegeMenuMap.put("createTime",createTime); | 
|             manegeMenuMap.put("updateTime",updateTime); | 
|             resultList.add(manegeMenuMap); | 
|         } | 
|         return resultList; | 
|     } | 
|   | 
|     @Override | 
|     public List<ManageMenu> getAllMenus() { | 
|         List<ManageMenu> allMenus = manageMenuMapper.getAll(); | 
|         if(ObjectUtils.isEmpty(allMenus)) | 
|             return null; | 
|         Map<Integer, ManageMenu> menusMap = new HashMap<>(); | 
|         for (ManageMenu menu : allMenus) { | 
|             menu.setChildren(new ArrayList<>());//初始化 | 
|             menusMap.put(menu.getId(), menu); | 
|         } | 
|         for (ManageMenu menu : allMenus) { | 
|             combinationParentChildrenMenus(menusMap, menu); | 
|         } | 
|   | 
|         //已经封装好父子菜单,去除parentId不是0的菜单,去除重复 | 
|         allMenus.removeIf(new Predicate<ManageMenu>() { | 
|             @Override | 
|             public boolean test(ManageMenu manageMenu) { | 
|                 if(manageMenu.getParentId().equals(0)) | 
|                     return false; | 
|                 return true; | 
|             } | 
|         }); | 
|         return allMenus; | 
|     } | 
|   | 
|     @Override | 
|     public List getManageMenuByRoleId(int roleId) { | 
|         List<ManageMenu> manageMenus = manageMenuMapper.getManageMenuByRoleId(roleId); | 
|         List menuIdList = new ArrayList(); | 
|         for (ManageMenu manageMenu:manageMenus) { | 
|             menuIdList.add(manageMenu.getId()); | 
|         } | 
|         return menuIdList; | 
|     } | 
|   | 
|     @Override | 
|     public List getManageChildMenuByRoleId(int roleId) { | 
|         List<ManageMenu> manageMenus = manageMenuMapper.getManageMenuByRoleId(roleId); | 
|         List menuIdList = new ArrayList(); | 
|         Map limitMap = new HashMap(); | 
|         limitMap.put("start", 1); | 
|         limitMap.put("number", 1); | 
|         for (ManageMenu manageMenu:manageMenus) { | 
|             limitMap.put("parent_id", manageMenu.getId()); | 
|             List result = manageMenuMapper.getManageMenuByCondition(limitMap); | 
|             if (result.size()==0){ | 
|                 menuIdList.add(manageMenu.getId()); | 
|             } | 
|         } | 
|         return menuIdList; | 
|     } | 
|   | 
|     @Override | 
|     public List<Map<String,Object>> getManageMenuByNameFuzzy(Map map) { | 
|         Map limitMap = new HashMap(); | 
|         if(!ObjectUtils.isEmpty(map.get("name"))){ | 
|             limitMap.put("name", map.get("name")); | 
|         } | 
|         if(!ObjectUtils.isEmpty(map.get("parent_id"))){ | 
|             limitMap.put("parent_id", map.get("parent_id")); | 
|         } | 
|         limitMap.put("start", (Integer.parseInt(map.get("current").toString()) - 1) * Integer.parseInt(map.get("size").toString())); | 
|         limitMap.put("number", Integer.parseInt(map.get("size").toString())); | 
|         List<ManageMenu> manageMenus = manageMenuMapper.getManageMenuByNameFuzzy(limitMap); | 
|         SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|         List<Map<String,Object>> resultList = new ArrayList<>(); | 
|         for (ManageMenu manageMenu:manageMenus) { | 
|             Map manegeMenuMap = JSON.parseObject(JSON.toJSONString(manageMenu)); | 
|             if (manageMenu.getParentId().equals(0)){ | 
|                 manegeMenuMap.put("parent_name",""); | 
|             }else { | 
|                 ManageMenu parentMenu = manageMenuMapper.getManageMenuById(manageMenu.getParentId()); | 
|                 if (ObjectUtils.isEmpty(parentMenu)){ | 
|                     manegeMenuMap.put("parent_name",""); | 
|                 }else { | 
|                     String parent_name = parentMenu.getName(); | 
|                     manegeMenuMap.put("parent_name",parent_name); | 
|                 } | 
|             } | 
|             String createTime = SDF.format(manageMenu.getCreateTime()); | 
|             String updateTime = SDF.format(manageMenu.getUpdateTime()); | 
|             manegeMenuMap.put("createTime",createTime); | 
|             manegeMenuMap.put("updateTime",updateTime); | 
|             resultList.add(manegeMenuMap); | 
|         } | 
|         return resultList; | 
|     } | 
|   | 
|     @Override | 
|     public Map<String, Object> getManageMenuByCondition(Map map) { | 
|         Map<String,Object> resultMap = new HashMap<>(); | 
|         int current = Integer.parseInt(map.get("current").toString()); | 
|         int size = Integer.parseInt(map.get("size").toString()); | 
|         Page<ManageMenu> page = new Page<>(current,size); | 
|         QueryWrapper<ManageMenu> wrapper = new QueryWrapper(); | 
|         wrapper.eq("is_delete",Constants.NOT_DELETE); | 
|         if(!ObjectUtils.isEmpty(map.get("name"))){ | 
|             wrapper.like("name", map.get("name")); | 
|         } | 
|         if(!ObjectUtils.isEmpty(map.get("parent_id"))){ | 
|             wrapper.eq("parent_id", map.get("parent_id")); | 
|         } | 
|         Page resultpage = manageMenuMapper.selectPage(page,wrapper); | 
|         List<ManageMenu> manageMenus = resultpage.getRecords(); | 
|         SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|         List<Map<String,Object>> manageMenuList = new ArrayList<>(); | 
|         for (ManageMenu manageMenu:manageMenus) { | 
|             Map manegeMenuMap = JSON.parseObject(JSON.toJSONString(manageMenu)); | 
|             if (manageMenu.getParentId().equals(0)){ | 
|                 manegeMenuMap.put("parent_name",""); | 
|             }else { | 
|                 ManageMenu parentMenu = manageMenuMapper.getManageMenuById(manageMenu.getParentId()); | 
|                 if (ObjectUtils.isEmpty(parentMenu)){ | 
|                     manegeMenuMap.put("parent_name",""); | 
|                 }else { | 
|                     String parent_name = parentMenu.getName(); | 
|                     manegeMenuMap.put("parent_name",parent_name); | 
|                 } | 
|             } | 
|             String createTime = SDF.format(manageMenu.getCreateTime()); | 
|             String updateTime = SDF.format(manageMenu.getUpdateTime()); | 
|             manegeMenuMap.put("createTime",createTime); | 
|             manegeMenuMap.put("updateTime",updateTime); | 
|             manageMenuList.add(manegeMenuMap); | 
|         } | 
|         resultMap.put("manageMenus",manageMenuList); | 
|         int totalNumber = manageMenuMapper.selectCount(wrapper); | 
|         resultMap.put("totalNumber",totalNumber); | 
|         resultMap.put("current",current); | 
|         resultMap.put("size",size); | 
|         int totalPageNumber = totalNumber/size; | 
|         if(totalNumber%size != 0){ | 
|             totalPageNumber += 1; | 
|         } | 
|         resultMap.put("totalPageNumber",totalPageNumber); | 
|         return resultMap; | 
|     } | 
|   | 
|     @Override | 
|     public Map<String, Object> getManageParentMenu(Map map) { | 
|         Map<String,Object> resultMap = new HashMap(); | 
|         QueryWrapper<ManageMenu> wrapper = new QueryWrapper(); | 
|         wrapper.eq("is_delete",Constants.NOT_DELETE); | 
|         wrapper.eq("parent_id",0); | 
|         List<ManageMenu> manageMenus = manageMenuMapper.selectList(wrapper); | 
|         resultMap.put("manageMenus",manageMenus); | 
|         return resultMap; | 
|     } | 
|   | 
|     @Override | 
|     public List<Map<String, Object>> getManageMenuByParentId(Map map) { | 
|         Map limitMap = new HashMap(); | 
|         limitMap.put("parent_id", map.get("parent_id")); | 
|         limitMap.put("start", (Integer.parseInt(map.get("current").toString()) - 1) * Integer.parseInt(map.get("size").toString())); | 
|         limitMap.put("number", Integer.parseInt(map.get("size").toString())); | 
|         List<ManageMenu> manageMenus = manageMenuMapper.getManageMenuByCondition(limitMap); | 
|         SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|         List<Map<String,Object>> resultList = new ArrayList<>(); | 
|         for (ManageMenu manageMenu:manageMenus) { | 
|             Map manegeMenuMap = JSON.parseObject(JSON.toJSONString(manageMenu)); | 
|             if (manageMenu.getParentId().equals(0)){ | 
|                 manegeMenuMap.put("parent_name",""); | 
|             }else { | 
|                 ManageMenu parentMenu = manageMenuMapper.getManageMenuById(manageMenu.getParentId()); | 
|                 if (ObjectUtils.isEmpty(parentMenu)){ | 
|                     manegeMenuMap.put("parent_name",""); | 
|                 }else { | 
|                     String parent_name = parentMenu.getName(); | 
|                     manegeMenuMap.put("parent_name",parent_name); | 
|                 } | 
|             } | 
|             String createTime = SDF.format(manageMenu.getCreateTime()); | 
|             String updateTime = SDF.format(manageMenu.getUpdateTime()); | 
|             manegeMenuMap.put("createTime",createTime); | 
|             manegeMenuMap.put("updateTime",updateTime); | 
|             resultList.add(manegeMenuMap); | 
|         } | 
|         return resultList; | 
|     } | 
|   | 
|     @Override | 
|     public List<ManageMenu> getParentChildrenMenusByRoles(List<ManageRole> roles) { | 
|         List<ManageMenu> allMenus = manageMenuMapper.getAllMenusByRoles(roles); | 
|         if(ObjectUtils.isEmpty(allMenus)) | 
|             return null; | 
|         Map<Integer, ManageMenu> menusMap = new HashMap<>(); | 
|         for (ManageMenu menu : allMenus) { | 
|             menu.setChildren(new ArrayList<>());//初始化 | 
|             menusMap.put(menu.getId(), menu); | 
|         } | 
|         for (ManageMenu menu : allMenus) { | 
|             combinationParentChildrenMenus(menusMap, menu); | 
|         } | 
|   | 
|         //已经封装好父子菜单,去除parentId不是0的菜单,去除重复 | 
|         allMenus.removeIf(new Predicate<ManageMenu>() { | 
|             @Override | 
|             public boolean test(ManageMenu manageMenu) { | 
|                 if(manageMenu.getParentId().equals(0)) | 
|                     return false; | 
|                 return true; | 
|             } | 
|         }); | 
|          return allMenus; | 
|     } | 
|   | 
|     /** | 
|      * @Description: 组合多级菜单 | 
|      * @Param: [menuMap, menu]menuMap:key为menuid,value为menu | 
|      * @return: void | 
|      * @Author: 陈凯裕 | 
|      * @Date: 2021/4/7 | 
|      */ | 
|     private void combinationParentChildrenMenus(Map<Integer, ManageMenu> menuMap, ManageMenu menu) { | 
|         Integer parentId = menu.getParentId(); | 
|         ManageMenu parentMenu = menuMap.get(parentId); | 
|         if (!ObjectUtils.isEmpty(parentMenu)) { | 
|             parentMenu.getChildren().add(menu); | 
|         } | 
|     } | 
| } |