diff --git a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/config/AuthMgrConfig.java b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/config/AuthMgrConfig.java index f3d6dd3..19ea3d0 100644 --- a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/config/AuthMgrConfig.java +++ b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/config/AuthMgrConfig.java @@ -7,11 +7,14 @@ import com.beecode.inz.authmgr.dao.AuthManagerDao; import com.beecode.inz.authmgr.exception.ExceptionReaper; import com.beecode.inz.authmgr.internal.dao.AuthManagerDaoImpl; import com.beecode.inz.authmgr.internal.service.AuthManagerServiceImpl; +import com.beecode.inz.authmgr.internal.service.FunctionTreeServiceImpl; import com.beecode.inz.authmgr.internal.service.RoleManagerServiceImpl; import com.beecode.inz.authmgr.log.AuthmgrLogAspect; import com.beecode.inz.authmgr.service.AuthManagerService; +import com.beecode.inz.authmgr.service.FunctionTreeService; import com.beecode.inz.authmgr.service.RoleManagerService; import com.beecode.inz.authmgr.web.AuthMgrController; +import com.beecode.inz.authmgr.web.FunctionTreeController; import com.beecode.inz.authmgr.web.RoleController; import com.beecode.inz.authmgr.web.SysAuthMgrController; @@ -58,4 +61,15 @@ public class AuthMgrConfig { public RoleManagerService createRoleManagerService(){ return new RoleManagerServiceImpl(); } + + @Bean + public FunctionTreeController createFunctionTreeController() { + return new FunctionTreeController(); + } + + @Bean + public FunctionTreeService createFunctionTreeService(){ + return new FunctionTreeServiceImpl(); + } + } diff --git a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/internal/service/FunctionTreeServiceImpl.java b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/internal/service/FunctionTreeServiceImpl.java new file mode 100644 index 0000000..e21fb2f --- /dev/null +++ b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/internal/service/FunctionTreeServiceImpl.java @@ -0,0 +1,353 @@ +package com.beecode.inz.authmgr.internal.service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.beecode.amino.core.Amino; +import com.beecode.bap.functree.FunctionNode; +import com.beecode.bap.functree.FunctionTreeDefinition; +import com.beecode.bap.functree.Mode; +import com.beecode.bap.functree.service.FunctionNodeAuthentication; +import com.beecode.bap.staff.BapContext; +import com.beecode.bap.staff.service.StaffService; +import com.beecode.bap2.common.license.LicenseProperty; +import com.beecode.bap2.common.license.service.LicensePropertyService; +import com.beecode.bcp.User; +import com.beecode.bcp.authz.Privilege; +import com.beecode.bcp.authz.Role; +import com.beecode.bcp.authz.service.IdentityService; +import com.beecode.bcp.authz.service.RoleService; +import com.beecode.bcp.core.context.AminoContextHolder; +import com.beecode.bcp.group.Group; +import com.beecode.bcp.group.service.GroupService; +import com.beecode.bcp.type.KClass; +import com.beecode.bcp.type.KObject; +import com.beecode.bcp.type.json.JSONObjectUtils; +import com.beecode.inz.authmgr.domain.PrivilegeInfo; +import com.beecode.inz.authmgr.domain.RoleGroupInfo; +import com.beecode.inz.authmgr.exception.AuthDataMissingException; +import com.beecode.inz.authmgr.service.AuthManagerService; +import com.beecode.inz.authmgr.service.FunctionTreeService; +import com.beecode.inz.basis.config.constants.AuthcMessageConstants.CommonRoleGroup; +import com.beecode.inz.common.dao.FollowerDao; + +@Service +public class FunctionTreeServiceImpl implements FunctionTreeService { + + @Autowired + private LicensePropertyService licensePropertyService; + + @Autowired + private RoleService roleService; + + @Autowired + private StaffService staffService; + + @Autowired + private IdentityService identityService; + + @Autowired + private AuthManagerService authManagerService; + + @Autowired + private FollowerDao followerDao; + + @Autowired + private GroupService groupService; + + @Autowired + private BapContext bapContext; + + private static Logger logger = LoggerFactory.getLogger(FunctionTreeServiceImpl.class); + + @Override + public FunctionTreeDefinition getFunctionTreeDefinition(String name) { + FunctionTreeDefinition definition = Amino.getApplicationMetadataContext().getExtendableBean(name, + FunctionTreeDefinition.class); + // 深拷贝功能树 + FunctionTreeDefinition finalFunctionTreeDefinition = definition.clone().mergeParent(); + List<FunctionNode> allFunctionNode = finalFunctionTreeDefinition.getFunctionNodes().getAllFunctionNode(); + // 获得权限集合 +// Set<Privilege> privilegeSet = finalFunctionTreeDefinition.getFunctionNodes().getPrivilegeSet(); + + UUID identityId = null; + if(null!= AminoContextHolder.getContext().getIdentity()) { + identityId = AminoContextHolder.getContext().getIdentity().getId(); + } + + //查询该用户拥有的功能权限列表 + List<PrivilegeInfo> hasAuthSet = this.getCurrentStaffGrantAuth(); + + // 获得对应权限map +// Map<UUID, Boolean> privilegeMap = privilegeService.canAccess(privilegeSet, identityId, null); + Map<UUID, Boolean> privilegeMap = new HashMap<UUID, Boolean>(); + for(PrivilegeInfo privilege : hasAuthSet) { + privilegeMap.put(privilege.getId(), true); + } + // 获得当前角色 + List<Role> roles = null; + if(null != identityId) { + roles = roleService.getByIdentity(identityId); + } + Map<String, Boolean> roleMap = new HashMap<String, Boolean>(); + if (null != roles && !roles.isEmpty()) { + roles.forEach((role) -> roleMap.put(role.getName(), true)); + } + Map<String, Boolean> LicenseResult = new HashMap<String, Boolean>(); + // 获得所有功能类型校验接口 + Collection<FunctionNodeAuthentication> functionNodeAuthentication = this.getAllAuthentication(); + // 获得功能类型认证map + Map<FunctionNode, Boolean> authenticationMap = new HashMap<FunctionNode, Boolean>(); + if (functionNodeAuthentication != null) { + this.pushAuthenticationMap(authenticationMap, functionNodeAuthentication, allFunctionNode, roles); + } + checkFunctionNodesAuth(allFunctionNode.iterator(), privilegeMap, roleMap, LicenseResult, authenticationMap); + return finalFunctionTreeDefinition; + } + + @Override + public List<PrivilegeInfo> getCurrentStaffGrantAuth() { + List<PrivilegeInfo> result = new ArrayList<PrivilegeInfo>(); + //根据当前登录的组织机构id查询其自定义角色列表 + List<Group> groups = groupService.getChildren(roleService.getRoleGroupCategoryId(), getRootGroup().getId()); + if (groups != null) { + groups.forEach((children) -> { + RoleGroupInfo groupInfo = new RoleGroupInfo(children); + List<Role> roles = groupService.getItems(children.getId(), Role.class, null); + UUID currentRegionalCompany = getCurrentLoginRegionalCompany().getUuid("id"); + + for(int i = 0; i < roles.size(); i++) { + List<User> user = identityService.getUsers(roles.get(i).getCreateUser()); + KObject staff = staffService.getByUserId(user.get(0).getId()); + List<String> ids = new ArrayList<String>(); + ids.add(staff.getUuid("id").toString()); + List<KObject> followingList = followerDao.loadByMemberIds("com.xyst.dinas.biz.follower.datamodel.OrganizationFollower", ids); + List<UUID> organizaitonList = new ArrayList<UUID>(); + for(KObject following : followingList) { + organizaitonList.add(following.get("following").getUuid("id")); + } + if(!organizaitonList.contains(currentRegionalCompany)) { + roles.remove(i); + i--; + } + } + + groupInfo.setRoles(roles); + + //获取当前登录用户拥有的角色列表 + KObject currentStaff = getCurrentStaff(); + if(currentStaff != null) { + List<Role> staffRoleList = roleService.getByUser(currentStaff.get("user").getUuid("id")); + List<Role> commonRoleList = groupInfo.getRoles(); + + //以上两个List取交集,得到当前登录用户在该组织机构内所拥有的角色 + List<Role> resultRoleList = new ArrayList<Role>(); + for(int i = 0; i < staffRoleList.size(); i++) { + for(int j = 0; j < commonRoleList.size(); j++) { + if(commonRoleList.get(j).getId().equals(staffRoleList.get(i).getId())) { + resultRoleList.add(staffRoleList.get(i)); + break; + } + } + } + + for(int i = 0; i < resultRoleList.size(); i++) { + result.addAll(authManagerService.getPrivilegeInfoByRole(resultRoleList.get(i).getId())); + } + } + }); + } + return result; + } + + /** + * 获取当前登录的区域公司 + * @return + */ + public KObject getCurrentLoginRegionalCompany() { + Map<String, String> map = bapContext.getCurrentUserDatas(); + String currentRegionalCompany = map.get("currentRegionalCompany"); + + KClass kClass = Amino.getApplicationMetadataContext().getBean("com.xyst.dinas.biz.datamodel.xystOrganization", + KClass.class); + KObject regionalCompany = JSONObjectUtils.toObject(currentRegionalCompany, kClass); + return regionalCompany; + } + + /** + * 获取当前登录的用户 + * @return + */ + public KObject getCurrentStaff() { + try { + return bapContext.getCurrentStaff(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private Group getRootGroup() { + List<Group> commonRoleGroups = groupService.getByName(roleService.getRoleGroupCategoryId(), + CommonRoleGroup.NAME); + if (commonRoleGroups != null && commonRoleGroups.size() == 1) { + return commonRoleGroups.get(0); + } + throw new AuthDataMissingException("无法获取普通分组的根分组!"); + } + + private void checkFunctionNodesAuth(Iterator<FunctionNode> it, Map<UUID, Boolean> privilegeMap, + Map<String, Boolean> roleMap, Map<String, Boolean> LicenseResult, + Map<FunctionNode, Boolean> authenticationMap) { + if (null == it) { + return; + } + + while (it.hasNext()) { + FunctionNode node = it.next(); + + if (Mode.DISABLED == node.getMode()) { + it.remove(); + continue; + } + + if (Mode.REMOVE == node.getMode()) { + it.remove(); + continue; + } + + if (!checkLicense(LicenseResult, node.getLicense())) {// 无License权限 + it.remove(); + continue; + } + + if (!checkPrivilege(privilegeMap, node.getPrivilege())) {// 无功能权限 + it.remove(); + continue; + } + + if (!checkCategory(authenticationMap, node)) {// 无功能类型权限 + it.remove(); + continue; + } + + if (!checkRole(roleMap, node.getRole())) { + it.remove(); + continue; + } + + if (!node.getChildren().isEmpty()) { + Iterator<FunctionNode> childrenIt = node.getChildren().iterator(); + checkFunctionNodesAuth(childrenIt, privilegeMap, roleMap, LicenseResult, authenticationMap); + if (node.getChildren().isEmpty()) {// 权限校验完毕,当前节点的子节点全部被移除,则移除该节点本身 + it.remove(); + continue; + } + } else if (node.getFunctionDefinition() == null) { + it.remove(); + continue; + } + + } + } + + private void pushAuthenticationMap(Map<FunctionNode, Boolean> authenticationMap, + Collection<FunctionNodeAuthentication> functionNodeAuthentication, List<FunctionNode> allFunctionNode, + List<Role> roles) { + Map<String, List<FunctionNode>> categoryMap = new HashMap<String, List<FunctionNode>>(); + this.pushCategoryMap(categoryMap, allFunctionNode); + for (FunctionNodeAuthentication authentication : functionNodeAuthentication) { + // 获得功能类型 + List<FunctionNode> nodeList = categoryMap.get(authentication.getFunctionCategory()); + if (nodeList != null && nodeList.size() > 0) { + authenticationMap.putAll(authentication.authentication(nodeList, roles)); + } + } + } + + private Collection<FunctionNodeAuthentication> getAllAuthentication() { + Map<String, FunctionNodeAuthentication> beans = Amino.getApplicationMetadataContext() + .getBeansOfType(FunctionNodeAuthentication.class); + if (beans != null && beans.size() > 0) { + return beans.values(); + } + return null; + } + + private void pushCategoryMap(Map<String, List<FunctionNode>> functionNodeMap, List<FunctionNode> functionNodeList) { + functionNodeList.forEach((node) -> { + String view = null; + if (node.getFunctionDefinition() != null) { + view = node.getFunctionDefinition().getView().trim(); + } + List<FunctionNode> functionNode = functionNodeMap.get(view); + if (functionNode == null || functionNode.size() == 0) { + ArrayList<FunctionNode> tempList = new ArrayList<FunctionNode>(); + tempList.add(node); + functionNodeMap.put(view, tempList); + } else { + functionNode.add(node); + } + List<FunctionNode> children = node.getChildren(); + if (children != null && children.size() > 0) { + this.pushCategoryMap(functionNodeMap, children); + } + }); + } + + private boolean checkCategory(Map<FunctionNode, Boolean> authenticationMap, FunctionNode node) { + Boolean result = authenticationMap.get(node); + return result == null ? true : result; + } + + private boolean checkLicense(Map<String, Boolean> LicenseResult, String license) { + if (null == license || license.trim().length() == 0) { + return true; + } + if (null != LicenseResult.get(license)) { + return LicenseResult.get(license); + } + + LicenseProperty property = licensePropertyService.getLicenseProperty(license); + if (null == property) { + return false; + } + LicenseResult.put(license, property.getBooleanValue()); + + return LicenseResult.get(license); + } + + private boolean checkRole(Map<String, Boolean> roleMap, String role) { + if (role == null || role.trim().length() == 0) { + return true; + } + if (null == roleMap.get(role)) { + return false; + } + + return roleMap.get(role); + } + + private boolean checkPrivilege(Map<UUID, Boolean> privilegeMap, Privilege privilege) { + if (null == privilege) { + return true; + } + if (null == privilegeMap.get(privilege.getId())) { + logger.error("Get privilege [ id :{},title:{} ] access auth error ! ", privilege.getId(), + privilege.getTitle()); + return false; + } + return privilegeMap.get(privilege.getId()); + } + +} diff --git a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/service/FunctionTreeService.java b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/service/FunctionTreeService.java new file mode 100644 index 0000000..45cb042 --- /dev/null +++ b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/service/FunctionTreeService.java @@ -0,0 +1,13 @@ +package com.beecode.inz.authmgr.service; + +import java.util.List; + +import com.beecode.bap.functree.FunctionTreeDefinition; +import com.beecode.inz.authmgr.domain.PrivilegeInfo; + +public interface FunctionTreeService { + + FunctionTreeDefinition getFunctionTreeDefinition(String name); + + List<PrivilegeInfo> getCurrentStaffGrantAuth(); +} diff --git a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/AuthMgrController.java b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/AuthMgrController.java index 3fcef31..0850956 100644 --- a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/AuthMgrController.java +++ b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/AuthMgrController.java @@ -49,6 +49,7 @@ import com.beecode.inz.authmgr.domain.RoleGroupInfo; import com.beecode.inz.authmgr.domain.StaffInfo; import com.beecode.inz.authmgr.exception.AuthDataMissingException; import com.beecode.inz.authmgr.service.AuthManagerService; +import com.beecode.inz.authmgr.service.FunctionTreeService; import com.beecode.inz.authmgr.vo.AccessorPrivilegePara; import com.beecode.inz.common.dao.FollowerDao; import com.beecode.inz.common.service.ByIdService; @@ -78,6 +79,9 @@ public class AuthMgrController { private FollowerPrivilegeService followerPrivilegeService; @Autowired + private FunctionTreeService functionTreeService; + + @Autowired private FollowerDao followerDao; @Autowired @@ -148,11 +152,21 @@ public class AuthMgrController { } else { Privilege privilege = Amino.getApplicationMetadataContext().getBean(privilegeName, Privilege.class); Assert.notNull(privilege, "没有找到对应的权限项:" + privilegeName); - if (roleId == null) { - return privilegeService.canAccess(privilege.getId(), null); - } else { - return privilegeService.canAccess(privilege.getId(), roleId, null); + //修改判断单个功能权限的逻辑 + List<PrivilegeInfo> privilegeInfoList = functionTreeService.getCurrentStaffGrantAuth(); + boolean result = false; + for(PrivilegeInfo privilegeInfo : privilegeInfoList) { + if(privilegeInfo.getId().equals(privilege.getId())) { + result = true; + break; + } } + return result; +// if (roleId == null) { +// return privilegeService.canAccess(privilege.getId(), null); +// } else { +// return privilegeService.canAccess(privilege.getId(), roleId, null); +// } } } @@ -215,11 +229,19 @@ public class AuthMgrController { boolean canAccess = false; try { Privilege privilege = Amino.getApplicationMetadataContext().getBean(privilegeName, Privilege.class); - if (roleId == null) { - canAccess = privilegeService.canAccess(privilege.getId(), null); - } else { - canAccess = privilegeService.canAccess(privilege.getId(), roleId, null); + //修改判断单个功能权限的逻辑 + List<PrivilegeInfo> privilegeInfoList = functionTreeService.getCurrentStaffGrantAuth(); + for(PrivilegeInfo privilegeInfo : privilegeInfoList) { + if(privilegeInfo.getId().equals(privilege.getId())) { + canAccess = true; + break; + } } +// if (roleId == null) { +// canAccess = privilegeService.canAccess(privilege.getId(), null); +// } else { +// canAccess = privilegeService.canAccess(privilege.getId(), roleId, null); +// } } catch (Exception e) { logger.warn(MessageFormat.format("查询标志权限出错,具体参数为:权限项名称:【{0}】,角色id:【{1}】", privilegeName, roleId), e); canAccess = false; @@ -228,14 +250,19 @@ public class AuthMgrController { } @RequestMapping(value = "rolegroups/commongroup", method = RequestMethod.GET) - public List<RoleGroupInfo> getCommonRoleGroups() { + public List<RoleGroupInfo> getCommonRoleGroups(@RequestParam(name = "regionalCompanyId", required = false) UUID regionalCompanyId) { List<RoleGroupInfo> roleGroupInfos = new ArrayList<>(); List<Group> groups = groupService.getChildren(roleService.getRoleGroupCategoryId(), getRootGroup().getId()); if (groups != null) { groups.forEach((children) -> { RoleGroupInfo groupInfo = new RoleGroupInfo(children); List<Role> roles = groupService.getItems(children.getId(), Role.class, null); - KObject currentRegionalCompany = getCurrentLoginRegionalCompany(); + UUID currentRegionalCompany = null; + if(regionalCompanyId != null) { + currentRegionalCompany = regionalCompanyId; + } else { + currentRegionalCompany = getCurrentLoginRegionalCompany().getUuid("id"); + } for(int i = 0; i < roles.size(); i++) { List<User> user = identityService.getUsers(roles.get(i).getCreateUser()); @@ -247,7 +274,7 @@ public class AuthMgrController { for(KObject following : followingList) { organizaitonList.add(following.get("following").getUuid("id")); } - if(!organizaitonList.contains(currentRegionalCompany.getUuid("id"))) { + if(!organizaitonList.contains(currentRegionalCompany)) { roles.remove(i); i--; } diff --git a/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/FunctionTreeController.java b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/FunctionTreeController.java new file mode 100644 index 0000000..7f64d15 --- /dev/null +++ b/backend/inz.authmgr/src/main/java/com/beecode/inz/authmgr/web/FunctionTreeController.java @@ -0,0 +1,36 @@ +package com.beecode.inz.authmgr.web; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.beecode.bap.functree.FunctionTreeDefinition; +import com.beecode.bap.functree.util.FunctionTreeConstants; +import com.beecode.bap.functree.vo.FunctionTreeObj; +import com.beecode.inz.authmgr.service.FunctionTreeService; + +@RestController +public class FunctionTreeController { + + @Autowired + private FunctionTreeService functionTreeService; + + /** + * 将BAP中的逻辑复制出来,修改其中逻辑 + * @param name + * @return + */ + @RequestMapping(value = "/basis/xyst/functionTree", method = RequestMethod.GET) + public Object getFunctionTreeByName(@RequestParam(required = false) String name) { + + String functreeName = FunctionTreeConstants.DEFAULT_FUNCTION_TREE_METADATA_NAME; + if(StringUtils.hasLength(name)) { + functreeName = name; + } + FunctionTreeDefinition functionDefinition = functionTreeService.getFunctionTreeDefinition(functreeName); + return new FunctionTreeObj(functionDefinition); + } +} diff --git a/backend/inz.common/src/main/java/com/beecode/inz/common/internal/service/FollowerServiceImpl.java b/backend/inz.common/src/main/java/com/beecode/inz/common/internal/service/FollowerServiceImpl.java index f8ae2bb..ead0d73 100644 --- a/backend/inz.common/src/main/java/com/beecode/inz/common/internal/service/FollowerServiceImpl.java +++ b/backend/inz.common/src/main/java/com/beecode/inz/common/internal/service/FollowerServiceImpl.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import javax.transaction.Transactional; @@ -13,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import com.beecode.amino.metadata.context.support.ApplicationMetadataObjectSupport; import com.beecode.bap.staff.service.StaffService; +import com.beecode.bcp.authz.Role; +import com.beecode.bcp.authz.service.RoleService; import com.beecode.bcp.type.KClass; import com.beecode.bcp.type.KObject; import com.beecode.inz.common.dao.FollowerDao; @@ -33,6 +36,9 @@ public class FollowerServiceImpl extends ApplicationMetadataObjectSupport implem private StaffService staffService; @Autowired + private RoleService roleService; + + @Autowired private ByIdService byIdService; @Override @@ -59,6 +65,10 @@ public class FollowerServiceImpl extends ApplicationMetadataObjectSupport implem KObject kobject = type.newInstance(); kobject.set("role", body.getRole()); kobject.set("member", staff); + if(!body.getAttachRole().equals("")) { + Optional<Role> role = roleService.get(UUID.fromString(body.getAttachRole())); + kobject.set("attachRole", role.get().getId()); + } kobject.set(body.getEntityFieldName(), byIdService.byId(body.getEntityModelName(), UUID.fromString(body.getEntityIds()[i]))); kobject.set("readonly", body.getReadonly()); kobject.validate(); diff --git a/backend/inz.common/src/main/java/com/beecode/inz/common/pojo/FollowerEntityBatchAdd.java b/backend/inz.common/src/main/java/com/beecode/inz/common/pojo/FollowerEntityBatchAdd.java index e04c422..5857344 100644 --- a/backend/inz.common/src/main/java/com/beecode/inz/common/pojo/FollowerEntityBatchAdd.java +++ b/backend/inz.common/src/main/java/com/beecode/inz/common/pojo/FollowerEntityBatchAdd.java @@ -4,6 +4,8 @@ public class FollowerEntityBatchAdd { private String role; + private String attachRole; + private String[][] staffIds; private Boolean readonly; @@ -25,6 +27,14 @@ public class FollowerEntityBatchAdd { } + public String getAttachRole() { + return attachRole; + } + + public void setAttachRole(String attachRole) { + this.attachRole = attachRole; + } + public Boolean getReadonly() { return readonly; } diff --git a/backend/inz.common/src/main/java/com/beecode/inz/common/web/FollowerController.java b/backend/inz.common/src/main/java/com/beecode/inz/common/web/FollowerController.java index 47d9bf1..2affad1 100644 --- a/backend/inz.common/src/main/java/com/beecode/inz/common/web/FollowerController.java +++ b/backend/inz.common/src/main/java/com/beecode/inz/common/web/FollowerController.java @@ -4,8 +4,11 @@ package com.beecode.inz.common.web; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.UUID; +import org.json.JSONArray; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -14,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.beecode.bcp.authz.Role; +import com.beecode.bcp.authz.service.RoleService; import com.beecode.bcp.type.KObject; import com.beecode.bcp.type.json.JSONObjectUtils; import com.beecode.inz.common.pojo.FollowerEntity; @@ -22,6 +27,7 @@ import com.beecode.inz.common.pojo.FollowerEntityBatchDelete; import com.beecode.inz.common.pojo.FollowerEntityBatchEdit; import com.beecode.inz.common.pojo.FollowerEntityDelete; import com.beecode.inz.common.service.FollowerService; +import com.fasterxml.jackson.databind.JsonNode; @RestController public class FollowerController { @@ -29,17 +35,31 @@ public class FollowerController { @Autowired private FollowerService service; + @Autowired + private RoleService roleService; + @RequestMapping(value = "/common/followers/query", method = RequestMethod.POST, consumes = "application/json") public Object query(@RequestBody FollowerEntity body) { List<KObject> o = service.query(body); + JSONArray result = new JSONArray(); String s=""; if(o.size()<1){ s="[]"; }else{ for(KObject kObject : o){ kObject.setNull(body.getEntityFieldName());//断开json的死循环,这样做可能不妥 + JsonNode node = JSONObjectUtils.toJson(kObject); + JSONObject obj = new JSONObject(node.toString()); + UUID attachRole = kObject.getUuid("attachRole"); + if(attachRole != null) { + Optional<Role> role = roleService.get(attachRole); + if(role.isPresent()) { + obj.put("attachRoleName", role.get().getTitle()); + } + } + result.put(obj); } - s = JSONObjectUtils.toJson(o, true, false).toString(); + s = result.toString(); } return s; diff --git a/backend/xyst.dinas.biz/src/main/model/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.mk b/backend/xyst.dinas.biz/src/main/model/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.mk index bd45351..dcbad13 100644 --- a/backend/xyst.dinas.biz/src/main/model/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.mk +++ b/backend/xyst.dinas.biz/src/main/model/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.mk @@ -16,6 +16,10 @@ <annotation id='f4ec7a01-60f9-4da3-b262-7503c331d6f3' attributeId='6e6fec32-e8c0-4cca-acce-6fb94301355c' name='length' value='undefined'> </annotation> </attribute> + <attribute id='c2e179a2-a40b-421e-9665-0b3b6c9ca626' name='attachRole' columnName='attach_role' title='附加角色' type='uuid' default='' precision='' isArray='false'> + <annotation id='313c2ab2-5408-4252-b873-08c0fb9dd2a7' attributeId='9d00a458-100b-4b74-8a97-11bdda45a50a' name='length' value='undefined'> + </annotation> + </attribute> <hibernate>/xyst.dinas.biz/src/main/resources/config/OrganizationFollower.hbm.xml</hibernate> </dataModel> </content> diff --git a/backend/xyst.dinas.biz/src/main/resources/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.jmx b/backend/xyst.dinas.biz/src/main/resources/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.jmx index 3749ec4..0d13d8d 100644 --- a/backend/xyst.dinas.biz/src/main/resources/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.jmx +++ b/backend/xyst.dinas.biz/src/main/resources/com/xyst/dinas/biz/follower/datamodel/OrganizationFollower.jmx @@ -60,6 +60,25 @@ <m:description></m:description> <m:default></m:default> </m:attribute> + <m:attribute> + <m:annotations> + <m:annotation> + <m:type>javax.persistence.Column</m:type> + <m:properties> + <m:property> + <m:key>name</m:key> + <m:value>attach_role</m:value> + </m:property> + </m:properties> + </m:annotation> + </m:annotations> + <m:id>c2e179a2-a40b-421e-9665-0b3b6c9ca626</m:id> + <m:name>attachRole</m:name> + <m:title>附加角色</m:title> + <m:type>uuid</m:type> + <m:description></m:description> + <m:default></m:default> + </m:attribute> </m:attributes> </m:class> </content> diff --git a/backend/xyst.dinas.biz/src/main/resources/config/OrganizationFollower.hbm.xml b/backend/xyst.dinas.biz/src/main/resources/config/OrganizationFollower.hbm.xml index 1af05ec..6e1809d 100644 --- a/backend/xyst.dinas.biz/src/main/resources/config/OrganizationFollower.hbm.xml +++ b/backend/xyst.dinas.biz/src/main/resources/config/OrganizationFollower.hbm.xml @@ -20,5 +20,8 @@ <many-to-one name="following" entity-name="com.xyst.dinas.biz.datamodel.xystOrganization" fetch="select"> <column name="following" not-null="false"/> </many-to-one> + <property name="attachRole" type="uuid-binary" not-null="false"> + <column name="attach_role" length="16"></column> + </property> </class> </hibernate-mapping> \ No newline at end of file