1 package com.supwisdom.institute.backend.base.domain.service;
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.LinkedHashMap;
9 import lombok.extern.slf4j.Slf4j;
11 import org.apache.commons.lang3.StringUtils;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.data.domain.Example;
14 import org.springframework.data.domain.ExampleMatcher;
15 import org.springframework.data.domain.Page;
16 import org.springframework.data.domain.PageRequest;
17 import org.springframework.stereotype.Service;
19 import com.supwisdom.institute.backend.base.domain.entity.Permission;
20 import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
21 import com.supwisdom.institute.backend.base.domain.entity.Role;
22 import com.supwisdom.institute.backend.base.domain.model.PermissionRoleSet;
23 import com.supwisdom.institute.backend.base.domain.model.PermissionTreeNode;
24 import com.supwisdom.institute.backend.base.domain.repo.PermissionRepository;
25 import com.supwisdom.institute.backend.base.domain.repo.PermissionResourceRepository;
26 import com.supwisdom.institute.backend.base.domain.repo.RoleRepository;
27 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
28 import com.supwisdom.institute.backend.common.framework.service.ABaseService;
29 import com.supwisdom.institute.backend.common.util.MapBeanUtils;
33 public class PermissionService extends ABaseService<Permission, PermissionRepository> {
36 public PermissionRepository getRepo() {
37 return permissionRepository;
41 private PermissionRepository permissionRepository;
44 private PermissionResourceRepository permissionResourceRepository;
47 private RoleRepository roleRepository;
50 public Permission insert(Permission entity) {
51 Permission parentPermission = permissionRepository.selectById(entity.getParentId());
52 if (parentPermission != null) {
53 entity.setApplicationId(parentPermission.getApplicationId());
56 return super.insert(entity);
59 public void deleteBatch(List<String> ids) {
61 ids.stream().forEach(id -> {
68 public Page<PermissionResource> selectPermissionResources(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean) {
72 pageSize = Integer.MAX_VALUE;
75 PermissionResource probe = new PermissionResource();
76 if (mapBean != null) {
77 probe.setPermissionId(MapBeanUtils.getString(mapBean, "permissionId"));
78 probe.setResourceId(MapBeanUtils.getString(mapBean, "resourceId"));
81 ExampleMatcher matcher = ExampleMatcher.matching()
82 .withMatcher("permissionId", ExampleMatcher.GenericPropertyMatchers.exact())
83 .withMatcher("resourceId", ExampleMatcher.GenericPropertyMatchers.exact());
85 Example<PermissionResource> example = Example.of(probe, matcher);
87 PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
89 Page<PermissionResource> page = permissionResourceRepository.findAll(example, pageRequest); // FIXME: 多表关联查询
94 public void relatePermissionResources(Permission permission, List<PermissionResource> permissionResources) {
96 List<PermissionResource> existPermissionResources = this.selectPermissionResourcesByPermissionId(permission.getId());
98 Map<String, PermissionResource> existMapPermissionResources = new LinkedHashMap<String, PermissionResource>();
99 for (PermissionResource permissionResource : existPermissionResources) {
100 String k = String.format("%s", permissionResource.getPermissionId());
101 existMapPermissionResources.put(k, permissionResource);
104 for (PermissionResource permissionResource : permissionResources) {
105 String k = String.format("%s", permissionResource.getPermissionId());
107 if (existMapPermissionResources.containsKey(k)) {
108 existMapPermissionResources.remove(k);
110 permissionResource.setCompanyId(permission.getCompanyId());
111 permissionResource.setPermissionId(permission.getId());
113 permissionResourceRepository.insert(permissionResource);
117 for (PermissionResource permissionResource : existMapPermissionResources.values()) {
118 permissionResourceRepository.deleteById(permissionResource.getId());
122 public List<PermissionResource> selectPermissionResourcesByPermissionId(String permissionId) {
124 PermissionResource probe = new PermissionResource();
125 probe.setPermissionId(permissionId);
127 ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("permissionId",
128 ExampleMatcher.GenericPropertyMatchers.exact());
130 Example<PermissionResource> example = Example.of(probe, matcher);
132 List<PermissionResource> permissionResources = permissionResourceRepository.findAll(example);
134 return permissionResources;
138 private Permission selectApplicationPermission() {
139 Permission permission = permissionRepository.selectById(Permission.APPLICATION_ID);
144 private List<Permission> selectApplicationPermissionList() {
145 Map<String, Object> mapBean = new HashMap<String, Object>();
146 mapBean.put("type", Permission.TYPE_APPLICATION);
148 return permissionRepository.selectList(true, -1, -1, mapBean, null);
151 public PermissionTreeNode selectPermissionTree(String applicationId, String type) {
153 Map<String, Object> mapBean = new HashMap<String, Object>();
154 if (StringUtils.isNotBlank(type)) {
155 mapBean.put("type", type);
158 String rootTreeNodeId = "0";
160 List<Permission> permissions = new ArrayList<Permission>();
162 if (StringUtils.isBlank(applicationId)) {
163 Permission rootPermission = new Permission();
164 rootPermission.setId(Permission.ROOT_PARENT_ID);
165 rootPermission.setCode("root");
166 rootPermission.setName("根");
168 permissions.add(rootPermission);
169 rootTreeNodeId = rootPermission.getId();
171 List<Permission> applicationPermissions = this.selectApplicationPermissionList();
172 permissions.addAll(applicationPermissions);
174 Permission applicationPermission = permissionRepository.selectById(applicationId); // this.selectApplicationPermissionByCode(applicationCode);
175 if (applicationPermission == null) {
179 permissions.add(applicationPermission);
180 rootTreeNodeId = applicationPermission.getId();
183 List<Permission> menuPermissions = permissionRepository.selectList(true, -1, -1, mapBean, null);
184 permissions.addAll(menuPermissions);
186 return convertPermissionTree(permissions, rootTreeNodeId);
189 private PermissionTreeNode convertPermissionTree(List<Permission> permissions, String rootTreeNodeId) {
190 if (permissions == null || permissions.size() == 0) {
194 Map<String, PermissionTreeNode> parentTreeNode = new LinkedHashMap<String, PermissionTreeNode>();
196 for (Permission permission : permissions) {
197 PermissionTreeNode treeNode = EntityUtils.copy(permission, new PermissionTreeNode());
198 treeNode.setChildren(new ArrayList<PermissionTreeNode>());
200 if (parentTreeNode.containsKey(treeNode.getId())) {
203 parentTreeNode.put(treeNode.getId(), treeNode);
206 for (PermissionTreeNode treeNode : parentTreeNode.values()) {
207 if (!parentTreeNode.containsKey(treeNode.getParentId())) {
211 parentTreeNode.get(treeNode.getParentId()).getChildren().add(treeNode);
214 return parentTreeNode.get(rootTreeNodeId);
219 // public Permission selectApplicationPermissionByCode(String code) {
220 // Permission probe = new Permission();
221 // probe.setCode(code);
222 // probe.setType("1");
224 // ExampleMatcher matcher = ExampleMatcher.matching()
225 // .withMatcher("code", ExampleMatcher.GenericPropertyMatchers.exact())
226 // .withMatcher("type", ExampleMatcher.GenericPropertyMatchers.exact());
228 // Example<Permission> example = Example.of(probe, matcher);
230 // Optional<Permission> o = permissionRepository.findOne(example);
232 // if (o.isPresent()) {
240 public List<Permission> selectByUsername(String username, String applicationId, String type) {
241 List<Permission> permissions = new ArrayList<Permission>();
243 // Permission applicationPermission = permissionRepository.selectById(applicationId);
244 // if (applicationPermission == null) {
245 // return permissions;
248 // int lft = applicationPermission.getLft();
249 // int rgt = applicationPermission.getRgt();
251 if (StringUtils.isBlank(applicationId)) {
252 List<Permission> accountRolePermissions = permissionRepository.selectAccountRolePermissionByUsername(username, type);
253 permissions.addAll(accountRolePermissions);
255 List<Permission> accountGroupRolePermissions = permissionRepository.selectAccountGroupRolePermissionByUsername(username, type);
256 permissions.addAll(accountGroupRolePermissions);
258 List<Permission> accountRolePermissions = permissionRepository.selectAccountRolePermissionByUsername(username, applicationId, type);
259 permissions.addAll(accountRolePermissions);
261 List<Permission> accountGroupRolePermissions = permissionRepository.selectAccountGroupRolePermissionByUsername(username, applicationId, type);
262 permissions.addAll(accountGroupRolePermissions);
265 return EntityUtils.distinctList(permissions);
269 public PermissionTreeNode selectPermissionTreeByUsername(String username, String applicationId, String type) {
270 String rootTreeNodeId = "0";
272 List<Permission> permissions = new ArrayList<Permission>();
274 if (StringUtils.isBlank(applicationId)) {
275 Permission rootPermission = new Permission();
276 rootPermission.setId(Permission.ROOT_PARENT_ID);
277 rootPermission.setCode("root");
278 rootPermission.setName("根");
280 permissions.add(rootPermission);
281 rootTreeNodeId = rootPermission.getId();
283 List<Permission> applicationPermissions = this.selectApplicationPermissionList();
284 permissions.addAll(applicationPermissions);
286 Permission applicationPermission = permissionRepository.selectById(applicationId); // this.selectApplicationPermissionByCode(applicationCode);
287 if (applicationPermission == null) {
291 permissions.add(applicationPermission);
292 rootTreeNodeId = applicationPermission.getId();
295 List<Permission> menuPermissions = this.selectByUsername(username, applicationId, type);
296 permissions.addAll(menuPermissions);
298 return convertPermissionTree(permissions, rootTreeNodeId);
301 public List<PermissionRoleSet> selectPermissionRoleSet(Map<String, Object> mapBean) {
303 List<PermissionRoleSet> prsList = new ArrayList<>();
305 List<Permission> resourceList = permissionRepository.selectList(mapBean, null);
307 for (Permission permission : resourceList) {
309 List<Role> roleList = roleRepository.selectPermissionRolesByPermission(permission.getId());
311 PermissionRoleSet prs = new PermissionRoleSet(permission, roleList);