diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormCache.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormCache.java index 0e2ccae..7cf97ec 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormCache.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormCache.java @@ -7,10 +7,7 @@ import cc.smtweb.framework.core.common.SwConsts; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.EntityDao; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Set; +import java.util.*; /** * Created by Akmm at 2022/1/12 18:34 @@ -102,4 +99,12 @@ public class ModelFormCache extends AbstractEntityCache { public ModelForm getByPageName(String pageName) { return getByKey(mn, pageName.toUpperCase()); } + // 获取包含本页面的模块下的所有页面 + public Set getIncPage(long pageId){ + ModelForm form = get(pageId); + if(form==null || form.getParent()<=0L){ + return null; + } + return getListByModule(form.getParent()); + } } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormHelper.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormHelper.java index ffe8dc7..8190613 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormHelper.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormHelper.java @@ -21,6 +21,8 @@ import cc.smtweb.system.bpm.web.design.db.ModelCatalogCache; import cc.smtweb.system.bpm.web.design.db.ModelProjectCache; import cc.smtweb.system.bpm.web.design.form.define.*; import cc.smtweb.system.bpm.web.engine.flow.entity.Comment; +import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanHelper; +import cc.smtweb.system.bpm.web.sys.user.role.RoleHelper; import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.commons.lang3.StringUtils; @@ -293,6 +295,13 @@ public class ModelFormHelper { ret.put("label", form.getTitle()); ret.put("service", service); ret.put("module", ModelProjectCache.getInstance().getModule(form.getPrjId())); + // 加载权限 + long menuId = params.readLong("menuId"); + String fullPath = params.readString("fullPath"); + long findMenuId = MenuPlanHelper.findMenuId(menuId,form.getId(),fullPath); + Map permission = RoleHelper.getFuncAndFieldRight(us.getUserId(),us.getPartyId(),findMenuId); + ret.put("menuId",findMenuId>0L? findMenuId: menuId); + ret.put("permission",permission); buildOptsEx(form, ret); //form不用管 if (pageInfo.form != null) ret.put("form", pageInfo.form); diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanContent.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanContent.java index c762580..6998ed4 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanContent.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanContent.java @@ -4,6 +4,8 @@ import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.exception.BizException; import cc.smtweb.framework.core.util.CommUtil; import cc.smtweb.framework.core.util.JsonUtil; +import cc.smtweb.system.bpm.web.sys.user.menu.Menu; +import cc.smtweb.system.bpm.web.sys.user.menu.MenuCache; import java.util.ArrayList; import java.util.Collections; @@ -138,6 +140,23 @@ public class MenuPlanContent { findHome(item.getChildren(),homeList); } } + // 查询指定页面 + public void findPage(long pageId,List pageList){ + findPage(list,pageList,pageId); + } + // 查询指定页面 + private void findPage(List source,List pageList,long pageId){ + if(CommUtil.isEmpty(source))return; + for(MenuPlanItem item: source){ + if(item.getMenu()>0L){ + Menu menu = MenuCache.getInstance().get(item.getMenu()); + if(menu!=null&& menu.getPageId().equalsIgnoreCase(String.valueOf(pageId))){ + pageList.add(item); + } + } + findPage(item.getChildren(),pageList,pageId); + } + } private MenuPlanItem findById(long id, List itemList) { if (CommUtil.isEmpty(itemList)) { return null; diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanHelper.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanHelper.java index f070351..84efc15 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanHelper.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanHelper.java @@ -1,5 +1,12 @@ package cc.smtweb.system.bpm.web.sys.user.menuPlan; +import cc.smtweb.framework.core.util.CommUtil; +import cc.smtweb.framework.core.util.StringUtil; +import cc.smtweb.system.bpm.web.design.form.ModelForm; +import cc.smtweb.system.bpm.web.design.form.ModelFormCache; + +import java.util.*; + /** * @Author: tanghp * @Date: 2022-09-26 10:19 @@ -13,9 +20,120 @@ public class MenuPlanHelper { * @param fullPath 带参数的路径 * @return */ - public long findMenuId(long menuId,long pageId,String fullPath){ - // + public static long findMenuId(long menuId,long pageId,String fullPath){ + MenuPlanItemProvider.MenuPlanItem2 mItem = MenuPlanItemProvider.getInstance().getMenuPlanItem(menuId); + if(mItem==null)return 0L; + // 1、如果是本页面的菜单 直接返回菜单ID + if(mItem.getPageId() == pageId){ + return menuId; + } + // 获取本菜单对应的模块包含的所有页面 + Set children = ModelFormCache.getInstance().getIncPage(mItem.getPageId()); + if(!CommUtil.isEmpty(children)){ + for(ModelForm form : children){ + //2、本页属于本菜单模块的子页面 也返回该菜单 + if(form.getId() == pageId){ + return menuId; + } + } + } + // 获取包含本页面的所有的菜单 + List pItems = findItemIncPage(mItem.getMpId(),pageId); + // 解析fullPath + UrlPath urlPath = new UrlPath(fullPath); + Map> countMap = new HashMap<>(); + for(MenuPlanItemProvider.MenuPlanItem2 item: pItems){ + Map map = new HashMap<>(); + map.put("total",item.getParameterNames().size()); + map.put("count",0); + item.getParameterNames().forEach(name->{ + if(urlPath.getParamNames().contains(name)){ + map.put("count",map.get("count")+1); + } + }); + countMap.put(item.getId(),map); + // 3.参数总个数和命中个数 和配置一致直接返回 + if(map.get("total").intValue() == map.get("count").intValue()&& map.get("count")==urlPath.paramNames.size()){ + return item.getId(); + } + } + // 记录最大命中数的菜单 + int count = 0; + long rtMenuId=0L; + for(Map.Entry> item: countMap.entrySet()){ + // 4、参数命中个数 和 url的参数个数一致 也返回 + if(item.getValue().get("count")==urlPath.paramNames.size()){ + return item.getKey(); + } + // 找最大命中数的菜单 + if(count findItemIncPage(long mpId, long pageId){ + MenuPlan menuPlan = MenuPlanCache.getInstance().get(mpId); + if(menuPlan==null){ + return new ArrayList<>(); + } + List rtList = new ArrayList<>(); + List tempList = new ArrayList<>(); + MenuPlanContent menuPlanContent = new MenuPlanContent(menuPlan.getContent()); + menuPlanContent.findPage(pageId,tempList); + tempList.forEach(item->{ + MenuPlanItemProvider.MenuPlanItem2 bean = new MenuPlanItemProvider.MenuPlanItem2(); + bean.getData().putAll(item.getData()); + bean.setMpId(mpId); + }); + return rtList; + } + static class UrlPath{ + private String path; + private Set paramNames = new HashSet<>(); + + public UrlPath(String urlPath) { + String[] array = urlPath.split("\\?"); + if(array.length>0){ + path = array[0]; + } + if(array.length>1){ + String[] pArray = array[1].split("&"); + for(String p1 : pArray){ + String[] param = p1.split("="); + if(param.length>0){ + String p = param[0]; + if(StringUtil.isNotEmpty(p)){ + paramNames.add(p); + } + } + } + } + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Set getParamNames() { + return paramNames; + } - return 0L; + public void setParamNames(Set paramNames) { + this.paramNames = paramNames; + } } } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanItemProvider.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanItemProvider.java index 2cd16f8..6f37104 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanItemProvider.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/menuPlan/MenuPlanItemProvider.java @@ -1,11 +1,10 @@ package cc.smtweb.system.bpm.web.sys.user.menuPlan; -import cc.smtweb.framework.core.cache.SessionCacheFactory; import cc.smtweb.framework.core.util.CommUtil; +import cc.smtweb.system.bpm.web.sys.user.menu.Menu; +import cc.smtweb.system.bpm.web.sys.user.menu.MenuCache; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * @Author: tanghp @@ -13,33 +12,70 @@ import java.util.Map; * @Desc: 菜单明细加载类 */ public class MenuPlanItemProvider { - private volatile MenuPlanItemProvider provider; - private Map map = new HashMap<>(); + private Map map = new HashMap<>(); private MenuPlanItemProvider() { } - public MenuPlanItemProvider getInstance(){ - if (provider == null) { - synchronized (SessionCacheFactory.class) { - if (provider == null) { - provider = new MenuPlanItemProvider(); - } - } - } - return provider; + + public static MenuPlanItemProvider getInstance(){ + return ProviderHolder.provider; } + // 获取菜单方案明细ID - public MenuPlanItem getMenuPlanItem(long menuId){ - MenuPlanItem menuPlanItem = map.get(menuId); + public MenuPlanItem2 getMenuPlanItem(long menuId){ + MenuPlanItem2 menuPlanItem = map.get(menuId); if(menuPlanItem!=null)return menuPlanItem; Collection plans = MenuPlanCache.getInstance().getAll(); if(CommUtil.isEmpty(plans))return null; for(MenuPlan menuPlan: plans){ - menuPlanItem = MenuPlanCache.getInstance().getById(menuPlan.getEntityId(),menuId); - if(menuPlanItem!=null){ + MenuPlanItem item = MenuPlanCache.getInstance().getById(menuPlan.getEntityId(),menuId); + if(item!=null){ + menuPlanItem = new MenuPlanItem2(); + menuPlanItem.getData().putAll(item.getData()); + menuPlanItem.setMpId(menuPlan.getEntityId()); map.put(menuId,menuPlanItem); return menuPlanItem; } } return null; } + + private static final class ProviderHolder { + static final MenuPlanItemProvider provider = new MenuPlanItemProvider(); + } + + public static class MenuPlanItem2 extends MenuPlanItem{ + // 获取菜单方案ID + public long getMpId(){ + return getLong("mp_id"); + } + public void setMpId(long mp_id){ + put("mp_id",mp_id); + } + // 获取页面ID + public long getPageId(){ + if(getMenu()>0L){ + Menu menu = MenuCache.getInstance().get(getMenu()); + if(menu!=null){ + return Long.parseLong(menu.getPageId()); + } + } + return 0L; + } + // 获取路径的参数name + public Set getParameterNames(){ + Set rtSet = new HashSet<>(); + if(getMenu()>0L){ + Menu menu = MenuCache.getInstance().get(getMenu()); + if(menu!=null){ + String urlPath = menu.getPath(); + rtSet = getNamesByPath(urlPath); + } + } + return rtSet; + } + private Set getNamesByPath(String url){ + MenuPlanHelper.UrlPath urlPath = new MenuPlanHelper.UrlPath(url); + return urlPath.getParamNames(); + } + } } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleHelper.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleHelper.java index 91289d2..ee15040 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleHelper.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleHelper.java @@ -1,17 +1,16 @@ package cc.smtweb.system.bpm.web.sys.user.role; +import cc.smtweb.framework.core.util.CommUtil; import cc.smtweb.system.bpm.web.sys.user.dataRight.DataRightDefine; import cc.smtweb.system.bpm.web.sys.user.dataRight.DataRightDefineCache; import cc.smtweb.system.bpm.web.sys.user.dataRightGroup.DataRightGroup; import cc.smtweb.system.bpm.web.sys.user.dataRightGroup.DataRightGroupCache; -import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlan; -import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanCache; -import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanContent; -import cc.smtweb.system.bpm.web.sys.user.menuPlan.MenuPlanItem; +import cc.smtweb.system.bpm.web.sys.user.menuPlan.*; import cc.smtweb.system.bpm.web.sys.user.user.User; import cc.smtweb.system.bpm.web.sys.user.user.UserCache; import cc.smtweb.system.bpm.web.sys.user.user.UserRoleCache; +import javax.print.DocFlavor; import java.util.*; /** @@ -134,17 +133,16 @@ public final class RoleHelper { * 获取用户指定类型的数据权限组 * @param userId 用户ID * @param partyId 登录的单位 - * @param menuId 菜单ID + * @param menuId 菜单明细ID * @param dsType 数据权限类型编码 * @return 数据权限组集合 */ public static Set getDataRightGroup(long userId,long partyId,long menuId,String dsType){ - Set mpIds = getMenuPlanIds(userId,partyId); - if(mpIds.size()==0){ + MenuPlanItemProvider.MenuPlanItem2 menuPlanItem2 =MenuPlanItemProvider.getInstance().getMenuPlanItem(menuId); + if(menuPlanItem2 ==null){ return new HashSet<>(); } - // 没传菜单方案ID,随机取一个菜单方案 - return getDataRightGroup(userId,partyId,menuId,dsType,mpIds.iterator().next()); + return getDataRightGroup(userId,partyId,menuId,dsType,menuPlanItem2.getMpId()); } /** @@ -179,4 +177,66 @@ public final class RoleHelper { }); return new HashSet<>(mapGroup.values()); } + + /** + * 获取功能权限和字段权限 + * @param userId 用户ID + * @param partyId 登录单位ID + * @param menuId 菜单明细ID + * @return + */ + public static Map getFuncAndFieldRight(long userId,long partyId,long menuId){ + MenuPlanItemProvider.MenuPlanItem2 menuPlanItem2 =MenuPlanItemProvider.getInstance().getMenuPlanItem(menuId); + if(menuPlanItem2 ==null){ + return new HashMap<>(); + } + return getFuncAndFieldRight(userId,partyId,menuId,menuPlanItem2.getMpId()); + } + + /** + * 获取功能权限和字段权限 + * @param userId 用户ID + * @param partyId 登录单位ID + * @param menuId 菜单明细ID + * @param menuPlanId 菜单方案ID + * @return + */ + public static Map getFuncAndFieldRight(long userId,long partyId,long menuId,long menuPlanId){ + Set roleIds = UserRoleCache.getInstance().getRoleIdByUP(userId,partyId); + RoleCache roleCache = RoleCache.getInstance(); + Set fun = new HashSet<>(); + Map fieldMap = new HashMap<>(); + roleIds.forEach((roleId)-> { + Role role = roleCache.get(roleId); + if(role==null || role.getSmpId()!=menuPlanId){ + return; + } + RoleRightContent roleRightContent = new RoleRightContent(role.getPrivilege()); + RoleRight roleRight = roleRightContent.getRoleRight(menuId); + if(roleRight!=null){ + // 功能权限 + Set tempFun = roleRight.getRightFunc(); + if(!CommUtil.isEmpty(tempFun)){ + fun.addAll(tempFun); + } + // 字段权限 + Map tempFieldMap = roleRight.getRightField(); + if(tempFieldMap!=null){ + tempFieldMap.forEach((key,value)-> { + if(!fieldMap.containsKey(key)){ + fieldMap.put(key,value); + }else { + if(fieldMap.get(key) rtMap = new HashMap<>(); + rtMap.put("func",fun); + rtMap.put("field",fieldMap); + return rtMap; + } } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleRightContent.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleRightContent.java index cf10613..08b224a 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleRightContent.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/role/RoleRightContent.java @@ -115,7 +115,7 @@ public class RoleRightContent { /** * 获取菜单的数据权限组ID - * @param menuId 菜单id + * @param menuId 菜单明细id * @param dataRightId 数据权限定义id * @return 数据权限组ID */