package com.persagy.account.controller; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.collect.Lists; import com.persagy.account.config.ApplicationProperties; import com.persagy.account.manage.SaasAuthHandler; import com.persagy.account.manage.SaasProductHandler; import com.persagy.account.manage.SaasRoleMenuHandler; import com.persagy.account.pojo.dto.SaasFunction; import com.persagy.account.pojo.dto.SaasMenu; import com.persagy.account.pojo.dto.SaasProductPage; import com.persagy.account.pojo.dto.SaasRole; import com.persagy.account.pojo.vo.function.SaasFunctionCreateVO; import com.persagy.account.pojo.vo.function.SaasFunctionDeleteVO; import com.persagy.account.pojo.vo.function.SaasFunctionQueryVO; import com.persagy.account.pojo.vo.function.SaasMenuFunctionVO; import com.persagy.account.service.ISaasFunctionService; import com.persagy.account.service.ISaasMenuService; import com.persagy.account.service.ISaasProductPageService; import com.persagy.account.service.ISaasRoleService; import com.persagy.common.constant.SaasCommonConstant; import com.persagy.common.enums.ResponseCode; import com.persagy.common.utils.ResponseResult; import com.persagy.common.utils.ResponseResultUtil; import com.persagy.common.utils.StringUtil; import com.persagy.security.constant.CipherConstants; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; /** * 功能信息 * * @version 1.0.0 * @company persagy * @author zhangqiankun * @date 2021-03-13 15:29:50 */ @Api(tags = "功能信息") @RestController @RequestMapping(value = "/function", method = RequestMethod.POST) public class SaasFunctionController { @Autowired private SaasAuthHandler saasAuthHandler; @Autowired private ISaasMenuService saasMenuService; @Autowired private ISaasRoleService saasRoleService; @Autowired private SaasProductHandler saasProductHandler; @Autowired private ISaasFunctionService saasFunctionService; @Autowired private SaasRoleMenuHandler saasRoleMenuHandler; @Autowired private ISaasProductPageService saasProductPageService; @Autowired private ApplicationProperties applicationProperties; /** * 账号、菜单所拥有的功能点查询,权限过滤 * 此方法不考虑菜单与产品同时存在的情况,后续所有的权限都由产品控制 */ @ApiOperation(value = "菜单下功能点查询") @RequestMapping(value = "queryMenuFunctionList") public ResponseResult queryMenuFunctionList(@RequestBody @Validated SaasMenuFunctionVO model) { // 判断此账号的权限范围 boolean isAdmin = false; Map authMap = this.saasAuthHandler.validAccountAuth(model.getAccountId(), model.getGroupCode()); String groupCode = authMap.get(CipherConstants.GROUP_CODE); String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE); String accountBelong = authMap.get(SaasCommonConstant.ACCOUNT_BELONG); if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) { isAdmin = true; // 超管 } // 再判断此账号是否拥有此菜单的权限 SaasMenu saasMenu = null; if (isAdmin) { saasMenu = this.saasMenuService.getById(model.getMenuId()); saasMenu.setMenuId(model.getMenuId()); } else { // 关联查询出此账号的菜单信息,防止中途权限被修改 List 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()); } //默认菜单直接返回默认菜单下的功能点 if (StringUtils.equals(applicationProperties.getDefaultMenuId(),model.getMenuId())){ LambdaQueryWrapper queryWrapper = new SaasFunction.Builder().createQueryWrapper() .menuIdEq(saasMenu.getMenuId()).builderQueryWrapper(); List defaultFunctions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getCreateTime)); saasMenu.setFunctions(defaultFunctions); } // 获取此账号、此菜单下所对应的功能点信息集合 或者 产品页面树集合 this.saasProductHandler.queryMenuProductAuths(saasMenu, model.getAccountId(), accountBelong, model.getProjectId(), groupCode, isAdmin, true, model.isShowPageAuth()); if (StringUtil.isBlank(saasMenu.getProductId())) { return ResponseResultUtil.successResult(saasMenu.getFunctions()); } return ResponseResultUtil.successResult(saasMenu.getProductPages()); } /** * 功能点列表查询 */ @ApiOperation(value = "功能点列表查询") @RequestMapping(value = "querySaasFunctionList") public ResponseResult querySaasFunctionList(@RequestBody @Validated SaasFunctionQueryVO queryVO) { LambdaQueryWrapper queryWrapper = new SaasFunction.Builder().createQueryWrapper() .menuIdEq(queryVO.getMenuId()).funCodeEq(queryVO.getFunCode()).updateUserEq(queryVO.getUpdateUser()) .pageIdEq(queryVO.getPageId()).funNameLike(queryVO.getFunName()).builderQueryWrapper(); queryWrapper.orderByAsc(SaasFunction::getCreateTime); List list = this.saasFunctionService.list(queryWrapper); if (CollectionUtil.isEmpty(list)) { return ResponseResultUtil.successResult(Lists.newArrayList(), 0L); } return ResponseResultUtil.successResult(list, (long)list.size()); } /** * 角色功能点列表查询,根据角色做权限过滤 */ @ApiOperation(value = "角色菜单功能点列表查询") @RequestMapping(value = "querySaasRoleFunctions") public ResponseResult querySaasRoleFunctions(@RequestBody @Validated SaasFunctionQueryVO queryVO) { if (StringUtil.isBlank(queryVO.getRoleId())) { return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "ID不可为空"); } // 验证角色是否存在 SaasRole saasRole = this.saasRoleService.getOne(queryVO.getRoleId()); if (saasRole == null) { return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "数据不存在"); } // 优先查询出存在功能点的信息集合 List functions = this.saasFunctionService.queryRoleFunctionList(queryVO.getGroupCode(), queryVO.getRoleId(), null, null); // 再查询出此角色下,所有不存在功能点的菜单集合 List menus = this.saasMenuService.queryMenuAndEmptyFunction(queryVO.getGroupCode(), queryVO.getRoleId()); JSONObject result = new JSONObject(); result.put("menus", menus == null ? Lists.newArrayList() : menus); result.put("functions", functions == null ? Lists.newArrayList() : functions); return ResponseResultUtil.successResult(result); } /** * 新增 */ @ApiOperation(value = "保存") @RequestMapping(value = "createSaasFunction") public ResponseResult createSaasFunction(@RequestBody @Validated SaasFunctionCreateVO createVO) { ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getFunName(), null); if (validRequestParam != null) { return validRequestParam; } SaasFunction saasFunction = new SaasFunction(); BeanUtils.copyProperties(createVO, saasFunction); saasFunction.setId(null); saasFunction.setUpdateUser(createVO.getAccountId()); boolean result = this.saasFunctionService.save(saasFunction); return result ? ResponseResultUtil.successResult("保存成功", saasFunction.getId()) : ResponseResultUtil.errorResult("保存失败"); } /** * 更新 */ @ApiOperation(value = "更新") @RequestMapping(value = "updateSaasFunction") public ResponseResult updateSaasFunction(@RequestBody @Validated SaasFunctionCreateVO createVO) { if (StringUtil.isBlank(createVO.getId())) { return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "功能ID不可为空"); } ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getFunName(), createVO.getId()); if (validRequestParam != null) { return validRequestParam; } SaasFunction saasFunction = new SaasFunction(); BeanUtils.copyProperties(createVO, saasFunction); saasFunction.setUpdateUser(createVO.getAccountId()); boolean result = this.saasFunctionService.updateById(saasFunction); return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败"); } /** * 物理删除 */ @ApiOperation(value = "删除") @RequestMapping(value = "deleteSaasFunction") public ResponseResult deleteSaasFunction(@RequestBody @Validated SaasFunctionDeleteVO deleteVO) { if (StringUtil.isBlank(deleteVO.getId())) { return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "功能ID,不可为空"); } boolean result = this.saasRoleMenuHandler.deleteSaasFunction(deleteVO.getId()); return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败"); } /** * * @return */ 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必填其一"); } if (StringUtil.isNotBlank(menuId)) { SaasMenu menu = this.saasMenuService.getById(menuId); if (menu == null) { return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此菜单"); } // 验证功能编码的唯一性 if (StringUtil.isNotBlank(funCode)) { boolean validFunCode = this.saasFunctionService.validFunCode(menuId, null, funCode, funId); if (!validFunCode) { 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); if (page == null) { return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此页面"); } // 验证功能编码的唯一性 if (StringUtil.isNotBlank(funCode)) { boolean validFunCode = this.saasFunctionService.validFunCode(null, pageId, funCode, funId); if (!validFunCode) { 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; } }