Przeglądaj źródła

产品配置优化

zhangqiankun 3 lat temu
rodzic
commit
1949e494f1
33 zmienionych plików z 851 dodań i 107 usunięć
  1. 19 10
      saas-account/src/main/java/com/persagy/account/controller/SaasFunctionController.java
  2. 4 0
      saas-account/src/main/java/com/persagy/account/controller/SaasGroupProductController.java
  3. 2 2
      saas-account/src/main/java/com/persagy/account/controller/SaasProductController.java
  4. 1 1
      saas-account/src/main/java/com/persagy/account/controller/SaasProductPageController.java
  5. 43 5
      saas-account/src/main/java/com/persagy/account/controller/SaasProjectProductController.java
  6. 16 4
      saas-account/src/main/java/com/persagy/account/controller/SaasRoleMenuController.java
  7. 67 57
      saas-account/src/main/java/com/persagy/account/manage/SaasProductHandler.java
  8. 24 3
      saas-account/src/main/java/com/persagy/account/manage/SaasRoleMenuHandler.java
  9. 14 2
      saas-account/src/main/java/com/persagy/account/mapper/SaasRoleMenuMapper.java
  10. 3 0
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasAccount.java
  11. 1 1
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasGroupProduct.java
  12. 19 2
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProduct.java
  13. 1 2
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProjectProduct.java
  14. 3 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/account/SaasAccountQueryVO.java
  15. 32 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionPage.java
  16. 37 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionPageVO.java
  17. 1 1
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionVO.java
  18. 2 2
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasRoleMenuBatchVO.java
  19. 3 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasRoleMenuCreateVO.java
  20. 3 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasRoleMenuQueryVO.java
  21. 3 4
      saas-account/src/main/java/com/persagy/account/pojo/vo/function/SaasMenuFunctionVO.java
  22. 4 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProductCreateVO.java
  23. 3 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProductQueryVO.java
  24. 4 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProjectProductCreateVO.java
  25. 10 0
      saas-account/src/main/java/com/persagy/account/service/ISaasRoleMenuService.java
  26. 10 0
      saas-account/src/main/java/com/persagy/account/service/impl/SaasGroupProductServiceImpl.java
  27. 10 0
      saas-account/src/main/java/com/persagy/account/service/impl/SaasRoleMenuServiceImpl.java
  28. 2 0
      saas-account/src/main/resources/mapper/SaasAccountMapper.xml
  29. 1 1
      saas-account/src/main/resources/mapper/SaasGroupProductDetailMapper.xml
  30. 1 0
      saas-account/src/main/resources/mapper/SaasProductMapper.xml
  31. 1 1
      saas-account/src/main/resources/mapper/SaasProjectProductMapper.xml
  32. 9 0
      saas-account/src/main/resources/mapper/SaasRoleMenuMapper.xml
  33. 498 9
      saas-doc/doc/saas_platform.md

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

@@ -1,6 +1,7 @@
 package com.persagy.account.controller;
 package com.persagy.account.controller;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
+import com.persagy.account.manage.SaasAuthHandler;
 import com.persagy.account.manage.SaasProductHandler;
 import com.persagy.account.manage.SaasProductHandler;
 import com.persagy.account.manage.SaasRoleMenuHandler;
 import com.persagy.account.manage.SaasRoleMenuHandler;
 import com.persagy.account.pojo.dto.SaasFunction;
 import com.persagy.account.pojo.dto.SaasFunction;
@@ -27,6 +29,7 @@ import com.persagy.account.service.ISaasFunctionService;
 import com.persagy.account.service.ISaasMenuService;
 import com.persagy.account.service.ISaasMenuService;
 import com.persagy.account.service.ISaasProductPageService;
 import com.persagy.account.service.ISaasProductPageService;
 import com.persagy.account.service.ISaasRoleService;
 import com.persagy.account.service.ISaasRoleService;
+import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResultUtil;
 import com.persagy.common.utils.ResponseResultUtil;
@@ -50,6 +53,9 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping(value = "/function", method = RequestMethod.POST)
 @RequestMapping(value = "/function", method = RequestMethod.POST)
 public class SaasFunctionController {
 public class SaasFunctionController {
 	
 	
+	@Autowired
+	private SaasAuthHandler saasAuthHandler;
+	
     @Autowired
     @Autowired
     private ISaasMenuService saasMenuService;
     private ISaasMenuService saasMenuService;
     
     
@@ -76,16 +82,19 @@ public class SaasFunctionController {
     @RequestMapping(value = "queryMenuFunctionList")
     @RequestMapping(value = "queryMenuFunctionList")
     public ResponseResult queryMenuFunctionList(@RequestBody @Validated SaasMenuFunctionVO model) {
     public ResponseResult queryMenuFunctionList(@RequestBody @Validated SaasMenuFunctionVO model) {
     	// 优先判断此账号是否拥有此菜单的权限,后续判断
     	// 优先判断此账号是否拥有此菜单的权限,后续判断
-    	// 判断此菜单ID是否为产品,后续的落地菜单,均挂产品,此项判断仅为兼容之前的数据
-    	if (StringUtil.isBlank(model.getProductId())) {
-			// 产品ID不存在,直接获取此账号所拥有的功能点信息集合,返回
-    		List<SaasFunction> functions = this.saasFunctionService.queryAccountFunctionList(model.getAccountId(), model.getGroupCode(), model.getMenuId());
-    		return ResponseResultUtil.successResult(functions);
-    	}
-    	// 根据账号、集团、项目、视角获取满足条件的产品页面集合
-    	List<SaasProductPage> productPages = this.saasProductHandler.queryProductPageList(model.getAccountId(), model.getProductId(), 
-    			model.getAngle(), model.getGroupCode(), model.getProjectId());
-        return ResponseResultUtil.successResult(productPages);
+    	// 判断此账号的权限范围
+    	boolean isAdmin = false;
+    	Map<String, String> authMap = this.saasAuthHandler.validAccountAuth(model.getAccountId(), model.getGroupCode());
+		String groupCode = authMap.get(SaasCommonConstant.GROUP_CODE);
+		String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE);
+		if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) {
+			// 超管时
+			isAdmin = true;
+		}
+    	// 获取此账号、此菜单下所对应的功能点信息集合 或者 产品页面树集合
+    	Object result = this.saasProductHandler.queryMenuProductAuths(model.getMenuId(), model.getProductId(), model.getAccountId(), 
+    			model.getProjectId(), groupCode, isAdmin, model.isShowPageAuth());
+        return ResponseResultUtil.successResult(result);
     }
     }
 	
 	
     /**
     /**

+ 4 - 0
saas-account/src/main/java/com/persagy/account/controller/SaasGroupProductController.java

@@ -25,6 +25,7 @@ import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResultUtil;
 import com.persagy.common.utils.ResponseResultUtil;
+import com.persagy.common.utils.StringUtil;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
@@ -114,6 +115,9 @@ public class SaasGroupProductController {
 	@ApiOperation(value = "更新")
 	@ApiOperation(value = "更新")
 	@RequestMapping(value = "updateSaasGroupProduct")
 	@RequestMapping(value = "updateSaasGroupProduct")
     public ResponseResult updateSaasGroupProduct(@RequestBody @Validated SaasGroupProductCreateVO model) {
     public ResponseResult updateSaasGroupProduct(@RequestBody @Validated SaasGroupProductCreateVO model) {
+		if (StringUtil.isBlank(model.getId())) {
+			return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "签约ID不可为空");
+		}
 		if (SaasCommonConstant.STR_STATUS_0.equals(model.getValidLast())) {
 		if (SaasCommonConstant.STR_STATUS_0.equals(model.getValidLast())) {
 			if (!(model.getValidStartTime() != null && model.getValidEndTime() != null)) {
 			if (!(model.getValidStartTime() != null && model.getValidEndTime() != null)) {
 				return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "当validLast为0时,签约有效期时间字段不可为空");
 				return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "当validLast为0时,签约有效期时间字段不可为空");

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

@@ -53,7 +53,7 @@ public class SaasProductController {
     	LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper()
     	LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper()
     			.productCodeEq(model.getProductCode()).productNameLike(model.getProductName())
     			.productCodeEq(model.getProductCode()).productNameLike(model.getProductName())
     			.productStateEq(model.getProductState()).productMenuEq(model.getProductMenu())
     			.productStateEq(model.getProductState()).productMenuEq(model.getProductMenu())
-    			.appIdEq(model.getAppId()).updateUserEq(model.getUpdateUser()).builder();
+    			.productTypeEq(model.getProductType()).appIdEq(model.getAppId()).updateUserEq(model.getUpdateUser()).builder();
     	queryWrapper.orderByDesc(SaasProduct::getUpdateTime, SaasProduct::getId);		// 默认更新时间降序
     	queryWrapper.orderByDesc(SaasProduct::getUpdateTime, SaasProduct::getId);		// 默认更新时间降序
     	List<SaasProduct> list = this.saasProductService.list(queryWrapper);
     	List<SaasProduct> list = this.saasProductService.list(queryWrapper);
     	if (CollectionUtil.isEmpty(list)) {
     	if (CollectionUtil.isEmpty(list)) {
@@ -72,7 +72,7 @@ public class SaasProductController {
     	LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper()
     	LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper()
     			.productCodeEq(pageVO.getProductCode()).productNameLike(pageVO.getProductName())
     			.productCodeEq(pageVO.getProductCode()).productNameLike(pageVO.getProductName())
     			.productStateEq(pageVO.getProductState()).productMenuEq(pageVO.getProductMenu())
     			.productStateEq(pageVO.getProductState()).productMenuEq(pageVO.getProductMenu())
-    			.appIdEq(pageVO.getAppId()).updateUserEq(pageVO.getUpdateUser()).builder();
+    			.productTypeEq(pageVO.getProductType()).appIdEq(pageVO.getAppId()).updateUserEq(pageVO.getUpdateUser()).builder();
     	queryWrapper.orderByDesc(SaasProduct::getUpdateTime, SaasProduct::getId);		// 默认更新时间降序
     	queryWrapper.orderByDesc(SaasProduct::getUpdateTime, SaasProduct::getId);		// 默认更新时间降序
     	Page<SaasProduct> pageList = this.saasProductService.page(page, queryWrapper);
     	Page<SaasProduct> pageList = this.saasProductService.page(page, queryWrapper);
     	if (pageList == null || CollectionUtil.isEmpty(pageList.getRecords())) {
     	if (pageList == null || CollectionUtil.isEmpty(pageList.getRecords())) {

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

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

+ 43 - 5
saas-account/src/main/java/com/persagy/account/controller/SaasProjectProductController.java

@@ -1,5 +1,6 @@
 package com.persagy.account.controller;
 package com.persagy.account.controller;
 
 
+import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
@@ -13,11 +14,16 @@ import org.springframework.web.bind.annotation.RestController;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
+import com.persagy.account.pojo.dto.SaasProduct;
+import com.persagy.account.pojo.dto.SaasProject;
 import com.persagy.account.pojo.dto.SaasProjectProduct;
 import com.persagy.account.pojo.dto.SaasProjectProduct;
 import com.persagy.account.pojo.vo.product.SaasProjectProductBatchVO;
 import com.persagy.account.pojo.vo.product.SaasProjectProductBatchVO;
 import com.persagy.account.pojo.vo.product.SaasProjectProductCreateVO;
 import com.persagy.account.pojo.vo.product.SaasProjectProductCreateVO;
 import com.persagy.account.pojo.vo.product.SaasProjectProductQueryVO;
 import com.persagy.account.pojo.vo.product.SaasProjectProductQueryVO;
+import com.persagy.account.service.ISaasProductService;
 import com.persagy.account.service.ISaasProjectProductService;
 import com.persagy.account.service.ISaasProjectProductService;
+import com.persagy.account.service.ISaasProjectService;
+import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResultUtil;
 import com.persagy.common.utils.ResponseResultUtil;
 
 
@@ -40,6 +46,12 @@ import io.swagger.annotations.ApiOperation;
 public class SaasProjectProductController {
 public class SaasProjectProductController {
 	
 	
     @Autowired
     @Autowired
+    private ISaasProjectService saasProjectService;
+    
+    @Autowired
+    private ISaasProductService saasProductService;
+    
+    @Autowired
     private ISaasProjectProductService saasProjectProductService;
     private ISaasProjectProductService saasProjectProductService;
     
     
     /**
     /**
@@ -52,7 +64,7 @@ public class SaasProjectProductController {
     	if (model.isShowProjectName()) {
     	if (model.isShowProjectName()) {
     		list = this.saasProjectProductService.querySaasProjectProductList(model.getContractId(), model.getGroupCode(), model.getProjectId(), model.getProductId());
     		list = this.saasProjectProductService.querySaasProjectProductList(model.getContractId(), model.getGroupCode(), model.getProjectId(), model.getProductId());
 		} else {
 		} else {
-			LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper()
+			LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper().contractIdEq(model.getContractId())
 	    			.groupCodeEq(model.getGroupCode()).projectIdEq(model.getProjectId()).productIdEq(model.getProductId()).builder();
 	    			.groupCodeEq(model.getGroupCode()).projectIdEq(model.getProjectId()).productIdEq(model.getProductId()).builder();
 	    	list = this.saasProjectProductService.list(queryWrapper);
 	    	list = this.saasProjectProductService.list(queryWrapper);
 		}
 		}
@@ -68,8 +80,19 @@ public class SaasProjectProductController {
 	@ApiOperation(value = "保存")
 	@ApiOperation(value = "保存")
 	@RequestMapping(value = "createSaasProjectProduct")
 	@RequestMapping(value = "createSaasProjectProduct")
     public ResponseResult createSaasProjectProduct(@RequestBody @Validated SaasProjectProductCreateVO model) {
     public ResponseResult createSaasProjectProduct(@RequestBody @Validated SaasProjectProductCreateVO model) {
+		// 验证项目是否存在
+		SaasProject saasProject = this.saasProjectService.getOne(model.getGroupCode(), model.getProjectId());
+		if (saasProject == null) {
+			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此项目");
+		}
+		// 验证产品是否存在
+		SaasProduct saasProduct = this.saasProductService.getById(model.getProductId());
+		if (saasProduct == null) {
+			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此产品");
+		}
 		SaasProjectProduct saasProjectProduct = new SaasProjectProduct();
 		SaasProjectProduct saasProjectProduct = new SaasProjectProduct();
 		BeanUtils.copyProperties(model, saasProjectProduct);
 		BeanUtils.copyProperties(model, saasProjectProduct);
+		saasProjectProduct.setProductContract(new Date());
         boolean result = this.saasProjectProductService.save(saasProjectProduct);
         boolean result = this.saasProjectProductService.save(saasProjectProduct);
         return result ? ResponseResultUtil.successResult("保存成功") : ResponseResultUtil.errorResult("保存失败");
         return result ? ResponseResultUtil.successResult("保存成功") : ResponseResultUtil.errorResult("保存失败");
     }
     }
@@ -80,8 +103,13 @@ public class SaasProjectProductController {
 	@ApiOperation(value = "替换")
 	@ApiOperation(value = "替换")
 	@RequestMapping(value = "replaceSaasProjectProduct")
 	@RequestMapping(value = "replaceSaasProjectProduct")
     public ResponseResult replaceSaasProjectProduct(@RequestBody @Validated SaasProjectProductBatchVO model) {
     public ResponseResult replaceSaasProjectProduct(@RequestBody @Validated SaasProjectProductBatchVO model) {
+		// 验证产品是否存在
+		SaasProduct saasProduct = this.saasProductService.getById(model.getProductId());
+		if (saasProduct == null) {
+			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此产品");
+		}
         boolean result = this.saasProjectProductService.replaceSaasProjectProduct(model.getContractId(), model.getGroupCode(), model.getProductId(), model.getProjectIds());
         boolean result = this.saasProjectProductService.replaceSaasProjectProduct(model.getContractId(), model.getGroupCode(), model.getProductId(), model.getProjectIds());
-        return result ? ResponseResultUtil.successResult("保存成功") : ResponseResultUtil.errorResult("保存失败");
+        return result ? ResponseResultUtil.successResult("重置成功") : ResponseResultUtil.errorResult("重置失败");
     }
     }
     
     
     /**
     /**
@@ -90,10 +118,20 @@ public class SaasProjectProductController {
 	@ApiOperation(value = "更新")
 	@ApiOperation(value = "更新")
 	@RequestMapping(value = "updateSaasProjectProduct")
 	@RequestMapping(value = "updateSaasProjectProduct")
     public ResponseResult updateSaasProjectProduct(@RequestBody @Validated SaasProjectProductCreateVO model) {
     public ResponseResult updateSaasProjectProduct(@RequestBody @Validated SaasProjectProductCreateVO model) {
+		// 验证项目是否存在
+		SaasProject saasProject = this.saasProjectService.getOne(model.getGroupCode(), model.getProjectId());
+		if (saasProject == null) {
+			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此项目");
+		}
+		// 验证产品是否存在
+		SaasProduct saasProduct = this.saasProductService.getById(model.getProductId());
+		if (saasProduct == null) {
+			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此产品");
+		}
 		SaasProjectProduct saasProjectProduct = new SaasProjectProduct();
 		SaasProjectProduct saasProjectProduct = new SaasProjectProduct();
 		BeanUtils.copyProperties(model, saasProjectProduct);
 		BeanUtils.copyProperties(model, saasProjectProduct);
-		LambdaUpdateWrapper<SaasProjectProduct> updateWrapper = new SaasProjectProduct.BuilderUpdateWrapper()
-				.groupCodeEq(model.getGroupCode()).projectIdEq(model.getProjectId()).productIdEq(model.getProductId()).builder();
+		LambdaUpdateWrapper<SaasProjectProduct> updateWrapper = new SaasProjectProduct.BuilderUpdateWrapper().contractIdEq(model.getContractId())
+				.groupCodeEq(model.getGroupCode()).productIdEq(model.getProductId()).builder();
         boolean result = this.saasProjectProductService.update(saasProjectProduct, updateWrapper);
         boolean result = this.saasProjectProductService.update(saasProjectProduct, updateWrapper);
         return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
         return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
     }
     }
@@ -104,7 +142,7 @@ public class SaasProjectProductController {
     @ApiOperation(value = "删除")
     @ApiOperation(value = "删除")
     @RequestMapping(value = "deleteSaasProjectProduct")
     @RequestMapping(value = "deleteSaasProjectProduct")
     public ResponseResult deleteSaasProjectProduct(@RequestBody @Validated SaasProjectProductQueryVO model) {
     public ResponseResult deleteSaasProjectProduct(@RequestBody @Validated SaasProjectProductQueryVO model) {
-    	LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper()
+    	LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper().contractIdEq(model.getContractId())
     			.groupCodeEq(model.getGroupCode()).projectIdEq(model.getProjectId()).productIdEq(model.getProductId()).builder();
     			.groupCodeEq(model.getGroupCode()).projectIdEq(model.getProjectId()).productIdEq(model.getProductId()).builder();
         boolean result = this.saasProjectProductService.remove(queryWrapper);
         boolean result = this.saasProjectProductService.remove(queryWrapper);
         return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
         return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");

+ 16 - 4
saas-account/src/main/java/com/persagy/account/controller/SaasRoleMenuController.java

@@ -16,6 +16,8 @@ import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResultUtil;
 import com.persagy.common.utils.ResponseResultUtil;
 import com.persagy.account.manage.SaasRoleMenuHandler;
 import com.persagy.account.manage.SaasRoleMenuHandler;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
+import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
+import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.pojo.vo.auth.SaasRoleMenuBatchVO;
 import com.persagy.account.pojo.vo.auth.SaasRoleMenuBatchVO;
 import com.persagy.account.pojo.vo.auth.SaasRoleMenuCreateVO;
 import com.persagy.account.pojo.vo.auth.SaasRoleMenuCreateVO;
 import com.persagy.account.pojo.vo.auth.SaasRoleMenuQueryVO;
 import com.persagy.account.pojo.vo.auth.SaasRoleMenuQueryVO;
@@ -53,7 +55,7 @@ public class SaasRoleMenuController {
     public ResponseResult querySaasRoleMenuList(@RequestBody @Validated SaasRoleMenuQueryVO queryVO) {
     public ResponseResult querySaasRoleMenuList(@RequestBody @Validated SaasRoleMenuQueryVO queryVO) {
     	LambdaQueryWrapper<SaasRoleMenu> queryWrapper = new SaasRoleMenu.Builder().createQueryWrapper()
     	LambdaQueryWrapper<SaasRoleMenu> queryWrapper = new SaasRoleMenu.Builder().createQueryWrapper()
     			.groupCodeEq(queryVO.getGroupCode()).roleIdEq(queryVO.getRoleId()).menuIdEq(queryVO.getMenuId())
     			.groupCodeEq(queryVO.getGroupCode()).roleIdEq(queryVO.getRoleId()).menuIdEq(queryVO.getMenuId())
-    			.functionIdEq(queryVO.getFunctionId()).builderQueryWrapper();
+    			.pageIdEq(queryVO.getPageId()).functionIdEq(queryVO.getFunctionId()).builderQueryWrapper();
     	List<SaasRoleMenu> list = this.saasRoleMenuService.list(queryWrapper);
     	List<SaasRoleMenu> list = this.saasRoleMenuService.list(queryWrapper);
     	if (CollectionUtil.isEmpty(list)) {
     	if (CollectionUtil.isEmpty(list)) {
 			return ResponseResultUtil.successResult(Lists.newArrayList(), 0L);
 			return ResponseResultUtil.successResult(Lists.newArrayList(), 0L);
@@ -74,14 +76,24 @@ public class SaasRoleMenuController {
     }
     }
 	
 	
     /**
     /**
-     * 先删后新增,删除此账号角色下的所有菜单功能点的关联关系,并重新新增
+     * 先删后新增,删除此账号角色下的所有菜单功能点的关联关系,并重新新增
      */
      */
 	@ApiOperation(value = "删除新增")
 	@ApiOperation(value = "删除新增")
 	@RequestMapping(value = "resetSaasRoleMenu")
 	@RequestMapping(value = "resetSaasRoleMenu")
-    public ResponseResult resetSaasRoleMenu(@RequestBody @Validated SaasRoleMenuBatchVO batchVO) {
+    public ResponseResult resetSaasRoleMenu(@RequestBody @Validated SaasRoleMenuBatchVO<SaasMenuFunctionVO> batchVO) {
 		boolean result = this.saasRoleMenuHandler.resetSaasRoleMenu(batchVO.getGroupCode(), batchVO.getRoleId(), batchVO.getAuths());
 		boolean result = this.saasRoleMenuHandler.resetSaasRoleMenu(batchVO.getGroupCode(), batchVO.getRoleId(), batchVO.getAuths());
         return result ? ResponseResultUtil.successResult("重置成功") : ResponseResultUtil.errorResult("重置失败");
         return result ? ResponseResultUtil.successResult("重置成功") : ResponseResultUtil.errorResult("重置失败");
     }
     }
+	
+    /**
+     * 先删后新增,删除此账号角色下的所有菜单功能点的关联关系,并重新新增
+     */
+	@ApiOperation(value = "删除新增页面")
+	@RequestMapping(value = "resetSaasRoleMenuPage")
+    public ResponseResult resetSaasRoleMenuPage(@RequestBody @Validated SaasRoleMenuBatchVO<SaasMenuFunctionPageVO> batchVO) {
+		boolean result = this.saasRoleMenuHandler.resetSaasRoleMenuPage(batchVO.getGroupCode(), batchVO.getRoleId(), batchVO.getAuths());
+        return result ? ResponseResultUtil.successResult("重置成功") : ResponseResultUtil.errorResult("重置失败");
+    }
     
     
     /**
     /**
      * 物理删除
      * 物理删除
@@ -91,7 +103,7 @@ public class SaasRoleMenuController {
     public ResponseResult deleteSaasRoleMenu(@RequestBody @Validated SaasRoleMenuQueryVO deleteVO) {
     public ResponseResult deleteSaasRoleMenu(@RequestBody @Validated SaasRoleMenuQueryVO deleteVO) {
     	LambdaQueryWrapper<SaasRoleMenu> queryWrapper = new SaasRoleMenu.Builder().createQueryWrapper()
     	LambdaQueryWrapper<SaasRoleMenu> queryWrapper = new SaasRoleMenu.Builder().createQueryWrapper()
     			.groupCodeEq(deleteVO.getGroupCode()).roleIdEq(deleteVO.getRoleId()).menuIdEq(deleteVO.getMenuId())
     			.groupCodeEq(deleteVO.getGroupCode()).roleIdEq(deleteVO.getRoleId()).menuIdEq(deleteVO.getMenuId())
-    			.functionIdEq(deleteVO.getFunctionId()).builderQueryWrapper();
+    			.pageIdEq(deleteVO.getPageId()).functionIdEq(deleteVO.getFunctionId()).builderQueryWrapper();
         boolean result = this.saasRoleMenuService.remove(queryWrapper);
         boolean result = this.saasRoleMenuService.remove(queryWrapper);
         return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
         return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
     }
     }

+ 67 - 57
saas-account/src/main/java/com/persagy/account/manage/SaasProductHandler.java

@@ -1,7 +1,6 @@
 package com.persagy.account.manage;
 package com.persagy.account.manage;
 
 
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -14,10 +13,12 @@ import com.persagy.account.pojo.dto.SaasGroupProduct;
 import com.persagy.account.pojo.dto.SaasMenu;
 import com.persagy.account.pojo.dto.SaasMenu;
 import com.persagy.account.pojo.dto.SaasProductPage;
 import com.persagy.account.pojo.dto.SaasProductPage;
 import com.persagy.account.pojo.dto.SaasProjectProduct;
 import com.persagy.account.pojo.dto.SaasProjectProduct;
+import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.service.ISaasFunctionService;
 import com.persagy.account.service.ISaasFunctionService;
 import com.persagy.account.service.ISaasGroupProductService;
 import com.persagy.account.service.ISaasGroupProductService;
 import com.persagy.account.service.ISaasProductPageService;
 import com.persagy.account.service.ISaasProductPageService;
 import com.persagy.account.service.ISaasProjectProductService;
 import com.persagy.account.service.ISaasProjectProductService;
+import com.persagy.account.service.ISaasRoleMenuService;
 import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.utils.StringUtil;
 import com.persagy.common.utils.StringUtil;
 
 
@@ -33,15 +34,12 @@ import cn.hutool.core.collection.CollectionUtil;
 @Component
 @Component
 public class SaasProductHandler {
 public class SaasProductHandler {
 	
 	
-    //@Autowired
-    //private ISaasRoleMenuService saasRoleMenuService;
-	
-	@Autowired
-	private SaasAuthHandler saasAuthHandler;
-	
     @Autowired
     @Autowired
     private ISaasFunctionService saasFunctionService;
     private ISaasFunctionService saasFunctionService;
     
     
+    @Autowired
+    private ISaasRoleMenuService saasRoleMenuService;
+    
 	@Autowired
 	@Autowired
 	private ISaasProductPageService saasProductPageService;
 	private ISaasProductPageService saasProductPageService;
 	
 	
@@ -61,21 +59,23 @@ public class SaasProductHandler {
 	 * @param projectId
 	 * @param projectId
 	 * @param groupCode
 	 * @param groupCode
 	 * @param isAdmin
 	 * @param isAdmin
+	 * @param showFunctions
 	 */
 	 */
-	public void queryProductAuthList(SaasMenu saasMenu, String accountId, String projectId, String groupCode, boolean isAdmin, boolean showPageAuth) {
+	public void queryMenuProductAuths(SaasMenu saasMenu, String accountId, String projectId, String groupCode, boolean isAdmin, boolean showFunctions) {
 		// angle 1-集团视角,2-项目视角
 		// angle 1-集团视角,2-项目视角
 		String angle = StringUtil.isBlank(projectId) ? SaasCommonConstant.STR_STATUS_1 : SaasCommonConstant.STR_STATUS_2;
 		String angle = StringUtil.isBlank(projectId) ? SaasCommonConstant.STR_STATUS_1 : SaasCommonConstant.STR_STATUS_2;
 		if (StringUtil.isBlank(saasMenu.getProductId())) {
 		if (StringUtil.isBlank(saasMenu.getProductId())) {
-			// 未挂有产品,关联查询出对应的功能点集合,即可返回
 			List<SaasFunction> functions = null;
 			List<SaasFunction> functions = null;
-			if (isAdmin) {
-				LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(saasMenu.getMenuId()).builderQueryWrapper();
-				functions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getFunSort));
-			} else {
-				functions = this.saasFunctionService.queryAccountFunctionList(accountId, saasMenu.getGroupCode(), saasMenu.getMenuId());
+			if (showFunctions) {
+				// 未挂有产品,关联查询出对应的功能点集合,即可返回
+				if (isAdmin) {
+					LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(saasMenu.getMenuId()).builderQueryWrapper();
+					functions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getFunSort));
+				} 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);
-			saasMenu.setFunctions(functions);
 			return;
 			return;
 		}
 		}
 		// 挂有产品,判断是否已签约该产品
 		// 挂有产品,判断是否已签约该产品
@@ -92,12 +92,57 @@ public class SaasProductHandler {
 			return;	// 未签约
 			return;	// 未签约
 		}
 		}
 		// 已签约,走关联查询获取页面及其权限
 		// 已签约,走关联查询获取页面及其权限
-		List<SaasProductPage> pageTree = this.querySaasProductPageTree(angle, saasMenu.getProductId(), accountId, saasMenu.getMenuId(), isAdmin, showPageAuth);
+		List<SaasProductPage> pageTree = this.querySaasProductPageTree(angle, saasMenu.getProductId(), accountId, saasMenu.getMenuId(), isAdmin, showFunctions);
 		saasMenu.setProductPages(pageTree);
 		saasMenu.setProductPages(pageTree);
 		return;
 		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::getFunSort));
+			} 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 angle
 	 * @param productId
 	 * @param productId
@@ -194,56 +239,21 @@ public class SaasProductHandler {
 		return CollectionUtil.isEmpty(list) ? Lists.newArrayList() : list;
 		return CollectionUtil.isEmpty(list) ? Lists.newArrayList() : list;
 	}
 	}
 	
 	
-
-	/**
-	 * 获取此账号下能够可见的页面集合
-	 * 
-	 * @param accountId
-	 * @param productId
-	 * @param angle
-	 * @param groupCode
-	 * @param projectId
-	 * @return
-	 */
-	public List<SaasProductPage> queryProductPageList(String accountId, String productId, String angle, String groupCode, String projectId) {
-		List<SaasProductPage> productPages = null;
-		// 产品ID存在,获取该账户对应的产品页面权限,返回,后续每页的权限,由再次点击时获取
-    	Map<String, String> authMap = this.saasAuthHandler.validAccountAuth(accountId, groupCode);
-		groupCode = authMap.get(SaasCommonConstant.GROUP_CODE);
-		String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE);
-		if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) {
-			// 超管时,直接展示所有当前视角页
-			LambdaQueryWrapper<SaasProductPage> queryWrapper = new SaasProductPage.BuilderQueryWrapper().pageAngleIn(angle).productIdEq(productId).builder();
-			productPages = this.saasProductPageService.list(queryWrapper);
-			return CollectionUtil.isEmpty(productPages) ? Lists.newArrayList() : productPages;
-		}
-		// 非超管时,走产品关联查询
-		if (StringUtil.isNotBlank(projectId)) {
-			// 项目ID,不为空时,或许此项目下所设置的页面
-			productPages = this.saasProductPageService.queryProjectProductPages(groupCode, projectId, productId, angle);
-		} else {
-			// 获取此集团下所设置的页面
-			productPages = this.saasProductPageService.queryGroupProductPages(groupCode, productId, angle);
-		}
-		return CollectionUtil.isEmpty(productPages) ? Lists.newArrayList() : productPages;
-	}
-	
-	
 	/**
 	/**
 	 * 删除产品页面信息,级联删除页面下权限及其与权限相关的关联关系
 	 * 删除产品页面信息,级联删除页面下权限及其与权限相关的关联关系
-	 * @param id
+	 * @param pageId
 	 * @return
 	 * @return
 	 */
 	 */
 	@Transactional
 	@Transactional
-	public boolean deleteSaasProductPage(String id) {
-		boolean result = this.saasProductPageService.removeById(id);
+	public boolean deleteSaasProductPage(String pageId) {
+		boolean result = this.saasProductPageService.removeById(pageId);
 		if (result) {
 		if (result) {
 			// 1.删除权限点信息
 			// 1.删除权限点信息
-			/*LambdaQueryWrapper<SaasFunction> funWrapper = new SaasFunction.Builder().createQueryWrapper().pageIdEq(id).builderQueryWrapper();
+			LambdaQueryWrapper<SaasFunction> funWrapper = new SaasFunction.Builder().createQueryWrapper().pageIdEq(pageId).builderQueryWrapper();
 			this.saasFunctionService.remove(funWrapper);
 			this.saasFunctionService.remove(funWrapper);
 			// 2.删除此页面对应的菜单、角色关系数据
 			// 2.删除此页面对应的菜单、角色关系数据
-			LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().pageIdEq(menuId).builderQueryWrapper();
-			this.saasRoleMenuService.remove(roleMenuWrapper);*/
+			LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().pageIdEq(pageId).builderQueryWrapper();
+			this.saasRoleMenuService.remove(roleMenuWrapper);
 		}
 		}
 		return result;
 		return result;
 	}
 	}

+ 24 - 3
saas-account/src/main/java/com/persagy/account/manage/SaasRoleMenuHandler.java

@@ -21,6 +21,7 @@ import com.persagy.account.pojo.dto.SaasMenu;
 import com.persagy.account.pojo.dto.SaasProduct;
 import com.persagy.account.pojo.dto.SaasProduct;
 import com.persagy.account.pojo.dto.SaasRole;
 import com.persagy.account.pojo.dto.SaasRole;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
+import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.pojo.vo.menu.SaasMenuQueryVO;
 import com.persagy.account.pojo.vo.menu.SaasMenuQueryVO;
 import com.persagy.account.pojo.vo.role.SaasRoleDeleteVO;
 import com.persagy.account.pojo.vo.role.SaasRoleDeleteVO;
@@ -147,8 +148,9 @@ public class SaasRoleMenuHandler {
 			if (StringUtil.isBlank(parent.getMenuId())) {
 			if (StringUtil.isBlank(parent.getMenuId())) {
 				parent.setMenuId(parent.getId());
 				parent.setMenuId(parent.getId());
 			}
 			}
-			if (menuAndFun && StringUtil.isNotBlank(parent.getMenuUrl())) {
-				this.saasProductHandler.queryProductAuthList(parent, accountId, groupCode, projectId, isAdmin, menuAndFun);
+			if (StringUtil.isNotBlank(parent.getMenuUrl())) {
+				this.saasProductHandler.queryMenuProductAuths(parent, accountId, groupCode, projectId, isAdmin, menuAndFun);
+				
 				// 查询出对应功能点集合
 				// 查询出对应功能点集合
 				List<SaasFunction> functions = null;
 				List<SaasFunction> functions = null;
 				if (isAdmin) {
 				if (isAdmin) {
@@ -256,7 +258,7 @@ public class SaasRoleMenuHandler {
 		// 1.批量新增
 		// 1.批量新增
 		boolean result = this.saasRoleMenuService.batchCreateSaasRoleMenu(groupCode, roleId, auths);
 		boolean result = this.saasRoleMenuService.batchCreateSaasRoleMenu(groupCode, roleId, auths);
 		if (!result) {
 		if (!result) {
-			throw new BusinessException("先删后新增角色菜单功能权限失败");
+			throw new BusinessException("重置角色菜单功能权限失败");
 		}
 		}
 		return result;
 		return result;
 	}
 	}
@@ -293,4 +295,23 @@ public class SaasRoleMenuHandler {
 		return result;
 		return result;
 	}
 	}
 
 
+	/**
+	 * 删除新增角色菜单页面关联关系
+	 * @param groupCode
+	 * @param roleId
+	 * @param auths
+	 * @return
+	 */
+	@Transactional
+	public boolean resetSaasRoleMenuPage(String groupCode, String roleId, List<SaasMenuFunctionPageVO> auths) {
+		LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().roleIdEq(roleId).builderQueryWrapper();
+		this.saasRoleMenuService.remove(roleMenuWrapper);
+		// 1.批量新增
+		boolean result = this.saasRoleMenuService.batchCreateSaasRoleMenuPage(groupCode, roleId, auths);
+		if (!result) {
+			throw new BusinessException("重置角色菜单页面功能权限失败");
+		}
+		return result;
+	}
+
 }
 }

+ 14 - 2
saas-account/src/main/java/com/persagy/account/mapper/SaasRoleMenuMapper.java

@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Param;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
+import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 
 
 /**
 /**
@@ -23,12 +24,23 @@ public interface SaasRoleMenuMapper extends BaseMapper<SaasRoleMenu> {
 	/**
 	/**
 	 * 批量创建角色对应的菜单功能权限
 	 * 批量创建角色对应的菜单功能权限
 	 * 
 	 * 
-	 * @param batchVO
+	 * @param groupCode
+	 * @param roleId
+	 * @param auths
 	 * @return
 	 * @return
 	 */
 	 */
 	Integer batchCreateSaasRoleMenu(@Param("groupCode") String groupCode, @Param("roleId") String roleId, @Param("auths") List<SaasMenuFunctionVO> auths);
 	Integer batchCreateSaasRoleMenu(@Param("groupCode") String groupCode, @Param("roleId") String roleId, @Param("auths") List<SaasMenuFunctionVO> auths);
 
 
 	/**
 	/**
+	 * 批量创建角色对应的菜单页面功能权限
+	 * @param groupCode
+	 * @param roleId
+	 * @param auths
+	 * @return
+	 */
+	Integer batchCreateSaasRoleMenuPage(@Param("groupCode") String groupCode, @Param("roleId") String roleId, @Param("auths") List<SaasMenuFunctionPageVO> auths);
+	
+	/**
 	 * 统计出有效的角色数
 	 * 统计出有效的角色数
 	 * 
 	 * 
 	 * @param groupCode
 	 * @param groupCode
@@ -45,5 +57,5 @@ public interface SaasRoleMenuMapper extends BaseMapper<SaasRoleMenu> {
 	 * @return
 	 * @return
 	 */
 	 */
 	Integer countMenu(@Param("roleId") String roleId);
 	Integer countMenu(@Param("roleId") String roleId);
-	
+
 }
 }

+ 3 - 0
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasAccount.java

@@ -123,6 +123,9 @@ public class SaasAccount extends BaseEntity<SaasAccount> {
 	@TableField(exist = false)
 	@TableField(exist = false)
 	private Set<String> accountIds;
 	private Set<String> accountIds;
 	
 	
+	@TableField(exist = false)
+	private String casType; 	// 关联类型,0-主岗,1-副岗,2-业务超管默认角色
+	
 	public static class Builder {
 	public static class Builder {
 
 
 		private LambdaQueryWrapper<SaasAccount> queryWrapper = null;
 		private LambdaQueryWrapper<SaasAccount> queryWrapper = null;

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

@@ -47,7 +47,7 @@ public class SaasGroupProduct extends BaseEntity<SaasGroupProduct> {
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String productRange; // 产品使用范围,0-全部项目,1-部分项目
 	private String productRange; // 产品使用范围,0-全部项目,1-部分项目
 
 
-	@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_EMPTY)
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private Date productContract; // 签约时间
 	private Date productContract; // 签约时间
 
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)

+ 19 - 2
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProduct.java

@@ -54,6 +54,9 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String productMenu; // 产品是否关联菜单,0-未关联,1-已关联
 	private String productMenu; // 产品是否关联菜单,0-未关联,1-已关联
 
 
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	private String productType;	//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品
+	
 	@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_EMPTY)
 	@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_EMPTY)
 	private Date createTime; // 创建时间
 	private Date createTime; // 创建时间
 
 
@@ -67,8 +70,8 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 	private String remark; 		// 备注
 	private String remark; 		// 备注
 	
 	
 	@TableField(exist = false)
 	@TableField(exist = false)
-	private List<SaasProductPage> pages; 		// 下级所有页面集合
-
+	private List<SaasProductPage> productPages; 		// 下级所有页面集合
+	
 	public static class BuilderQueryWrapper {
 	public static class BuilderQueryWrapper {
 
 
 		private LambdaQueryWrapper<SaasProduct> queryWrapper = new LambdaQueryWrapper<SaasProduct>();
 		private LambdaQueryWrapper<SaasProduct> queryWrapper = new LambdaQueryWrapper<SaasProduct>();
@@ -128,6 +131,13 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 			}
 			}
 			return this;
 			return this;
 		}
 		}
+		
+		public BuilderQueryWrapper productTypeEq(String productType) {
+			if (StringUtil.isNotBlank(productType)) {
+				queryWrapper.eq(SaasProduct::getProductType, productType);
+			}
+			return this;
+		}
 
 
 		public BuilderQueryWrapper createTimeEq(Date createTime) {
 		public BuilderQueryWrapper createTimeEq(Date createTime) {
 			if (null != createTime) {
 			if (null != createTime) {
@@ -215,6 +225,13 @@ public class SaasProduct extends BaseEntity<SaasProduct> {
 			}
 			}
 			return this;
 			return this;
 		}
 		}
+		
+		public BuilderUpdateWrapper productTypeEq(String productType) {
+			if (StringUtil.isNotBlank(productType)) {
+				updateWrapper.eq(SaasProduct::getProductType, productType);
+			}
+			return this;
+		}
 
 
 		public BuilderUpdateWrapper createTimeEq(Date createTime) {
 		public BuilderUpdateWrapper createTimeEq(Date createTime) {
 			if (null != createTime) {
 			if (null != createTime) {

+ 1 - 2
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProjectProduct.java

@@ -2,7 +2,6 @@ package com.persagy.account.pojo.dto;
 
 
 import java.util.Date;
 import java.util.Date;
 
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -44,7 +43,7 @@ public class SaasProjectProduct extends Model<SaasProjectProduct> {
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String productId; // 产品ID
 	private String productId; // 产品ID
 
 
-	@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_EMPTY)
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private Date productContract; // 签约时间
 	private Date productContract; // 签约时间
 
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)

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

@@ -41,6 +41,9 @@ public class SaasAccountQueryVO {
 	@ApiModelProperty(value = "角色ID集合", example = "RY56122123152")
 	@ApiModelProperty(value = "角色ID集合", example = "RY56122123152")
 	private Set<String> roleIds; 	// 角色ID集合
 	private Set<String> roleIds; 	// 角色ID集合
 	
 	
+	@ApiModelProperty(value = "关联类型,0-主岗,1-副岗,2-业务超管默认角色", example = "0")
+	private String casType; 	// 关联类型,0-主岗,1-副岗,2-业务超管默认角色
+	
 	@ApiModelProperty(value = "账号类型, 0-超级管理员(所有集团),1-单集团管理员(单集团),2-普通账号", example = "0")
 	@ApiModelProperty(value = "账号类型, 0-超级管理员(所有集团),1-单集团管理员(单集团),2-普通账号", example = "0")
 	private String accountType;		//账号类型, 0-超级管理员(所有集团),1-单集团管理员(单集团),2-普通账号
 	private String accountType;		//账号类型, 0-超级管理员(所有集团),1-单集团管理员(单集团),2-普通账号
 	
 	

+ 32 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionPage.java

@@ -0,0 +1,32 @@
+package com.persagy.account.pojo.vo.auth;
+
+import javax.validation.constraints.NotBlank;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @version 
+ * @description 
+ * @company persagy
+ * @author zhangqiankun
+ * @since 2021年3月16日:	下午5:04:13
+ */
+@Getter
+@Setter
+@ApiModel
+@ToString
+public class SaasMenuFunctionPage {
+
+	@NotBlank(message = "页面ID,不可为空")
+	@ApiModelProperty(value = "页面ID", example = "1001")
+	private String pageId; 		// 页面ID
+	
+	//@NotBlank(message = "功能ID,不可为空")
+	@ApiModelProperty(value = "功能ID", example = "1001")
+	private String functionId; 	// 功能ID
+	
+}

+ 37 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionPageVO.java

@@ -0,0 +1,37 @@
+package com.persagy.account.pojo.vo.auth;
+
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @version 
+ * @description 
+ * @company persagy
+ * @author zhangqiankun
+ * @since 2021年3月16日:	下午5:04:13
+ */
+@Getter
+@Setter
+@ApiModel
+@ToString
+public class SaasMenuFunctionPageVO {
+
+	@NotBlank(message = "菜单ID,不可为空")
+	@ApiModelProperty(value = "菜单ID", example = "1001")
+	private String menuId; 		// 菜单ID
+	
+	@Valid
+	@NotEmpty(message = "页面功能权限集合,不可为空")
+	@ApiModelProperty(value = "页面功能权限集合", example = "1001")
+	private List<SaasMenuFunctionPage> pages; 
+	
+}

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

@@ -24,7 +24,7 @@ public class SaasMenuFunctionVO {
 	@NotBlank(message = "菜单ID,不可为空")
 	@NotBlank(message = "菜单ID,不可为空")
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	private String menuId; 		// 菜单ID
 	private String menuId; 		// 菜单ID
-
+	
 	//@NotBlank(message = "功能ID,不可为空")
 	//@NotBlank(message = "功能ID,不可为空")
 	@ApiModelProperty(value = "功能ID", example = "1001")
 	@ApiModelProperty(value = "功能ID", example = "1001")
 	private String functionId; 	// 功能ID
 	private String functionId; 	// 功能ID

+ 2 - 2
saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasRoleMenuBatchVO.java

@@ -26,7 +26,7 @@ import lombok.ToString;
 @Setter
 @Setter
 @ApiModel
 @ApiModel
 @ToString
 @ToString
-public class SaasRoleMenuBatchVO extends BaseGroupModel {
+public class SaasRoleMenuBatchVO<T> extends BaseGroupModel {
 
 
 	@NotBlank(message = "角色ID,不可为空")
 	@NotBlank(message = "角色ID,不可为空")
 	@ApiModelProperty(value = "角色ID", example = "123")
 	@ApiModelProperty(value = "角色ID", example = "123")
@@ -35,6 +35,6 @@ public class SaasRoleMenuBatchVO extends BaseGroupModel {
 	@Valid
 	@Valid
 	@NotEmpty(message = "菜单功能权限集合,不可为空")
 	@NotEmpty(message = "菜单功能权限集合,不可为空")
 	@ApiModelProperty(value = "菜单功能权限集合", example = "1001")
 	@ApiModelProperty(value = "菜单功能权限集合", example = "1001")
-	private List<SaasMenuFunctionVO> auths; 	// 菜单功能权限集合
+	private List<T> auths; 	// 菜单功能权限集合
 
 
 }
 }

+ 3 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasRoleMenuCreateVO.java

@@ -31,6 +31,9 @@ public class SaasRoleMenuCreateVO extends BaseGroupModel {
 	@NotBlank(message = "菜单ID,不可为空")
 	@NotBlank(message = "菜单ID,不可为空")
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	private String menuId; // 菜单ID
 	private String menuId; // 菜单ID
+	
+	@ApiModelProperty(value = "页面ID", example = "1001")
+	private String pageId; 	// 页面ID
 
 
 	//@NotBlank(message = "功能ID,不可为空")
 	//@NotBlank(message = "功能ID,不可为空")
 	@ApiModelProperty(value = "功能ID", example = "1001")
 	@ApiModelProperty(value = "功能ID", example = "1001")

+ 3 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasRoleMenuQueryVO.java

@@ -27,6 +27,9 @@ public class SaasRoleMenuQueryVO extends BaseGroupModel {
 
 
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	private String menuId; // 菜单ID
 	private String menuId; // 菜单ID
+	
+	@ApiModelProperty(value = "页面ID", example = "1001")
+	private String pageId; 	// 页面ID
 
 
 	@ApiModelProperty(value = "功能ID", example = "1001")
 	@ApiModelProperty(value = "功能ID", example = "1001")
 	private String functionId; // 功能ID
 	private String functionId; // 功能ID

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

@@ -34,14 +34,13 @@ public class SaasMenuFunctionVO extends BaseUserModel {
 	@ApiModelProperty(value = "菜单ID", example = "123")
 	@ApiModelProperty(value = "菜单ID", example = "123")
 	private String menuId; // 菜单ID
 	private String menuId; // 菜单ID
 	
 	
-	@NotBlank(message = "当前角度,不可为空")
-	@ApiModelProperty(value = "当前角度", example = "123")
-	private String angle; // 当前角度,1-集团视角,2-项目视角
-	
 	@ApiModelProperty(value = "产品ID", example = "PD1001")
 	@ApiModelProperty(value = "产品ID", example = "PD1001")
 	private String productId; // 产品ID
 	private String productId; // 产品ID
 
 
 	@ApiModelProperty(value = "页面ID", example = "123")
 	@ApiModelProperty(value = "页面ID", example = "123")
 	private String pageId; // 页面ID
 	private String pageId; // 页面ID
+	
+	@ApiModelProperty(value = "是否展示产品页面的功能点信息,true-展示,默认false", example = "false")
+	private boolean showPageAuth;	//是否展示产品页面的功能点信息,true-展示,默认false
 
 
 }
 }

+ 4 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProductCreateVO.java

@@ -46,6 +46,10 @@ public class SaasProductCreateVO extends BaseUserModel {
 	@ApiModelProperty(value = "产品是否关联菜单,0-未关联,1-已关联", required = true, example = "0")
 	@ApiModelProperty(value = "产品是否关联菜单,0-未关联,1-已关联", required = true, example = "0")
 	private String productMenu; // 产品是否关联菜单,0-未关联,1-已关联
 	private String productMenu; // 产品是否关联菜单,0-未关联,1-已关联
 
 
+	@NotBlank(message = "产品类型,不可为空")
+	@ApiModelProperty(value = "产品类型,0-系统产品,1-标准业务产品,2-IBMS产品", example = "0")
+	private String productType;	//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品
+	
 	@ApiModelProperty(value = "备注", example = "测试")
 	@ApiModelProperty(value = "备注", example = "测试")
 	private String remark; 		// 备注
 	private String remark; 		// 备注
 
 

+ 3 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProductQueryVO.java

@@ -32,6 +32,9 @@ public class SaasProductQueryVO extends BaseUserModel {
 
 
 	@ApiModelProperty(value = "产品是否关联菜单,0-未关联,1-已关联", example = "0")
 	@ApiModelProperty(value = "产品是否关联菜单,0-未关联,1-已关联", example = "0")
 	private String productMenu; // 产品是否关联菜单,0-未关联,1-已关联
 	private String productMenu; // 产品是否关联菜单,0-未关联,1-已关联
+	
+	@ApiModelProperty(value = "产品类型,0-系统产品,1-标准业务产品,2-IBMS产品", example = "0")
+	private String productType;	//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品
 
 
 	@ApiModelProperty(value = "最后一次操作者ID", example = "RC")
 	@ApiModelProperty(value = "最后一次操作者ID", example = "RC")
 	private String updateUser; // 最后一次操作者ID
 	private String updateUser; // 最后一次操作者ID

+ 4 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProjectProductCreateVO.java

@@ -23,6 +23,10 @@ import lombok.ToString;
 @ToString
 @ToString
 public class SaasProjectProductCreateVO extends BaseGroupModel {
 public class SaasProjectProductCreateVO extends BaseGroupModel {
 	
 	
+	@NotBlank(message = "集团签约ID,不可为空")
+	@ApiModelProperty(value = "集团签约ID", example = "GP1001")
+	private String contractId; //集团签约ID
+	
 	@NotBlank(message = "项目ID,不可为空")
 	@NotBlank(message = "项目ID,不可为空")
 	@ApiModelProperty(value = "项目ID", example = "Pj1001")
 	@ApiModelProperty(value = "项目ID", example = "Pj1001")
 	private String projectId; // 项目ID
 	private String projectId; // 项目ID

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

@@ -4,6 +4,7 @@ import java.util.List;
 
 
 import com.persagy.common.service.ISuperService;
 import com.persagy.common.service.ISuperService;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
+import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 
 
 /**
 /**
@@ -26,6 +27,15 @@ public interface ISaasRoleMenuService extends ISuperService<SaasRoleMenu> {
 	boolean batchCreateSaasRoleMenu(String groupCode, String roleId, List<SaasMenuFunctionVO> auths);
 	boolean batchCreateSaasRoleMenu(String groupCode, String roleId, List<SaasMenuFunctionVO> auths);
 
 
 	/**
 	/**
+	 * 批量创建角色对应的菜单页面功能权限
+	 * @param groupCode
+	 * @param roleId
+	 * @param auths
+	 * @return
+	 */
+	boolean batchCreateSaasRoleMenuPage(String groupCode, String roleId, List<SaasMenuFunctionPageVO> auths);
+	
+	/**
 	 * 验证是否允许删除菜单
 	 * 验证是否允许删除菜单
 	 * @param groupCode
 	 * @param groupCode
 	 * @param menuId
 	 * @param menuId

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

@@ -1,5 +1,6 @@
 package com.persagy.account.service.impl;
 package com.persagy.account.service.impl;
 
 
+import java.util.Date;
 import java.util.Set;
 import java.util.Set;
 
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,8 +11,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.persagy.account.mapper.SaasGroupProductDetailMapper;
 import com.persagy.account.mapper.SaasGroupProductDetailMapper;
 import com.persagy.account.mapper.SaasGroupProductMapper;
 import com.persagy.account.mapper.SaasGroupProductMapper;
+import com.persagy.account.mapper.SaasProjectProductMapper;
 import com.persagy.account.pojo.dto.SaasGroupProduct;
 import com.persagy.account.pojo.dto.SaasGroupProduct;
 import com.persagy.account.pojo.dto.SaasGroupProductDetail;
 import com.persagy.account.pojo.dto.SaasGroupProductDetail;
+import com.persagy.account.pojo.dto.SaasProjectProduct;
 import com.persagy.account.service.ISaasGroupProductService;
 import com.persagy.account.service.ISaasGroupProductService;
 import com.persagy.common.service.impl.SuperServiceImpl;
 import com.persagy.common.service.impl.SuperServiceImpl;
 
 
@@ -27,12 +30,16 @@ import com.persagy.common.service.impl.SuperServiceImpl;
 public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProductMapper, SaasGroupProduct> implements ISaasGroupProductService {
 public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProductMapper, SaasGroupProduct> implements ISaasGroupProductService {
 
 
 	@Autowired
 	@Autowired
+	private SaasProjectProductMapper saasProjectProductMapper;
+	
+	@Autowired
 	private SaasGroupProductDetailMapper saasGroupProductDetailMapper;
 	private SaasGroupProductDetailMapper saasGroupProductDetailMapper;
 	
 	
 	@Override
 	@Override
 	@Transactional
 	@Transactional
 	public boolean createSaasGroupProduct(SaasGroupProduct saasGroupProduct, Set<String> pageIds) {
 	public boolean createSaasGroupProduct(SaasGroupProduct saasGroupProduct, Set<String> pageIds) {
 		// 优先创建产品集团签约信息
 		// 优先创建产品集团签约信息
+		saasGroupProduct.setProductContract(new Date());
 		Integer result = this.baseMapper.insert(saasGroupProduct);
 		Integer result = this.baseMapper.insert(saasGroupProduct);
 		if (SqlHelper.retBool(result)) {
 		if (SqlHelper.retBool(result)) {
 			// 创建签约信息与产品页面的关联关系
 			// 创建签约信息与产品页面的关联关系
@@ -64,6 +71,9 @@ public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProdu
 			// 删除签约信息与产品页面的关联关系
 			// 删除签约信息与产品页面的关联关系
 			LambdaQueryWrapper<SaasGroupProductDetail> pageWrapper = new SaasGroupProductDetail.BuilderQueryWrapper().contractIdEq(contractId).builder();
 			LambdaQueryWrapper<SaasGroupProductDetail> pageWrapper = new SaasGroupProductDetail.BuilderQueryWrapper().contractIdEq(contractId).builder();
 			result = this.saasGroupProductDetailMapper.delete(pageWrapper);
 			result = this.saasGroupProductDetailMapper.delete(pageWrapper);
+			// 删除项目签约的产品信息
+			LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper().contractIdEq(contractId).builder();
+			this.saasProjectProductMapper.delete(queryWrapper);
 		}
 		}
 		return SqlHelper.retBool(result);
 		return SqlHelper.retBool(result);
 	}
 	}

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

@@ -3,6 +3,7 @@ package com.persagy.account.service.impl;
 import java.util.List;
 import java.util.List;
 
 
 import org.springframework.stereotype.Service;
 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.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
@@ -10,6 +11,7 @@ import com.persagy.common.constant.SaasCommonConstant;
 import com.persagy.common.service.impl.SuperServiceImpl;
 import com.persagy.common.service.impl.SuperServiceImpl;
 import com.persagy.account.mapper.SaasRoleMenuMapper;
 import com.persagy.account.mapper.SaasRoleMenuMapper;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
 import com.persagy.account.pojo.dto.SaasRoleMenu;
+import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.pojo.vo.auth.SaasMenuFunctionVO;
 import com.persagy.account.service.ISaasRoleMenuService;
 import com.persagy.account.service.ISaasRoleMenuService;
 
 
@@ -25,10 +27,18 @@ import com.persagy.account.service.ISaasRoleMenuService;
 public class SaasRoleMenuServiceImpl extends SuperServiceImpl<SaasRoleMenuMapper, SaasRoleMenu> implements ISaasRoleMenuService {
 public class SaasRoleMenuServiceImpl extends SuperServiceImpl<SaasRoleMenuMapper, SaasRoleMenu> implements ISaasRoleMenuService {
 
 
 	@Override
 	@Override
+	@Transactional
 	public boolean batchCreateSaasRoleMenu(String groupCode, String roleId, List<SaasMenuFunctionVO> auths) {
 	public boolean batchCreateSaasRoleMenu(String groupCode, String roleId, List<SaasMenuFunctionVO> auths) {
 		Integer result = this.baseMapper.batchCreateSaasRoleMenu(groupCode, roleId, auths);
 		Integer result = this.baseMapper.batchCreateSaasRoleMenu(groupCode, roleId, auths);
 		return SqlHelper.retBool(result);
 		return SqlHelper.retBool(result);
 	}
 	}
+	
+	@Override
+	@Transactional
+	public boolean batchCreateSaasRoleMenuPage(String groupCode, String roleId, List<SaasMenuFunctionPageVO> auths) {
+		Integer result = this.baseMapper.batchCreateSaasRoleMenuPage(groupCode, roleId, auths);
+		return SqlHelper.retBool(result);
+	}
 
 
 	@Override
 	@Override
 	public boolean isAllowDeleteMenu(String groupCode, String menuId) {
 	public boolean isAllowDeleteMenu(String groupCode, String menuId) {

+ 2 - 0
saas-account/src/main/resources/mapper/SaasAccountMapper.xml

@@ -64,6 +64,7 @@
 		SELECT N.* FROM (SELECT DISTINCT ACCOUNT_ID FROM saas_account_role 
 		SELECT N.* FROM (SELECT DISTINCT ACCOUNT_ID FROM saas_account_role 
 		<where>
 		<where>
 			<if test="account.groupCode != null and account.groupCode.trim().length() != 0">AND GROUP_CODE = #{account.groupCode}</if>
 			<if test="account.groupCode != null and account.groupCode.trim().length() != 0">AND GROUP_CODE = #{account.groupCode}</if>
+			<if test="account.casType != null and account.casType.trim().length() != 0">AND CAS_TYPE = #{account.casType}</if>
 			<if test="roleIds != null">AND ROLE_ID IN
 			<if test="roleIds != null">AND ROLE_ID IN
 				<foreach collection="roleIds" index="index" item="roleId" open="(" close=")" separator="," >#{roleId}</foreach>
 				<foreach collection="roleIds" index="index" item="roleId" open="(" close=")" separator="," >#{roleId}</foreach>
 			</if>
 			</if>
@@ -89,6 +90,7 @@
 		SELECT COUNT(*) FROM (SELECT DISTINCT ACCOUNT_ID FROM saas_account_role 
 		SELECT COUNT(*) FROM (SELECT DISTINCT ACCOUNT_ID FROM saas_account_role 
 		<where>
 		<where>
 			<if test="account.groupCode != null and account.groupCode.trim().length() != 0">AND GROUP_CODE = #{account.groupCode}</if>
 			<if test="account.groupCode != null and account.groupCode.trim().length() != 0">AND GROUP_CODE = #{account.groupCode}</if>
+			<if test="account.casType != null and account.casType.trim().length() != 0">AND CAS_TYPE = #{account.casType}</if>
 			<if test="roleIds != null">AND ROLE_ID IN
 			<if test="roleIds != null">AND ROLE_ID IN
 				<foreach collection="roleIds" index="index" item="roleId" open="(" close=")" separator="," >#{roleId}</foreach>
 				<foreach collection="roleIds" index="index" item="roleId" open="(" close=")" separator="," >#{roleId}</foreach>
 			</if>
 			</if>

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

@@ -8,7 +8,7 @@
 		<result column="PAGE_ID" property="pageId" jdbcType="VARCHAR" />
 		<result column="PAGE_ID" property="pageId" jdbcType="VARCHAR" />
 	</resultMap>
 	</resultMap>
 	
 	
-	<insert id="batchInsertSaasProjectProduct">
+	<insert id="insertSaasGroupProductDetail">
 		INSERT INTO saas_group_product_detail (CONTRACT_ID, PAGE_ID) VALUES
 		INSERT INTO saas_group_product_detail (CONTRACT_ID, PAGE_ID) VALUES
 		<foreach collection="pageIds" index="index" item="pageId" separator="," >
 		<foreach collection="pageIds" index="index" item="pageId" separator="," >
 			(#{contractId}, #{pageId})
 			(#{contractId}, #{pageId})

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

@@ -11,6 +11,7 @@
 		<result column="PRODUCT_ICON" property="productIcon" jdbcType="VARCHAR" />
 		<result column="PRODUCT_ICON" property="productIcon" jdbcType="VARCHAR" />
 		<result column="PRODUCT_STATE" property="productState" jdbcType="VARCHAR" />
 		<result column="PRODUCT_STATE" property="productState" jdbcType="VARCHAR" />
 		<result column="PRODUCT_MENU" property="productMenu" jdbcType="VARCHAR" />
 		<result column="PRODUCT_MENU" property="productMenu" jdbcType="VARCHAR" />
+		<result column="PRODUCT_TYPE" property="productType" jdbcType="VARCHAR" />
 		<result column="CREATE_TIME" property="createTime" jdbcType="DATE" />
 		<result column="CREATE_TIME" property="createTime" jdbcType="DATE" />
 		<result column="UPDATE_TIME" property="updateTime" jdbcType="DATE" />
 		<result column="UPDATE_TIME" property="updateTime" jdbcType="DATE" />
 		<result column="UPDATE_USER" property="updateUser" jdbcType="VARCHAR" />
 		<result column="UPDATE_USER" property="updateUser" jdbcType="VARCHAR" />

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

@@ -18,7 +18,7 @@
 		CONTRACT_ID, GROUP_CODE, PROJECT_ID, PRODUCT_ID, PRODUCT_CONTRACT, REMARK
 		CONTRACT_ID, GROUP_CODE, PROJECT_ID, PRODUCT_ID, PRODUCT_CONTRACT, REMARK
 	</sql>
 	</sql>
 	
 	
-	<select id="querySaasProjectProductList">
+	<select id="querySaasProjectProductList" resultMap="BaseResultMap">
 		SELECT M.*, N.PROJECT_NAME FROM (SELECT <include refid="Base_Sql_Column"></include> FROM saas_project_product 
 		SELECT M.*, N.PROJECT_NAME FROM (SELECT <include refid="Base_Sql_Column"></include> FROM saas_project_product 
 		<where>
 		<where>
 			<if test="contractId != null and contractId.trim().length() != 0">AND CONTRACT_ID = #{contractId}</if>
 			<if test="contractId != null and contractId.trim().length() != 0">AND CONTRACT_ID = #{contractId}</if>

+ 9 - 0
saas-account/src/main/resources/mapper/SaasRoleMenuMapper.xml

@@ -18,6 +18,15 @@
 		</foreach>
 		</foreach>
 	</insert>
 	</insert>
 	
 	
+	<insert id="batchCreateSaasRoleMenuPage">
+		INSERT INTO saas_role_menu (GROUP_CODE, ROLE_ID, MENU_ID, PAGE_ID, FUNCTION_ID) VALUES
+		<foreach collection="auths" index="index" item="auth" separator="," >
+			<foreach collection="auth.pages" index="index" item="page" separator="," >
+				(#{groupCode}, #{roleId}, #{auth.menuId}, #{page.pageId}, #{page.functionId})
+			</foreach>
+		</foreach>
+	</insert>
+	
 	<select id="isAllowDeleteMenu" resultType="java.lang.Integer">
 	<select id="isAllowDeleteMenu" resultType="java.lang.Integer">
 		SELECT COUNT(*) FROM (SELECT * FROM saas_role_menu
 		SELECT COUNT(*) FROM (SELECT * FROM saas_role_menu
 		<where>
 		<where>

+ 498 - 9
saas-doc/doc/saas_platform.md

@@ -1589,6 +1589,309 @@ Header:Content-Type=application/json
 
 
 ## 产品管理
 ## 产品管理
 
 
+### 集团签约产品信息查询
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/groupProduct/querySaasGroupProductList
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"TEST",        //集团编码,必填
+	    "productId":"PD1390234244466438145", // 产品ID,选填
+	    "validLast":"1"  // 签约有效期,0-期内有效,1-永久有效,选填
+	}
+
+返回:
+
+	{
+	    "content": [
+	        {
+	            "groupCode": "TEST",
+	            "id": "GP1391603821226078210",
+	            "productCode": "1001",
+	            "productContract": 1620619180000,
+	            "productId": "PD1390234244466438145",
+	            "productRange": "0",
+	            "remark": "测试",
+	            "updateTime": 1620619180000,
+	            "updateUser": "AC1372371635352403969",
+	            "validEndTime": 1620616920000,
+	            "validLast": "1",
+	            "validStartTime": 1620616909000
+	        }
+	    ],
+	    "count": 1,
+	    "respCode": "00000",
+	    "respMsg": "success"
+	}
+
+### 集团签约产品分页信息查询
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/groupProduct/queryGroupProductPageList
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"TEST",        //集团编码,必填
+	    "productId":"PD1390234244466438145", // 产品ID,选填
+	    "validLast":"1",  // 签约有效期,0-期内有效,1-永久有效,选填
+	    "totalProject":false,   //是否统计项目数,true-统计,默认false
+	    "page":1,       //分页页码,不可低于1,必填
+	    "size":10       //分页大小,不可低于1,必填
+	}
+
+返回:
+
+	{
+	    "content": [
+	        {
+	            "groupCode": "TEST",
+	            "id": "GP1391603821226078210",
+	            "productCode": "1001",
+	            "productContract": 1620619180000,
+	            "productId": "PD1390234244466438145",
+	            "productRange": "0",
+	            "remark": "测试",
+	            "updateTime": 1620619180000,
+	            "updateUser": "AC1372371635352403969",
+	            "validEndTime": 1620616920000,
+	            "validLast": "1",
+	            "validStartTime": 1620616909000
+	        }
+	    ],
+	    "count": 1,
+	    "respCode": "00000",
+	    "respMsg": "success"
+	}
+
+### 集团签约产品
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/groupProduct/createSaasGroupProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,此处的APP ID 来源于产品信息中的,目前无用
+	    "groupCode":"TEST",        //集团编码,必填
+	    "productId":"PD1390234244466438145", // 产品ID,必填
+	    "productCode":"1001",   //产品编码,必填
+	    "productRange":"0",  //产品使用范围,0-全部项目,1-部分项目,必填
+	    "pageIds":[         // 页面ID集合,必填
+	        "PA1390240032173895682"
+	    ],
+	    "validStartTime":1620616909201,     // 签约有效期为0时,必填
+	    "validEndTime":1620616920187,       // 签约有效期为0时,必填
+	    "validLast":"1",  // 签约有效期,0-期内有效,1-永久有效,必填
+	    "remark":"测试"     //备注,选填
+	}
+
+返回:
+
+	{
+	    "content": "GP1391598206613241857",
+	    "respCode": "00000",
+	    "respMsg": "保存成功"
+	}
+
+### 更新集团签约产品信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/groupProduct/updateSaasGroupProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "id":"GP1391598206613241857",    //签约ID,必填
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,此处的APP ID 来源于产品信息中的,目前无用
+	    "groupCode":"TEST",        //集团编码,必填
+	    "productId":"PD1390234244466438145", // 产品ID,必填
+	    "productCode":"1001",   //产品编码,必填
+	    "productRange":"0",  //产品使用范围,0-全部项目,1-部分项目,必填
+	    "pageIds":[         // 页面ID集合,必填
+	        "PA1390240032173895682"
+	    ],
+	    "validStartTime":1620616909201,     // 签约有效期为0时,必填
+	    "validEndTime":1620616920187,       // 签约有效期为0时,必填
+	    "validLast":"1",  // 签约有效期,0-期内有效,1-永久有效,必填
+	    "remark":"测试"     //备注,选填
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "更新成功"
+	}
+
+### 删除集团签约产品信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/groupProduct/deleteSaasGroupProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"TEST",        //集团编码,必填
+	    "productId":"PD1390234244466438145"       // 产品ID,必填
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "删除成功"
+	}
+
+### 项目签约产品信息查询
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/projectProduct/querySaasProjectProductList
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"QKZZ",        //集团编码,必填
+	    "contractId":"GP1391603821226078210",    //签约ID,选填
+	    "projectId":"Pj1209010205",     //项目ID,选填
+	    "productId":"PD1390234244466438145", // 产品ID,选填
+	    "showProjectName":false  // 是否展示项目名称,true-展示,默认false
+	}
+
+返回:
+
+	{
+	    "content": [
+	        {
+	            "contractId": "GP1391603821226078210",
+	            "groupCode": "QKZZ",
+	            "productContract": 1620628287000,
+	            "productId": "PD1390234244466438145",
+	            "projectId": "Pj1209010205",
+	            "remark": "测试"
+	        }
+	    ],
+	    "count": 1,
+	    "respCode": "00000",
+	    "respMsg": "success"
+	}
+
+### 项目签约产品
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/projectProduct/createSaasProjectProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"QKZZ",        //集团编码,必填
+	    "contractId":"GP1391603821226078210",    //集团签约ID,必填
+	    "projectId":"Pj1209010205",     //项目ID,必填
+	    "productId":"PD1390234244466438145", // 产品ID,必填
+	    "remark":"测试"         //备注,选填
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "保存成功"
+	}
+
+### 重置项目签约产品信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/projectProduct/replaceSaasProjectProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"QKZZ",        //集团编码,必填
+	    "contractId":"GP1391603821226078210",    //集团签约ID,必填
+	    "productId":"PD1390234244466438145", // 产品ID,必填
+	    "projectIds":["Pj1209010206"]        //项目ID集合,必填
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "重置成功"
+	}
+
+### 更新项目签约产品信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/projectProduct/updateSaasProjectProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"QKZZ",        //集团编码,必填
+	    "contractId":"GP1391603821226078210",    //集团签约ID,必填
+	    "projectId":"Pj1209010205",     //项目ID,必填
+	    "productId":"PD1390234244466438145", // 产品ID,必填
+	    "remark":"测试"         //备注,选填
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "更新成功"
+	}
+
+### 删除项目签约产品信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/projectProduct/deleteSaasProjectProduct
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     // 账号ID,必填,不做为sql条件
+	    "appId":"PC",                   // 应用ID,PC-电脑,APP-手机应用,必填,目前不做为sql条件,后续要区分端查看时,会作为sql条件
+	    "groupCode":"QKZZ",        //集团编码,必填
+	    "contractId":"GP1391603821226078210",    //集团签约ID,选填
+	    "projectId":"Pj1209010205",     //项目ID,选填
+	    "productId":"PD1390234244466438145" // 产品ID,选填
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "删除成功"
+	}
+
 ### 查询产品信息
 ### 查询产品信息
 
 
 	URL:http://develop.persagy.com/saas-platform/saas-account/product/querySaasProductList
 	URL:http://develop.persagy.com/saas-platform/saas-account/product/querySaasProductList
@@ -1603,7 +1906,8 @@ Header:Content-Type=application/json
 	    "productCode":"1001",           // 产品编码,选填,唯一
 	    "productCode":"1001",           // 产品编码,选填,唯一
 	    "productName":"测试",           // 产品名称,选填,唯一
 	    "productName":"测试",           // 产品名称,选填,唯一
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,选填
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,选填
-	    "productMenu":"0"          // 产品是否关联菜单,0-未关联,1-已关联,选填
+	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,选填
+	    "productType":"0"			//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品,选填
 	}
 	}
 
 
 返回:
 返回:
@@ -1643,6 +1947,7 @@ Header:Content-Type=application/json
 	    "productName":"测试",           // 产品名称,选填,唯一
 	    "productName":"测试",           // 产品名称,选填,唯一
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,选填
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,选填
 	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,选填
 	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,选填
+	    "productType":"0",			//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品,选填
 	    "page":1,       //分页页码,不可低于1,必填
 	    "page":1,       //分页页码,不可低于1,必填
 	    "size":10       //分页大小,不可低于1,必填
 	    "size":10       //分页大小,不可低于1,必填
 	}
 	}
@@ -1671,7 +1976,7 @@ Header:Content-Type=application/json
 
 
 ### 新增产品信息
 ### 新增产品信息
 
 
-	URL:http://develop.persagy.com/saas-platform/saas-account/product/querySaasAccountList
+	URL:http://develop.persagy.com/saas-platform/saas-account/product/createSaasProduct
 	Method:POST
 	Method:POST
 	Header:Content-Type=application/json
 	Header:Content-Type=application/json
 
 
@@ -1685,6 +1990,7 @@ Header:Content-Type=application/json
 	    "productIcon":"layui-test-icon",   // 产品图标,必填
 	    "productIcon":"layui-test-icon",   // 产品图标,必填
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,必填
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,必填
 	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,必填
 	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,必填
+	    "productType":"0",			//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品,必填
 	    "remark":"测试"             //备注,选填
 	    "remark":"测试"             //备注,选填
 	}
 	}
 
 
@@ -1698,7 +2004,7 @@ Header:Content-Type=application/json
 
 
 ### 更新产品信息
 ### 更新产品信息
 
 
-	URL:http://develop.persagy.com/saas-platform/saas-account/product/querySaasAccountList
+	URL:http://develop.persagy.com/saas-platform/saas-account/product/updateSaasProduct
 	Method:POST
 	Method:POST
 	Header:Content-Type=application/json
 	Header:Content-Type=application/json
 
 
@@ -1713,6 +2019,7 @@ Header:Content-Type=application/json
 	    "productIcon":"layui-test-icon",   // 产品图标,必填
 	    "productIcon":"layui-test-icon",   // 产品图标,必填
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,必填
 	    "productState":"0",         // 产品状态,0-建设中,1-已完成,2-已关联,必填
 	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,必填
 	    "productMenu":"0",          // 产品是否关联菜单,0-未关联,1-已关联,必填
+	    "productType":"0",			//产品类型,0-系统产品,1-标准业务产品,2-IBMS产品,必填
 	    "remark":"测试但是"             //备注,选填
 	    "remark":"测试但是"             //备注,选填
 	}
 	}
 
 
@@ -2105,6 +2412,43 @@ Header:Content-Type=application/json
 
 
 ## 菜单管理
 ## 菜单管理
 
 
+### 查询顶级菜单
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/menu/querySaasMenuTop
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     //当前账号ID,必填,不做为sql条件
+	    "appId":"PC",         //应用ID, PC-电脑端,APP-手机应用端,必填
+	    "menuType":"0" ///菜单类型,0-系统菜单,1-业务菜单,必填
+	}
+
+返回:
+
+	{
+	    "content": [
+	        {
+	            "appId": "PC",
+	            "createTime": 1618242292000,
+	            "id": "ME1372501618212643050",
+	            "menuCode": "1002",
+	            "menuName": "账号权限管理",
+	            "menuSort": 2,
+	            "menuType": "0",
+	            "menuUrl": "/oms/accountPermission",
+	            "remark": "账号权限管理",
+	            "updateTime": 1618242292000,
+	            "updateUser": "AC1372371635352403969",
+	            "urlType": "0"
+	        }
+	    ],
+	    "respCode": "00000",
+	    "respMsg": "success"
+	}
+
 ### 查询菜单功能树(不做权限过滤)
 ### 查询菜单功能树(不做权限过滤)
 
 
 	URL:http://develop.persagy.com/saas-platform/saas-account/menu/queryMenuFunTree
 	URL:http://develop.persagy.com/saas-platform/saas-account/menu/queryMenuFunTree
@@ -2219,12 +2563,13 @@ Header:Content-Type=application/json
 请求:
 请求:
 
 
 	{
 	{
-		"accountBelong":"0",		//账号所属, 0-运维系统账号,1-业务账号,必填
-	    "accountId":"1371370289309515777",     //当前账号ID,必填
-	    "appId":"PC",         //应用ID, PC-电脑端,APP-手机应用端,BIM-BIM平台,,必填
-	    "isMenu":false,		// 是否仅查询出菜单树,true-是,默认false
-	    "angle":"1",		// 当前角度,不填,默认全查, 1-集团视角,2-项目视角
-	    "groupCode":"TEST"    //集团编码,选填
+	    "accountBelong":"1",		//账号所属, 0-运维系统账号,1-业务账号,必填
+	    "accountId":"AC1372371635352403969",     //当前账号ID,必填
+	    "appId":"PC",         //应用ID, PC-电脑端,APP-手机应用端,必填
+	    "productId":"PD1390234244466438145", //产品ID,选填
+	    "projectId":"Pj1209010205", //项目ID,存在即为项目视角
+	    "groupCode":"tes",    //集团编码,选填
+	    "isMenu":false       //是否仅查询出菜单树,true-是,默认false
 	}
 	}
 
 
 返回:
 返回:
@@ -2348,6 +2693,36 @@ Header:Content-Type=application/json
 	    "respMsg": "success"
 	    "respMsg": "success"
 	}
 	}
 
 
+### 菜单重排序
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/menu/sortSaasMenu
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     //当前账号ID,必填
+	    "appId":"PC",       //应用ID,必填
+	    "menus": [
+	        {
+	            "menuId": "ME1372501618212643050",      //菜单ID,必填
+	            "menuSort": 2               //菜单顺序,必填
+	        },
+	        {
+	            "menuId": "ME1372505574210637826",
+	            "menuSort": 1
+	        }
+	    ]
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "调整成功"
+	}
+
 ### 创建菜单信息
 ### 创建菜单信息
 
 
 	URL:http://develop.persagy.com/saas-platform/saas-account/menu/createSaasMenu
 	URL:http://develop.persagy.com/saas-platform/saas-account/menu/createSaasMenu
@@ -2439,6 +2814,70 @@ Header:Content-Type=application/json
 
 
 ## 功能点管理
 ## 功能点管理
 
 
+### 查询菜单下权限信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/function/queryMenuFunctionList
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	{
+	    "accountId":"AC1372371635352403969",     //当前账号ID,必填,不做为sql条件
+	    "appId":"PC",         //应用ID, PC-电脑端,APP-手机应用端,必填,不做为sql条件
+	    "groupCode":"",    //集团编码,选填
+	    "projectId":"",       //项目ID,存在,即为项目视角
+	    "productId":"PD1390234244466438145",    //产品ID,选填
+	    "menuId":"ME1372501618212643050",       //菜单ID,必填
+	    "showPageAuth":false		//,当返回产品页面树结果集时,是否展示产品页面的功能点信息,true-展示,默认false
+	}
+
+返回:
+
+	// 返回样式一:返回功能点信息结果集
+	{
+	    "content": [
+	        {
+	            "createTime": 1618855281000,
+	            "funCode": "101004",
+	            "funName": "查询平台管理员",
+	            "funSort": 1,
+	            "funUrl": "/account/queryAccountPageList",
+	            "id": "FU1372501618212832063",
+	            "menuId": "ME1372501618212643050",
+	            "remark": "查询平台管理员",
+	            "updateTime": 1618855281000,
+	            "updateUser": "AC1372371635352403969"
+	        }
+	    ],
+	    "respCode": "00000",
+	    "respMsg": "success"
+	}
+	
+	// 返回样式二:返回产品页面树信息结果集
+	{
+	    "content": [		// 内容为产品页面集合
+	        {
+	            "childrens": [],		// 此页面的下级子页面
+	            "createTime": 1620294028000,
+	            "id": "PA1390240032173895682",
+	            "pageAngle": "0",		//页面视角,0-集团项目页,1-集团独有页,2-项目独有页
+	            "pageFloor": "0",		//是否为落地页,0-非落地页,1-集团落地页,2-项目落地页,3-集团项目落地页
+	            "pageIcon": "",
+	            "pageName": "测试页面",
+	            "pageSort": 1,
+	            "pageUrl": "",
+	            "parentId": "",
+	            "productId": "PD1390234244466438145",
+	            "remark": "测试但是",
+	            "updateTime": 1620294028000
+	        }
+	    ],
+	    "respCode": "00000",
+	    "respMsg": "success"
+	}
+
+
 ### 查询功能点信息
 ### 查询功能点信息
 
 
 	URL:http://develop.persagy.com/saas-platform/saas-account/function/querySaasFunctionList
 	URL:http://develop.persagy.com/saas-platform/saas-account/function/querySaasFunctionList
@@ -2898,6 +3337,7 @@ Header:Content-Type=application/json
 	    "groupCode":"TEST",    //集团编码,必填
 	    "groupCode":"TEST",    //集团编码,必填
 	    "roleId":"RO1371761303924879361",       //角色ID,选填
 	    "roleId":"RO1371761303924879361",       //角色ID,选填
 	    "menuId":"1371376123917754369",       //菜单ID,选填
 	    "menuId":"1371376123917754369",       //菜单ID,选填
+	    "pageId":"PA1390240032173895682",	//页面ID,选填
 	    "functionId":"FU1371634297690148866"       //功能ID,选填
 	    "functionId":"FU1371634297690148866"       //功能ID,选填
 	}
 	}
 
 
@@ -2909,6 +3349,7 @@ Header:Content-Type=application/json
 	            "functionId": "FU1371634297690148866",
 	            "functionId": "FU1371634297690148866",
 	            "groupCode": "TEST",
 	            "groupCode": "TEST",
 	            "menuId": "1371376123917754369",
 	            "menuId": "1371376123917754369",
+	            "pageId":"PA1390240032173895682",
 	            "roleId": "RO1371761303924879361"
 	            "roleId": "RO1371761303924879361"
 	        }
 	        }
 	    ],
 	    ],
@@ -2976,6 +3417,53 @@ Header:Content-Type=application/json
 	    "respMsg": "重置成功"
 	    "respMsg": "重置成功"
 	}
 	}
 
 
+### 重置角色-菜单页面关联信息
+
+	URL:http://develop.persagy.com/saas-platform/saas-account/roleMenu/resetSaasRoleMenuPage
+	Method:POST
+	Header:Content-Type=application/json
+
+请求:
+
+	// 先删后新增,删除此角色下的所有菜单功能点的关联关系,并重新新增
+	{
+	    "accountId":"AC1372371635352403969",     //当前账号ID,必填
+	    "appId":"PC",         //应用ID, PC-电脑端,APP-手机应用端,必填,不做为sql条件
+	    "groupCode":"TEST",    //集团编码,必填
+	    "roleId":"RO1384058727954395138",       //角色ID,必填
+	    "auths": [              //菜单功能集合,必填
+	        {
+	            "menuId":"ME1372505574210636732",       //菜单ID,必填
+	            "pages":[
+	                {
+	                    "pageId":"PA1390240032173895682",       //页面ID,必填
+	                    "functionId":"FU1372509049900339201"       //功能ID,选填
+	                },
+	                {
+	                    "pageId":"PA1390240032173895682",       //页面ID,必填
+	                    "functionId":"FU1372509049900339202"       //功能ID,选填
+	                }
+	            ]
+	        },
+	        {
+	            "menuId":"ME1372505574210636732",       //菜单ID,必填
+	            "pages":[
+	                {
+	                    "pageId":"PA1390240032173895683",       //页面ID,必填
+	                    "functionId":"FU1372509049900339201"       //功能ID,选填
+	                }
+	            ]
+	        }
+	    ]
+	}
+
+返回:
+
+	{
+	    "respCode": "00000",
+	    "respMsg": "重置成功"
+	}
+
 ### 删除角色-菜单关联信息
 ### 删除角色-菜单关联信息
 
 
 	URL:http://develop.persagy.com/saas-platform/saas-account/roleMenu/deleteSaasRoleMenu
 	URL:http://develop.persagy.com/saas-platform/saas-account/roleMenu/deleteSaasRoleMenu
@@ -2991,6 +3479,7 @@ Header:Content-Type=application/json
 	    "groupCode":"TEST",    //集团编码,必填
 	    "groupCode":"TEST",    //集团编码,必填
 	    "roleId":"RO1371761303924879362",       //角色ID,选填
 	    "roleId":"RO1371761303924879362",       //角色ID,选填
 	    "menuId":"1371376123917754369",       //菜单ID,选填
 	    "menuId":"1371376123917754369",       //菜单ID,选填
+	    "pageId":"PA1390240032173895682",	//页面ID,选填
 	    "functionId":"1371376123917754369"       //功能ID,选填
 	    "functionId":"1371376123917754369"       //功能ID,选填
 	}
 	}