Browse Source

优化产品配置

zhangqiankun 3 years ago
parent
commit
45260d5767
26 changed files with 412 additions and 280 deletions
  1. 2 2
      saas-account/src/main/java/com/persagy/account/controller/SaasAreaController.java
  2. 1 1
      saas-account/src/main/java/com/persagy/account/controller/SaasFunctionController.java
  3. 2 2
      saas-account/src/main/java/com/persagy/account/controller/SaasMenuController.java
  4. 1 1
      saas-account/src/main/java/com/persagy/account/controller/SaasProductPageController.java
  5. 11 3
      saas-account/src/main/java/com/persagy/account/controller/SaasProjectController.java
  6. 12 35
      saas-account/src/main/java/com/persagy/account/manage/SaasAreaProjectHandler.java
  7. 43 5
      saas-account/src/main/java/com/persagy/account/manage/SaasAuthHandler.java
  8. 22 1
      saas-account/src/main/java/com/persagy/account/manage/SaasGroupProjectHandler.java
  9. 30 63
      saas-account/src/main/java/com/persagy/account/manage/SaasProductHandler.java
  10. 198 82
      saas-account/src/main/java/com/persagy/account/manage/SaasRoleMenuHandler.java
  11. 2 1
      saas-account/src/main/java/com/persagy/account/mapper/SaasProjectMapper.java
  12. 11 0
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasArea.java
  13. 15 1
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasFunction.java
  14. 17 0
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProduct.java
  15. 3 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/function/SaasFunctionCreateVO.java
  16. 1 1
      saas-account/src/main/java/com/persagy/account/pojo/vo/function/SaasMenuFunctionVO.java
  17. 5 2
      saas-account/src/main/java/com/persagy/account/pojo/vo/project/SaasProjectQueryVO.java
  18. 0 16
      saas-account/src/main/java/com/persagy/account/service/ISaasMenuService.java
  19. 10 0
      saas-account/src/main/java/com/persagy/account/service/ISaasProductService.java
  20. 2 1
      saas-account/src/main/java/com/persagy/account/service/ISaasProjectService.java
  21. 0 58
      saas-account/src/main/java/com/persagy/account/service/impl/SaasMenuServiceImpl.java
  22. 18 2
      saas-account/src/main/java/com/persagy/account/service/impl/SaasProductServiceImpl.java
  23. 2 2
      saas-account/src/main/java/com/persagy/account/service/impl/SaasProjectServiceImpl.java
  24. 2 1
      saas-account/src/main/resources/mapper/SaasFunctionMapper.xml
  25. 1 0
      saas-account/src/main/resources/mapper/SaasProductMapper.xml
  26. 1 0
      saas-account/src/main/resources/mapper/SaasProjectMapper.xml

+ 2 - 2
saas-account/src/main/java/com/persagy/account/controller/SaasAreaController.java

@@ -71,7 +71,7 @@ public class SaasAreaController {
     @ApiOperation(value = "查询区域树")
     @RequestMapping(value = "querySaasAreaTree")
     public ResponseResult querySaasAreaTree(@RequestBody @Validated BaseGroupVO model) {
-    	List<SaasArea> topList = this.saasAreaProjectHandler.getTopAreaList(model.getGroupCode());
+    	List<SaasArea> topList = this.saasAreaProjectHandler.getTopAreaList(model.getGroupCode(), false);
     	this.saasAreaProjectHandler.querySaasAreaTree(topList, false);
     	return ResponseResultUtil.successResult(topList);
     }
@@ -82,7 +82,7 @@ public class SaasAreaController {
     @ApiOperation(value = "查询区域权限树")
     @RequestMapping(value = "queryAllowAreaTree")
     public ResponseResult queryAllowAreaTree(@RequestBody @Validated BaseGroupVO groupVO) {
-    	List<SaasArea> areaList = this.saasAuthHandler.getAllowAreaList(groupVO.getAccountId(), groupVO.getGroupCode());
+    	List<SaasArea> areaList = this.saasAuthHandler.getAllowAreaList(groupVO.getAccountId(), groupVO.getGroupCode(), false);
     	return ResponseResultUtil.successResult(areaList);
     }
     

+ 1 - 1
saas-account/src/main/java/com/persagy/account/controller/SaasFunctionController.java

@@ -104,7 +104,7 @@ public class SaasFunctionController {
 			return ResponseResultUtil.successResult(Lists.newArrayList());
 		}
     	// 获取此账号、此菜单下所对应的功能点信息集合 或者 产品页面树集合
-    	this.saasProductHandler.queryMenuProductAuths(saasMenu, model.getAccountId(), accountBelong, model.getProjectId(), groupCode, isAdmin, model.isShowPageAuth());
+    	this.saasProductHandler.queryMenuProductAuths(saasMenu, model.getAccountId(), accountBelong, model.getProjectId(), groupCode, isAdmin, true, model.isShowPageAuth());
         if (StringUtil.isBlank(saasMenu.getProductId())) {
         	return ResponseResultUtil.successResult(saasMenu.getFunctions());
 		} 

+ 2 - 2
saas-account/src/main/java/com/persagy/account/controller/SaasMenuController.java

@@ -130,7 +130,7 @@ public class SaasMenuController {
 			}
 			saasMenu.setMenuIcon(saasProduct.getProductIcon());
 		}
-		boolean result = this.saasMenuService.createSaasMenu(saasMenu);
+		boolean result = this.saasRoleMenuHandler.createSaasMenu(saasMenu);
         return result ? ResponseResultUtil.successResult("保存成功", saasMenu.getId()) : ResponseResultUtil.errorResult("保存失败");
     }
     
@@ -175,7 +175,7 @@ public class SaasMenuController {
 			}
 			saasMenu.setMenuIcon(saasProduct.getProductIcon());
 		}
-		boolean result = this.saasMenuService.updateSaasMenu(saasMenu, menu.getProductId());
+		boolean result = this.saasRoleMenuHandler.updateSaasMenu(saasMenu, menu.getProductId());
         return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
     }
 

+ 1 - 1
saas-account/src/main/java/com/persagy/account/controller/SaasProductPageController.java

@@ -66,7 +66,7 @@ public class SaasProductPageController {
 		}
 		// 获取该产品的下级页面权限信息,按照超管逻辑处理
 		for (SaasProduct saasProduct : saasProducts) {
-			List<SaasProductPage> pageList = this.saasProductHandler.querySaasProductPageTree(null, saasProduct.getId(), null, null, true, treeVO.isShowPageAuth());
+			List<SaasProductPage> pageList = this.saasProductHandler.querySaasProductPageTree(null, saasProduct.getId(), null, null, null, true, treeVO.isShowPageAuth());
 			saasProduct.setProductPages(pageList);
 		}
 		return ResponseResultUtil.successResult(saasProducts);

+ 11 - 3
saas-account/src/main/java/com/persagy/account/controller/SaasProjectController.java

@@ -159,7 +159,7 @@ public class SaasProjectController {
     		return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "集团信息不存在");
 		}
     	for (SaasGroup saasGroup : groups) {
-    		this.saasAreaProjectHandler.queryAreaProjectTree(saasGroup);
+    		this.saasAreaProjectHandler.queryAreaProjectTree(saasGroup, model.isExcludeEmptyArea());
 		}
     	return ResponseResultUtil.successResult(groups);
     }
@@ -183,10 +183,18 @@ public class SaasProjectController {
 		List<SaasGroup> groups = this.saasAuthHandler.getAllowGroupList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType);
     	// 查询区域项目树
     	for (SaasGroup saasGroup : groups) {
-    		List<SaasArea> areaList = this.saasAuthHandler.getAllowAreaList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType);
+    		List<SaasArea> areaList = this.saasAuthHandler.getAllowAreaList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType, queryVO.isExcludeEmptyArea());
     		saasGroup.setAreas(areaList);
     		this.saasAreaProjectHandler.queryAllowAreaProjectTree(queryVO, saasGroup, areaList);
-		}
+    		if (queryVO.isExcludeEmptyArea()) {
+    			// 获取未分区下的可见项目
+        		SaasArea areaOne = this.saasAreaService.getAreaOne(null, queryVO.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null);
+        		if (areaOne != null) {
+        			List<SaasProject> projects = this.saasAuthHandler.getAllowProjectList(queryVO.getAccountId(), queryVO.getGroupCode(), areaOne.getId());
+        			saasGroup.setProjects(projects);
+    			}
+			}
+    	}
     	return ResponseResultUtil.successResult(groups);
     }
     

+ 12 - 35
saas-account/src/main/java/com/persagy/account/manage/SaasAreaProjectHandler.java

@@ -17,6 +17,7 @@ import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.exception.BusinessException;
 import com.persagy.account.pojo.dto.SaasAccountProject;
 import com.persagy.account.pojo.dto.SaasArea;
+import com.persagy.account.pojo.dto.SaasArea.Builder;
 import com.persagy.account.pojo.dto.SaasGroup;
 import com.persagy.account.pojo.dto.SaasProject;
 import com.persagy.account.pojo.vo.area.SaasAreaQueryVO;
@@ -56,8 +57,8 @@ public class SaasAreaProjectHandler {
      * @param queryVO
      * @param saasGroup 
      */
-	public void queryAreaProjectTree(SaasGroup saasGroup) {
-		List<SaasArea> topList = this.getTopAreaList(saasGroup.getGroupCode());
+	public void queryAreaProjectTree(SaasGroup saasGroup, boolean excludeEmptyArea) {
+		List<SaasArea> topList = this.getTopAreaList(saasGroup.getGroupCode(), excludeEmptyArea);
 		saasGroup.setAreas(topList);
     	this.querySaasAreaTree(topList, true);
 	}
@@ -66,10 +67,15 @@ public class SaasAreaProjectHandler {
 	 * 获取集团下,顶层区域集合
 	 * 
 	 * @param groupCode
+	 * @param excludeEmptyArea 是否排除未分区,true-排除,false-不排除
 	 * @return
 	 */
-	public List<SaasArea> getTopAreaList(String groupCode) {
-		LambdaQueryWrapper<SaasArea> queryWrapper = new SaasArea.Builder().createQueryWrapper().groupCodeEq(groupCode).builderQueryWrapper();
+	public List<SaasArea> getTopAreaList(String groupCode, boolean excludeEmptyArea) {
+		Builder builder = new SaasArea.Builder().createQueryWrapper();
+		if (excludeEmptyArea) {
+			builder.areaCodeNe(SaasCommonConstant.STR_STATUS_MINUS_1);	//排除未分区
+		}
+		LambdaQueryWrapper<SaasArea> queryWrapper = builder.groupCodeEq(groupCode).builderQueryWrapper();
     	queryWrapper.apply("(PARENT_ID IS NULL OR TRIM(PARENT_ID) = '')");
     	List<SaasArea> topList = this.saasAreaService.list(queryWrapper);
     	return CollectionUtil.isEmpty(topList) ? Lists.newArrayList() : topList;
@@ -129,7 +135,7 @@ public class SaasAreaProjectHandler {
 			}
 		}
     	// 组合成结果树
-    	boolean showEmptyArea = BooleanUtil.isTrue(queryVO.getShowEmptyArea());
+    	boolean showEmptyArea = BooleanUtil.isTrue(queryVO.isShowEmptyArea());
     	this.queryAllowAreaProjectTree(areaList, tempPro, !showEmptyArea);
     	return saasGroup;
 	}
@@ -337,34 +343,5 @@ public class SaasAreaProjectHandler {
 		}
 		return result;
 	}
-
-	/**
-	 * 验证此区域是否允许被删除
-	 * 
-	 * @param parentId
-	 * @param groupCode
-	 * @param result 调用时传true
-	 * @return 没有下级默认允许-true,
-	 */
-	/*public boolean validAreaProjectExist(List<SaasArea> saasAreas, String groupCode) {
-		if (CollectionUtil.isEmpty(saasAreas)) {
-			return true;
-		}
-    	for (SaasArea area : saasAreas) {
-    		// 如果是底层区域,判断,旗下是否存在项目信息,存在不允许删除
-        	if (SaasCommonConstant.STR_STATUS_1.equals(area.getAreaType())) {
-        		LambdaQueryWrapper<SaasProject> projectWrapper = new SaasProject.Builder().createQueryWrapper()
-        				.groupCodeEq(groupCode).areaIdEq(area.getId()).last("limit 0, 1").builderQueryWrapper();
-    			SaasProject project = this.saasProjectService.getOne(projectWrapper);
-    			if (project != null) {
-    				return false;
-    			}
-    		} 
-        	// 继续递归
-        	LambdaQueryWrapper<SaasArea> queryWrapper = new SaasArea.Builder().createQueryWrapper().parentIdEq(area.getId()).groupCodeEq(groupCode).builderQueryWrapper();
-        	List<SaasArea> nextAreas = this.saasAreaService.list(queryWrapper);
-        	this.validAreaProjectExist(nextAreas, groupCode);
-		}
-	}*/
-
+	
 }

+ 43 - 5
saas-account/src/main/java/com/persagy/account/manage/SaasAuthHandler.java

@@ -14,6 +14,7 @@ import com.google.common.collect.Lists;
 import com.persagy.account.pojo.dto.SaasAccount;
 import com.persagy.account.pojo.dto.SaasArea;
 import com.persagy.account.pojo.dto.SaasGroup;
+import com.persagy.account.pojo.dto.SaasProject;
 import com.persagy.account.service.ISaasAccountService;
 import com.persagy.account.service.ISaasGroupService;
 import com.persagy.common.constant.SaasCommonConstant;
@@ -46,6 +47,9 @@ public class SaasAuthHandler {
     @Autowired
     private SaasAreaProjectHandler saasAreaProjectHandler;
     
+    @Autowired
+    private SaasGroupProjectHandler saasGroupProjectHandler;
+    
 	@Autowired
 	private RedisTemplate<String, Object> redisTemplate;
     
@@ -114,7 +118,7 @@ public class SaasAuthHandler {
 			saasGroup.setValid(SaasCommonConstant.STATUS_1);
 			groups = this.saasGroupService.queryAllowGroupInfo(saasGroup, accountId);
 		} else {
-			LambdaQueryWrapper<SaasGroup> queryWrapper = new SaasGroup.Builder().createQueryWrapper().validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
+			LambdaQueryWrapper<SaasGroup> queryWrapper = new SaasGroup.Builder().createQueryWrapper().groupCodeEq(groupCode).validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
     		groups = this.saasGroupService.list(queryWrapper);
 		}
 		return groups == null ? Lists.newArrayList() : groups;
@@ -127,12 +131,12 @@ public class SaasAuthHandler {
      * @param groupCode
      * @return 允许此账号访问的集团信息
      */
-    public List<SaasArea> getAllowAreaList(String accountId, String groupCode) {
+    public List<SaasArea> getAllowAreaList(String accountId, String groupCode, boolean excludeEmptyArea) {
     	// 获取此账号对应的集团权限
     	Map<String, String> accountAuth = this.validAccountAuth(accountId, groupCode);
     	groupCode = accountAuth.get(CipherConstants.GROUP_CODE);
     	String accountType = accountAuth.get(SaasCommonConstant.ACCOUNT_TYPE);
-		return this.getAllowAreaList(accountId, groupCode, accountType);
+		return this.getAllowAreaList(accountId, groupCode, accountType, excludeEmptyArea);
     }
     
     /**
@@ -143,8 +147,8 @@ public class SaasAuthHandler {
      * @param accountType
      * @return 
      */
-    public List<SaasArea> getAllowAreaList(String accountId, String groupCode, String accountType) {
-    	List<SaasArea> topList = this.saasAreaProjectHandler.getTopAreaList(groupCode);
+    public List<SaasArea> getAllowAreaList(String accountId, String groupCode, String accountType, boolean excludeEmptyArea) {
+    	List<SaasArea> topList = this.saasAreaProjectHandler.getTopAreaList(groupCode, excludeEmptyArea);
 		if (SaasCommonConstant.STR_STATUS_2.equals(accountType)) {
 			// 其他类型时,需要根据权限表数据,去匹配区域树
 			this.saasAreaProjectHandler.queryAllowAreaTree(topList, accountId, groupCode);
@@ -155,6 +159,40 @@ public class SaasAuthHandler {
     }
     
     /**
+     * 返回被允许访问的区域树
+     * 
+     * @param accountId
+     * @param groupCode
+     * @param areaId
+     * @return 允许此账号访问的项目信息
+     */
+    public List<SaasProject> getAllowProjectList(String accountId, String groupCode, String areaId) {
+    	// 获取此账号对应的集团权限
+    	Map<String, String> accountAuth = this.validAccountAuth(accountId, groupCode);
+    	groupCode = accountAuth.get(CipherConstants.GROUP_CODE);
+    	String accountType = accountAuth.get(SaasCommonConstant.ACCOUNT_TYPE);
+		return this.getAllowProjectList(accountId, groupCode, accountType, areaId);
+    }
+    
+    /**
+     * 返回被允许访问的区域树
+     * 
+     * @param accountId
+     * @param groupCode
+     * @param accountType
+     * @param areaId
+     * @return 
+     */
+    public List<SaasProject> getAllowProjectList(String accountId, String groupCode, String accountType, String areaId) {
+    	boolean isAdmin = true;
+    	if (SaasCommonConstant.STR_STATUS_2.equals(accountType)) {
+    		isAdmin = false;
+		}
+    	List<SaasProject> projects = this.saasGroupProjectHandler.queryAllowProjectList(accountId, groupCode, areaId, isAdmin);
+		return projects;
+    }
+
+    /**
      * 申请授权码,每次重新生成
      * 
      * @param clientId

+ 22 - 1
saas-account/src/main/java/com/persagy/account/manage/SaasGroupProjectHandler.java

@@ -103,7 +103,7 @@ public class SaasGroupProjectHandler {
 				list = this.saasProjectService.list(queryWrapper);
 			} else {
 				// 表关联查询
-				list = this.saasProjectService.queryAllowGroupProjectList(groupCode, accountId);
+				list = this.saasProjectService.queryAllowGroupProjectList(groupCode, accountId, null);
 			}
 			if (CollectionUtil.isEmpty(list)) {
 				list = Lists.newArrayList();
@@ -182,6 +182,27 @@ public class SaasGroupProjectHandler {
 		return projectList;
     }
 
+	/**
+	 * 查询允许访问的项目集合
+	 * 
+	 * @param accountId
+	 * @param groupCode
+	 * @param areaId
+	 * @param isAdmin
+	 * @return 空集合或项目集合
+	 */
+	public List<SaasProject> queryAllowProjectList(String accountId, String groupCode, String areaId, boolean isAdmin) {
+		if (isAdmin) {
+			LambdaQueryWrapper<SaasProject> queryWrapper = new SaasProject.Builder().createQueryWrapper().areaIdEq(areaId)
+					.groupCodeEq(groupCode).validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
+			List<SaasProject> projects = this.saasProjectService.list(queryWrapper);
+			return CollectionUtil.isEmpty(projects) ? Lists.newArrayList() : projects;
+		}
+		// 关联查询出可见项目信息
+		List<SaasProject> projects = this.saasProjectService.queryAllowGroupProjectList(groupCode, accountId, areaId);
+		return CollectionUtil.isEmpty(projects) ? Lists.newArrayList() : projects;
+	}
+	
     /**
      * 创建项目信息的同时,判断是否需要添加一条权限信息
      * 

+ 30 - 63
saas-account/src/main/java/com/persagy/account/manage/SaasProductHandler.java

@@ -12,6 +12,7 @@ import com.persagy.account.pojo.dto.SaasFunction;
 import com.persagy.account.pojo.dto.SaasGroupProduct;
 import com.persagy.account.pojo.dto.SaasMenu;
 import com.persagy.account.pojo.dto.SaasProductPage;
+import com.persagy.account.pojo.dto.SaasProductPage.BuilderQueryWrapper;
 import com.persagy.account.pojo.dto.SaasProjectProduct;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.service.ISaasFunctionService;
@@ -61,26 +62,30 @@ public class SaasProductHandler {
 	 * @param projectId
 	 * @param groupCode
 	 * @param isAdmin
-	 * @param showFunctions
+	 * @param showFunction 是否展示权限点,兼容之前的设计字段
+	 * @param showPageAuth 是否展示产品页面的权限点
 	 */
-	public void queryMenuProductAuths(SaasMenu saasMenu, String accountId, String accountBelong, String projectId, String groupCode, boolean isAdmin, boolean showFunctions) {
-		// angle 1-集团视角,2-项目视角
-		String angle = StringUtil.isBlank(projectId) ? SaasCommonConstant.STR_STATUS_1 : SaasCommonConstant.STR_STATUS_2;
+	public void queryMenuProductAuths(SaasMenu saasMenu, String accountId, String accountBelong, String projectId, String groupCode, boolean isAdmin, boolean showFunction, boolean showPageAuth) {
 		if (StringUtil.isBlank(saasMenu.getProductId())) {
-			List<SaasFunction> functions = null;
-			// 未挂有产品,关联查询出对应的功能点集合,即可返回
-			if (isAdmin) {
-				LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(saasMenu.getMenuId()).builderQueryWrapper();
-				functions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getCreateTime));
-			} else {
-				functions = this.saasFunctionService.queryAccountFunctionList(accountId, saasMenu.getGroupCode(), saasMenu.getMenuId());
+			if (showFunction) {
+				List<SaasFunction> functions = null;
+				// 未挂有产品,关联查询出对应的功能点集合,即可返回
+				if (isAdmin) {
+					LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(saasMenu.getMenuId()).builderQueryWrapper();
+					functions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getCreateTime));
+				} else {
+					functions = this.saasFunctionService.queryAccountFunctionList(accountId, saasMenu.getGroupCode(), saasMenu.getMenuId());
+				}
+				saasMenu.setFunctions(CollectionUtil.isEmpty(functions) ? Lists.newArrayList() : functions);
 			}
-			saasMenu.setFunctions(CollectionUtil.isEmpty(functions) ? Lists.newArrayList() : functions);
 			return;
 		}
+		
+		// angle 1-集团视角,2-项目视角
+		String angle = StringUtil.isBlank(projectId) ? SaasCommonConstant.STR_STATUS_1 : SaasCommonConstant.STR_STATUS_2;
 		// 挂有产品,并判断是否是系统账号
 		if (!SaasCommonConstant.STR_STATUS_0.equals(accountBelong)) {
-			// 非系统账号,验证是否以签约改产品
+			// 非系统账号,验证是否签约改产品
 			int count = 0;
 			if (SaasCommonConstant.STR_STATUS_2.equals(angle)) {
 				LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper().groupCodeEq(groupCode).projectIdEq(projectId).productIdEq(saasMenu.getProductId()).builder();
@@ -95,69 +100,25 @@ public class SaasProductHandler {
 			}
 		}
 		// 已签约,走关联查询获取页面及其权限
-		List<SaasProductPage> pageTree = this.querySaasProductPageTree(angle, saasMenu.getProductId(), accountId, saasMenu.getMenuId(), isAdmin, showFunctions);
+		List<SaasProductPage> pageTree = this.querySaasProductPageTree(angle, saasMenu.getProductId(), accountId, accountBelong, saasMenu.getMenuId(), isAdmin, showPageAuth);
 		saasMenu.setProductPages(pageTree);
 		return;
 	}
 	
 	/**
-	 * 这里未签约,不会返回异常,会设置为空的集合
-	 * 获取此账号下能够可见的页面集合,优先做权限判断,判定是否进行了签约
-	 * 
-	 * @param menuId
-	 * @param productId
-	 * @param accountId
-	 * @param projectId
-	 * @param groupCode
-	 * @param isAdmin
-	 * @param showPageAuth
-	 */
-	/*public Object queryMenuProductAuths(String menuId, String productId, String accountId, String projectId, String groupCode, boolean isAdmin, boolean showPageAuth) {
-		// angle 1-集团视角,2-项目视角
-		String angle = StringUtil.isBlank(projectId) ? SaasCommonConstant.STR_STATUS_1 : SaasCommonConstant.STR_STATUS_2;
-		
-		if (StringUtil.isBlank(productId)) {
-			// 未挂有产品,关联查询出对应的功能点集合,即可返回
-			List<SaasFunction> functions = null;
-			if (isAdmin) {
-				LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
-				functions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getCreateTime));
-			} else {
-				functions = this.saasFunctionService.queryAccountFunctionList(accountId, groupCode, menuId);
-			}
-			functions = CollectionUtil.isEmpty(functions) ? Lists.newArrayList() : functions;
-			return functions;
-		}
-		// 挂有产品,判断是否已签约该产品
-		int count = 0;
-		if (SaasCommonConstant.STR_STATUS_2.equals(angle)) {
-			LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper().groupCodeEq(groupCode).projectIdEq(projectId).productIdEq(productId).builder();
-			count = this.saasProjectProductService.count(queryWrapper);
-		} else {
-			LambdaQueryWrapper<SaasGroupProduct> queryWrapper = new SaasGroupProduct.BuilderQueryWrapper().groupCodeEq(groupCode).productIdEq(productId).builder();
-			count = this.saasGroupProductService.count(queryWrapper);
-		}
-		if (count < 1) {
-			return Lists.newArrayList();	// 未签约
-		}
-		// 已签约,走关联查询获取页面及其权限
-		List<SaasProductPage> pageTree = this.querySaasProductPageTree(angle, productId, accountId, menuId, isAdmin, showPageAuth);
-		return pageTree;
-	}*/
-	
-	/**
 	 * 获取产品页面树
 	 * @param angle
 	 * @param productId
 	 * @param accountId
+	 * @param accountBelong
 	 * @param menuId
 	 * @param isAdmin 当为超管时,accountId、menuId可为空
 	 * @param showPageAuth
 	 * @return 空集合或数据集合
 	 */
-	public List<SaasProductPage> querySaasProductPageTree(String angle, String productId, String accountId, String menuId, boolean isAdmin, boolean showPageAuth) {
+	public List<SaasProductPage> querySaasProductPageTree(String angle, String productId, String accountId, String accountBelong, String menuId, boolean isAdmin, boolean showPageAuth) {
 		// 查询出该产品下顶级页面信息集合
-		List<SaasProductPage> topList = this.getTopProductPageList(angle, productId);
+		List<SaasProductPage> topList = this.getTopProductPageList(accountBelong, angle, productId);
 		if (topList.size() == 0) {
 			return topList;
 		}
@@ -167,12 +128,18 @@ public class SaasProductHandler {
 	
 	/**
 	 * 获取顶级产品页面信息集合
+	 * 
+	 * @param accountBelong 业务系统账号,没有视角的概念
 	 * @param angle
 	 * @param productId
 	 * @return
 	 */
-	public List<SaasProductPage> getTopProductPageList(String angle, String productId) {
-		LambdaQueryWrapper<SaasProductPage> queryWrapper = new SaasProductPage.BuilderQueryWrapper().pageAngleIn(angle).productIdEq(productId).builder();
+	public List<SaasProductPage> getTopProductPageList(String accountBelong, String angle, String productId) {
+		BuilderQueryWrapper wrapper = new SaasProductPage.BuilderQueryWrapper().productIdEq(productId);
+		if (!SaasCommonConstant.STR_STATUS_0.equals(accountBelong)) {
+			wrapper.pageAngleIn(angle);
+		}
+		LambdaQueryWrapper<SaasProductPage> queryWrapper = wrapper.builder();
 		queryWrapper.apply("(PARENT_ID IS NULL OR TRIM(PARENT_ID) = '')");
 		queryWrapper.orderByAsc(SaasProductPage::getCreateTime);
 		List<SaasProductPage> topList = this.saasProductPageService.list(queryWrapper);

+ 198 - 82
saas-account/src/main/java/com/persagy/account/manage/SaasRoleMenuHandler.java

@@ -2,8 +2,10 @@ package com.persagy.account.manage;
 
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,11 +13,11 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.google.common.collect.Lists;
 import com.persagy.account.pojo.dto.SaasAccountRole;
 import com.persagy.account.pojo.dto.SaasFunction;
 import com.persagy.account.pojo.dto.SaasMenu;
-import com.persagy.account.pojo.dto.SaasProduct;
 import com.persagy.account.pojo.dto.SaasRole;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
@@ -98,7 +100,7 @@ public class SaasRoleMenuHandler {
 	}
     
 	/**
-	 * 查询账号菜单功能权限树,菜单定义和角色定义编码相同,所以这里应该同步传递
+	 * 查询账号菜单功能权限树
 	 * 
 	 * @param accountId
 	 * @param accountBelong
@@ -110,31 +112,102 @@ public class SaasRoleMenuHandler {
 	 * @return 空集合或数据菜单树
 	 */
 	public List<SaasMenu> querySaasMenuTree(String accountId, String accountBelong, String groupCode, String projectId, String appId, boolean isAdmin, boolean isMenu) {
-		// 1.获取此账号对应菜单集合
-		List<SaasMenu> menuTree = null;
 		if (isAdmin) {
+			// 这里是所有的菜单项,直接转为菜单树即可
 			LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).menuTypeEq(SaasCommonConstant.STR_STATUS_0).builderQueryWrapper();
-			menuTree = this.saasMenuService.list(queryWrapper);
-		} else {
-			menuTree = this.saasMenuService.querySaasMenuTree(accountId, groupCode, appId, null, SaasCommonConstant.STATUS_1);
+			List<SaasMenu> menuTree = this.saasMenuService.list(queryWrapper);
+			if (CollectionUtil.isEmpty(menuTree)) {
+				return Lists.newArrayList();
+			}
+			// 转为菜单树
+			List<SaasMenu> topMenus = new ArrayList<SaasMenu>();
+			for (int i = menuTree.size() - 1; i >= 0; i--) {
+				SaasMenu saasMenu = menuTree.get(i);
+				if (StringUtil.isBlank(saasMenu.getParentId())) {
+					topMenus.add(saasMenu);
+					menuTree.remove(i);
+				}
+			}
+			List<SaasMenu> parents = topMenus.stream().sorted(Comparator.comparing(SaasMenu::getMenuSort)).collect(Collectors.toList());
+			this.setMenuChildrens(accountId, accountBelong, groupCode, projectId, menuTree, parents, isAdmin, !isMenu);
+			return parents;
 		}
-		if (CollectionUtil.isEmpty(menuTree)) {
+		// 这里查询出来的仅是最末级的菜单,需要往上递归查询出父级,再形成菜单树
+		List<SaasMenu> menuTree = this.saasMenuService.querySaasMenuTree(accountId, groupCode, appId, null, SaasCommonConstant.STATUS_1);
+		return this.setMenuChildrens(menuTree, appId, accountId, accountBelong, groupCode, projectId, isAdmin, !isMenu);
+	}
+
+	/**
+	 * 根据末级菜单集合,这里不往上递归查询形成树,因为涉及到排序,所以这里先查询出顶级树,根据条件剔除菜单
+	 * 
+	 * @param authMenus 自动剔除无法看到的菜单
+	 * @param appId
+	 * @param accountId
+	 * @param accountBelong
+	 * @param groupCode
+	 * @param projectId
+	 * @param isAdmin
+	 * @param menuAndFun
+	 */
+	public List<SaasMenu> setMenuChildrens(List<SaasMenu> authMenus, String appId, String accountId, String accountBelong,
+			String groupCode, String projectId, boolean isAdmin, boolean menuAndFun) {
+		if (CollectionUtil.isEmpty(authMenus)) {
 			return Lists.newArrayList();
 		}
-		// 2.转为菜单树
-		List<SaasMenu> topMenus = new ArrayList<SaasMenu>();
-		for (int i = menuTree.size() - 1; i >= 0; i--) {
-			SaasMenu saasMenu = menuTree.get(i);
-			if (StringUtil.isBlank(saasMenu.getParentId())) {
-				topMenus.add(saasMenu);
-				menuTree.remove(i);
+		Set<String> lastMenuIds = new HashSet<String>();
+		for (SaasMenu saasMenu : authMenus) {
+			lastMenuIds.add(saasMenu.getId());
+		}
+		// 1.获取顶级菜单树
+		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).builderQueryWrapper();
+    	queryWrapper.apply("(PARENT_ID IS NULL OR TRIM(PARENT_ID) = '')");
+    	queryWrapper.orderByAsc(SaasMenu::getMenuSort);		// 默认菜单升序排序
+    	List<SaasMenu> topMenu = this.saasMenuService.list(queryWrapper);
+    	this.setMenuChildrens(topMenu, lastMenuIds, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun);
+    	return topMenu;
+	}
+	
+	/**
+	 * 根据权限ID集合,形成菜单树
+	 * 
+	 * @param menuList
+	 * @param lastMenuIds
+	 * @param accountId
+	 * @param accountBelong
+	 * @param groupCode
+	 * @param projectId
+	 * @param isAdmin
+	 * @param menuAndFun
+	 */
+	private void setMenuChildrens(List<SaasMenu> menuList, Set<String> lastMenuIds, String accountId, String accountBelong,
+			String groupCode, String projectId, boolean isAdmin, boolean menuAndFun) {
+		for (int i = menuList.size() - 1; i >= 0; i--) {
+			SaasMenu saasMenu = menuList.get(i);
+			// 获取下级
+			LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(saasMenu.getId()).builderQueryWrapper();
+			queryWrapper.orderByAsc(SaasMenu::getMenuSort);		// 默认菜单升序排序
+	    	List<SaasMenu> childrens = this.saasMenuService.list(queryWrapper);
+	    	if (CollectionUtil.isEmpty(childrens) && !lastMenuIds.contains(saasMenu.getId())) {
+	    		menuList.remove(i);		//移除
+			} else {
+				childrens = CollectionUtil.isEmpty(childrens) ? Lists.newArrayList() : childrens;
+		    	saasMenu.setChildrens(childrens);
+		    	// 再次查询
+				this.setMenuChildrens(childrens, lastMenuIds, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun);
+				
+				// 最后还需判断一次,递归回路删除上级菜单信息
+				if (CollectionUtil.isEmpty(saasMenu.getChildrens()) && !lastMenuIds.contains(saasMenu.getId())) {
+					menuList.remove(i);		//移除
+				} else {
+					// 最后查询出来权限点
+					if (StringUtil.isNotBlank(saasMenu.getMenuUrl())) {
+						this.saasProductHandler.queryMenuProductAuths(saasMenu, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun, menuAndFun);
+					}
+				}
 			}
 		}
-		List<SaasMenu> parents = topMenus.stream().sorted(Comparator.comparing(SaasMenu::getMenuSort)).collect(Collectors.toList());
-		this.setMenuChildrens(accountId, accountBelong, groupCode, projectId, menuTree, parents, isAdmin, !isMenu);
-		return parents;
 	}
-
+	
 	/**
 	 * 生成菜单树
 	 * @param accountId 为null时,isAdmin 为true
@@ -152,7 +225,7 @@ public class SaasRoleMenuHandler {
 				parent.setMenuId(parent.getId());
 			}
 			if (StringUtil.isNotBlank(parent.getMenuUrl())) {
-				this.saasProductHandler.queryMenuProductAuths(parent, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun);
+				this.saasProductHandler.queryMenuProductAuths(parent, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun, menuAndFun);
 			}
 			
 			List<SaasMenu> childrens = null;
@@ -198,68 +271,6 @@ public class SaasRoleMenuHandler {
 	}
 	
 	/**
-	 * 删除菜单,级联删除,角色、菜单、功能三者关联关系数据
-	 * 
-	 * @param menuId
-	 * @param productId
-	 * @param updateProduct 是否更新产品关联菜单字段
-	 * @return
-	 */
-	@Transactional
-	public boolean deleteSaasMenu(String menuId, String productId, boolean updateProduct) {
-		if (StringUtil.isBlank(menuId)) {
-			return true;
-		}
-		boolean result = this.saasMenuService.removeById(menuId);
-		if (result) {
-			if (updateProduct) {
-				// 更新产品是否已关联菜单字段
-				SaasProduct saasProduct = new SaasProduct();
-				saasProduct.setId(productId);
-				saasProduct.setProductMenu(SaasCommonConstant.STR_STATUS_0);
-				result = this.saasProductService.updateById(saasProduct);
-			}
-			// 1.删除此菜单下功能
-			LambdaQueryWrapper<SaasFunction> funWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
-			this.saasFunctionService.remove(funWrapper);
-			// 2.删除此功能对应的菜单、角色关系数据
-			LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
-			this.saasRoleMenuService.remove(roleMenuWrapper);
-			// 级联删除此菜单下的所有子菜单和对应的功能点信息
-			this.casDeleteChildrenMenu(menuId);
-			return true;
-		}
-		throw new BusinessException("菜单信息删除失败");
-	}
-
-	/**
-	 * 级联删除所有的子菜单和对应的权限信息
-	 * @param menuId
-	 * @param productId
-	 */
-	@Transactional
-	public void casDeleteChildrenMenu(String parentId) {
-		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(parentId).builderQueryWrapper();
-		List<SaasMenu> saasMenus = this.saasMenuService.list(queryWrapper.select(SaasMenu::getId, SaasMenu::getProductId));
-		if (CollectionUtil.isEmpty(saasMenus)) {
-			return;
-		}
-		for (SaasMenu saasMenu : saasMenus) {
-			boolean updateProduct = false;
-	    	if (StringUtil.isNotBlank(saasMenu.getProductId())) {
-				// 判断此产品是否仅被此菜单使用
-	    		queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
-	    		int count = this.saasMenuService.count(queryWrapper);
-	    		if (count < 2) {
-	    			updateProduct = true;
-				}
-			}
-	    	// 删除此菜单
-	    	this.deleteSaasMenu(saasMenu.getId(), saasMenu.getProductId(), updateProduct);
-		}
-	}
-
-	/**
 	 * 删除功能,级联删除菜单、功能关系
 	 * 
 	 * @param funId
@@ -346,4 +357,109 @@ public class SaasRoleMenuHandler {
 		return result;
 	}
 
+	/**
+	 * 创建菜单,同时设置产品是否已关联菜单
+	 * @param saasMenu
+	 * @return
+	 */
+	@Transactional
+	public boolean createSaasMenu(SaasMenu saasMenu) {
+		boolean result = this.saasMenuService.save(saasMenu);
+		if (result && StringUtil.isNotBlank(saasMenu.getProductId())) {
+			this.saasProductService.updateProductByMenu(saasMenu.getProductId(), SaasCommonConstant.STR_STATUS_1, saasMenu.getId());
+		}
+		return result;
+	}
+	
+	/**
+	 * 更新菜单
+	 * 
+	 * @param saasMenu
+	 * @param orgProductId 原纪录的产品ID 
+	 * @return
+	 */
+	@Transactional
+	public boolean updateSaasMenu(SaasMenu saasMenu, String orgProductId) {
+		boolean result = false;
+		if (StringUtil.isAllBlank(saasMenu.getProductId(), orgProductId)) {
+			result = this.saasMenuService.updateById(saasMenu);
+			return result;
+		}
+		if (StringUtil.isNotBlank(orgProductId) && StringUtil.isBlank(saasMenu.getProductId())) {
+			// 判断此产品是否仅被此菜单使用
+    		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
+    		int count = this.saasMenuService.count(queryWrapper);
+    		if (count < 2) {
+    			this.saasProductService.updateProductByMenu(orgProductId, SaasCommonConstant.STR_STATUS_0, null);
+    		}
+    		// 更新此菜单信息
+    		LambdaUpdateWrapper<SaasMenu> updateWrapper = new SaasMenu.Builder().idEq(saasMenu.getId()).builderUpdateWrapper();
+    		updateWrapper.setSql("PRODUCT_ID = NULL");
+			result = this.saasMenuService.update(saasMenu, updateWrapper);
+			return result;
+		}
+		// 更新产品是否已关联菜单字段
+		result = this.saasMenuService.updateById(saasMenu);
+		this.saasProductService.updateProductByMenu(saasMenu.getProductId(), SaasCommonConstant.STR_STATUS_1, saasMenu.getId());
+		return result;
+	}
+
+	/**
+	 * 删除菜单,级联删除,角色、菜单、功能三者关联关系数据
+	 * 
+	 * @param menuId
+	 * @param productId
+	 * @param updateProduct 是否更新产品关联菜单字段
+	 * @return
+	 */
+	@Transactional
+	public boolean deleteSaasMenu(String menuId, String productId, boolean updateProduct) {
+		if (StringUtil.isBlank(menuId)) {
+			return true;
+		}
+		boolean result = this.saasMenuService.removeById(menuId);
+		if (result) {
+			if (updateProduct) {
+				this.saasProductService.updateProductByMenu(productId, SaasCommonConstant.STR_STATUS_0, null);
+			}
+			// 1.删除此菜单下功能
+			LambdaQueryWrapper<SaasFunction> funWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
+			this.saasFunctionService.remove(funWrapper);
+			// 2.删除此功能对应的菜单、角色关系数据
+			LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
+			this.saasRoleMenuService.remove(roleMenuWrapper);
+			// 级联删除此菜单下的所有子菜单和对应的功能点信息
+			this.casDeleteChildrenMenu(menuId);
+			return true;
+		}
+		throw new BusinessException("菜单信息删除失败");
+	}
+
+	/**
+	 * 级联删除所有的子菜单和对应的权限信息
+	 * @param menuId
+	 * @param productId
+	 */
+	@Transactional
+	public void casDeleteChildrenMenu(String parentId) {
+		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(parentId).builderQueryWrapper();
+		List<SaasMenu> saasMenus = this.saasMenuService.list(queryWrapper.select(SaasMenu::getId, SaasMenu::getProductId));
+		if (CollectionUtil.isEmpty(saasMenus)) {
+			return;
+		}
+		for (SaasMenu saasMenu : saasMenus) {
+			boolean updateProduct = false;
+	    	if (StringUtil.isNotBlank(saasMenu.getProductId())) {
+				// 判断此产品是否仅被此菜单使用
+	    		queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
+	    		int count = this.saasMenuService.count(queryWrapper);
+	    		if (count < 2) {
+	    			updateProduct = true;
+				}
+			}
+	    	// 删除此菜单
+	    	this.deleteSaasMenu(saasMenu.getId(), saasMenu.getProductId(), updateProduct);
+		}
+	}
+	
 }

+ 2 - 1
saas-account/src/main/java/com/persagy/account/mapper/SaasProjectMapper.java

@@ -55,7 +55,8 @@ public interface SaasProjectMapper extends BaseMapper<SaasProject> {
 	 * @param valid 1-可用,0-不可用
 	 * @return
 	 */
-	List<SaasProject> queryAllowGroupProjectList(@Param("groupCode") String groupCode, @Param("accountId") String accountId, @Param("valid") Integer valid);
+	List<SaasProject> queryAllowGroupProjectList(@Param("groupCode") String groupCode, @Param("accountId") String accountId, 
+			@Param("areaId") String areaId, @Param("valid") Integer valid);
 	
 	/**
 	 * 批量插入项目信息

+ 11 - 0
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasArea.java

@@ -146,6 +146,17 @@ public class SaasArea extends BaseEntity<SaasArea> {
 			}
 			return this;
 		}
+		
+		public Builder areaCodeNe(String areaCode) {
+			if (StringUtil.isNotBlank(areaCode)) {
+				if (updateWrapper != null) {
+					updateWrapper.ne(SaasArea::getAreaCode, areaCode);
+				} else {
+					queryWrapper.ne(SaasArea::getAreaCode, areaCode);
+				}
+			}
+			return this;
+		}
 
 		public Builder areaNameEq(String areaName) {
 			if (StringUtil.isNotBlank(areaName)) {

+ 15 - 1
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasFunction.java

@@ -49,6 +49,9 @@ public class SaasFunction extends BaseEntity<SaasFunction> {
 	
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String funUrl;	//功能URL
+	
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	private String productId; // 产品ID
 
 	@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_EMPTY)
 	private Date createTime; // 创建时间
@@ -113,7 +116,18 @@ public class SaasFunction extends BaseEntity<SaasFunction> {
 			}
 			return this;
 		}
-
+		
+		public Builder productIdEq(String productId) {
+			if (StringUtil.isNotBlank(productId)) {
+				if (updateWrapper != null) {
+					updateWrapper.eq(SaasFunction::getProductId, productId);
+				} else {
+					queryWrapper.eq(SaasFunction::getProductId, productId);
+				}
+			}
+			return this;
+		}
+		
 		public Builder funCodeEq(String funCode) {
 			if (StringUtil.isNotBlank(funCode)) {
 				if (updateWrapper != null) {

+ 17 - 0
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProduct.java

@@ -40,6 +40,9 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 	private String appId; // 应用ID, PC-电脑端,APP-手机端
 	
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	private String menuId; // 已关联菜单的产品,对应的菜单ID
+	
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String productCode; // 产品编码
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
@@ -83,6 +86,13 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 			return this;
 		}
 		
+		public BuilderQueryWrapper menuIdEq(String menuId) {
+			if (StringUtil.isNotBlank(menuId)) {
+				queryWrapper.eq(SaasProduct::getMenuId, menuId);
+			}
+			return this;
+		}
+		
 		public BuilderQueryWrapper appIdEq(String appId) {
 			if (StringUtil.isNotBlank(appId)) {
 				queryWrapper.eq(SaasProduct::getAppId, appId);
@@ -184,6 +194,13 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 			return this;
 		}
 		
+		public BuilderUpdateWrapper menuIdEq(String menuId) {
+			if (StringUtil.isNotBlank(menuId)) {
+				updateWrapper.eq(SaasProduct::getMenuId, menuId);
+			}
+			return this;
+		}
+		
 		public BuilderUpdateWrapper appIdEq(String appId) {
 			if (StringUtil.isNotBlank(appId)) {
 				updateWrapper.eq(SaasProduct::getAppId, appId);

+ 3 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/function/SaasFunctionCreateVO.java

@@ -34,6 +34,9 @@ public class SaasFunctionCreateVO extends BaseUserModel {
 	@ApiModelProperty(value = "页面ID", example = "123")
 	private String pageId;	// 页面ID
 
+	@ApiModelProperty(value = "产品ID", example = "PD1001")
+	private String productId; // 产品ID
+	
 	//@NotBlank(message = "功能编码,不可为空")
 	@ApiModelProperty(value = "功能编码", example = "456")
 	private String funCode; // 功能编码

+ 1 - 1
saas-account/src/main/java/com/persagy/account/pojo/vo/function/SaasMenuFunctionVO.java

@@ -41,6 +41,6 @@ public class SaasMenuFunctionVO extends BaseUserModel {
 	private String pageId; // 页面ID
 	
 	@ApiModelProperty(value = "是否展示产品页面的功能点信息,true-展示,默认false", example = "false")
-	private boolean showPageAuth;	//是否展示产品页面的功能点信息,true-展示,默认false
+	private boolean showPageAuth = false;	//是否展示产品页面的功能点信息,true-展示,默认false
 
 }

+ 5 - 2
saas-account/src/main/java/com/persagy/account/pojo/vo/project/SaasProjectQueryVO.java

@@ -62,8 +62,11 @@ public class SaasProjectQueryVO extends BaseUserModel {
 	@ApiModelProperty(value = "最后一次操作者ID", example = "zhangsan")
 	private String updateUser; // 最后一次操作者ID
 
-	@ApiModelProperty(value = "是否展示空的区域信息,即不存在项目的空区域", example = "zhangsan")
-	private Boolean showEmptyArea = true; 	// 是否展示空的区域信息,即不存在项目的空区域
+	@ApiModelProperty(value = "是否展示空的区域信息,即不存在项目的空区域", example = "true")
+	private boolean showEmptyArea = true; 	// 是否展示空的区域信息,即不存在项目的空区域
+	
+	@ApiModelProperty(value = "是否剔除未分区,改为未分区下的项目平铺在集团下,true-是,默认false", example = "false")
+	private boolean excludeEmptyArea = false; 	// 是否剔除未分区,改为未分区下的项目平铺在集团下,true-是,默认false
 	
 	private Integer valid = SaasCommonConstant.STATUS_1; // 0-不可用,1-可用
 

+ 0 - 16
saas-account/src/main/java/com/persagy/account/service/ISaasMenuService.java

@@ -65,21 +65,5 @@ public interface ISaasMenuService extends ISuperService<SaasMenu> {
 	 */
 	boolean validMenuName(String appId, String menuType, String menuName, String menuId);
 	
-	/**
-	 * 创建菜单,同时设置产品是否已关联菜单
-	 * @param saasMenu
-	 * @return
-	 */
-	boolean createSaasMenu(SaasMenu saasMenu);
-
-	/**
-	 * 更新菜单
-	 * 
-	 * @param saasMenu
-	 * @param orgProductId 原纪录的产品ID 
-	 * @return
-	 */
-	boolean updateSaasMenu(SaasMenu saasMenu, String orgProductId);
-
 }
 

+ 10 - 0
saas-account/src/main/java/com/persagy/account/service/ISaasProductService.java

@@ -39,5 +39,15 @@ public interface ISaasProductService extends ISuperService<SaasProduct> {
 	 */
 	String validProductName(String appId, String productType, String productName, String id);
 
+	/***
+	 * 在添加、更新菜单时,同步更新产品信息
+	 * 
+	 * @param productId
+	 * @param productMenu
+	 * @param menuId
+	 * @return
+	 */
+	boolean updateProductByMenu(String productId, String productMenu, String menuId);
+
 }
 

+ 2 - 1
saas-account/src/main/java/com/persagy/account/service/ISaasProjectService.java

@@ -49,9 +49,10 @@ public interface ISaasProjectService extends ISuperService<SaasProject> {
 	 * 
 	 * @param groupCode
 	 * @param accountId
+	 * @param areaId 区域ID
 	 * @return
 	 */
-	List<SaasProject> queryAllowGroupProjectList(String groupCode, String accountId);
+	List<SaasProject> queryAllowGroupProjectList(String groupCode, String accountId, String areaId);
 	
 	/**
 	 * 验证项目ID、项目本地编码、项目名称,分别在集团下的唯一性

+ 0 - 58
saas-account/src/main/java/com/persagy/account/service/impl/SaasMenuServiceImpl.java

@@ -2,20 +2,15 @@ package com.persagy.account.service.impl;
 
 import java.util.List;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.persagy.account.mapper.SaasMenuMapper;
-import com.persagy.account.mapper.SaasProductMapper;
 import com.persagy.account.pojo.dto.SaasMenu;
-import com.persagy.account.pojo.dto.SaasProduct;
 import com.persagy.account.pojo.vo.menu.SaasMenuSort;
 import com.persagy.account.service.ISaasMenuService;
-import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.service.impl.SuperServiceImpl;
 import com.persagy.common.utils.StringUtil;
 
@@ -30,9 +25,6 @@ import com.persagy.common.utils.StringUtil;
 @Service
 public class SaasMenuServiceImpl extends SuperServiceImpl<SaasMenuMapper, SaasMenu> implements ISaasMenuService {
 	
-	@Autowired
-	private SaasProductMapper saasProductMapper;
-	
 	@Override
 	public List<SaasMenu> querySaasMenuTree(String accountId, String groupCode, String appId, String menuId, Integer valid) {
 		return this.baseMapper.querySaasMenuTree(accountId, groupCode, appId, menuId, valid);
@@ -70,54 +62,4 @@ public class SaasMenuServiceImpl extends SuperServiceImpl<SaasMenuMapper, SaasMe
 		return true;
 	}
 
-	@Override
-	@Transactional
-	public boolean createSaasMenu(SaasMenu saasMenu) {
-		Integer result = this.baseMapper.insert(saasMenu);
-		if (SqlHelper.retBool(result) && StringUtil.isNotBlank(saasMenu.getProductId())) {
-			// 更新产品是否已关联菜单字段
-			SaasProduct saasProduct = new SaasProduct();
-			saasProduct.setId(saasMenu.getProductId());
-			saasProduct.setProductMenu(SaasCommonConstant.STR_STATUS_1);
-			result = this.saasProductMapper.updateById(saasProduct);
-		}
-		return SqlHelper.retBool(result);
-	}
-
-	@Override
-	@Transactional
-	public boolean updateSaasMenu(SaasMenu saasMenu, String orgProductId) {
-		Integer result = null;
-		if (StringUtil.isAllBlank(saasMenu.getProductId(), orgProductId)) {
-			result = this.baseMapper.updateById(saasMenu);
-			return SqlHelper.retBool(result);
-		}
-		if (StringUtil.isNotBlank(orgProductId) && StringUtil.isBlank(saasMenu.getProductId())) {
-			// 判断此产品是否仅被此菜单使用
-    		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
-    		int count = this.baseMapper.selectCount(queryWrapper);
-    		if (count < 2) {
-    			// 更新产品是否已关联菜单字段
-				SaasProduct saasProduct = new SaasProduct();
-				saasProduct.setId(orgProductId);
-				saasProduct.setProductMenu(SaasCommonConstant.STR_STATUS_0);
-				this.saasProductMapper.updateById(saasProduct);
-			}
-    		// 更新此菜单信息
-    		LambdaUpdateWrapper<SaasMenu> updateWrapper = new SaasMenu.Builder().idEq(saasMenu.getId()).builderUpdateWrapper();
-    		updateWrapper.setSql("PRODUCT_ID = NULL");
-			result = this.baseMapper.update(saasMenu, updateWrapper);
-			return SqlHelper.retBool(result);
-		}
-		// 更新产品是否已关联菜单字段
-		result = this.baseMapper.updateById(saasMenu);
-		if (SqlHelper.retBool(result)) {
-			SaasProduct saasProduct = new SaasProduct();
-			saasProduct.setId(saasMenu.getProductId());
-			saasProduct.setProductMenu(SaasCommonConstant.STR_STATUS_1);
-			result = this.saasProductMapper.updateById(saasProduct);
-		}
-		return SqlHelper.retBool(result);
-	}
-
 }

+ 18 - 2
saas-account/src/main/java/com/persagy/account/service/impl/SaasProductServiceImpl.java

@@ -4,8 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.persagy.common.service.impl.SuperServiceImpl;
-import com.persagy.common.utils.StringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
@@ -14,6 +12,9 @@ import com.persagy.account.mapper.SaasProductMapper;
 import com.persagy.account.pojo.dto.SaasMenu;
 import com.persagy.account.pojo.dto.SaasProduct;
 import com.persagy.account.service.ISaasProductService;
+import com.persagy.common.constant.SaasCommonConstant;
+import com.persagy.common.service.impl.SuperServiceImpl;
+import com.persagy.common.utils.StringUtil;
 
 /**
  * 产品信息
@@ -76,4 +77,19 @@ public class SaasProductServiceImpl extends SuperServiceImpl<SaasProductMapper,
 		return null;
 	}
 
+	@Override
+	@Transactional
+	public boolean updateProductByMenu(String productId, String productMenu, String menuId) {
+		// 未关联菜单
+		LambdaUpdateWrapper<SaasProduct> updateWrapper = new SaasProduct.BuilderUpdateWrapper().idEq(productId).builder();
+		updateWrapper.set(SaasProduct::getProductMenu, productMenu);
+		if (SaasCommonConstant.STR_STATUS_0.equals(productMenu)) {
+			updateWrapper.setSql("MENU_ID = NULL");
+		} else {
+			updateWrapper.set(SaasProduct::getMenuId, menuId);
+		}
+		Integer result = this.baseMapper.update(null, updateWrapper);
+		return SqlHelper.retBool(result);
+	}
+
 }

+ 2 - 2
saas-account/src/main/java/com/persagy/account/service/impl/SaasProjectServiceImpl.java

@@ -101,8 +101,8 @@ public class SaasProjectServiceImpl extends SuperServiceImpl<SaasProjectMapper,
 	}
 	
 	@Override
-	public List<SaasProject> queryAllowGroupProjectList(String groupCode, String accountId) {
-		return this.baseMapper.queryAllowGroupProjectList(groupCode, accountId, SaasCommonConstant.STATUS_1);
+	public List<SaasProject> queryAllowGroupProjectList(String groupCode, String accountId, String areaId) {
+		return this.baseMapper.queryAllowGroupProjectList(groupCode, accountId, areaId, SaasCommonConstant.STATUS_1);
 	}
 	
 	@Override

+ 2 - 1
saas-account/src/main/resources/mapper/SaasFunctionMapper.xml

@@ -6,6 +6,7 @@
 	<resultMap id="BaseResultMap" type="com.persagy.account.pojo.dto.SaasFunction">
 		<result column="ID" property="id" jdbcType="VARCHAR" />
 		<result column="MENU_ID" property="menuId" jdbcType="VARCHAR" />
+		<result column="PRODUCT_ID" property="productId" jdbcType="VARCHAR" />
 		<result column="PAGE_ID" property="pageId" jdbcType="VARCHAR" />
 		<result column="FUN_CODE" property="funCode" jdbcType="VARCHAR" />
 		<result column="FUN_NAME" property="funName" jdbcType="VARCHAR" />
@@ -19,7 +20,7 @@
 	</resultMap>
 	
 	<sql id="Base_Sql_Column">
-		ID, MENU_ID, PAGE_ID, FUN_CODE, FUN_NAME, FUN_URL, CREATE_TIME, REMARK
+		ID, MENU_ID, PRODUCT_ID, PAGE_ID, FUN_CODE, FUN_NAME, FUN_URL, CREATE_TIME, REMARK
 	</sql>
 	
 	<select id="queryAccountFunctionList" resultMap="BaseResultMap">

+ 1 - 0
saas-account/src/main/resources/mapper/SaasProductMapper.xml

@@ -6,6 +6,7 @@
 	<resultMap id="BaseResultMap" type="com.persagy.account.pojo.dto.SaasProduct">
 		<result column="ID" property="id" jdbcType="VARCHAR" />
 		<result column="APP_ID" property="appId" jdbcType="VARCHAR" />
+		<result column="MENU_ID" property="menuId" jdbcType="VARCHAR" />
 		<result column="PRODUCT_CODE" property="productCode" jdbcType="VARCHAR" />
 		<result column="PRODUCT_NAME" property="productName" jdbcType="VARCHAR" />
 		<result column="PRODUCT_ICON" property="productIcon" jdbcType="VARCHAR" />

+ 1 - 0
saas-account/src/main/resources/mapper/SaasProjectMapper.xml

@@ -127,6 +127,7 @@
 		JOIN (SELECT <include refid="Base_Sql_Column"></include> FROM saas_project 
 		<where>
 			<if test="groupCode != null and groupCode.trim().length() != 0">AND GROUP_CODE = #{groupCode}</if>
+			<if test="areaId != null and areaId.trim().length() != 0">AND AREA_ID = #{areaId}</if>
 			<if test="valid != null">AND VALID = #{valid}</if>
 		</where>) N ON M.GROUP_CODE = N.GROUP_CODE AND M.PROJECT_ID = N.PROJECT_ID ORDER BY N.PROJECT_NAME 
 	</select>