Commit 06bf1140 by zhangkb

修改加载标签兼容一个用户多个机构情况

parent ac28d254
package com.keymobile.tagmanager.api;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -15,7 +15,6 @@ import com.keymobile.tagmanager.model.SysTag;
import com.keymobile.tagmanager.model.Tag;
import com.keymobile.tagmanager.service.TagService;
import com.keymobile.tagmanager.util.JsonTreeHelper.JsonNode;
import com.keymobile.tagmanager.util.Constants;
import com.keymobile.tagmanager.util.UserInfoUtils;
import io.swagger.annotations.Api;
......@@ -74,7 +73,10 @@ public class TagCtrl {
@RequestParam(required = false) String deptIdPath) throws TagNotExistException {
//获取当前登录用户机构
deptIdPath = UserInfoUtils.getDataRoleOrg();
return tagService.queryDimensionTagAsTree(deptIdPath, parentId);
//考虑一个用户对应多个机构的情况
List<String> orgIds = new ArrayList<>();
orgIds.add(deptIdPath);
return tagService.queryDimensionTagAsTree(orgIds, parentId);
}
@ApiOperation(value = "获取个人标签树", notes = "获取个人标签树")
......@@ -84,9 +86,12 @@ public class TagCtrl {
@RequestParam(required = false) String deptIdPath) throws TagNotExistException {
//获取当前登录用户机构id
deptIdPath = UserInfoUtils.getDataRoleOrg();
//考虑一个用户对应多个机构的情况
List<String> orgIds = new ArrayList<>();
orgIds.add(deptIdPath);
//获取当前登录用户id
String userId = UserInfoUtils.getUserId();
return tagService.queryPersonalTagAsTree(parentId, userId, deptIdPath);
return tagService.queryPersonalTagAsTree(parentId, userId, orgIds);
}
@ApiOperation(value = "搜索维度标签里面的个人标签", notes = "搜索维度标签里面的个人标签")
......@@ -100,7 +105,10 @@ public class TagCtrl {
@RequestParam("pageSize") Integer pageSize) throws TagNotExistException{
String userName = UserInfoUtils.getUserId();
deptIdPath = UserInfoUtils.getDataRoleOrg();
return tagService.searchPersonalDimensionTagByPage(userName, deptIdPath, keyword,
//考虑一个用户对应多个机构的情况
List<String> orgIds = new ArrayList<>();
orgIds.add(deptIdPath);
return tagService.searchPersonalDimensionTagByPage(userName, orgIds, keyword,
path, domain, new Page(pageSize, pageNo));
}
......@@ -114,7 +122,10 @@ public class TagCtrl {
@RequestParam("pageSize") Integer pageSize) throws TagNotExistException{
String userName = UserInfoUtils.getUserId();
deptIdPath = UserInfoUtils.getDataRoleOrg();
return tagService.searchPersonalTagByPage(userName, deptIdPath, keyword, path, domain, new Page(pageSize, pageNo));
//考虑一个用户对应多个机构的情况
List<String> orgIds = new ArrayList<>();
orgIds.add(deptIdPath);
return tagService.searchPersonalTagByPage(userName, orgIds, keyword, path, domain, new Page(pageSize, pageNo));
}
// @PreAuthorize("principal.authorities.?[authority.startsWith('ROLE_tagmanager_admin')].size() > 0")
......@@ -142,7 +153,10 @@ public class TagCtrl {
@RequestParam(required = false) String deptIdPath) throws TagNotExistException {
String userName = UserInfoUtils.getUserId();
deptIdPath = UserInfoUtils.getDataRoleOrg();
return tagService.queryPersonalTagExcludeOpenTypeAsTree(parentId, userName, deptIdPath);
//考虑一个用户对应多个机构的情况
List<String> orgIds = new ArrayList<>();
orgIds.add(deptIdPath);
return tagService.queryPersonalTagExcludeOpenTypeAsTree(parentId, userName, orgIds);
}
@ApiOperation(value = "分享/取消分享标签(0:取消分享 1:分享)", notes = "分享/取消分享标签(0:取消分享 1:分享)")
......
package com.keymobile.tagmanager.service;
import java.util.ArrayList;
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 java.util.stream.Collectors;
......@@ -115,18 +117,20 @@ public class TagService {
}
//获取维度标签树
public JsonNode[] queryDimensionTagAsTree(String dept, String parentId) throws TagNotExistException {
public JsonNode[] queryDimensionTagAsTree(List<String> orgIds,
String parentId) throws TagNotExistException {
List<Tag> tags = new ArrayList<>();
//根据当前登录用户所属机构获取对应公司机构id
String companyOrgId = this.getCompanyOrgIdByUserOrgId(dept);
List<String> companyOrgIdList = this.getCompanyOrgIdListByUserOrgIds(orgIds);
if(!companyOrgIdList.isEmpty()) {
if (StringUtils.isEmpty(parentId)) {//从根节点开始获取
tags = mongoOperations.find(createDimensionTagQuery(companyOrgId), Tag.class);
tags = mongoOperations.find(createDimensionTagQuery(companyOrgIdList), Tag.class);
} else {
Tag parentTag = getTagById(parentId);
//获取父节点标签下的所有子标签
tags = getDimensionSubTag(parentTag,companyOrgId);
tags = getDimensionSubTag(parentTag,companyOrgIdList);
//tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName())));
}
}
List<JsonNode> nodes = new ArrayList<>();
tags.forEach(p -> {
JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath());
......@@ -144,16 +148,17 @@ public class TagService {
//获取个人标签树
public JsonNode[] queryPersonalTagAsTree(String parentId, String userId,
String dept)
throws TagNotExistException{
List<String> orgIds) throws TagNotExistException{
List<Tag> tags = new ArrayList<>();
//根据用户所属机构id获取对应的公司机构id
String companyOrgId = this.getCompanyOrgIdByUserOrgId(dept);
List<String> companyOrgIdList = this.getCompanyOrgIdListByUserOrgIds(orgIds);
if(!companyOrgIdList.isEmpty()) {
if (StringUtils.isEmpty(parentId)) {//从根目录开始查找
tags = mongoOperations.find(this.createNewPersonalTagQuery(userId, dept, companyOrgId), Tag.class);
tags = mongoOperations.find(this.createNewPersonalTagQuery(userId, orgIds,
companyOrgIdList), Tag.class);
}else {
Tag parentTag = getTagById(parentId);
tags = this.getNewPersonSubTag(parentTag, userId, dept, companyOrgId);
tags = this.getNewPersonSubTag(parentTag, userId, orgIds, companyOrgIdList);
}
}
List<JsonNode> nodes = new ArrayList<>();
tags.forEach(p -> {
......@@ -168,6 +173,24 @@ public class TagService {
}
}
//根据用户管理的机构list获取公司机构id
public List<String> getCompanyOrgIdListByUserOrgIds(List<String> orgIds)
throws TagNotExistException{
List<String> companyOrgIdList = new ArrayList<>();
//定义用于去重用户公司机构id的map
Map<String,String> companyOrgIdMap = new HashMap<>();
for(String orgId : orgIds) {
//根据当前登录用户所属机构获取对应公司机构id
String companyOrgId = this.getCompanyOrgIdByUserOrgId(orgId);
companyOrgIdMap.put(companyOrgId, companyOrgId);
}
//遍历map,获取去重的公司机构id的list
for(Map.Entry<String,String> entry : companyOrgIdMap.entrySet()) {
companyOrgIdList.add(entry.getValue());
}
return companyOrgIdList;
}
//根据用户所属机构id获取对应的公司机构id
public String getCompanyOrgIdByUserOrgId(String dept) throws TagNotExistException{
//根据用户机构id获取机构信息
......@@ -193,18 +216,22 @@ public class TagService {
}
//根据关键字查询维度标签数据
public Page searchPersonalDimensionTagByPage(String userName, String dept, String keyword,
public Page searchPersonalDimensionTagByPage(String userName, List<String> orgIds, String keyword,
String path, Integer domain, Page page) throws TagNotExistException{
Criteria andCriterias = createPersonalDimensionTagCriteria(userName, path, dept);
List<String> companyOrgIdList = this.getCompanyOrgIdListByUserOrgIds(orgIds);
page.setData(new ArrayList<ExtTag>());
page.setTotal(0L);
if(!companyOrgIdList.isEmpty()) {
Criteria andCriterias = createPersonalDimensionTagCriteria(userName, path, companyOrgIdList);
if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) {
andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword));
}
Query q = createPageQuery(page, andCriterias);
List<Tag> tags = mongoOperations.find(q, Tag.class);
long count = mongoOperations.count(q, Tag.class);
page.setData(decoratorToExtTag(tags, userName));
page.setTotal(count);
}
return page;
}
......@@ -223,9 +250,13 @@ public class TagService {
}
//根据关键字查找个人标签
public Page searchPersonalTagByPage(String userName, String dept, String keyword, String path,
public Page searchPersonalTagByPage(String userName, List<String> orgIds, String keyword, String path,
Integer domain, Page page) throws TagNotExistException{
Criteria andCriterias = createPersonalTagCriteria(userName, dept, path);
page.setData(new ArrayList<ExtTag>());
page.setTotal(0L);
List<String> companyOrgIdList = this.getCompanyOrgIdListByUserOrgIds(orgIds);
if(!companyOrgIdList.isEmpty()) {
Criteria andCriterias = createPersonalTagCriteria(userName, orgIds, companyOrgIdList, path);
if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) {
andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword));
}
......@@ -235,6 +266,7 @@ public class TagService {
long count = mongoOperations.count(q, Tag.class);
page.setData(decoratorToExtTag(tags, userName));
page.setTotal(count);
}
return page;
}
......@@ -262,18 +294,14 @@ public class TagService {
}
//获取新增个人标签加载上级标签树接口
public JsonNode[] queryPersonalTagExcludeOpenTypeAsTree(String parentId, String userName, String dept) throws TagNotExistException {
public JsonNode[] queryPersonalTagExcludeOpenTypeAsTree(String parentId, String userName,
List<String> orgIds) throws TagNotExistException {
List<Tag> tags = new ArrayList<>();
//根据普通用户机构id获取机构信息
String companyOrgId = this.getCompanyOrgIdByUserOrgId(dept);
if (StringUtils.isEmpty(parentId)) {
tags = mongoOperations.find(createPersonalExcludeOpenTypeTagQuery(userName, companyOrgId), Tag.class);
List<String> companyOrgIdList = this.getCompanyOrgIdListByUserOrgIds(orgIds);
if(!companyOrgIdList.isEmpty()) {
tags = mongoOperations.find(createPersonalExcludeOpenTypeTagQuery(userName, companyOrgIdList),
Tag.class);
}
/**else {
Tag parentTag = getTagById(parentId);
tags = getPersonSubTag(parentTag, userName);
//tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName())));
}*/
List<JsonNode> nodes = new ArrayList<>();
tags.forEach(p -> {
JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath());
......@@ -332,18 +360,29 @@ public class TagService {
}
//拼接个人维度标签树查询条件
private Query createDimensionTagQuery(String dept) {
return Query.query(Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE)
private Query createDimensionTagQuery(List<String> companyOrgIdList) {
Criteria criteriaOr = new Criteria();
for(String companyOrgId : companyOrgIdList) {
Criteria criteria = Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE)
.and("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("proDept").is(dept))
.with(Sort.by(getDefaultTagOrders()));
.and("proDept").is(companyOrgId);
//加入or条件中
criteriaOr.orOperator(criteria);
}
return Query.query(criteriaOr).with(Sort.by(getDefaultTagOrders()));
}
//根据机构获取当前维度标签的所有子标签
private List<Tag> getDimensionSubTag(Tag parentTag,String companyOrgId) {
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
private List<Tag> getDimensionSubTag(Tag parentTag,List<String> companyOrgIdList) {
Criteria criteriaOr = new Criteria();
for(String companyOrgId : companyOrgIdList) {
Criteria criteria = Criteria.where("path")
.regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE)
.and("proDept").is(companyOrgId))
.and("proDept").is(companyOrgId);
//加入or条件中
criteriaOr.orOperator(criteria);
}
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(criteriaOr)
.with(Sort.by(getDefaultTagOrders())), Tag.class);
dirs.add(parentTag);
return dirs;
......@@ -363,32 +402,42 @@ public class TagService {
return orders;
}
//拼接查找个人标签条件
private Query createNewPersonalTagQuery(String userId,String deptId,
String companyId) {
private Query createNewPersonalTagQuery(String userId,List<String> orgIds,
List<String> companyOrgIdList) {
Criteria criteria = Criteria.where("tagType").is("1");//获取自定义标签
criteria.orOperator(
Criteria.where("proDept").is(companyId)
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE),//标签是维度管理员机构的
Criteria.where("dept").is(deptId).and("tagUser").is(userId),//标签是普通用户结构且普通用户名创建
Criteria.where("proDept").is(companyId)
.and("isOpen").is(Constants.TAG_OPEN_STATUS)//公司机构id是companyId和是共享状态的
);
for(String companyOrgId : companyOrgIdList) {
Criteria criteriaDim = Criteria.where("proDept").is(companyOrgId)
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE);//标签是维度管理员机构的
Criteria criteriaShare = Criteria.where("proDept").is(companyOrgId)
.and("isOpen").is(Constants.TAG_OPEN_STATUS);//公司机构id是companyId和是共享状态的
criteria.orOperator(criteriaDim,criteriaShare);
}
for(String orgId : orgIds) {
Criteria criteriaUser = Criteria.where("dept").is(orgId).and("tagUser").is(userId);
criteria.orOperator(criteriaUser);
}
return Query.query(criteria)
.with(Sort.by(getDefaultTagOrders()));
}
//根据父标签查找子标签
private List<Tag> getNewPersonSubTag(Tag parentTag, String userId,String deptId,
String companyId) {
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
private List<Tag> getNewPersonSubTag(Tag parentTag, String userId,List<String> orgIds,
List<String> companyOrgIdList) {
Criteria criteria = Criteria.where("path")
.regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
.and("tagType").is(Constants.TAG_PERSONAL_TYPE)
.orOperator(
Criteria.where("proDept").is(companyId)
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE),//标签是维度管理员机构的
Criteria.where("dept").is(deptId).and("tagUser").is(userId),//标签是普通用户结构且普通用户名创建
Criteria.where("proDept").is(companyId)
.and("isOpen").is(Constants.TAG_OPEN_STATUS)//公司机构id是companyId和是共享状态的
)).with(Sort.by(getDefaultTagOrders())), Tag.class);
.and("tagType").is(Constants.TAG_PERSONAL_TYPE);
for(String companyOrgId : companyOrgIdList) {
Criteria criteriaDim = Criteria.where("proDept").is(companyOrgId)
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE);//标签是维度管理员机构的
Criteria criteriaShare = Criteria.where("proDept").is(companyOrgId)
.and("isOpen").is(Constants.TAG_OPEN_STATUS);//公司机构id是companyId和是共享状态的
criteria.orOperator(criteriaDim,criteriaShare);
}
for(String orgId : orgIds) {
Criteria criteriaUser = Criteria.where("dept").is(orgId).and("tagUser").is(userId);
criteria.orOperator(criteriaUser);
}
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(criteria)
.with(Sort.by(getDefaultTagOrders())), Tag.class);
dirs.add(parentTag);
return dirs;
}
......@@ -401,16 +450,17 @@ public class TagService {
}
//拼接根据机构id查询个人维度标签
private Criteria createPersonalDimensionTagCriteria(String userName,
String path, String dept)throws TagNotExistException
{
//根据当前用户所属机构获取公司结构id
String companyOrgId = this.getCompanyOrgIdByUserOrgId(dept);
String path, List<String> companyOrgIdList)throws TagNotExistException {
Criteria criteriaOr = new Criteria();
for(String companyOrgId : companyOrgIdList) {
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("proDept").is(companyOrgId).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE);
criteriaOr.orOperator(criteria);
}
if (StringUtils.isNotBlank(path)) {
criteria.and("path").regex("^"+path);
criteriaOr.and("path").regex("^"+path);
}
return criteria;
return criteriaOr;
}
//拼接查找系统标签条件
private Criteria createSystemTagCriteria(String path) {
......@@ -436,24 +486,26 @@ public class TagService {
}).collect(Collectors.toList());
}
//拼接个人标签查询条件
private Criteria createPersonalTagCriteria(String userName, String dept, String path) throws TagNotExistException{
//根据当前用户机构id获取所属公司机构id
String companyOrgId = this.getCompanyOrgIdByUserOrgId(dept);
Criteria criteria1 = Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("dept").is(dept).and("tagUser").is(userName);
private Criteria createPersonalTagCriteria(String userName, List<String> orgIds,
List<String> companyOrgIdList, String path) throws TagNotExistException{
Criteria criteriaOr = new Criteria();
for(String orgId : orgIds) {
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("dept").is(orgId).and("tagUser").is(userName);
if (StringUtils.isNotBlank(path)) {
criteria1 = criteria1.and("path").regex("^"+path);
return new Criteria().orOperator(
criteria1,
//查询共享个人标签
Criteria.where("proDept").is(companyOrgId)
.and("path").regex("^"+path).and("isOpen").is(Constants.TAG_OPEN_STATUS));
}else {
return new Criteria().orOperator(
criteria1,
//查询共享个人标签
Criteria.where("proDept").is(companyOrgId).and("isOpen").is(Constants.TAG_OPEN_STATUS));
criteria.and("path").regex("^"+path);
}
criteriaOr.orOperator(criteria);
}
for(String companyOrgId : companyOrgIdList) {
Criteria criteria = Criteria.where("proDept").is(companyOrgId)
.and("isOpen").is(Constants.TAG_OPEN_STATUS);
if (StringUtils.isNotBlank(path)) {
criteria.and("path").regex("^"+path);
}
criteriaOr.orOperator(criteria);
}
return criteriaOr;
}
//拼接查询当前系统标签子标签条件
private List<Tag> getSystemSubTag(Tag parentTag) {
......@@ -465,9 +517,14 @@ public class TagService {
return dirs;
}
//拼接获取维度标签条件
private Query createPersonalExcludeOpenTypeTagQuery(String userName, String dept) {
return Query.query(Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("dept").is(dept).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE))
private Query createPersonalExcludeOpenTypeTagQuery(String userName, List<String> companyOrgIdList) {
Criteria criteriaOr = new Criteria();
for(String companyOrgId : companyOrgIdList) {
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("dept").is(companyOrgId).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE);
criteriaOr.orOperator(criteria);
}
return Query.query(criteriaOr)
.with(Sort.by(getDefaultTagOrders()));
}
......@@ -504,27 +561,27 @@ public class TagService {
// return new JsonNode[] {};
// }
private Query createPersonalTagQuery(String userName, String dept, Criteria... serachCriterias)throws TagNotExistException {
return Query.query(
createPersonalTagCriteria(userName, dept, null))
.with(Sort.by(getDefaultTagOrders()));
}
public List<Tag> getPersonSubTag(Tag parentTag, String userName) {
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
.regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
.and("tagType").is(Constants.TAG_PERSONAL_TYPE)
.orOperator(
Criteria.where("openStatus").is(Constants.TAG_OPEN_STATUS),
Criteria.where("creator").is(userName)))
.with(Sort.by(getDefaultTagOrders())), Tag.class);
dirs.add(parentTag);
return dirs;
}
private Criteria createPathRegexQuery(String path) {
return Criteria.where("path").regex("^"+path);
}
// private Query createPersonalTagQuery(String userName, String dept, Criteria... serachCriterias)throws TagNotExistException {
// return Query.query(
// createPersonalTagCriteria(userName, dept, null))
// .with(Sort.by(getDefaultTagOrders()));
// }
//
// public List<Tag> getPersonSubTag(Tag parentTag, String userName) {
// List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
// .regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
// .and("tagType").is(Constants.TAG_PERSONAL_TYPE)
// .orOperator(
// Criteria.where("openStatus").is(Constants.TAG_OPEN_STATUS),
// Criteria.where("creator").is(userName)))
// .with(Sort.by(getDefaultTagOrders())), Tag.class);
// dirs.add(parentTag);
// return dirs;
// }
//
// private Criteria createPathRegexQuery(String path) {
// return Criteria.where("path").regex("^"+path);
// }
public List<SysTag> listSysTags() {
return mongoOperations.findAll(SysTag.class);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment