Browse Source

产品配置优化

zhangqiankun 3 years ago
parent
commit
a752bd74d7
45 changed files with 935 additions and 358 deletions
  1. 21 0
      saas-account/src/main/java/com/persagy/account/controller/SaasCommonController.java
  2. 36 9
      saas-account/src/main/java/com/persagy/account/controller/SaasFunctionController.java
  3. 34 5
      saas-account/src/main/java/com/persagy/account/controller/SaasMenuController.java
  4. 26 26
      saas-account/src/main/java/com/persagy/account/controller/SaasProductCategeoryController.java
  5. 4 4
      saas-account/src/main/java/com/persagy/account/controller/SaasProductController.java
  6. 3 3
      saas-account/src/main/java/com/persagy/account/controller/SaasProductPageController.java
  7. 7 7
      saas-account/src/main/java/com/persagy/account/manage/SaasAuthHandler.java
  8. 38 13
      saas-account/src/main/java/com/persagy/account/manage/SaasProductHandler.java
  9. 35 2
      saas-account/src/main/java/com/persagy/account/manage/SaasRoleMenuHandler.java
  10. 3 3
      saas-account/src/main/java/com/persagy/account/mapper/SaasGroupProductDetailMapper.java
  11. 1 1
      saas-account/src/main/java/com/persagy/account/mapper/SaasMenuMapper.java
  12. 2 2
      saas-account/src/main/java/com/persagy/account/mapper/SaasProductCategeoryMapper.java
  13. 0 17
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasGroupProduct.java
  14. 9 9
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasGroupProductDetail.java
  15. 25 25
      saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProductCategeory.java
  16. 1 3
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionPage.java
  17. 0 4
      saas-account/src/main/java/com/persagy/account/pojo/vo/auth/SaasMenuFunctionPageVO.java
  18. 30 0
      saas-account/src/main/java/com/persagy/account/pojo/vo/dict/SaasDictVO.java
  19. 0 4
      saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasGroupProductCreateVO.java
  20. 1 1
      saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProductCategeoryQueryVO.java
  21. 1 1
      saas-account/src/main/java/com/persagy/account/pojo/vo/project/SaasProjectCreateVO.java
  22. 11 0
      saas-account/src/main/java/com/persagy/account/service/ISaasFunctionService.java
  23. 2 2
      saas-account/src/main/java/com/persagy/account/service/ISaasGroupProductDetailService.java
  24. 6 3
      saas-account/src/main/java/com/persagy/account/service/ISaasMenuService.java
  25. 2 2
      saas-account/src/main/java/com/persagy/account/service/ISaasProductCategeoryService.java
  26. 2 1
      saas-account/src/main/java/com/persagy/account/service/ISaasProductPageService.java
  27. 3 3
      saas-account/src/main/java/com/persagy/account/service/ISaasProductService.java
  28. 19 0
      saas-account/src/main/java/com/persagy/account/service/impl/SaasFunctionServiceImpl.java
  29. 0 21
      saas-account/src/main/java/com/persagy/account/service/impl/SaasGroupProductDetailServiceImpl.java
  30. 21 0
      saas-account/src/main/java/com/persagy/account/service/impl/SaasGroupProductPageServiceImpl.java
  31. 9 9
      saas-account/src/main/java/com/persagy/account/service/impl/SaasGroupProductServiceImpl.java
  32. 6 6
      saas-account/src/main/java/com/persagy/account/service/impl/SaasMenuServiceImpl.java
  33. 0 21
      saas-account/src/main/java/com/persagy/account/service/impl/SaasProductCategeoryServiceImpl.java
  34. 21 0
      saas-account/src/main/java/com/persagy/account/service/impl/SaasProductCategoryServiceImpl.java
  35. 29 25
      saas-account/src/main/java/com/persagy/account/service/impl/SaasProductPageServiceImpl.java
  36. 4 4
      saas-account/src/main/java/com/persagy/account/service/impl/SaasProductServiceImpl.java
  37. 4 4
      saas-account/src/main/resources/mapper/SaasGroupProductDetailMapper.xml
  38. 0 1
      saas-account/src/main/resources/mapper/SaasGroupProductMapper.xml
  39. 2 0
      saas-account/src/main/resources/mapper/SaasMenuMapper.xml
  40. 2 2
      saas-account/src/main/resources/mapper/SaasProductCategeoryMapper.xml
  41. 10 3
      saas-account/src/main/resources/mapper/SaasRoleMenuMapper.xml
  42. 1 1
      saas-common/src/main/java/com/persagy/common/constant/SaasCommonConstant.java
  43. 72 0
      saas-common/src/main/java/com/persagy/common/constant/SaasDictData.java
  44. 25 0
      saas-common/src/main/java/com/persagy/common/model/SaasDictModel.java
  45. 407 111
      saas-doc/doc/saas_platform.md

+ 21 - 0
saas-account/src/main/java/com/persagy/account/controller/SaasCommonController.java

@@ -9,7 +9,10 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.persagy.account.pojo.vo.BaseGroupVO;
+import com.persagy.account.pojo.vo.dict.SaasDictVO;
 import com.persagy.common.constant.SaasCommonConstant;
+import com.persagy.common.constant.SaasDictData;
+import com.persagy.common.model.BaseUserModel;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResultUtil;
 import com.persagy.security.constant.CipherConstants;
@@ -35,6 +38,24 @@ public class SaasCommonController {
 	private RedisTemplate<String, Object> redisTemplate;
 	
     /**
+     * 查询字典数据
+     */
+    @ApiOperation(value = "查询所有的字典类型")
+    @RequestMapping(value = "dictType")
+    public ResponseResult dictType(@RequestBody @Validated BaseUserModel model) {
+    	return ResponseResultUtil.successResult(SaasDictData.DICT_TYPE_DATA);
+    }
+    
+    /**
+     * 查询字典数据
+     */
+    @ApiOperation(value = "根据字典类型获取数据")
+    @RequestMapping(value = "dict")
+    public ResponseResult dict(@RequestBody @Validated SaasDictVO model) {
+    	return ResponseResultUtil.successResult(SaasDictData.DICT_DATA.get(model.getDictType()));
+    }
+	
+    /**
      * 查询菜单历史记录
      */
     @ApiOperation(value = "查询菜单历史记录")

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

@@ -81,20 +81,33 @@ public class SaasFunctionController {
     @ApiOperation(value = "菜单下功能点查询")
     @RequestMapping(value = "queryMenuFunctionList")
     public ResponseResult queryMenuFunctionList(@RequestBody @Validated SaasMenuFunctionVO model) {
-    	// 优先判断此账号是否拥有此菜单的权限,后续判断
     	// 判断此账号的权限范围
     	boolean isAdmin = false;
     	Map<String, String> authMap = this.saasAuthHandler.validAccountAuth(model.getAccountId(), model.getGroupCode());
 		String groupCode = authMap.get(CipherConstants.GROUP_CODE);
 		String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE);
 		if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) {
-			// 超管时
-			isAdmin = true;
+			isAdmin = true;		// 超管
+		}
+    	// 再判断此账号是否拥有此菜单的权限
+		SaasMenu saasMenu = null;
+		if (isAdmin) {
+			saasMenu = this.saasMenuService.getById(model.getMenuId());
+			saasMenu.setMenuId(model.getMenuId());
+		} else {
+			// 关联查询出此账号的菜单信息,防止中途权限被修改
+			List<SaasMenu> saasMenus = this.saasMenuService.querySaasMenuTree(model.getAccountId(), groupCode, model.getAppId(), model.getMenuId(), SaasCommonConstant.STATUS_1);
+			saasMenu = CollectionUtil.isEmpty(saasMenus) ? null : saasMenus.get(0);
+		}
+		if (saasMenu == null) {
+			return ResponseResultUtil.successResult(Lists.newArrayList());
 		}
     	// 获取此账号、此菜单下所对应的功能点信息集合 或者 产品页面树集合
-    	Object result = this.saasProductHandler.queryMenuProductAuths(model.getMenuId(), model.getProductId(), model.getAccountId(), 
-    			model.getProjectId(), groupCode, isAdmin, model.isShowPageAuth());
-        return ResponseResultUtil.successResult(result);
+    	this.saasProductHandler.queryMenuProductAuths(saasMenu, model.getAccountId(), model.getProjectId(), groupCode, isAdmin, model.isShowPageAuth());
+        if (StringUtil.isBlank(saasMenu.getProductId())) {
+        	return ResponseResultUtil.successResult(saasMenu.getFunctions());
+		} 
+    	return ResponseResultUtil.successResult(saasMenu.getProductPages());
     }
 	
     /**
@@ -145,7 +158,7 @@ public class SaasFunctionController {
 	@ApiOperation(value = "保存")
 	@RequestMapping(value = "createSaasFunction")
     public ResponseResult createSaasFunction(@RequestBody @Validated SaasFunctionCreateVO createVO) {
-		ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), null);
+		ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getFunName(), null);
 		if (validRequestParam != null) {
 			return validRequestParam;
 		}
@@ -166,7 +179,7 @@ public class SaasFunctionController {
 		if (StringUtil.isBlank(createVO.getId())) {
 			return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "功能ID不可为空");
 		}
-		ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getId());
+		ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getFunName(), createVO.getId());
 		if (validRequestParam != null) {
 			return validRequestParam;
 		}
@@ -194,7 +207,7 @@ public class SaasFunctionController {
      * 
      * @return
      */
-    private ResponseResult validRequestParam(String menuId, String pageId, String funCode, String funId) {
+    private ResponseResult validRequestParam(String menuId, String pageId, String funCode, String funName, String funId) {
     	if (StringUtil.isAllBlank(menuId, pageId)) {
 			return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "菜单ID与页面ID必填其一");
 		}
@@ -210,6 +223,13 @@ public class SaasFunctionController {
 					return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此编码已存在");
 				}
 			}
+			// 验证功能名称的唯一性
+			if (StringUtil.isNotBlank(funName)) {
+				boolean validFunName = this.saasFunctionService.validFunName(menuId, null, funName, funId);
+				if (!validFunName) {
+					return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此名称已存在");
+				}
+			}
 		}
 		if (StringUtil.isNotBlank(pageId)) {
 			SaasProductPage page = this.saasProductPageService.getById(pageId);
@@ -223,6 +243,13 @@ public class SaasFunctionController {
 					return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此编码已存在");
 				}
 			}
+			// 验证功能名称的唯一性
+			if (StringUtil.isNotBlank(funName)) {
+				boolean validFunName = this.saasFunctionService.validFunName(null, pageId, funName, funId);
+				if (!validFunName) {
+					return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此名称已存在");
+				}
+			}
 		}
     	return null;
     }

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

@@ -14,11 +14,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
 import com.persagy.account.manage.SaasRoleMenuHandler;
 import com.persagy.account.pojo.dto.SaasMenu;
+import com.persagy.account.pojo.dto.SaasProduct;
 import com.persagy.account.pojo.vo.menu.SaasMenuCreateVO;
 import com.persagy.account.pojo.vo.menu.SaasMenuDeleteVO;
 import com.persagy.account.pojo.vo.menu.SaasMenuQueryVO;
 import com.persagy.account.pojo.vo.menu.SaasMenuSortVO;
 import com.persagy.account.service.ISaasMenuService;
+import com.persagy.account.service.ISaasProductService;
 import com.persagy.account.service.ISaasRoleMenuService;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.utils.ResponseResult;
@@ -46,6 +48,9 @@ public class SaasMenuController {
     private ISaasMenuService saasMenuService;
     
     @Autowired
+    private ISaasProductService saasProductService;
+    
+    @Autowired
     private SaasRoleMenuHandler saasRoleMenuHandler;
     
     @Autowired
@@ -108,7 +113,7 @@ public class SaasMenuController {
 			return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "当菜单URL存在时,URL类型不可为空");
 		}
 		// 应用下菜单编码唯一
-		ResponseResult validRequestParam = this.validRequestParam(createVO.getAppId(), createVO.getMenuCode(), createVO.getMenuName(), null);
+		ResponseResult validRequestParam = this.validRequestParam(createVO.getAppId(), createVO.getMenuType(), createVO.getMenuCode(), createVO.getMenuName(), null);
 		if (validRequestParam != null) {
 			return validRequestParam;
 		}
@@ -116,6 +121,14 @@ public class SaasMenuController {
 		BeanUtils.copyProperties(createVO, saasMenu);
 		saasMenu.setId(null);
 		saasMenu.setUpdateUser(createVO.getAccountId());
+		// 获取产品图标,设置进菜单图标
+		if (StringUtil.isNotBlank(createVO.getProductId())) {
+			SaasProduct saasProduct = this.saasProductService.getById(createVO.getProductId());
+			if (saasProduct == null) {
+				return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此产品");
+			}
+			saasMenu.setMenuIcon(saasProduct.getProductIcon());
+		}
 		boolean result = this.saasMenuService.createSaasMenu(saasMenu);
         return result ? ResponseResultUtil.successResult("保存成功", saasMenu.getId()) : ResponseResultUtil.errorResult("保存失败");
     }
@@ -138,13 +151,29 @@ public class SaasMenuController {
 			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此菜单");
 		}
 		// 应用下菜单编码唯一
-		ResponseResult validRequestParam = this.validRequestParam(createVO.getAppId(), createVO.getMenuCode(), createVO.getMenuName(), createVO.getId());
+		ResponseResult validRequestParam = this.validRequestParam(createVO.getAppId(), createVO.getMenuType(), createVO.getMenuCode(), createVO.getMenuName(), createVO.getId());
 		if (validRequestParam != null) {
 			return validRequestParam;
 		}
+		// 验证是否允许菜单转为产品页
+		if (StringUtil.isBlank(menu.getProductId()) && StringUtil.isNotBlank(createVO.getProductId())) {
+			LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(createVO.getId()).builderQueryWrapper();
+			int count = this.saasMenuService.count(queryWrapper);
+			if (count > 0) {
+				return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "此菜单存在下级菜单,不允许转变为产品页");
+			}
+		}
 		SaasMenu saasMenu = new SaasMenu();
 		BeanUtils.copyProperties(createVO, saasMenu);
 		saasMenu.setUpdateUser(createVO.getAccountId());
+		// 获取产品图标,设置进菜单图标
+		if (StringUtil.isNotBlank(createVO.getProductId())) {
+			SaasProduct saasProduct = this.saasProductService.getById(createVO.getProductId());
+			if (saasProduct == null) {
+				return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此产品");
+			}
+			saasMenu.setMenuIcon(saasProduct.getProductIcon());
+		}
 		boolean result = this.saasMenuService.updateSaasMenu(saasMenu, menu.getProductId());
         return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
     }
@@ -191,18 +220,18 @@ public class SaasMenuController {
      * 
      * @return
      */
-    private ResponseResult validRequestParam(String appId, String menuCode, String menuName, String menuId) {
+    private ResponseResult validRequestParam(String appId, String menuType, String menuCode, String menuName, String menuId) {
     	if (StringUtil.isBlank(appId)) {
 			return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "应用ID,不可为空");
 		}
 		if (StringUtil.isNotBlank(menuCode)) {
-			boolean validMenuCode = this.saasMenuService.validMenuCode(appId, menuCode, menuId);
+			boolean validMenuCode = this.saasMenuService.validMenuCode(appId, menuType, menuCode, menuId);
 			if (!validMenuCode) {
 				return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此编码已存在");
 			}
 		}
 		if (StringUtil.isNotBlank(menuName)) {
-			boolean validMenuName = this.saasMenuService.validMenuName(appId, menuName, menuId);
+			boolean validMenuName = this.saasMenuService.validMenuName(appId, menuType, menuName, menuId);
 			if (!validMenuName) {
 				return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此名称已存在");
 			}

+ 26 - 26
saas-account/src/main/java/com/persagy/account/controller/SaasProductCategeoryController.java

@@ -11,9 +11,9 @@ import org.springframework.web.bind.annotation.RestController;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
-import com.persagy.account.pojo.dto.SaasProductCategeory;
-import com.persagy.account.pojo.vo.product.SaasProductCategeoryQueryVO;
-import com.persagy.account.service.ISaasProductCategeoryService;
+import com.persagy.account.pojo.dto.SaasProductCategory;
+import com.persagy.account.pojo.vo.product.SaasProductCategoryQueryVO;
+import com.persagy.account.service.ISaasProductCategoryService;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseResultUtil;
 
@@ -32,27 +32,27 @@ import io.swagger.annotations.ApiOperation;
 
 @Api(tags = "产品类别信息")
 @RestController
-@RequestMapping(value = "/productCategeory", method = RequestMethod.POST)
-public class SaasProductCategeoryController {
+@RequestMapping(value = "/productCategory", method = RequestMethod.POST)
+public class SaasProductCategoryController {
 	
     @Autowired
-    private ISaasProductCategeoryService saasProductCategeoryService;
+    private ISaasProductCategoryService SaasProductCategoryService;
     
     /**
      * 列表查询
      */
     @ApiOperation(value = "产品类别树查询")
-    @RequestMapping(value = "querySaasProductCategeoryTree")
-    public ResponseResult querySaasProductCategeoryTree(@RequestBody @Validated SaasProductCategeoryQueryVO model) {
-    	LambdaQueryWrapper<SaasProductCategeory> queryWrapper = new SaasProductCategeory.BuilderQueryWrapper()
+    @RequestMapping(value = "querySaasProductCategoryTree")
+    public ResponseResult querySaasProductCategoryTree(@RequestBody @Validated SaasProductCategoryQueryVO model) {
+    	LambdaQueryWrapper<SaasProductCategory> queryWrapper = new SaasProductCategory.BuilderQueryWrapper()
     			.categoryNameLike(model.getCategoryName()).idEq(model.getId()).menuTypeEq(model.getMenuType())
     			.productTypeEq(model.getProductType()).terminalEq(model.getTerminal()).builder();
     	queryWrapper.apply("(PARENT_ID IS NULL OR TRIM(PARENT_ID) = '')");
-    	List<SaasProductCategeory> topList = this.saasProductCategeoryService.list(queryWrapper.orderByAsc(SaasProductCategeory::getCreateTime));
+    	List<SaasProductCategory> topList = this.SaasProductCategoryService.list(queryWrapper.orderByAsc(SaasProductCategory::getCreateTime));
     	if (CollectionUtil.isEmpty(topList)) {
 			return ResponseResultUtil.successResult(Lists.newArrayList());
 		}
-    	this.querySaasProductCategeoryTree(topList);
+    	this.querySaasProductCategoryTree(topList);
         return ResponseResultUtil.successResult(topList);
     }
     
@@ -60,13 +60,13 @@ public class SaasProductCategeoryController {
      * 获取产品类别树
      * @param list
      */
-    private void querySaasProductCategeoryTree(List<SaasProductCategeory> list) {
-		for (SaasProductCategeory categeory : list) {
-			LambdaQueryWrapper<SaasProductCategeory> queryWrapper = new SaasProductCategeory.BuilderQueryWrapper().parentIdEq(categeory.getId()).builder();
-	    	List<SaasProductCategeory> nextList = this.saasProductCategeoryService.list(queryWrapper.orderByAsc(SaasProductCategeory::getCreateTime));
+    private void querySaasProductCategoryTree(List<SaasProductCategory> list) {
+		for (SaasProductCategory categeory : list) {
+			LambdaQueryWrapper<SaasProductCategory> queryWrapper = new SaasProductCategory.BuilderQueryWrapper().parentIdEq(categeory.getId()).builder();
+	    	List<SaasProductCategory> nextList = this.SaasProductCategoryService.list(queryWrapper.orderByAsc(SaasProductCategory::getCreateTime));
 	    	nextList = CollectionUtil.isEmpty(nextList) ? Lists.newArrayList() : nextList;
 	    	categeory.setChildrens(nextList);
-			this.querySaasProductCategeoryTree(nextList);
+			this.querySaasProductCategoryTree(nextList);
 		}
 	}
 
@@ -74,19 +74,19 @@ public class SaasProductCategeoryController {
      * 新增
      */
 	@ApiOperation(value = "保存")
-	@RequestMapping(value = "createSaasProductCategeory")
-    public ResponseResult createSaasProductCategeory(@RequestBody SaasProductCategeory saasProductCategeory) {
-        boolean result = this.saasProductCategeoryService.save(saasProductCategeory);
-        return result ? ResponseResultUtil.successResult("保存成功", saasProductCategeory.getId()) : ResponseResultUtil.errorResult("保存失败");
+	@RequestMapping(value = "createSaasProductCategory")
+    public ResponseResult createSaasProductCategory(@RequestBody SaasProductCategory SaasProductCategory) {
+        boolean result = this.SaasProductCategoryService.save(SaasProductCategory);
+        return result ? ResponseResultUtil.successResult("保存成功", SaasProductCategory.getId()) : ResponseResultUtil.errorResult("保存失败");
     }
     
     /**
      * 更新
      */
 	@ApiOperation(value = "更新")
-	@RequestMapping(value = "updateSaasProductCategeory")
-    public ResponseResult updateSaasProductCategeory(@RequestBody SaasProductCategeory saasProductCategeory) {
-        boolean result = this.saasProductCategeoryService.updateById(saasProductCategeory);
+	@RequestMapping(value = "updateSaasProductCategory")
+    public ResponseResult updateSaasProductCategory(@RequestBody SaasProductCategory SaasProductCategory) {
+        boolean result = this.SaasProductCategoryService.updateById(SaasProductCategory);
         return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
     }
 
@@ -94,9 +94,9 @@ public class SaasProductCategeoryController {
      * 物理删除
      */
     @ApiOperation(value = "删除")
-    @RequestMapping(value = "deleteSaasProductCategeory")
-    public ResponseResult deleteSaasProductCategeory(@RequestBody SaasProductCategeory saasProductCategeory) {
-        boolean result = this.saasProductCategeoryService.removeById(saasProductCategeory.getId());
+    @RequestMapping(value = "deleteSaasProductCategory")
+    public ResponseResult deleteSaasProductCategory(@RequestBody SaasProductCategory SaasProductCategory) {
+        boolean result = this.SaasProductCategoryService.removeById(SaasProductCategory.getId());
         return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
     }
     

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

@@ -97,12 +97,12 @@ public class SaasProductController {
 		// 验证产品名称、产品编码的唯一性
 		boolean result = false;
 		if (StringUtil.isNotBlank(model.getProductCode())) {
-			result = this.saasProductService.validProductCode(model.getProductCode(), null);
+			result = this.saasProductService.validProductCode(model.getProductType(), model.getProductCode(), null);
 			if (!result) {
 				return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "产品编码已存在");
 			}
 		}
-		result = this.saasProductService.validProductName(model.getProductName(), null);
+		result = this.saasProductService.validProductName(model.getProductType(), model.getProductName(), null);
 		if (!result) {
 			return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "产品名称已存在");
 		}
@@ -132,12 +132,12 @@ public class SaasProductController {
 		// 验证产品名称、产品编码的唯一性
 		boolean result = false;
 		if (StringUtil.isNotBlank(model.getProductCode())) {
-			result = this.saasProductService.validProductCode(model.getProductCode(), null);
+			result = this.saasProductService.validProductCode(model.getProductType(), model.getProductCode(), null);
 			if (!result) {
 				return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "产品编码已存在");
 			}
 		}
-		result = this.saasProductService.validProductName(model.getProductName(), model.getId());
+		result = this.saasProductService.validProductName(model.getProductType(),model.getProductName(), model.getId());
 		if (!result) {
 			return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "产品名称已存在");
 		}

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

@@ -83,7 +83,7 @@ public class SaasProductPageController {
 		if (saasProduct == null) {
 			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "产品信息不存在");
 		}
-		boolean result = this.saasProductPageService.validPageName(model.getPageName(), null);
+		boolean result = this.saasProductPageService.validPageName(model.getProductId(),model.getPageName(), null);
 		if (!result) {
 			return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "页面名称已存在");
 		}
@@ -109,7 +109,7 @@ public class SaasProductPageController {
 		if (saasProduct == null) {
 			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "产品信息不存在");
 		}
-		boolean result = this.saasProductPageService.validPageName(model.getPageName(), model.getId());
+		boolean result = this.saasProductPageService.validPageName(model.getProductId(), model.getPageName(), model.getId());
 		if (!result) {
 			return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "页面名称已存在");
 		}
@@ -133,7 +133,7 @@ public class SaasProductPageController {
 			return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "产品页面信息不存在");
 		}
 		if (!SaasCommonConstant.STR_STATUS_0.equals(productPage.getPageFloor())) {
-			return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "落地页不允许删除,请优先变更落地页所属");
+			return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "落地页不允许删除,请优先变更落地页所属");
 		}
 		// 删除,级联删除权限及其关联关系
 		boolean result = this.saasProductHandler.deleteSaasProductPage(model.getId());

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

@@ -108,14 +108,14 @@ public class SaasAuthHandler {
      */
     public List<SaasGroup> getAllowGroupList(String accountId, String groupCode, String accountType) {
     	List<SaasGroup> groups = null;
-    	if (SaasCommonConstant.STR_STATUS_2.equals(accountType)) {
+    	if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) {
+    		LambdaQueryWrapper<SaasGroup> queryWrapper = new SaasGroup.Builder().createQueryWrapper().validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
+    		groups = this.saasGroupService.list(queryWrapper);
+		} else {
 			SaasGroup saasGroup = new SaasGroup();
 			saasGroup.setGroupCode(groupCode);
 			saasGroup.setValid(SaasCommonConstant.STATUS_1);
 			groups = this.saasGroupService.queryAllowGroupInfo(saasGroup, accountId);
-		} else {
-			LambdaQueryWrapper<SaasGroup> queryWrapper = new SaasGroup.Builder().createQueryWrapper().validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
-    		groups = this.saasGroupService.list(queryWrapper);
 		}
 		return groups == null ? Lists.newArrayList() : groups;
     }
@@ -145,11 +145,11 @@ public class SaasAuthHandler {
      */
     public List<SaasArea> getAllowAreaList(String accountId, String groupCode, String accountType) {
     	List<SaasArea> topList = this.saasAreaProjectHandler.getTopAreaList(groupCode);
-		if (SaasCommonConstant.STR_STATUS_2.equals(accountType)) {
+		if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) {
+			this.saasAreaProjectHandler.querySaasAreaTree(topList, false);
+		} else {
 			// 其他类型时,需要根据权限表数据,去匹配区域树
 			this.saasAreaProjectHandler.queryAllowAreaTree(topList, accountId, groupCode);
-		} else {
-	    	this.saasAreaProjectHandler.querySaasAreaTree(topList, false);
 		}
 		return topList;
     }

+ 38 - 13
saas-account/src/main/java/com/persagy/account/manage/SaasProductHandler.java

@@ -20,6 +20,7 @@ import com.persagy.account.service.ISaasProductPageService;
 import com.persagy.account.service.ISaasProjectProductService;
 import com.persagy.account.service.ISaasRoleMenuService;
 import com.persagy.common.constant.SaasCommonConstant;
+import com.persagy.common.exception.BusinessException;
 import com.persagy.common.utils.StringUtil;
 
 import cn.hutool.core.collection.CollectionUtil;
@@ -54,7 +55,7 @@ public class SaasProductHandler {
 	 * 这里未签约,不会返回异常,会设置为空的集合
 	 * 获取此账号下能够可见的页面集合,优先做权限判断,判定是否进行了签约
 	 * 
-	 * @param saasMenu
+	 * @param saasMenu 不可为空
 	 * @param accountId
 	 * @param projectId
 	 * @param groupCode
@@ -66,14 +67,12 @@ public class SaasProductHandler {
 		String angle = StringUtil.isBlank(projectId) ? SaasCommonConstant.STR_STATUS_1 : SaasCommonConstant.STR_STATUS_2;
 		if (StringUtil.isBlank(saasMenu.getProductId())) {
 			List<SaasFunction> functions = null;
-			if (showFunctions) {
-				// 未挂有产品,关联查询出对应的功能点集合,即可返回
-				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 (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);
 			return;
@@ -109,7 +108,7 @@ public class SaasProductHandler {
 	 * @param isAdmin
 	 * @param showPageAuth
 	 */
-	public Object queryMenuProductAuths(String menuId, String productId, String accountId, String projectId, String groupCode, boolean isAdmin, boolean 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;
 		
@@ -140,7 +139,7 @@ public class SaasProductHandler {
 		// 已签约,走关联查询获取页面及其权限
 		List<SaasProductPage> pageTree = this.querySaasProductPageTree(angle, productId, accountId, menuId, isAdmin, showPageAuth);
 		return pageTree;
-	}
+	}*/
 	
 	/**
 	 * 获取产品页面树
@@ -239,14 +238,38 @@ public class SaasProductHandler {
 		List<SaasProductPage> list = this.saasProductPageService.queryAccountProductPages(accountId, saasProductPage.getProductId(), menuId, saasProductPage.getId(), angle);
 		return CollectionUtil.isEmpty(list) ? Lists.newArrayList() : list;
 	}
+
+	/**
+	 * 级联删除所有的子菜单和对应的权限信息
+	 * @param menuId
+	 * @param productId
+	 */
+	@Transactional
+	public void casDeleteChildrenPage(String parentId) {
+		LambdaQueryWrapper<SaasProductPage> queryWrapper = new SaasProductPage.BuilderQueryWrapper().parentIdEq(parentId).builder();
+		List<SaasProductPage> productPages = this.saasProductPageService.list(queryWrapper.select(SaasProductPage::getId, SaasProductPage::getPageFloor));
+		if (CollectionUtil.isEmpty(productPages)) {
+			return;
+		}
+		for (SaasProductPage productPage : productPages) {
+			// 删除此页面
+			if (!SaasCommonConstant.STR_STATUS_0.equals(productPage.getPageFloor())) {
+				throw new BusinessException("落地页不允许删除,请优先变更落地页所属");
+			}
+	    	this.deleteSaasProductPage(productPage.getId());
+		}
+	}
 	
 	/**
-	 * 删除产品页面信息,级联删除页面下权限及其与权限相关的关联关系
+	 * 删除产品页面信息,级联删除页面和子页面下权限,并与其权限相关的关联关系
 	 * @param pageId
 	 * @return
 	 */
 	@Transactional
 	public boolean deleteSaasProductPage(String pageId) {
+		if (StringUtil.isBlank(pageId)) {
+			return true;
+		}
 		boolean result = this.saasProductPageService.removeById(pageId);
 		if (result) {
 			// 1.删除权限点信息
@@ -255,8 +278,10 @@ public class SaasProductHandler {
 			// 2.删除此页面对应的菜单、角色关系数据
 			LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().pageIdEq(pageId).builderQueryWrapper();
 			this.saasRoleMenuService.remove(roleMenuWrapper);
+			this.casDeleteChildrenPage(pageId);
+			return true;
 		}
-		return result;
+		throw new BusinessException("产品页面信息删除失败");
 	}
 
 }

+ 35 - 2
saas-account/src/main/java/com/persagy/account/manage/SaasRoleMenuHandler.java

@@ -115,7 +115,7 @@ public class SaasRoleMenuHandler {
 			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, SaasCommonConstant.STATUS_1);
+			menuTree = this.saasMenuService.querySaasMenuTree(accountId, groupCode, appId, null, SaasCommonConstant.STATUS_1);
 		}
 		if (CollectionUtil.isEmpty(menuTree)) {
 			return Lists.newArrayList();
@@ -205,6 +205,9 @@ public class SaasRoleMenuHandler {
 	 */
 	@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) {
@@ -220,8 +223,38 @@ public class SaasRoleMenuHandler {
 			// 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);
 		}
-		return result;
 	}
 
 	/**

+ 3 - 3
saas-account/src/main/java/com/persagy/account/mapper/SaasGroupProductDetailMapper.java

@@ -6,7 +6,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.account.pojo.dto.SaasGroupProductDetail;
+import com.persagy.account.pojo.dto.SaasGroupProductPage;
 
 /**
  * 集团签约产品详情
@@ -17,7 +17,7 @@ import com.persagy.account.pojo.dto.SaasGroupProductDetail;
  * @date 2021-05-07 12:02:40
  */
 @Mapper
-public interface SaasGroupProductDetailMapper extends BaseMapper<SaasGroupProductDetail> {
+public interface SaasGroupProductPageMapper extends BaseMapper<SaasGroupProductPage> {
 
 	/**
 	 * 创建签约ID,与页面ID的关联关系
@@ -25,6 +25,6 @@ public interface SaasGroupProductDetailMapper extends BaseMapper<SaasGroupProduc
 	 * @param pageIds
 	 * @return
 	 */
-	Integer insertSaasGroupProductDetail(@Param("contractId") String contractId, @Param("pageIds") Set<String> pageIds);
+	Integer insertSaasGroupProductPage(@Param("contractId") String contractId, @Param("pageIds") Set<String> pageIds);
 
 }

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

@@ -30,7 +30,7 @@ public interface SaasMenuMapper extends BaseMapper<SaasMenu> {
 	 * @return
 	 */
 	List<SaasMenu> querySaasMenuTree(@Param("accountId") String accountId, @Param("groupCode") String groupCode, 
-			@Param("appId") String appId, @Param("valid") Integer valid);
+			@Param("appId") String appId, @Param("menuId") String menuId, @Param("valid") Integer valid);
 	
 	/**
 	 * 查询出此角色下,所有不存在功能点的菜单集合

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

@@ -3,7 +3,7 @@ package com.persagy.account.mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.account.pojo.dto.SaasProductCategeory;
+import com.persagy.account.pojo.dto.SaasProductCategory;
 
 /**
  * 产品信息
@@ -14,6 +14,6 @@ import com.persagy.account.pojo.dto.SaasProductCategeory;
  * @date 2021-05-11 19:23:03
  */
 @Mapper
-public interface SaasProductCategeoryMapper extends BaseMapper<SaasProductCategeory> {
+public interface SaasProductCategoryMapper extends BaseMapper<SaasProductCategory> {
 
 }

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

@@ -42,9 +42,6 @@ public class SaasGroupProduct extends BaseEntity<SaasGroupProduct> {
 	private String productId; // 产品ID
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
-	private String productCode; // 产品编码
-
-	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String productRange; // 产品使用范围,0-全部项目,1-部分项目
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
@@ -96,13 +93,6 @@ public class SaasGroupProduct extends BaseEntity<SaasGroupProduct> {
 			return this;
 		}
 
-		public BuilderQueryWrapper productCodeEq(String productCode) {
-			if (StringUtil.isNotBlank(productCode)) {
-				queryWrapper.eq(SaasGroupProduct::getProductCode, productCode);
-			}
-			return this;
-		}
-
 		public BuilderQueryWrapper productRangeEq(String productRange) {
 			if (StringUtil.isNotBlank(productRange)) {
 				queryWrapper.eq(SaasGroupProduct::getProductRange, productRange);
@@ -176,13 +166,6 @@ public class SaasGroupProduct extends BaseEntity<SaasGroupProduct> {
 			return this;
 		}
 
-		public BuilderUpdateWrapper productCodeEq(String productCode) {
-			if (StringUtil.isNotBlank(productCode)) {
-				updateWrapper.eq(SaasGroupProduct::getProductCode, productCode);
-			}
-			return this;
-		}
-
 		public BuilderUpdateWrapper productRangeEq(String productRange) {
 			if (StringUtil.isNotBlank(productRange)) {
 				updateWrapper.eq(SaasGroupProduct::getProductRange, productRange);

+ 9 - 9
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasGroupProductDetail.java

@@ -26,7 +26,7 @@ import lombok.ToString;
 @ToString
 @EqualsAndHashCode(callSuper = false)
 @TableName("saas_group_product_detail")
-public class SaasGroupProductDetail extends Model<SaasGroupProductDetail> {
+public class SaasGroupProductPage extends Model<SaasGroupProductPage> {
 	private static final long serialVersionUID = -4851547634570454698L;
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
@@ -37,23 +37,23 @@ public class SaasGroupProductDetail extends Model<SaasGroupProductDetail> {
 
 	public static class BuilderQueryWrapper {
 
-		private LambdaQueryWrapper<SaasGroupProductDetail> queryWrapper = new LambdaQueryWrapper<SaasGroupProductDetail>();
+		private LambdaQueryWrapper<SaasGroupProductPage> queryWrapper = new LambdaQueryWrapper<SaasGroupProductPage>();
 
 		public BuilderQueryWrapper contractIdEq(String contractId) {
 			if (StringUtil.isNotBlank(contractId)) {
-				queryWrapper.eq(SaasGroupProductDetail::getContractId, contractId);
+				queryWrapper.eq(SaasGroupProductPage::getContractId, contractId);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper pageIdEq(String pageId) {
 			if (StringUtil.isNotBlank(pageId)) {
-				queryWrapper.eq(SaasGroupProductDetail::getPageId, pageId);
+				queryWrapper.eq(SaasGroupProductPage::getPageId, pageId);
 			}
 			return this;
 		}
 
-		public LambdaQueryWrapper<SaasGroupProductDetail> builder() {
+		public LambdaQueryWrapper<SaasGroupProductPage> builder() {
 			return queryWrapper;
 		}
 
@@ -61,23 +61,23 @@ public class SaasGroupProductDetail extends Model<SaasGroupProductDetail> {
 
 	public static class BuilderUpdateWrapper {
 
-		private LambdaUpdateWrapper<SaasGroupProductDetail> updateWrapper = new LambdaUpdateWrapper<SaasGroupProductDetail>();
+		private LambdaUpdateWrapper<SaasGroupProductPage> updateWrapper = new LambdaUpdateWrapper<SaasGroupProductPage>();
 
 		public BuilderUpdateWrapper contractIdEq(String contractId) {
 			if (StringUtil.isNotBlank(contractId)) {
-				updateWrapper.eq(SaasGroupProductDetail::getContractId, contractId);
+				updateWrapper.eq(SaasGroupProductPage::getContractId, contractId);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper pageIdEq(String pageId) {
 			if (StringUtil.isNotBlank(pageId)) {
-				updateWrapper.eq(SaasGroupProductDetail::getPageId, pageId);
+				updateWrapper.eq(SaasGroupProductPage::getPageId, pageId);
 			}
 			return this;
 		}
 
-		public LambdaUpdateWrapper<SaasGroupProductDetail> builder() {
+		public LambdaUpdateWrapper<SaasGroupProductPage> builder() {
 			return updateWrapper;
 		}
 

+ 25 - 25
saas-account/src/main/java/com/persagy/account/pojo/dto/SaasProductCategeory.java

@@ -30,9 +30,9 @@ import lombok.ToString;
 @Setter
 @ToString
 @EqualsAndHashCode(callSuper = false)
-@TableName("saas_product_categeory")
-@IdGeneratorPrefix(SaasCommonConstant.SAAS_PRODUCT_CATEGEORY_ID_PREFIX)
-public class SaasProductCategeory extends BaseEntity<SaasProductCategeory> {
+@TableName("saas_product_category")
+@IdGeneratorPrefix(SaasCommonConstant.SAAS_PRODUCT_CATEGORY_ID_PREFIX)
+public class SaasProductCategory extends BaseEntity<SaasProductCategory> {
 	private static final long serialVersionUID = 8965388764057710104L;
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
@@ -63,76 +63,76 @@ public class SaasProductCategeory extends BaseEntity<SaasProductCategeory> {
 	private String remark;	// 备注
 	
 	@TableField(exist = false)
-	private List<SaasProductCategeory> childrens;	//资料
+	private List<SaasProductCategory> childrens;	//资料
 
 	public static class BuilderQueryWrapper {
 
-		private LambdaQueryWrapper<SaasProductCategeory> queryWrapper = new LambdaQueryWrapper<SaasProductCategeory>();
+		private LambdaQueryWrapper<SaasProductCategory> queryWrapper = new LambdaQueryWrapper<SaasProductCategory>();
 
 		public BuilderQueryWrapper idEq(String id) {
 			if (StringUtil.isNotBlank(id)) {
-				queryWrapper.eq(SaasProductCategeory::getId, id);
+				queryWrapper.eq(SaasProductCategory::getId, id);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper parentIdEq(String parentId) {
 			if (StringUtil.isNotBlank(parentId)) {
-				queryWrapper.eq(SaasProductCategeory::getParentId, parentId);
+				queryWrapper.eq(SaasProductCategory::getParentId, parentId);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper categoryNameEq(String categoryName) {
 			if (StringUtil.isNotBlank(categoryName)) {
-				queryWrapper.eq(SaasProductCategeory::getCategoryName, categoryName);
+				queryWrapper.eq(SaasProductCategory::getCategoryName, categoryName);
 			}
 			return this;
 		}
 		
 		public BuilderQueryWrapper categoryNameLike(String categoryName) {
 			if (StringUtil.isNotBlank(categoryName)) {
-				queryWrapper.like(SaasProductCategeory::getCategoryName, categoryName);
+				queryWrapper.like(SaasProductCategory::getCategoryName, categoryName);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper categoryIconEq(String categoryIcon) {
 			if (StringUtil.isNotBlank(categoryIcon)) {
-				queryWrapper.eq(SaasProductCategeory::getCategoryIcon, categoryIcon);
+				queryWrapper.eq(SaasProductCategory::getCategoryIcon, categoryIcon);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper terminalEq(String terminal) {
 			if (StringUtil.isNotBlank(terminal)) {
-				queryWrapper.eq(SaasProductCategeory::getTerminal, terminal);
+				queryWrapper.eq(SaasProductCategory::getTerminal, terminal);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper terminalNameEq(String terminalName) {
 			if (StringUtil.isNotBlank(terminalName)) {
-				queryWrapper.eq(SaasProductCategeory::getTerminalName, terminalName);
+				queryWrapper.eq(SaasProductCategory::getTerminalName, terminalName);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper productTypeEq(String productType) {
 			if (StringUtil.isNotBlank(productType)) {
-				queryWrapper.eq(SaasProductCategeory::getProductType, productType);
+				queryWrapper.eq(SaasProductCategory::getProductType, productType);
 			}
 			return this;
 		}
 
 		public BuilderQueryWrapper menuTypeEq(String menuType) {
 			if (StringUtil.isNotBlank(menuType)) {
-				queryWrapper.eq(SaasProductCategeory::getMenuType, menuType);
+				queryWrapper.eq(SaasProductCategory::getMenuType, menuType);
 			}
 			return this;
 		}
 
-		public LambdaQueryWrapper<SaasProductCategeory> builder() {
+		public LambdaQueryWrapper<SaasProductCategory> builder() {
 			return queryWrapper;
 		}
 
@@ -140,65 +140,65 @@ public class SaasProductCategeory extends BaseEntity<SaasProductCategeory> {
 
 	public static class BuilderUpdateWrapper {
 
-		private LambdaUpdateWrapper<SaasProductCategeory> updateWrapper = new LambdaUpdateWrapper<SaasProductCategeory>();
+		private LambdaUpdateWrapper<SaasProductCategory> updateWrapper = new LambdaUpdateWrapper<SaasProductCategory>();
 
 		public BuilderUpdateWrapper idEq(String id) {
 			if (StringUtil.isNotBlank(id)) {
-				updateWrapper.eq(SaasProductCategeory::getId, id);
+				updateWrapper.eq(SaasProductCategory::getId, id);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper parentIdEq(String parentId) {
 			if (StringUtil.isNotBlank(parentId)) {
-				updateWrapper.eq(SaasProductCategeory::getParentId, parentId);
+				updateWrapper.eq(SaasProductCategory::getParentId, parentId);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper categoryNameEq(String categoryName) {
 			if (StringUtil.isNotBlank(categoryName)) {
-				updateWrapper.eq(SaasProductCategeory::getCategoryName, categoryName);
+				updateWrapper.eq(SaasProductCategory::getCategoryName, categoryName);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper categoryIconEq(String categoryIcon) {
 			if (StringUtil.isNotBlank(categoryIcon)) {
-				updateWrapper.eq(SaasProductCategeory::getCategoryIcon, categoryIcon);
+				updateWrapper.eq(SaasProductCategory::getCategoryIcon, categoryIcon);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper terminalEq(String terminal) {
 			if (StringUtil.isNotBlank(terminal)) {
-				updateWrapper.eq(SaasProductCategeory::getTerminal, terminal);
+				updateWrapper.eq(SaasProductCategory::getTerminal, terminal);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper terminalNameEq(String terminalName) {
 			if (StringUtil.isNotBlank(terminalName)) {
-				updateWrapper.eq(SaasProductCategeory::getTerminalName, terminalName);
+				updateWrapper.eq(SaasProductCategory::getTerminalName, terminalName);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper productTypeEq(String productType) {
 			if (StringUtil.isNotBlank(productType)) {
-				updateWrapper.eq(SaasProductCategeory::getProductType, productType);
+				updateWrapper.eq(SaasProductCategory::getProductType, productType);
 			}
 			return this;
 		}
 
 		public BuilderUpdateWrapper menuTypeEq(String menuType) {
 			if (StringUtil.isNotBlank(menuType)) {
-				updateWrapper.eq(SaasProductCategeory::getMenuType, menuType);
+				updateWrapper.eq(SaasProductCategory::getMenuType, menuType);
 			}
 			return this;
 		}
 
-		public LambdaUpdateWrapper<SaasProductCategeory> builder() {
+		public LambdaUpdateWrapper<SaasProductCategory> builder() {
 			return updateWrapper;
 		}
 

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

@@ -1,7 +1,5 @@
 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;
@@ -21,7 +19,7 @@ import lombok.ToString;
 @ToString
 public class SaasMenuFunctionPage {
 
-	@NotBlank(message = "页面ID,不可为空")
+	//@NotBlank(message = "页面ID,不可为空")
 	@ApiModelProperty(value = "页面ID", example = "1001")
 	private String pageId; 		// 页面ID
 	

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

@@ -2,9 +2,7 @@ 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;
@@ -29,8 +27,6 @@ public class SaasMenuFunctionPageVO {
 	@ApiModelProperty(value = "菜单ID", example = "1001")
 	private String menuId; 		// 菜单ID
 	
-	@Valid
-	@NotEmpty(message = "页面功能权限集合,不可为空")
 	@ApiModelProperty(value = "页面功能权限集合", example = "1001")
 	private List<SaasMenuFunctionPage> pages; 
 	

+ 30 - 0
saas-account/src/main/java/com/persagy/account/pojo/vo/dict/SaasDictVO.java

@@ -0,0 +1,30 @@
+package com.persagy.account.pojo.vo.dict;
+
+import javax.validation.constraints.NotBlank;
+
+import com.persagy.common.model.BaseUserModel;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy 
+ * @author zhangqiankun
+ * @date 2021年5月14日 下午2:50:52
+ */
+@Getter
+@Setter
+@ApiModel
+@ToString
+public class SaasDictVO extends BaseUserModel {
+	
+	@NotBlank(message = "字典类型,不可为空")
+	@ApiModelProperty(value = "字典类型", example = "123456")
+	private String dictType;
+	
+}

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

@@ -35,10 +35,6 @@ public class SaasGroupProductCreateVO extends BaseGroupModel {
 	@ApiModelProperty(value = "产品ID", example = "1001", required = true)
 	private String productId; // 产品ID
 
-	@NotBlank(message = "产品编码,不可为空")
-	@ApiModelProperty(value = "产品编码", example = "0", required = true)
-	private String productCode; // 产品编码
-
 	@NotBlank(message = "产品使用范围,不可为空")
 	@ApiModelProperty(value = "产品使用范围,0-全部项目,1-部分项目", example = "0", required = true)
 	private String productRange; // 产品使用范围,0-全部项目,1-部分项目

+ 1 - 1
saas-account/src/main/java/com/persagy/account/pojo/vo/product/SaasProductCategeoryQueryVO.java

@@ -19,7 +19,7 @@ import lombok.ToString;
 @Setter
 @ApiModel
 @ToString
-public class SaasProductCategeoryQueryVO extends BaseUserModel {
+public class SaasProductCategoryQueryVO extends BaseUserModel {
 	
 	@ApiModelProperty(value = "类别ID", example = "PD1001")
 	private String id; // ID

+ 1 - 1
saas-account/src/main/java/com/persagy/account/pojo/vo/project/SaasProjectCreateVO.java

@@ -38,7 +38,7 @@ public class SaasProjectCreateVO extends BaseGroupModel {
 	@ApiModelProperty(value = "项目所属区域", example = "123456")
 	private String areaId; 		// 项目所属区域,必须为最底层的区域
 
-	@NotBlank(message = "项目本地编码,不可为空")
+	//@NotBlank(message = "项目本地编码,不可为空")
 	@ApiModelProperty(value = "项目本地编码", example = "123456789", required = true)
 	private String projectLocalId; // 项目本地编码
 

+ 11 - 0
saas-account/src/main/java/com/persagy/account/service/ISaasFunctionService.java

@@ -44,6 +44,17 @@ public interface ISaasFunctionService extends ISuperService<SaasFunction> {
 	 * @return
 	 */
 	boolean validFunCode(String menuId, String pageId, String funCode, String funId);
+	
+	/**
+	 * 验证功能名称的唯一性
+	 * 
+	 * @param menuId
+	 * @param pageId
+	 * @param funName
+	 * @param funId
+	 * @return
+	 */
+	boolean validFunName(String menuId, String pageId, String funName, String funId);
 
 	/**
 	 * 获取此产品页面再此账号下所拥有的的页面权限

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

@@ -1,7 +1,7 @@
 package com.persagy.account.service;
 
 import com.persagy.common.service.ISuperService;
-import com.persagy.account.pojo.dto.SaasGroupProductDetail;
+import com.persagy.account.pojo.dto.SaasGroupProductPage;
 
 /**
  * 集团签约产品详情
@@ -11,7 +11,7 @@ import com.persagy.account.pojo.dto.SaasGroupProductDetail;
  * @author zhangqiankun
  * @date 2021-05-07 12:02:40
  */
-public interface ISaasGroupProductDetailService extends ISuperService<SaasGroupProductDetail> {
+public interface ISaasGroupProductPageService extends ISuperService<SaasGroupProductPage> {
 
 }
 

+ 6 - 3
saas-account/src/main/java/com/persagy/account/service/ISaasMenuService.java

@@ -21,10 +21,11 @@ public interface ISaasMenuService extends ISuperService<SaasMenu> {
 	 * @param accountId
 	 * @param groupCode
 	 * @param appId
+	 * @param menuId 可为null
 	 * @param valid
 	 * @return
 	 */
-	List<SaasMenu> querySaasMenuTree(String accountId, String groupCode, String appId, Integer valid);
+	List<SaasMenu> querySaasMenuTree(String accountId, String groupCode, String appId, String menuId, Integer valid);
 
 	/**
 	 * 查询出此角色下,所有不存在功能点的菜单集合
@@ -46,21 +47,23 @@ public interface ISaasMenuService extends ISuperService<SaasMenu> {
 	 * 验证菜单编码在应用下的唯一性
 	 * 
 	 * @param appId
+	 * @param menuType
 	 * @param menuCode
 	 * @param menuId
 	 * @return
 	 */
-	boolean validMenuCode(String appId, String menuCode, String menuId);
+	boolean validMenuCode(String appId, String menuType, String menuCode, String menuId);
 	
 	/**
 	 * 验证菜单名称的唯一性
 	 * 
 	 * @param appId
+	 * @param menuType
 	 * @param menuName
 	 * @param menuId
 	 * @return
 	 */
-	boolean validMenuName(String appId, String menuName, String menuId);
+	boolean validMenuName(String appId, String menuType, String menuName, String menuId);
 	
 	/**
 	 * 创建菜单,同时设置产品是否已关联菜单

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

@@ -1,7 +1,7 @@
 package com.persagy.account.service;
 
+import com.persagy.account.pojo.dto.SaasProductCategory;
 import com.persagy.common.service.ISuperService;
-import com.persagy.account.pojo.dto.SaasProductCategeory;
 
 /**
  * 产品信息
@@ -11,7 +11,7 @@ import com.persagy.account.pojo.dto.SaasProductCategeory;
  * @author zhangqiankun
  * @date 2021-05-11 19:23:03
  */
-public interface ISaasProductCategeoryService extends ISuperService<SaasProductCategeory> {
+public interface ISaasProductCategoryService extends ISuperService<SaasProductCategory> {
 
 }
 

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

@@ -63,11 +63,12 @@ public interface ISaasProductPageService extends ISuperService<SaasProductPage>
 
 	/**
 	 * 验证页面名称在此页面下的唯一性
+	 * @param productId
 	 * @param pageName
 	 * @param pageId
 	 * @return
 	 */
-	boolean validPageName(String pageName, String pageId);
+	boolean validPageName(String productId, String pageName, String pageId);
 
 }
 

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

@@ -15,11 +15,11 @@ public interface ISaasProductService extends ISuperService<SaasProduct> {
 
 	/**
 	 * 验证产品编码的唯一性
-	 * 
+	 * @param productType
 	 * @param productCode
 	 * @param id
 	 */
-	boolean validProductCode(String productCode, String id);
+	boolean validProductCode(String productType, String productCode, String id);
 	
 	/**
 	 * 验证产品名称的唯一性
@@ -27,7 +27,7 @@ public interface ISaasProductService extends ISuperService<SaasProduct> {
 	 * @param productName
 	 * @param id
 	 */
-	boolean validProductName(String productName, String id);
+	boolean validProductName(String productType, String productName, String id);
 
 }
 

+ 19 - 0
saas-account/src/main/java/com/persagy/account/service/impl/SaasFunctionServiceImpl.java

@@ -50,6 +50,25 @@ public class SaasFunctionServiceImpl extends SuperServiceImpl<SaasFunctionMapper
 		}
 		return true;
 	}
+	
+	@Override
+	public boolean validFunName(String menuId, String pageId, String funName, String funId) {
+		if (StringUtil.isNotBlank(menuId)) {
+			LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(menuId).funNameEq(funName).builderQueryWrapper();
+			SaasFunction selectOne = this.baseMapper.selectOne(queryWrapper);
+			if (selectOne != null && (StringUtil.isBlank(funId) || !funId.equals(selectOne.getId()))) {
+				return false;
+			}
+		}
+		if (StringUtil.isNotBlank(pageId)) {
+			LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper().pageIdEq(pageId).funNameEq(funName).builderQueryWrapper();
+			SaasFunction selectOne = this.baseMapper.selectOne(queryWrapper);
+			if (selectOne != null && (StringUtil.isBlank(funId) || !funId.equals(selectOne.getId()))) {
+				return false;
+			}
+		}
+		return true;
+	}
 
 	@Override
 	public List<SaasFunction> queryProductPageFunctions(String accountId, String menuId, String pageId) {

+ 0 - 21
saas-account/src/main/java/com/persagy/account/service/impl/SaasGroupProductDetailServiceImpl.java

@@ -1,21 +0,0 @@
-package com.persagy.account.service.impl;
-
-import org.springframework.stereotype.Service;
-
-import com.persagy.common.service.impl.SuperServiceImpl;
-import com.persagy.account.mapper.SaasGroupProductDetailMapper;
-import com.persagy.account.pojo.dto.SaasGroupProductDetail;
-import com.persagy.account.service.ISaasGroupProductDetailService;
-
-/**
- * 集团签约产品详情
- * 
- * @version 1.0.0
- * @company persagy 
- * @author zhangqiankun
- * @date 2021-05-07 12:02:40
- */
-@Service
-public class SaasGroupProductDetailServiceImpl extends SuperServiceImpl<SaasGroupProductDetailMapper, SaasGroupProductDetail> implements ISaasGroupProductDetailService {
-
-}

+ 21 - 0
saas-account/src/main/java/com/persagy/account/service/impl/SaasGroupProductPageServiceImpl.java

@@ -0,0 +1,21 @@
+package com.persagy.account.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.persagy.common.service.impl.SuperServiceImpl;
+import com.persagy.account.mapper.SaasGroupProductPageMapper;
+import com.persagy.account.pojo.dto.SaasGroupProductPage;
+import com.persagy.account.service.ISaasGroupProductPageService;
+
+/**
+ * 集团签约产品详情
+ * 
+ * @version 1.0.0
+ * @company persagy 
+ * @author zhangqiankun
+ * @date 2021-05-07 12:02:40
+ */
+@Service
+public class SaasGroupProductPageServiceImpl extends SuperServiceImpl<SaasGroupProductPageMapper, SaasGroupProductPage> implements ISaasGroupProductPageService {
+
+}

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

@@ -9,11 +9,11 @@ import org.springframework.transaction.annotation.Transactional;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
-import com.persagy.account.mapper.SaasGroupProductDetailMapper;
+import com.persagy.account.mapper.SaasGroupProductPageMapper;
 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.SaasGroupProductDetail;
+import com.persagy.account.pojo.dto.SaasGroupProductPage;
 import com.persagy.account.pojo.dto.SaasProjectProduct;
 import com.persagy.account.service.ISaasGroupProductService;
 import com.persagy.common.service.impl.SuperServiceImpl;
@@ -33,7 +33,7 @@ public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProdu
 	private SaasProjectProductMapper saasProjectProductMapper;
 	
 	@Autowired
-	private SaasGroupProductDetailMapper saasGroupProductDetailMapper;
+	private SaasGroupProductPageMapper saasGroupProductPageMapper;
 	
 	@Override
 	@Transactional
@@ -43,7 +43,7 @@ public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProdu
 		Integer result = this.baseMapper.insert(saasGroupProduct);
 		if (SqlHelper.retBool(result)) {
 			// 创建签约信息与产品页面的关联关系
-			result = this.saasGroupProductDetailMapper.insertSaasGroupProductDetail(saasGroupProduct.getId(), pageIds);
+			result = this.saasGroupProductPageMapper.insertSaasGroupProductPage(saasGroupProduct.getId(), pageIds);
 		}
 		return SqlHelper.retBool(result);
 	}
@@ -55,10 +55,10 @@ public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProdu
 		Integer result = this.baseMapper.updateById(saasGroupProduct);
 		if (SqlHelper.retBool(result)) {
 			// 删除签约信息与产品页面的关联关系
-			LambdaQueryWrapper<SaasGroupProductDetail> queryWrapper = new SaasGroupProductDetail.BuilderQueryWrapper().contractIdEq(saasGroupProduct.getId()).builder();
-			this.saasGroupProductDetailMapper.delete(queryWrapper);
+			LambdaQueryWrapper<SaasGroupProductPage> queryWrapper = new SaasGroupProductPage.BuilderQueryWrapper().contractIdEq(saasGroupProduct.getId()).builder();
+			this.saasGroupProductPageMapper.delete(queryWrapper);
 			// 创建签约信息与产品页面的关联关系
-			result = this.saasGroupProductDetailMapper.insertSaasGroupProductDetail(saasGroupProduct.getId(), pageIds);
+			result = this.saasGroupProductPageMapper.insertSaasGroupProductPage(saasGroupProduct.getId(), pageIds);
 		}
 		return SqlHelper.retBool(result);
 	}
@@ -69,8 +69,8 @@ public class SaasGroupProductServiceImpl extends SuperServiceImpl<SaasGroupProdu
 		Integer result = this.baseMapper.deleteById(contractId);
 		if (SqlHelper.retBool(result)) {
 			// 删除签约信息与产品页面的关联关系
-			LambdaQueryWrapper<SaasGroupProductDetail> pageWrapper = new SaasGroupProductDetail.BuilderQueryWrapper().contractIdEq(contractId).builder();
-			result = this.saasGroupProductDetailMapper.delete(pageWrapper);
+			LambdaQueryWrapper<SaasGroupProductPage> pageWrapper = new SaasGroupProductPage.BuilderQueryWrapper().contractIdEq(contractId).builder();
+			result = this.saasGroupProductPageMapper.delete(pageWrapper);
 			// 删除项目签约的产品信息
 			LambdaQueryWrapper<SaasProjectProduct> queryWrapper = new SaasProjectProduct.BuilderQueryWrapper().contractIdEq(contractId).builder();
 			this.saasProjectProductMapper.delete(queryWrapper);

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

@@ -34,8 +34,8 @@ public class SaasMenuServiceImpl extends SuperServiceImpl<SaasMenuMapper, SaasMe
 	private SaasProductMapper saasProductMapper;
 	
 	@Override
-	public List<SaasMenu> querySaasMenuTree(String accountId, String groupCode, String appId, Integer valid) {
-		return this.baseMapper.querySaasMenuTree(accountId, groupCode, appId, valid);
+	public List<SaasMenu> querySaasMenuTree(String accountId, String groupCode, String appId, String menuId, Integer valid) {
+		return this.baseMapper.querySaasMenuTree(accountId, groupCode, appId, menuId, valid);
 	}
 
 	@Override
@@ -51,8 +51,8 @@ public class SaasMenuServiceImpl extends SuperServiceImpl<SaasMenuMapper, SaasMe
 	}
 
 	@Override
-	public boolean validMenuCode(String appId, String menuCode, String menuId) {
-		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).menuCodeEq(menuCode).builderQueryWrapper();
+	public boolean validMenuCode(String appId, String menuType, String menuCode, String menuId) {
+		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).menuTypeEq(menuType).menuCodeEq(menuCode).builderQueryWrapper();
 		SaasMenu selectOne = this.baseMapper.selectOne(queryWrapper);
 		if (selectOne != null && (StringUtil.isBlank(menuId) || !menuId.equals(selectOne.getId()))) {
 			return false;
@@ -61,8 +61,8 @@ public class SaasMenuServiceImpl extends SuperServiceImpl<SaasMenuMapper, SaasMe
 	}
 	
 	@Override
-	public boolean validMenuName(String appId, String menuName, String menuId) {
-		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).menuNameEq(menuName).builderQueryWrapper();
+	public boolean validMenuName(String appId, String menuType, String menuName, String menuId) {
+		LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).menuTypeEq(menuType).menuNameEq(menuName).builderQueryWrapper();
 		SaasMenu selectOne = this.baseMapper.selectOne(queryWrapper);
 		if (selectOne != null && (StringUtil.isBlank(menuId) || !menuId.equals(selectOne.getId()))) {
 			return false;

+ 0 - 21
saas-account/src/main/java/com/persagy/account/service/impl/SaasProductCategeoryServiceImpl.java

@@ -1,21 +0,0 @@
-package com.persagy.account.service.impl;
-
-import org.springframework.stereotype.Service;
-
-import com.persagy.common.service.impl.SuperServiceImpl;
-import com.persagy.account.mapper.SaasProductCategeoryMapper;
-import com.persagy.account.pojo.dto.SaasProductCategeory;
-import com.persagy.account.service.ISaasProductCategeoryService;
-
-/**
- * 产品信息
- * 
- * @version 1.0.0
- * @company persagy 
- * @author zhangqiankun
- * @date 2021-05-11 19:23:03
- */
-@Service
-public class SaasProductCategeoryServiceImpl extends SuperServiceImpl<SaasProductCategeoryMapper, SaasProductCategeory> implements ISaasProductCategeoryService {
-
-}

+ 21 - 0
saas-account/src/main/java/com/persagy/account/service/impl/SaasProductCategoryServiceImpl.java

@@ -0,0 +1,21 @@
+package com.persagy.account.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.persagy.account.mapper.SaasProductCategoryMapper;
+import com.persagy.account.pojo.dto.SaasProductCategory;
+import com.persagy.account.service.ISaasProductCategoryService;
+import com.persagy.common.service.impl.SuperServiceImpl;
+
+/**
+ * 产品信息
+ * 
+ * @version 1.0.0
+ * @company persagy 
+ * @author zhangqiankun
+ * @date 2021-05-11 19:23:03
+ */
+@Service
+public class SaasProductCategoryServiceImpl extends SuperServiceImpl<SaasProductCategoryMapper, SaasProductCategory> implements ISaasProductCategoryService {
+
+}

+ 29 - 25
saas-account/src/main/java/com/persagy/account/service/impl/SaasProductPageServiceImpl.java

@@ -45,17 +45,8 @@ public class SaasProductPageServiceImpl extends SuperServiceImpl<SaasProductPage
 	@Transactional
 	public boolean createSaasProductPage(SaasProductPage saasProductPage) {
 		// 判断是否是落地页,落地页的时候,取消其余的落地页设置
-		Integer result =  1;
-		if (!SaasCommonConstant.STR_STATUS_0.equals(saasProductPage.getPageFloor())) {
-			LambdaUpdateWrapper<SaasProductPage> updateWrapper = new SaasProductPage.BuilderUpdateWrapper()
-					.productIdEq(saasProductPage.getProductId()).pageFloorEq(saasProductPage.getPageFloor()).builder();
-			SaasProductPage updatePage = new SaasProductPage();
-			updatePage.setPageFloor(SaasCommonConstant.STR_STATUS_0);
-			result = this.baseMapper.update(updatePage, updateWrapper);
-		}
-		if (SqlHelper.retBool(result)) {
-			result = this.baseMapper.insert(saasProductPage);
-		}
+		this.updatePageFloor(saasProductPage.getProductId(), saasProductPage.getPageFloor());
+		Integer result = this.baseMapper.insert(saasProductPage);
 		return SqlHelper.retBool(result);
 	}
 
@@ -63,23 +54,14 @@ public class SaasProductPageServiceImpl extends SuperServiceImpl<SaasProductPage
 	@Transactional
 	public boolean updateSaasProductPage(SaasProductPage saasProductPage) {
 		// 判断是否是落地页,落地页的时候,取消其余的落地页设置
-		Integer result =  1;
-		if (!SaasCommonConstant.STR_STATUS_0.equals(saasProductPage.getPageFloor())) {
-			LambdaUpdateWrapper<SaasProductPage> updateWrapper = new SaasProductPage.BuilderUpdateWrapper()
-					.productIdEq(saasProductPage.getProductId()).pageFloorEq(saasProductPage.getPageFloor()).builder();
-			SaasProductPage updatePage = new SaasProductPage();
-			updatePage.setPageFloor(SaasCommonConstant.STR_STATUS_0);
-			result = this.baseMapper.update(updatePage, updateWrapper);
-		}
-		if (SqlHelper.retBool(result)) {
-			result = this.baseMapper.insert(saasProductPage);
-		}
+		this.updatePageFloor(saasProductPage.getProductId(), saasProductPage.getPageFloor());
+		Integer result = this.baseMapper.updateById(saasProductPage);
 		return SqlHelper.retBool(result);
 	}
-
+	
 	@Override
-	public boolean validPageName(String pageName, String pageId) {
-		LambdaQueryWrapper<SaasProductPage> queryWrapper = new SaasProductPage.BuilderQueryWrapper().pageNameEq(pageName).builder();
+	public boolean validPageName(String productId, String pageName, String pageId) {
+		LambdaQueryWrapper<SaasProductPage> queryWrapper = new SaasProductPage.BuilderQueryWrapper().productIdEq(productId).pageNameEq(pageName).builder();
 		SaasProductPage selectOne = this.baseMapper.selectOne(queryWrapper);
 		if (selectOne == null) {
 			return true;
@@ -90,4 +72,26 @@ public class SaasProductPageServiceImpl extends SuperServiceImpl<SaasProductPage
 		return false;
 	}
 
+	/**
+	 * 更新落地页选项
+	 * @param productId
+	 * @param pageFloor
+	 */
+	private void updatePageFloor(String productId, String pageFloor) {
+		if (SaasCommonConstant.STR_STATUS_0.equals(pageFloor)) {
+			return;
+		}
+		String pageFloorSql = null;
+		if (SaasCommonConstant.STR_STATUS_1.equals(pageFloor)) {
+			pageFloorSql = "PAGE_FLOOR = (CASE PAGE_FLOOR WHEN '3' THEN '2' WHEN '1' THEN '0' ELSE PAGE_FLOOR END)";
+		} else if (SaasCommonConstant.STR_STATUS_2.equals(pageFloor)) {
+			pageFloorSql = "PAGE_FLOOR = (CASE PAGE_FLOOR WHEN '3' THEN '1' WHEN '2' THEN '0' ELSE PAGE_FLOOR END)";
+		} else {
+			pageFloorSql = "PAGE_FLOOR = '0'";
+		}
+		LambdaUpdateWrapper<SaasProductPage> updateWrapper = new SaasProductPage.BuilderUpdateWrapper().productIdEq(productId).builder();
+		updateWrapper.setSql(pageFloorSql);
+		this.baseMapper.update(null, updateWrapper);
+	}
+	
 }

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

@@ -21,8 +21,8 @@ import com.persagy.account.service.ISaasProductService;
 public class SaasProductServiceImpl extends SuperServiceImpl<SaasProductMapper, SaasProduct> implements ISaasProductService {
 
 	@Override
-	public boolean validProductCode(String productCode, String id) {
-		LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper().productCodeEq(productCode).builder();
+	public boolean validProductCode(String productType, String productCode, String id) {
+		LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper().productTypeEq(productType).productCodeEq(productCode).builder();
 		SaasProduct selectOne = this.baseMapper.selectOne(queryWrapper);
 		if (selectOne == null) {
 			return true;
@@ -34,8 +34,8 @@ public class SaasProductServiceImpl extends SuperServiceImpl<SaasProductMapper,
 	}
 
 	@Override
-	public boolean validProductName(String productName, String id) {
-		LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper().productNameEq(productName).builder();
+	public boolean validProductName(String productType, String productName, String id) {
+		LambdaQueryWrapper<SaasProduct> queryWrapper = new SaasProduct.BuilderQueryWrapper().productTypeEq(productType).productNameEq(productName).builder();
 		SaasProduct selectOne = this.baseMapper.selectOne(queryWrapper);
 		if (selectOne == null) {
 			return true;

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

@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.persagy.account.mapper.SaasGroupProductDetailMapper">
+<mapper namespace="com.persagy.account.mapper.SaasGroupProductPageMapper">
     
-	<resultMap id="BaseResultMap" type="com.persagy.account.pojo.dto.SaasGroupProductDetail">
+	<resultMap id="BaseResultMap" type="com.persagy.account.pojo.dto.SaasGroupProductPage">
 		<result column="CONTRACT_ID" property="contractId" jdbcType="VARCHAR" />
 		<result column="PAGE_ID" property="pageId" jdbcType="VARCHAR" />
 	</resultMap>
 	
-	<insert id="insertSaasGroupProductDetail">
-		INSERT INTO saas_group_product_detail (CONTRACT_ID, PAGE_ID) VALUES
+	<insert id="insertSaasGroupProductPage">
+		INSERT INTO saas_group_product_page (CONTRACT_ID, PAGE_ID) VALUES
 		<foreach collection="pageIds" index="index" item="pageId" separator="," >
 			(#{contractId}, #{pageId})
 		</foreach>

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

@@ -7,7 +7,6 @@
 		<result column="ID" property="id" jdbcType="VARCHAR" />
 		<result column="GROUP_CODE" property="groupCode" jdbcType="VARCHAR" />
 		<result column="PRODUCT_ID" property="productId" jdbcType="VARCHAR" />
-		<result column="PRODUCT_CODE" property="productCode" jdbcType="VARCHAR" />
 		<result column="PRODUCT_RANGE" property="productRange" jdbcType="VARCHAR" />
 		<result column="PRODUCT_CONTRACT" property="productContract" jdbcType="DATE" />
 		<result column="VALID_START_TIME" property="validStartTime" jdbcType="DATE" />

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

@@ -46,10 +46,12 @@
 		JOIN (SELECT DISTINCT ROLE_ID, MENU_ID FROM saas_role_menu
 		<where>
 			<if test="groupCode != null and groupCode.trim().length() != 0">AND GROUP_CODE = #{groupCode}</if>
+			<if test="menuId != null and menuId.trim().length() != 0">AND MENU_ID = #{menuId}</if>
 		</where>) S ON M.ROLE_ID = S.ROLE_ID) P
 		JOIN (SELECT ID AS MENU_ID, <include refid="Base_Sql_Column"></include> FROM saas_menu
 		<where>
 			<if test="appId != null and appId.trim().length() != 0">AND APP_ID = #{appId}</if>
+			<if test="menuId != null and menuId.trim().length() != 0">AND ID = #{menuId}</if>
 		</where>) Q ON P.MENU_ID = Q.MENU_ID ORDER BY Q.MENU_SORT
 	</select>
 	

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

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.persagy.account.mapper.SaasProductCategeoryMapper">
+<mapper namespace="com.persagy.account.mapper.SaasProductCategoryMapper">
     
-	<resultMap id="BaseResultMap" type="com.persagy.account.pojo.dto.SaasProductCategeory">
+	<resultMap id="BaseResultMap" type="com.persagy.account.pojo.dto.SaasProductCategory">
 		<result column="ID" property="id" jdbcType="VARCHAR" />
 		<result column="PARENT_ID" property="parentId" jdbcType="VARCHAR" />
 		<result column="CATEGORY_NAME" property="categoryName" jdbcType="VARCHAR" />

+ 10 - 3
saas-account/src/main/resources/mapper/SaasRoleMenuMapper.xml

@@ -21,9 +21,16 @@
 	<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>
+			<choose>
+                <when test="auth.pages != null and auth.pages.size() != 0">
+                	<foreach collection="auth.pages" index="index" item="page" separator="," >
+						(#{groupCode}, #{roleId}, #{auth.menuId}, #{page.pageId}, #{page.functionId})
+					</foreach>
+                </when>
+                <otherwise>
+                	(#{groupCode}, #{roleId}, #{auth.menuId}, NULL, NULL)
+                </otherwise>
+            </choose>
 		</foreach>
 	</insert>
 	

+ 1 - 1
saas-common/src/main/java/com/persagy/common/constant/SaasCommonConstant.java

@@ -50,7 +50,7 @@ public interface SaasCommonConstant {
 	String SAAS_PRODUCT_ID_PREFIX = "PD";
 	
 	//产品类别ID前缀
-	String SAAS_PRODUCT_CATEGEORY_ID_PREFIX = "PC";
+	String SAAS_PRODUCT_CATEGORY_ID_PREFIX = "PC";
 		
 	//产品页面ID前缀
 	String SAAS_PRODUCT_PAGE_ID_PREFIX = "PP";

+ 72 - 0
saas-common/src/main/java/com/persagy/common/constant/SaasDictData.java

@@ -0,0 +1,72 @@
+package com.persagy.common.constant;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.persagy.common.model.SaasDictModel;
+
+/**
+ * saas 字典数据
+ * @version 1.0.0
+ * @company persagy 
+ * @author zhangqiankun
+ * @date 2021年5月14日 下午2:44:20
+ */
+public class SaasDictData {
+
+	public static final Map<String, List<SaasDictModel>> DICT_DATA = new HashMap<String, List<SaasDictModel>>(2);
+	public static final Map<String, String> DICT_TYPE_DATA = new HashMap<String, String>(2);
+	
+	/**功能类型*/
+	public static final String PROJECT_FUN_TYPE = "PROJECT_FUN_TYPE";
+	public static final List<SaasDictModel> projectFunData = new ArrayList<SaasDictModel>(8);
+	
+	/**气候区*/
+	public static final String WEATHER_TYPE = "WEATHER_TYPE";
+	public static final List<SaasDictModel> weatherData = new ArrayList<SaasDictModel>(32);
+	
+	static {
+		weatherData.add(new SaasDictModel("10", "严寒地区"));
+		weatherData.add(new SaasDictModel("20", "寒冷地区"));
+		weatherData.add(new SaasDictModel("30", "夏热冬冷地区"));
+		weatherData.add(new SaasDictModel("40", "夏热冬暖地区"));
+		weatherData.add(new SaasDictModel("50", "温和地区"));
+		weatherData.add(new SaasDictModel("00", "其他地区"));
+		DICT_DATA.put(WEATHER_TYPE, weatherData);
+		
+		projectFunData.add(new SaasDictModel("100", "居住项目"));
+		projectFunData.add(new SaasDictModel("200", "办公项目"));
+		projectFunData.add(new SaasDictModel("300", "教育项目"));
+		projectFunData.add(new SaasDictModel("400", "科研项目"));
+		projectFunData.add(new SaasDictModel("500", "金融项目"));
+		projectFunData.add(new SaasDictModel("600", "观演项目"));
+		projectFunData.add(new SaasDictModel("700", "文化项目"));
+		projectFunData.add(new SaasDictModel("800", "博览项目"));
+		projectFunData.add(new SaasDictModel("900", "游乐休闲项目"));
+		projectFunData.add(new SaasDictModel("A00", "旅馆项目"));
+		projectFunData.add(new SaasDictModel("B00", "商业项目"));
+		projectFunData.add(new SaasDictModel("C00", "体育项目"));
+		projectFunData.add(new SaasDictModel("D00", "医疗项目"));
+		projectFunData.add(new SaasDictModel("E00", "宗教项目"));
+		projectFunData.add(new SaasDictModel("F00", "市政项目"));
+		projectFunData.add(new SaasDictModel("G00", "邮电媒体项目"));
+		projectFunData.add(new SaasDictModel("H00", "司法项目"));
+		projectFunData.add(new SaasDictModel("I00", "福利项目"));
+		projectFunData.add(new SaasDictModel("J00", "殡葬项目"));
+		projectFunData.add(new SaasDictModel("K00", "交通项目"));
+		projectFunData.add(new SaasDictModel("L00", "仓储物流项目"));
+		projectFunData.add(new SaasDictModel("M00", "工业项目"));
+		projectFunData.add(new SaasDictModel("N00", "综合项目"));
+		projectFunData.add(new SaasDictModel("000", "人防项目"));
+		projectFunData.add(new SaasDictModel("P00", "园区项目"));
+		projectFunData.add(new SaasDictModel("Z00", "其他项目"));
+		DICT_DATA.put(PROJECT_FUN_TYPE, projectFunData);
+		
+		DICT_TYPE_DATA.put(WEATHER_TYPE, "气候区类型");
+		DICT_TYPE_DATA.put(PROJECT_FUN_TYPE, "项目功能类型");
+		
+	}
+	
+}

+ 25 - 0
saas-common/src/main/java/com/persagy/common/model/SaasDictModel.java

@@ -0,0 +1,25 @@
+package com.persagy.common.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @version 
+ * @description 
+ * @company persagy
+ * @author zhangqiankun
+ * @since 2021年3月1日:	下午2:17:10
+ */
+@Getter
+@Setter
+@ToString
+@AllArgsConstructor
+public class SaasDictModel {
+	
+	private String code; 	// 编码
+
+	private String name; 	// 名称
+	
+}

File diff suppressed because it is too large
+ 407 - 111
saas-doc/doc/saas_platform.md