SaasFunctionController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package com.persagy.account.controller;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.alibaba.druid.util.StringUtils;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.google.common.collect.Lists;
  7. import com.persagy.account.config.ApplicationProperties;
  8. import com.persagy.account.manage.SaasAuthHandler;
  9. import com.persagy.account.manage.SaasProductHandler;
  10. import com.persagy.account.manage.SaasRoleMenuHandler;
  11. import com.persagy.account.pojo.dto.SaasFunction;
  12. import com.persagy.account.pojo.dto.SaasMenu;
  13. import com.persagy.account.pojo.dto.SaasProductPage;
  14. import com.persagy.account.pojo.dto.SaasRole;
  15. import com.persagy.account.pojo.vo.function.SaasFunctionCreateVO;
  16. import com.persagy.account.pojo.vo.function.SaasFunctionDeleteVO;
  17. import com.persagy.account.pojo.vo.function.SaasFunctionQueryVO;
  18. import com.persagy.account.pojo.vo.function.SaasMenuFunctionVO;
  19. import com.persagy.account.service.ISaasFunctionService;
  20. import com.persagy.account.service.ISaasMenuService;
  21. import com.persagy.account.service.ISaasProductPageService;
  22. import com.persagy.account.service.ISaasRoleService;
  23. import com.persagy.common.constant.SaasCommonConstant;
  24. import com.persagy.common.enums.ResponseCode;
  25. import com.persagy.common.utils.ResponseResult;
  26. import com.persagy.common.utils.ResponseResultUtil;
  27. import com.persagy.common.utils.StringUtil;
  28. import com.persagy.security.constant.CipherConstants;
  29. import io.swagger.annotations.Api;
  30. import io.swagger.annotations.ApiOperation;
  31. import org.springframework.beans.BeanUtils;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.RequestBody;
  35. import org.springframework.web.bind.annotation.RequestMapping;
  36. import org.springframework.web.bind.annotation.RequestMethod;
  37. import org.springframework.web.bind.annotation.RestController;
  38. import java.util.List;
  39. import java.util.Map;
  40. /**
  41. * 功能信息
  42. *
  43. * @version 1.0.0
  44. * @company persagy
  45. * @author zhangqiankun
  46. * @date 2021-03-13 15:29:50
  47. */
  48. @Api(tags = "功能信息")
  49. @RestController
  50. @RequestMapping(value = "/function", method = RequestMethod.POST)
  51. public class SaasFunctionController {
  52. @Autowired
  53. private SaasAuthHandler saasAuthHandler;
  54. @Autowired
  55. private ISaasMenuService saasMenuService;
  56. @Autowired
  57. private ISaasRoleService saasRoleService;
  58. @Autowired
  59. private SaasProductHandler saasProductHandler;
  60. @Autowired
  61. private ISaasFunctionService saasFunctionService;
  62. @Autowired
  63. private SaasRoleMenuHandler saasRoleMenuHandler;
  64. @Autowired
  65. private ISaasProductPageService saasProductPageService;
  66. @Autowired
  67. private ApplicationProperties applicationProperties;
  68. /**
  69. * 账号、菜单所拥有的功能点查询,权限过滤
  70. * 此方法不考虑菜单与产品同时存在的情况,后续所有的权限都由产品控制
  71. */
  72. @ApiOperation(value = "菜单下功能点查询")
  73. @RequestMapping(value = "queryMenuFunctionList")
  74. public ResponseResult queryMenuFunctionList(@RequestBody @Validated SaasMenuFunctionVO model) {
  75. // 判断此账号的权限范围
  76. boolean isAdmin = false;
  77. Map<String, String> authMap = this.saasAuthHandler.validAccountAuth(model.getAccountId(), model.getGroupCode());
  78. String groupCode = authMap.get(CipherConstants.GROUP_CODE);
  79. String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE);
  80. String accountBelong = authMap.get(SaasCommonConstant.ACCOUNT_BELONG);
  81. if (SaasCommonConstant.STR_STATUS_0.equals(accountType)) {
  82. isAdmin = true; // 超管
  83. }
  84. // 再判断此账号是否拥有此菜单的权限
  85. SaasMenu saasMenu = null;
  86. if (isAdmin) {
  87. saasMenu = this.saasMenuService.getById(model.getMenuId());
  88. saasMenu.setMenuId(model.getMenuId());
  89. } else {
  90. // 关联查询出此账号的菜单信息,防止中途权限被修改
  91. List<SaasMenu> saasMenus = this.saasMenuService.querySaasMenuTree(model.getAccountId(), groupCode, model.getAppId(), model.getMenuId(), SaasCommonConstant.STATUS_1);
  92. saasMenu = CollectionUtil.isEmpty(saasMenus) ? null : saasMenus.get(0);
  93. }
  94. if (saasMenu == null) {
  95. return ResponseResultUtil.successResult(Lists.newArrayList());
  96. }
  97. //默认菜单直接返回默认菜单下的功能点
  98. if (StringUtils.equals(applicationProperties.getDefaultMenuId(),model.getMenuId())){
  99. LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper()
  100. .menuIdEq(saasMenu.getMenuId()).builderQueryWrapper();
  101. List<SaasFunction> defaultFunctions = this.saasFunctionService.list(queryWrapper.orderByAsc(SaasFunction::getCreateTime));
  102. saasMenu.setFunctions(defaultFunctions);
  103. }
  104. // 获取此账号、此菜单下所对应的功能点信息集合 或者 产品页面树集合
  105. this.saasProductHandler.queryMenuProductAuths(saasMenu, model.getAccountId(), accountBelong, model.getProjectId(), groupCode, isAdmin, true, model.isShowPageAuth());
  106. if (StringUtil.isBlank(saasMenu.getProductId())) {
  107. return ResponseResultUtil.successResult(saasMenu.getFunctions());
  108. }
  109. return ResponseResultUtil.successResult(saasMenu.getProductPages());
  110. }
  111. /**
  112. * 功能点列表查询
  113. */
  114. @ApiOperation(value = "功能点列表查询")
  115. @RequestMapping(value = "querySaasFunctionList")
  116. public ResponseResult querySaasFunctionList(@RequestBody @Validated SaasFunctionQueryVO queryVO) {
  117. LambdaQueryWrapper<SaasFunction> queryWrapper = new SaasFunction.Builder().createQueryWrapper()
  118. .menuIdEq(queryVO.getMenuId()).funCodeEq(queryVO.getFunCode()).updateUserEq(queryVO.getUpdateUser())
  119. .pageIdEq(queryVO.getPageId()).funNameLike(queryVO.getFunName()).builderQueryWrapper();
  120. queryWrapper.orderByAsc(SaasFunction::getCreateTime);
  121. List<SaasFunction> list = this.saasFunctionService.list(queryWrapper);
  122. if (CollectionUtil.isEmpty(list)) {
  123. return ResponseResultUtil.successResult(Lists.newArrayList(), 0L);
  124. }
  125. return ResponseResultUtil.successResult(list, (long)list.size());
  126. }
  127. /**
  128. * 角色功能点列表查询,根据角色做权限过滤
  129. */
  130. @ApiOperation(value = "角色菜单功能点列表查询")
  131. @RequestMapping(value = "querySaasRoleFunctions")
  132. public ResponseResult querySaasRoleFunctions(@RequestBody @Validated SaasFunctionQueryVO queryVO) {
  133. if (StringUtil.isBlank(queryVO.getRoleId())) {
  134. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "ID不可为空");
  135. }
  136. // 验证角色是否存在
  137. SaasRole saasRole = this.saasRoleService.getOne(queryVO.getRoleId());
  138. if (saasRole == null) {
  139. return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "数据不存在");
  140. }
  141. // 优先查询出存在功能点的信息集合
  142. List<SaasFunction> functions = this.saasFunctionService.queryRoleFunctionList(queryVO.getGroupCode(), queryVO.getRoleId(), null, null);
  143. // 再查询出此角色下,所有不存在功能点的菜单集合
  144. List<SaasMenu> menus = this.saasMenuService.queryMenuAndEmptyFunction(queryVO.getGroupCode(), queryVO.getRoleId());
  145. JSONObject result = new JSONObject();
  146. result.put("menus", menus == null ? Lists.newArrayList() : menus);
  147. result.put("functions", functions == null ? Lists.newArrayList() : functions);
  148. return ResponseResultUtil.successResult(result);
  149. }
  150. /**
  151. * 新增
  152. */
  153. @ApiOperation(value = "保存")
  154. @RequestMapping(value = "createSaasFunction")
  155. public ResponseResult createSaasFunction(@RequestBody @Validated SaasFunctionCreateVO createVO) {
  156. ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getFunName(), null);
  157. if (validRequestParam != null) {
  158. return validRequestParam;
  159. }
  160. SaasFunction saasFunction = new SaasFunction();
  161. BeanUtils.copyProperties(createVO, saasFunction);
  162. saasFunction.setId(null);
  163. saasFunction.setUpdateUser(createVO.getAccountId());
  164. boolean result = this.saasFunctionService.save(saasFunction);
  165. return result ? ResponseResultUtil.successResult("保存成功", saasFunction.getId()) : ResponseResultUtil.errorResult("保存失败");
  166. }
  167. /**
  168. * 更新
  169. */
  170. @ApiOperation(value = "更新")
  171. @RequestMapping(value = "updateSaasFunction")
  172. public ResponseResult updateSaasFunction(@RequestBody @Validated SaasFunctionCreateVO createVO) {
  173. if (StringUtil.isBlank(createVO.getId())) {
  174. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "功能ID不可为空");
  175. }
  176. ResponseResult validRequestParam = this.validRequestParam(createVO.getMenuId(), createVO.getPageId(), createVO.getFunCode(), createVO.getFunName(), createVO.getId());
  177. if (validRequestParam != null) {
  178. return validRequestParam;
  179. }
  180. SaasFunction saasFunction = new SaasFunction();
  181. BeanUtils.copyProperties(createVO, saasFunction);
  182. saasFunction.setUpdateUser(createVO.getAccountId());
  183. boolean result = this.saasFunctionService.updateById(saasFunction);
  184. return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
  185. }
  186. /**
  187. * 物理删除
  188. */
  189. @ApiOperation(value = "删除")
  190. @RequestMapping(value = "deleteSaasFunction")
  191. public ResponseResult deleteSaasFunction(@RequestBody @Validated SaasFunctionDeleteVO deleteVO) {
  192. if (StringUtil.isBlank(deleteVO.getId())) {
  193. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "功能ID,不可为空");
  194. }
  195. boolean result = this.saasRoleMenuHandler.deleteSaasFunction(deleteVO.getId());
  196. return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
  197. }
  198. /**
  199. *
  200. * @return
  201. */
  202. private ResponseResult validRequestParam(String menuId, String pageId, String funCode, String funName, String funId) {
  203. if (StringUtil.isAllBlank(menuId, pageId)) {
  204. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "菜单ID与页面ID必填其一");
  205. }
  206. if (StringUtil.isNotBlank(menuId)) {
  207. SaasMenu menu = this.saasMenuService.getById(menuId);
  208. if (menu == null) {
  209. return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此菜单");
  210. }
  211. // 验证功能编码的唯一性
  212. if (StringUtil.isNotBlank(funCode)) {
  213. boolean validFunCode = this.saasFunctionService.validFunCode(menuId, null, funCode, funId);
  214. if (!validFunCode) {
  215. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此编码已存在");
  216. }
  217. }
  218. // 验证功能名称的唯一性
  219. if (StringUtil.isNotBlank(funName)) {
  220. boolean validFunName = this.saasFunctionService.validFunName(menuId, null, funName, funId);
  221. if (!validFunName) {
  222. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此名称已存在");
  223. }
  224. }
  225. }
  226. if (StringUtil.isNotBlank(pageId)) {
  227. SaasProductPage page = this.saasProductPageService.getById(pageId);
  228. if (page == null) {
  229. return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "不存在此页面");
  230. }
  231. // 验证功能编码的唯一性
  232. if (StringUtil.isNotBlank(funCode)) {
  233. boolean validFunCode = this.saasFunctionService.validFunCode(null, pageId, funCode, funId);
  234. if (!validFunCode) {
  235. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此编码已存在");
  236. }
  237. }
  238. // 验证功能名称的唯一性
  239. if (StringUtil.isNotBlank(funName)) {
  240. boolean validFunName = this.saasFunctionService.validFunName(null, pageId, funName, funId);
  241. if (!validFunName) {
  242. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "此名称已存在");
  243. }
  244. }
  245. }
  246. return null;
  247. }
  248. }