Commit 10ed975e by zhangkb

修改标签管理维度标签和个人标签根据当前登录用户过滤

parent 3ff544a8
...@@ -30,14 +30,20 @@ public class TagCtrl { ...@@ -30,14 +30,20 @@ public class TagCtrl {
@Autowired @Autowired
private TagService tagService; private TagService tagService;
//author:zhangkb time:2020-1-6 desc:修改标签相关接口
@ApiOperation(value = "新增或更新标签", notes = "新增或更新标签") @ApiOperation(value = "新增或更新标签", notes = "新增或更新标签")
@PostMapping(value = "/addOrUpdateTag") @PostMapping(value = "/addOrUpdateTag")
public Tag addTag(@RequestParam(value = "parentId", required = false) String parentId, public Tag addTag(@RequestParam(value = "parentId", required = false) String parentId,
@RequestBody Tag tag) throws Exception { @RequestBody Tag tag) throws Exception {
//获取当前登录用户名和id
String userName = UserInfoUtils.getUserName(); String userName = UserInfoUtils.getUserName();
String userId = UserInfoUtils.getUserId();
//获取当前登录用户所属机构
String org = UserInfoUtils.getDataRoleOrg();
tag.setCreator(userName); tag.setCreator(userName);
tag.setDept(UserInfoUtils.getUserCompanyIdPath()); tag.setTagUser(userId);
tag.setDept(org);
//调用新增或者修改标签接口
return tagService.addOrUpdateTag(parentId, tag, userName); return tagService.addOrUpdateTag(parentId, tag, userName);
} }
...@@ -55,21 +61,13 @@ public class TagCtrl { ...@@ -55,21 +61,13 @@ public class TagCtrl {
return tagService.hasChild(tagId, userName); return tagService.hasChild(tagId, userName);
} }
@ApiOperation(value = "获取维度标签树", notes = "获取维度标签树")
// @PreAuthorize("principal.authorities.?[authority.startsWith('ROLE_tagmanager_admin')].size() > 0")
@ApiOperation(value = "查询系统标签树", notes = "查询系统标签树")
@GetMapping(value = "/querySystemTagAsTree")
public JsonNode[] querySystemTagAsTree(@RequestParam(value = "parentId", required = false) String parentId) throws TagNotExistException {
return tagService.querySystemTagAsTree(parentId);
}
@ApiOperation(value = "查询维度标签树", notes = "查询维度标签树")
@GetMapping(value = "/queryDimensionTagAsTree") @GetMapping(value = "/queryDimensionTagAsTree")
public JsonNode[] queryDimensionTagAsTree( public JsonNode[] queryDimensionTagAsTree(
@RequestParam(value = "parentId", required = false) String parentId, @RequestParam(value = "parentId", required = false) String parentId,
@RequestParam(required = false) String deptIdPath) throws TagNotExistException { @RequestParam(required = false) String deptIdPath) throws TagNotExistException {
if (StringUtils.isBlank(deptIdPath)) //获取当前登录用户机构
deptIdPath = UserInfoUtils.getUserCompanyIdPath(); deptIdPath = UserInfoUtils.getDataRoleOrg();
return tagService.queryDimensionTagAsTree(deptIdPath, parentId); return tagService.queryDimensionTagAsTree(deptIdPath, parentId);
} }
...@@ -78,35 +76,12 @@ public class TagCtrl { ...@@ -78,35 +76,12 @@ public class TagCtrl {
public JsonNode[] queryPersonalTagAsTree( public JsonNode[] queryPersonalTagAsTree(
@RequestParam(value = "parentId", required = false) String parentId, @RequestParam(value = "parentId", required = false) String parentId,
@RequestParam(required = false) String deptIdPath) throws TagNotExistException { @RequestParam(required = false) String deptIdPath) throws TagNotExistException {
if (StringUtils.isBlank(deptIdPath)) //获取当前登录用户机构id
deptIdPath = UserInfoUtils.getUserCompanyIdPath(); deptIdPath = UserInfoUtils.getDataRoleOrg();
String userName = UserInfoUtils.getUserName(); //获取当前登录用户id
return tagService.queryPersonalTagAsTree(parentId, userName, deptIdPath); String userId = UserInfoUtils.getUserId();
} return tagService.queryPersonalTagAsTree(parentId, userId, deptIdPath);
@ApiOperation(value = "查询个人标签树不包括分享的标签", notes = "查询个人标签树不包括分享的标签")
@GetMapping(value = "/queryPersonalTagExcludeOpenTypeAsTree")
public JsonNode[] queryPersonalTagExcludeOpenTypeAsTree(
@RequestParam(value = "parentId", required = false) String parentId,
@RequestParam(required = false) String deptIdPath) throws TagNotExistException {
String userName = UserInfoUtils.getUserName();
if (StringUtils.isBlank(deptIdPath))
deptIdPath = UserInfoUtils.getUserCompanyIdPath();
return tagService.queryPersonalTagExcludeOpenTypeAsTree(parentId, userName, deptIdPath);
}
@ApiOperation(value = "搜索系統标签", notes = "搜索系統标签")
@GetMapping(value = "/searchSystemTagByPage")
public Page searchSystemTagByPage(@RequestParam(required = false, value = "keyword") String keyword,
@RequestParam(required = false, value = "domain") Integer domain,
@RequestParam(required = false , value = "path") String path,
@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize) {
String userName = UserInfoUtils.getUserName();
return tagService.searchSystemTagByPage(userName, keyword, path, domain, new Page(pageSize, pageNo));
} }
@ApiOperation(value = "搜索维度标签里面的个人标签", notes = "搜索维度标签里面的个人标签") @ApiOperation(value = "搜索维度标签里面的个人标签", notes = "搜索维度标签里面的个人标签")
@GetMapping(value = "/searchPersonalDimensionTagByPage") @GetMapping(value = "/searchPersonalDimensionTagByPage")
public Page searchPersonalDimensionTagByPage( public Page searchPersonalDimensionTagByPage(
...@@ -116,10 +91,10 @@ public class TagCtrl { ...@@ -116,10 +91,10 @@ public class TagCtrl {
@RequestParam(required = false , value = "path") String path, @RequestParam(required = false , value = "path") String path,
@RequestParam("pageNo") Integer pageNo, @RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize) { @RequestParam("pageSize") Integer pageSize) {
String userName = UserInfoUtils.getUserName(); String userName = UserInfoUtils.getUserId();
if (StringUtils.isBlank(deptIdPath)) deptIdPath = UserInfoUtils.getDataRoleOrg();
deptIdPath = UserInfoUtils.getUserCompanyIdPath(); return tagService.searchPersonalDimensionTagByPage(userName, deptIdPath, keyword,
return tagService.searchPersonalDimensionTagByPage(userName, deptIdPath, keyword, path, domain, new Page(pageSize, pageNo)); path, domain, new Page(pageSize, pageNo));
} }
@ApiOperation(value = "搜索个人标签", notes = "搜索个人标签") @ApiOperation(value = "搜索个人标签", notes = "搜索个人标签")
...@@ -130,12 +105,51 @@ public class TagCtrl { ...@@ -130,12 +105,51 @@ public class TagCtrl {
@RequestParam(required = false , value = "deptIdPath") String deptIdPath, @RequestParam(required = false , value = "deptIdPath") String deptIdPath,
@RequestParam("pageNo") Integer pageNo, @RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize) { @RequestParam("pageSize") Integer pageSize) {
String userName = UserInfoUtils.getUserName(); String userName = UserInfoUtils.getUserId();
if (StringUtils.isBlank(deptIdPath)) deptIdPath = UserInfoUtils.getDataRoleOrg();
deptIdPath = UserInfoUtils.getUserCompanyIdPath();
return tagService.searchPersonalTagByPage(userName, deptIdPath, keyword, path, domain, new Page(pageSize, pageNo)); return tagService.searchPersonalTagByPage(userName, deptIdPath, keyword, path, domain, new Page(pageSize, pageNo));
} }
// @PreAuthorize("principal.authorities.?[authority.startsWith('ROLE_tagmanager_admin')].size() > 0")
@ApiOperation(value = "查询系统标签树", notes = "查询系统标签树")
@GetMapping(value = "/querySystemTagAsTree")
public JsonNode[] querySystemTagAsTree(@RequestParam(value = "parentId", required = false) String parentId) throws TagNotExistException {
return tagService.querySystemTagAsTree(parentId);
}
@ApiOperation(value = "搜索系統标签", notes = "搜索系統标签")
@GetMapping(value = "/searchSystemTagByPage")
public Page searchSystemTagByPage(@RequestParam(required = false, value = "keyword") String keyword,
@RequestParam(required = false, value = "domain") Integer domain,
@RequestParam(required = false , value = "path") String path,
@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize) {
String userName = UserInfoUtils.getUserId();
return tagService.searchSystemTagByPage(userName, keyword, path, domain, new Page(pageSize, pageNo));
}
@ApiOperation(value = "查询个人标签树不包括分享的标签", notes = "查询个人标签树不包括分享的标签")
@GetMapping(value = "/queryPersonalTagExcludeOpenTypeAsTree")
public JsonNode[] queryPersonalTagExcludeOpenTypeAsTree(
@RequestParam(value = "parentId", required = false) String parentId,
@RequestParam(required = false) String deptIdPath) throws TagNotExistException {
String userName = UserInfoUtils.getUserId();
deptIdPath = UserInfoUtils.getDataRoleOrg();
return tagService.queryPersonalTagExcludeOpenTypeAsTree(parentId, userName, deptIdPath);
}
@ApiOperation(value = "分享标签", notes = "分享标签") @ApiOperation(value = "分享标签", notes = "分享标签")
@PostMapping(value = "/shareTags") @PostMapping(value = "/shareTags")
public void shareTags(@RequestBody List<String> tagIds) throws Exception { public void shareTags(@RequestBody List<String> tagIds) throws Exception {
......
package com.keymobile.tagmanager.api; package com.keymobile.tagmanager.api;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.keymobile.tagmanager.model.Page; import com.keymobile.tagmanager.model.Page;
import com.keymobile.tagmanager.service.TagFileService; import com.keymobile.tagmanager.service.TagFileService;
import com.keymobile.tagmanager.util.UserInfoUtils; import com.keymobile.tagmanager.util.UserInfoUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@Api(value = "文件", tags = "文件") @Api(value = "文件", tags = "文件")
@RestController @RestController
@RequestMapping(value = "/file") @RequestMapping(value = "/file")
public class TagFileCtrl { public class TagFileCtrl {
@Autowired @Autowired
private TagFileService tagExportService; private TagFileService tagExportService;
@GetMapping("/exportTag") @GetMapping("/exportTag")
public int export(HttpServletResponse response, @RequestParam(required = false , value = "deptIdPath") String deptIdPath) { public int export(HttpServletResponse response, @RequestParam(required = false , value = "deptIdPath") String deptIdPath) {
if (StringUtils.isBlank(deptIdPath)) { deptIdPath = UserInfoUtils.getDataRoleOrg();
deptIdPath = UserInfoUtils.getUserCompanyIdPath(); return tagExportService.exportExcel(deptIdPath, response);
} }
return tagExportService.exportExcel(deptIdPath, response);
} @PostMapping("/importTag")
public String importExcel(MultipartFile file, HttpServletResponse response,
@PostMapping("/importTag") @RequestParam(required = false , value = "deptIdPath") String deptIdPath) throws Exception {
public String importExcel(MultipartFile file, HttpServletResponse response, String userName = UserInfoUtils.getUserName();
@RequestParam(required = false , value = "deptIdPath") String deptIdPath) throws Exception { String userId = UserInfoUtils.getUserId();
String userName = UserInfoUtils.getUserName(); deptIdPath = UserInfoUtils.getDataRoleOrg();
if (StringUtils.isBlank(deptIdPath)) { return tagExportService.importExcel(userName, userId, deptIdPath, file);
deptIdPath = UserInfoUtils.getUserCompanyIdPath(); }
}
return tagExportService.importExcel(userName, deptIdPath, file); @ApiOperation(value = "分页获取导入日志", notes = "分页获取导入日志")
} @GetMapping(value = "/listImportTagLogByPage")
public Page searchPersonalDimensionTagByPage(
@ApiOperation(value = "分页获取导入日志", notes = "分页获取导入日志") @RequestParam(required = false , value = "deptIdPath") String deptIdPath,
@GetMapping(value = "/listImportTagLogByPage") @RequestParam("pageNo") Integer pageNo,
public Page searchPersonalDimensionTagByPage( @RequestParam("pageSize") Integer pageSize) {
@RequestParam(required = false , value = "deptIdPath") String deptIdPath, if (StringUtils.isBlank(deptIdPath)) {
@RequestParam("pageNo") Integer pageNo, deptIdPath = UserInfoUtils.getUserCompanyIdPath();
@RequestParam("pageSize") Integer pageSize) { }
if (StringUtils.isBlank(deptIdPath)) { return tagExportService.listImportlogByPage(deptIdPath, new Page(pageSize, pageNo));
deptIdPath = UserInfoUtils.getUserCompanyIdPath(); }
}
return tagExportService.listImportlogByPage(deptIdPath, new Page(pageSize, pageNo)); @ApiOperation(value = "撤销导入", notes = "撤销导入")
} @PostMapping(value = "/undoImportTag")
public void undoImportExcel(@RequestParam("importlogId") String importlogId) {
@ApiOperation(value = "撤销导入", notes = "撤销导入") tagExportService.undoImportExcel(importlogId);
@PostMapping(value = "/undoImportTag") }
public void undoImportExcel(@RequestParam("importlogId") String importlogId) {
tagExportService.undoImportExcel(importlogId);
} //----------------------以下为导入系统的时候
@PostMapping("/importSystem")
//----------------------以下为导入系统的时候 public String importSystem(MultipartFile file, HttpServletResponse response) throws Exception {
String userName = UserInfoUtils.getUserName();
@PostMapping("/importSystem") return tagExportService.importSystem(userName, file);
public String importSystem(MultipartFile file, HttpServletResponse response) throws Exception { }
String userName = UserInfoUtils.getUserName();
return tagExportService.importSystem(userName, file);
} }
}
package com.keymobile.tagmanager.model; package com.keymobile.tagmanager.model;
import java.io.Serializable; import java.io.Serializable;
import javax.persistence.Id; import javax.persistence.Id;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import com.keymobile.tagmanager.util.Constants; import com.keymobile.tagmanager.util.Constants;
import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget; import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import cn.afterturn.easypoi.handler.inter.IExcelDataModel; import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel; import cn.afterturn.easypoi.handler.inter.IExcelModel;
@ExcelTarget("20") @ExcelTarget("20")
@Document(collection="Tag") @Document(collection="Tag")
public class Tag implements Serializable, IExcelModel, IExcelDataModel{ public class Tag implements Serializable, IExcelModel, IExcelDataModel{
/** /**
* *
*/ */
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Id @Id
private String id; private String id;
@Excel(name = "名称", orderNum = "0", width=30) @Excel(name = "名称", orderNum = "0", width=30)
@NotNull @NotNull
private String name; private String name;
@Excel(name = "英文名", orderNum = "1", width=30) @Excel(name = "英文名", orderNum = "1", width=30)
private String nameEn; private String nameEn;
@Excel(name = "路径", orderNum = "2", width=30) @Excel(name = "路径", orderNum = "2", width=30)
@NotNull @NotNull
private String path; private String path;
@Excel(name = "描述", orderNum = "3", width=30) @Excel(name = "描述", orderNum = "3", width=30)
private String desc; private String desc;
private String imgId; private String imgId;
@Excel(name = "排序权重", orderNum = "4", width=30) @Excel(name = "排序权重", orderNum = "4", width=30)
private Integer order; private Integer order;
private Integer level; private Integer level;
@Excel(name = "标签类型", replace = { "系统标签_0", "自定义标签_1" }, orderNum = "5", width=30) @Excel(name = "标签类型", replace = { "系统标签_0", "自定义标签_1" }, orderNum = "5", width=30)
private String tagType; //0, 系统标签, 1 ,自定义标签 private String tagType; //0, 系统标签, 1 ,自定义标签
private String idPath; private String idPath;
private String creator; private String creator;
private String createDate; private String createDate;
private String isOpen = Constants.TAG_CLOSE_STATUS; //0 不公开, 1, 公开 private String isOpen = Constants.TAG_CLOSE_STATUS; //0 不公开, 1, 公开
private Integer domain; private Integer domain;
private String dimensionType = Constants.TAG_DIMENSION_FALSE;//0 非维度标签, 1 维度标签 private String dimensionType = Constants.TAG_DIMENSION_FALSE;//0 非维度标签, 1 维度标签
private String dept;// 部门 private String dept;// 部门
private String importId;//记录导入的Id,后面撤销用到 private String importId;//记录导入的Id,后面撤销用到
public Tag() {} //author:zhangkb time:2020-1-6 desc:添加标签创建对应的用户id,普通用户创建自定义标签有用到
private String tagUser;
public Tag(String name, String desc) {
this.name = name; public Tag() {}
this.desc = desc;
this.path = name; public Tag(String name, String desc) {
} this.name = name;
this.desc = desc;
public Tag(String parentPath, String name, String desc, String imgId) { this.path = name;
this.name = name; }
this.desc = desc;
if (StringUtils.isEmpty(parentPath)) { public Tag(String parentPath, String name, String desc, String imgId) {
this.path = name; this.name = name;
} else { this.desc = desc;
this.path = parentPath + Constants.TAG_PATH_SEPARATOR + name; if (StringUtils.isEmpty(parentPath)) {
} this.path = name;
this.imgId = imgId; } else {
} this.path = parentPath + Constants.TAG_PATH_SEPARATOR + name;
}
public void setCreateDate(String createDate) { this.imgId = imgId;
this.createDate = createDate; }
}
public void setCreateDate(String createDate) {
public String getCreateDate() { this.createDate = createDate;
return createDate; }
}
public String getCreateDate() {
public Tag(String parentPath, String name, String id) { return createDate;
this(parentPath, name, "", ""); }
this.id = id;
} public Tag(String parentPath, String name, String id) {
this(parentPath, name, "", "");
public String getId() { this.id = id;
return id; }
}
public String getId() {
public void setImportId(String importId) { return id;
this.importId = importId; }
}
public void setImportId(String importId) {
public String getImportId() { this.importId = importId;
return importId; }
}
public String getImportId() {
public void setId(String id) { return importId;
this.id = id; }
}
public void setId(String id) {
public String getName() { this.id = id;
return name; }
}
public String getName() {
public void setName(String name) { return name;
this.name = name; }
}
public void setName(String name) {
public String getNameEn() { this.name = name;
return nameEn; }
}
public String getNameEn() {
public void setNameEn(String nameEn) { return nameEn;
this.nameEn = nameEn; }
}
public void setNameEn(String nameEn) {
public String getPath() { this.nameEn = nameEn;
return path; }
}
public String getPath() {
public void setPath(String path) { return path;
this.path = path; }
}
public void setPath(String path) {
public String getDesc() { this.path = path;
return desc; }
}
public String getDesc() {
public void setDesc(String desc) { return desc;
this.desc = desc; }
}
public void setDesc(String desc) {
public String getImgId() { this.desc = desc;
return imgId; }
}
public String getImgId() {
public void setImgId(String imgId) { return imgId;
this.imgId = imgId; }
}
public void setImgId(String imgId) {
public Integer getOrder() { this.imgId = imgId;
return order; }
}
public Integer getOrder() {
public void setOrder(Integer order) { return order;
this.order = order; }
}
public void setOrder(Integer order) {
public Integer getLevel() { this.order = order;
return level; }
}
public Integer getLevel() {
public void setLevel(Integer level) { return level;
this.level = level; }
}
public void setLevel(Integer level) {
public String getTagType() { this.level = level;
return tagType; }
}
public String getTagType() {
public void setTagType(String tagType) { return tagType;
this.tagType = tagType; }
}
public void setTagType(String tagType) {
public String getCreator() { this.tagType = tagType;
return creator; }
}
public String getCreator() {
public void setCreator(String creator) { return creator;
this.creator = creator; }
}
public void setCreator(String creator) {
public String getIsOpen() { this.creator = creator;
return isOpen; }
}
public String getIsOpen() {
public void setIsOpen(String isOpen) { return isOpen;
this.isOpen = isOpen; }
}
public void setIsOpen(String isOpen) {
public Integer getDomain() { this.isOpen = isOpen;
return domain; }
}
public Integer getDomain() {
public void setDomain(Integer domain) { return domain;
this.domain = domain; }
}
public void setDomain(Integer domain) {
public void setDimensionType(String dimensionType) { this.domain = domain;
this.dimensionType = dimensionType; }
}
public void setDimensionType(String dimensionType) {
public String getDimensionType() { this.dimensionType = dimensionType;
return dimensionType; }
}
public String getDimensionType() {
public void setIdPath(String idPath) { return dimensionType;
this.idPath = idPath; }
}
public void setIdPath(String idPath) {
public String getIdPath() { this.idPath = idPath;
return idPath; }
}
public String getIdPath() {
public void setDept(String dept) { return idPath;
this.dept = dept; }
}
public void setDept(String dept) {
public String getDept() { this.dept = dept;
return dept; }
}
public String getDept() {
@Override return dept;
public String toString() { }
return "Tag [id=" + id + ", name=" + name + ", nameEn=" + nameEn + ", path=" + path + ", desc=" + desc
+ ", imgId=" + imgId + ", order=" + order + ", level=" + level + ", tagType=" + tagType + ", creator=" @Override
+ creator + ", createDate=" + createDate + ", isOpen=" + isOpen + ", domain=" + domain public String toString() {
+ ", dimensionType=" + dimensionType + "]"; return "Tag [id=" + id + ", name=" + name + ", nameEn=" + nameEn + ", path=" + path + ", desc=" + desc
} + ", imgId=" + imgId + ", order=" + order + ", level=" + level + ", tagType=" + tagType + ", creator="
+ creator + ", createDate=" + createDate + ", isOpen=" + isOpen + ", domain=" + domain
@org.springframework.data.annotation.Transient + ", dimensionType=" + dimensionType + "]";
private String errMsg; }
@org.springframework.data.annotation.Transient @org.springframework.data.annotation.Transient
private int excelRowNum; private String errMsg;
@Override @org.springframework.data.annotation.Transient
public String getErrorMsg() { private int excelRowNum;
return errMsg;
} @Override
public String getErrorMsg() {
@Override return errMsg;
public void setErrorMsg(String errorMsg) { }
this.errMsg = errorMsg;
} @Override
public void setErrorMsg(String errorMsg) {
@Override this.errMsg = errorMsg;
public Integer getRowNum() { }
return excelRowNum;
} @Override
public Integer getRowNum() {
@Override return excelRowNum;
public void setRowNum(Integer rowNum) { }
this.excelRowNum = rowNum;
} @Override
public void setRowNum(Integer rowNum) {
} this.excelRowNum = rowNum;
}
public String getTagUser() {
return tagUser;
}
public void setTagUser(String tagUser) {
this.tagUser = tagUser;
}
}
package com.keymobile.tagmanager.model.authService;
/**
* author:zhangkb time:2020-1-6 desc:定义用于接收结构信息实体
*/
public class Org {
private Long id;
private String fullName;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
}
package com.keymobile.tagmanager.remote;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import com.keymobile.tagmanager.model.authService.Org;
@FeignClient(name = "authService")
public interface AuthServiceClient {
@GetMapping(value = "/orgs/{orgId}")
public Org getOrgs(@PathVariable("orgId") String orgId);
@GetMapping(value = "/orgs/findByFullName")
public Org findByFullName(@RequestParam("orgFullName") String orgFullName);
}
package com.keymobile.tagmanager.service; package com.keymobile.tagmanager.service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order; import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.keymobile.tagmanager.model.ImportLog; import com.keymobile.tagmanager.model.ImportLog;
import com.keymobile.tagmanager.model.Page; import com.keymobile.tagmanager.model.Page;
import com.keymobile.tagmanager.model.SysTag; import com.keymobile.tagmanager.model.SysTag;
import com.keymobile.tagmanager.model.Tag; import com.keymobile.tagmanager.model.Tag;
import com.keymobile.tagmanager.persistence.TagRepository; import com.keymobile.tagmanager.persistence.TagRepository;
import com.keymobile.tagmanager.util.Constants; import com.keymobile.tagmanager.util.Constants;
import com.keymobile.tagmanager.util.DateUtils; import com.keymobile.tagmanager.util.DateUtils;
import com.keymobile.tagmanager.util.ExcelUtils; import com.keymobile.tagmanager.util.ExcelUtils;
import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler; import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
@Service @Service
public class TagFileService { public class TagFileService {
@Autowired @Autowired
private MongoOperations mongoOperations; private MongoOperations mongoOperations;
@Autowired @Autowired
private TagRepository tagRepository; private TagRepository tagRepository;
public int exportExcel(String dept, HttpServletResponse response) { public int exportExcel(String dept, HttpServletResponse response) {
List<Tag> toExportTags = mongoOperations.find(Query.query(Criteria.where("dept").is(dept) List<Tag> toExportTags = mongoOperations.find(Query.query(Criteria.where("dept").is(dept)
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE)), Tag.class); .and("dimensionType").is(Constants.TAG_DIMENSION_TRUE)), Tag.class);
// 导出操作 // 导出操作
ExcelUtils.exportExcel(toExportTags, null , "sheet1", Tag.class, "标签.xlsx", response); ExcelUtils.exportExcel(toExportTags, null , "sheet1", Tag.class, "标签.xlsx", response);
return toExportTags.size(); return toExportTags.size();
} }
public String importExcel(String userName, String dept, MultipartFile file) throws Exception { public String importExcel(String userName, String userId, String dept, MultipartFile file) throws Exception {
ImportLog importLog = new ImportLog(UUID.randomUUID().toString()); ImportLog importLog = new ImportLog(UUID.randomUUID().toString());
importLog.setCreator(userName); importLog.setCreator(userName);
importLog.setDept(dept); importLog.setDept(dept);
mongoOperations.save(importLog); mongoOperations.save(importLog);
new Thread(new ExcelImportExecutor(userName, dept, file, importLog)).start(); new Thread(new ExcelImportExecutor(userName, userId, dept, file, importLog)).start();
return "ok"; return "ok";
} }
public String importSystem(String userName, MultipartFile file) throws Exception { public String importSystem(String userName, MultipartFile file) throws Exception {
ImportLog importLog = new ImportLog(UUID.randomUUID().toString()); ImportLog importLog = new ImportLog(UUID.randomUUID().toString());
importLog.setType(Constants.SYS_TAG_LOG_TYPE); importLog.setType(Constants.SYS_TAG_LOG_TYPE);
importLog.setCreator(userName); importLog.setCreator(userName);
mongoOperations.save(importLog); mongoOperations.save(importLog);
new Thread(new SysExcelImportExecutor(userName, file, importLog)).start(); new Thread(new SysExcelImportExecutor(userName, file, importLog)).start();
return "ok"; return "ok";
} }
class SysExcelVerifyHandler implements IExcelVerifyHandler<SysTag> { class SysExcelVerifyHandler implements IExcelVerifyHandler<SysTag> {
private Map<String, SysTag> codeSysTags; private Map<String, SysTag> codeSysTags;
private Map<String, SysTag> nameSysTags; private Map<String, SysTag> nameSysTags;
public SysExcelVerifyHandler(Map<String, SysTag> codeSysTags, Map<String, SysTag> nameSysTags) { public SysExcelVerifyHandler(Map<String, SysTag> codeSysTags, Map<String, SysTag> nameSysTags) {
this.codeSysTags = codeSysTags; this.codeSysTags = codeSysTags;
this.nameSysTags = nameSysTags; this.nameSysTags = nameSysTags;
} }
@Override @Override
public ExcelVerifyHandlerResult verifyHandler(SysTag t) { public ExcelVerifyHandlerResult verifyHandler(SysTag t) {
ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true); ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true);
if (codeSysTags.get(t.getSystemCode()) != null) { if (codeSysTags.get(t.getSystemCode()) != null) {
result.setSuccess(false); result.setSuccess(false);
result.setMsg(String.format("系统代码[%s]已经存在", t.getSystemCode())); result.setMsg(String.format("系统代码[%s]已经存在", t.getSystemCode()));
} }
if (nameSysTags.get(t.getName()) != null) { if (nameSysTags.get(t.getName()) != null) {
result.setSuccess(false); result.setSuccess(false);
result.setMsg(String.format("名称[%s]已经存在", t.getName())); result.setMsg(String.format("名称[%s]已经存在", t.getName()));
} }
return result; return result;
} }
} }
class SysExcelImportExecutor implements Runnable { class SysExcelImportExecutor implements Runnable {
private MultipartFile file; private MultipartFile file;
private ImportLog importLog; private ImportLog importLog;
public SysExcelImportExecutor(String userName, MultipartFile file, ImportLog importLog) { public SysExcelImportExecutor(String userName, MultipartFile file, ImportLog importLog) {
this.file = file; this.file = file;
this.importLog = importLog; this.importLog = importLog;
} }
@Override @Override
public void run() { public void run() {
List<SysTag> tags = mongoOperations.findAll(SysTag.class); List<SysTag> tags = mongoOperations.findAll(SysTag.class);
Map<String, SysTag> codeSysTags = tags.stream().collect(Collectors.toMap(SysTag::getSystemCode, tag -> tag)); Map<String, SysTag> codeSysTags = tags.stream().collect(Collectors.toMap(SysTag::getSystemCode, tag -> tag));
Map<String, SysTag> nameSysTags = tags.stream().collect(Collectors.toMap(SysTag::getName, tag -> tag)); Map<String, SysTag> nameSysTags = tags.stream().collect(Collectors.toMap(SysTag::getName, tag -> tag));
try { try {
ImportParams params = new ImportParams(); ImportParams params = new ImportParams();
params.setTitleRows(0); params.setTitleRows(0);
params.setHeadRows(1); params.setHeadRows(1);
params.setNeedVerify(true); params.setNeedVerify(true);
params.setVerifyHandler(new SysExcelVerifyHandler(codeSysTags, nameSysTags)); params.setVerifyHandler(new SysExcelVerifyHandler(codeSysTags, nameSysTags));
ExcelImportResult<SysTag> excelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), SysTag.class, params); ExcelImportResult<SysTag> excelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), SysTag.class, params);
List<String> successIds = new ArrayList<>(); List<String> successIds = new ArrayList<>();
List<SysTag> sysTags = excelImportResult.getList(); List<SysTag> sysTags = excelImportResult.getList();
boolean hasOtherFail = false; boolean hasOtherFail = false;
for (SysTag t : sysTags) { for (SysTag t : sysTags) {
t.setId(UUID.randomUUID().toString()); t.setId(UUID.randomUUID().toString());
mongoOperations.save(t); mongoOperations.save(t);
successIds.add(t.getId()); successIds.add(t.getId());
} }
excelImportResult.getFailList().forEach(tag -> { excelImportResult.getFailList().forEach(tag -> {
importLog.appendErrorMsg(String.format("第%s行, %s", tag.getRowNum() + params.getTitleRows() + params.getReadRows(), tag.getErrorMsg())); importLog.appendErrorMsg(String.format("第%s行, %s", tag.getRowNum() + params.getTitleRows() + params.getReadRows(), tag.getErrorMsg()));
}); });
importLog.setHasFailNum(!excelImportResult.getFailList().isEmpty() || hasOtherFail); importLog.setHasFailNum(!excelImportResult.getFailList().isEmpty() || hasOtherFail);
importLog.setTotalNum(excelImportResult.getList().size() + excelImportResult.getFailList().size()); importLog.setTotalNum(excelImportResult.getList().size() + excelImportResult.getFailList().size());
importLog.setSuccessIds(successIds); importLog.setSuccessIds(successIds);
importLog.setReport(importLog.generateReport()); importLog.setReport(importLog.generateReport());
} catch (Exception e) { } catch (Exception e) {
importLog.appendErrorMsg(e.getCause().getMessage()); importLog.appendErrorMsg(e.getCause().getMessage());
} finally { } finally {
importLog.setEndTime(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss")); importLog.setEndTime(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
importLog.setHasFinish(true); importLog.setHasFinish(true);
mongoOperations.save(importLog); mongoOperations.save(importLog);
} }
} }
} }
class ExcelImportExecutor implements Runnable{ class ExcelImportExecutor implements Runnable{
private String dept; private String dept;
private MultipartFile file; private MultipartFile file;
private ImportLog importLog; private ImportLog importLog;
private String userName; private String userName;
public ExcelImportExecutor(String userName, String dept, MultipartFile file, ImportLog importLog) { private String userId;
this.userName = userName; public ExcelImportExecutor(String userName, String userId, String dept,
this.dept = dept; MultipartFile file, ImportLog importLog) {
this.file = file; this.userName = userName;
this.importLog = importLog; this.userId = userId;
} this.dept = dept;
@Override this.file = file;
public void run() { this.importLog = importLog;
List<Tag> dimensionTags = mongoOperations.find(Query.query( }
Criteria.where("dept").is(dept).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE)), @Override
Tag.class); public void run() {
Map<String, Tag> pathTags = dimensionTags.stream().collect(Collectors.toMap(Tag::getPath, tag -> tag)); List<Tag> dimensionTags = mongoOperations.find(Query.query(
try { Criteria.where("dept").is(dept).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE)),
ImportParams params = new ImportParams(); Tag.class);
params.setTitleRows(0); Map<String, Tag> pathTags = dimensionTags.stream().collect(Collectors.toMap(Tag::getPath, tag -> tag));
params.setHeadRows(1); try {
params.setNeedVerify(true); ImportParams params = new ImportParams();
params.setVerifyHandler(new ExcelVerifyHandler(pathTags)); params.setTitleRows(0);
ExcelImportResult<Tag> excelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), Tag.class, params); params.setHeadRows(1);
List<String> successIds = new ArrayList<>(); params.setNeedVerify(true);
List<Tag> tags = excelImportResult.getList(); params.setVerifyHandler(new ExcelVerifyHandler(pathTags));
tags.forEach(tag -> { ExcelImportResult<Tag> excelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), Tag.class, params);
tag.setId(UUID.randomUUID().toString()); List<String> successIds = new ArrayList<>();
pathTags.put(tag.getPath(), tag); List<Tag> tags = excelImportResult.getList();
}); tags.forEach(tag -> {
tag.setId(UUID.randomUUID().toString());
boolean hasOtherFail = false; pathTags.put(tag.getPath(), tag);
for (Tag t : tags) { });
String parentIdPath = "";
if (t.getPath().split(Constants.TAG_PATH_SEPARATOR).length > 1) { boolean hasOtherFail = false;
String parentPath = t.getPath().substring(0, t.getPath().lastIndexOf(Constants.TAG_PATH_SEPARATOR)); for (Tag t : tags) {
if (pathTags.get(parentPath) == null) { String parentIdPath = "";
importLog.appendErrorMsg(String.format("第%s行, 路径为[%s]的标签找不到父节点", t.getRowNum(), t.getPath())); if (t.getPath().split(Constants.TAG_PATH_SEPARATOR).length > 1) {
hasOtherFail = true; String parentPath = t.getPath().substring(0, t.getPath().lastIndexOf(Constants.TAG_PATH_SEPARATOR));
continue; if (pathTags.get(parentPath) == null) {
} else { importLog.appendErrorMsg(String.format("第%s行, 路径为[%s]的标签找不到父节点", t.getRowNum(), t.getPath()));
//主题域,HSE,物资 hasOtherFail = true;
String[] ts = parentPath.split(Constants.TAG_PATH_SEPARATOR); continue;
List<String> parentIdList = new LinkedList<>(); } else {
List<String> path = new LinkedList<>(); //主题域,HSE,物资
for (int a = 0; a < ts.length; a++) { String[] ts = parentPath.split(Constants.TAG_PATH_SEPARATOR);
path.add(ts[a]); List<String> parentIdList = new LinkedList<>();
parentIdList.add(pathTags.get(String.join(Constants.TAG_PATH_SEPARATOR, path)).getId()); List<String> path = new LinkedList<>();
} for (int a = 0; a < ts.length; a++) {
parentIdPath = String.join(Constants.TAG_PATH_SEPARATOR, parentIdList); path.add(ts[a]);
} parentIdList.add(pathTags.get(String.join(Constants.TAG_PATH_SEPARATOR, path)).getId());
} }
t.setIdPath(parentIdPath + Constants.TAG_PATH_SEPARATOR + t.getId()); parentIdPath = String.join(Constants.TAG_PATH_SEPARATOR, parentIdList);
t.setLevel(t.getPath().split(",").length); }
t.setCreator(userName); }
t.setDept(dept); t.setIdPath(parentIdPath + Constants.TAG_PATH_SEPARATOR + t.getId());
t.setDimensionType(Constants.TAG_DIMENSION_TRUE); t.setLevel(t.getPath().split(",").length);
t.setCreateDate(DateUtils.formatDate(new Date(), "yyyy-MM-dd")); t.setCreator(userName);
t.setImportId(importLog.getId()); t.setTagUser(userId);
t = tagRepository.save(t); t.setDept(dept);
successIds.add(t.getId()); t.setDimensionType(Constants.TAG_DIMENSION_TRUE);
} t.setCreateDate(DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
excelImportResult.getFailList().forEach(tag -> { t.setImportId(importLog.getId());
importLog.appendErrorMsg(String.format("第%s行, %s", tag.getRowNum() + params.getTitleRows() + params.getReadRows(), tag.getErrorMsg())); t = tagRepository.save(t);
}); successIds.add(t.getId());
importLog.setHasFailNum(!excelImportResult.getFailList().isEmpty() || hasOtherFail); }
importLog.setTotalNum(excelImportResult.getList().size() + excelImportResult.getFailList().size()); excelImportResult.getFailList().forEach(tag -> {
importLog.setSuccessIds(successIds); importLog.appendErrorMsg(String.format("第%s行, %s", tag.getRowNum() + params.getTitleRows() + params.getReadRows(), tag.getErrorMsg()));
importLog.setReport(importLog.generateReport()); });
} catch (Exception e) { importLog.setHasFailNum(!excelImportResult.getFailList().isEmpty() || hasOtherFail);
importLog.appendErrorMsg(e.getCause().getMessage()); importLog.setTotalNum(excelImportResult.getList().size() + excelImportResult.getFailList().size());
} finally { importLog.setSuccessIds(successIds);
importLog.setEndTime(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss")); importLog.setReport(importLog.generateReport());
importLog.setHasFinish(true); } catch (Exception e) {
mongoOperations.save(importLog); importLog.appendErrorMsg(e.getCause().getMessage());
} } finally {
importLog.setEndTime(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
} importLog.setHasFinish(true);
} mongoOperations.save(importLog);
}
class ExcelVerifyHandler implements IExcelVerifyHandler<Tag> {
}
private Map<String, Tag> tags; }
public ExcelVerifyHandler(Map<String, Tag> tags) {
this.tags = tags; class ExcelVerifyHandler implements IExcelVerifyHandler<Tag> {
}
@Override private Map<String, Tag> tags;
public ExcelVerifyHandlerResult verifyHandler(Tag t) { public ExcelVerifyHandler(Map<String, Tag> tags) {
ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true); this.tags = tags;
if (!Constants.TAG_SYSTEM_TYPE.equals(t.getTagType()) }
&& !Constants.TAG_PERSONAL_TYPE.equals(t.getTagType())) { @Override
result.setSuccess(false); public ExcelVerifyHandlerResult verifyHandler(Tag t) {
result.setMsg(String.format("标签类型错误,不能为[%s]", t.getTagType())); ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true);
} if (!Constants.TAG_SYSTEM_TYPE.equals(t.getTagType())
if (tags.get(t.getPath()) != null && !Constants.TAG_PERSONAL_TYPE.equals(t.getTagType())) {
&& tags.get(t.getPath()).getTagType().equals(t.getTagType())) { result.setSuccess(false);
result.setSuccess(false); result.setMsg(String.format("标签类型错误,不能为[%s]", t.getTagType()));
result.setMsg(String.format("标签类型为[%s], 路径为[%s]的标签已经存在", }
Constants.TAG_PERSONAL_TYPE.equals(t.getTagType()) ? "个人标签" : "系统标签", t.getPath())); if (tags.get(t.getPath()) != null
} && tags.get(t.getPath()).getTagType().equals(t.getTagType())) {
if (!t.getPath().endsWith(t.getName())) { result.setSuccess(false);
result.setSuccess(false); result.setMsg(String.format("标签类型为[%s], 路径为[%s]的标签已经存在",
result.setMsg(String.format("名称和路径不匹配,名称为[%s],路径为[%s]", t.getName(), t.getPath())); Constants.TAG_PERSONAL_TYPE.equals(t.getTagType()) ? "个人标签" : "系统标签", t.getPath()));
} }
return result; if (!t.getPath().endsWith(t.getName())) {
} result.setSuccess(false);
} result.setMsg(String.format("名称和路径不匹配,名称为[%s],路径为[%s]", t.getName(), t.getPath()));
}
public Page listImportlogByPage(String dept, Page page) { return result;
Query q = createImportlogPageQuery(dept, page); }
List<ImportLog> logs = mongoOperations }
.find(q, ImportLog.class);
long count = mongoOperations.count(q, ImportLog.class); public Page listImportlogByPage(String dept, Page page) {
page.setData(logs); Query q = createImportlogPageQuery(dept, page);
page.setTotal(count); List<ImportLog> logs = mongoOperations
return page; .find(q, ImportLog.class);
} long count = mongoOperations.count(q, ImportLog.class);
page.setData(logs);
private Query createImportlogPageQuery(String dept, Page page) { page.setTotal(count);
Query q = new Query(); return page;
q.addCriteria(Criteria.where("type").is(Constants.COMMON_TAG_LOG_TYPE)); }
q.addCriteria(Criteria.where("dept").is(dept));
q.skip(page.getOffset()); private Query createImportlogPageQuery(String dept, Page page) {
q.limit(page.getPageSize()); Query q = new Query();
q.with(Sort.by(Arrays.asList(new Order(Direction.DESC, "startTime")))); q.addCriteria(Criteria.where("type").is(Constants.COMMON_TAG_LOG_TYPE));
return q; q.addCriteria(Criteria.where("dept").is(dept));
} q.skip(page.getOffset());
q.limit(page.getPageSize());
public void undoImportExcel(String importlogId) { q.with(Sort.by(Arrays.asList(new Order(Direction.DESC, "startTime"))));
mongoOperations.remove(Query.query(Criteria.where("importId").is(importlogId)), Tag.class); return q;
} }
} public void undoImportExcel(String importlogId) {
mongoOperations.remove(Query.query(Criteria.where("importId").is(importlogId)), Tag.class);
}
}
package com.keymobile.tagmanager.service; package com.keymobile.tagmanager.service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order; import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.keymobile.tagmanager.exception.TagDuplicateException; import com.keymobile.tagmanager.exception.TagDuplicateException;
import com.keymobile.tagmanager.exception.TagException; import com.keymobile.tagmanager.exception.TagException;
import com.keymobile.tagmanager.exception.TagNotExistException; import com.keymobile.tagmanager.exception.TagNotExistException;
import com.keymobile.tagmanager.model.ExtTag; import com.keymobile.tagmanager.model.ExtTag;
import com.keymobile.tagmanager.model.Page; import com.keymobile.tagmanager.model.Page;
import com.keymobile.tagmanager.model.SysTag; import com.keymobile.tagmanager.model.SysTag;
import com.keymobile.tagmanager.model.Tag; import com.keymobile.tagmanager.model.Tag;
import com.keymobile.tagmanager.persistence.TagRepository; import com.keymobile.tagmanager.model.authService.Org;
import com.keymobile.tagmanager.util.Constants; import com.keymobile.tagmanager.persistence.TagRepository;
import com.keymobile.tagmanager.util.JsonTreeHelper; import com.keymobile.tagmanager.remote.AuthServiceClient;
import com.keymobile.tagmanager.util.JsonTreeHelper.JsonNode; import com.keymobile.tagmanager.util.Constants;
import com.keymobile.tagmanager.util.JsonTreeHelper;
@Service import com.keymobile.tagmanager.util.JsonTreeHelper.JsonNode;
public class TagService {
@Service
@Autowired public class TagService {
private MongoOperations mongoOperations;
@Autowired @Autowired
private TagRepository tagRepository; private MongoOperations mongoOperations;
@Autowired
private Logger logger = LoggerFactory.getLogger(TagService.class); private TagRepository tagRepository;
@Autowired
public Tag addOrUpdateTag(String parentId, Tag tag, String userName) throws TagNotExistException, TagDuplicateException, TagException { private AuthServiceClient authService;
String originId = tag.getId();
if (StringUtils.isNotBlank(parentId)) { private Logger logger = LoggerFactory.getLogger(TagService.class);
Tag parent = getTagById(parentId);
String parentIdPath = parent.getIdPath(); //新增或修改标签
String tagId = StringUtils.isNotBlank(originId) ? originId : UUID.randomUUID().toString(); public Tag addOrUpdateTag(String parentId, Tag tag, String userName) throws TagNotExistException, TagDuplicateException, TagException {
tag.setId(tagId); //定义保存原来的id
tag.setIdPath(parentIdPath + Constants.TAG_PATH_SEPARATOR + tagId); String originId = tag.getId();
tag.setPath(parent.getPath() + Constants.TAG_PATH_SEPARATOR + tag.getName()); if (StringUtils.isNotBlank(parentId)) {//如果新增子节点
} else { //根据父节点id获取对应的父标签
tag.setPath(tag.getName()); Tag parentTag = getTagById(parentId);
String tagId = StringUtils.isNotBlank(originId) ? originId : UUID.randomUUID().toString(); //设置新增标签的idpath和path
tag.setId(tagId); String tagId = StringUtils.isNotBlank(originId) ? originId : UUID.randomUUID().toString();
tag.setIdPath(tagId); tag.setId(tagId);
} tag.setIdPath(parentTag.getIdPath() + Constants.TAG_PATH_SEPARATOR + tagId);
changeNameToAvoidConflict(tag, userName); tag.setPath(parentTag.getPath() + Constants.TAG_PATH_SEPARATOR + tag.getName());
checkTagValid(tag, userName); }else {//如果是新增根目录
if (StringUtils.isNotBlank(originId)) { String tagId = StringUtils.isNotBlank(originId) ? originId : UUID.randomUUID().toString();
//update tag.setId(tagId);
Tag origin = mongoOperations.findOne(Query.query(Criteria.where("_id").is(tag.getId())), Tag.class); tag.setIdPath(tagId);
List<Tag> relationNamepathTags = mongoOperations.find( tag.setPath(tag.getName());
Query.query(createRelationNamepathCriteria(userName, origin)), Tag.class); }
relationNamepathTags.forEach(p -> { changeNameToAvoidConflict(tag, userName);
p.setIdPath(p.getIdPath().replaceAll(origin.getIdPath(), tag.getIdPath())); checkTagValid(tag, userName);
p.setPath(p.getPath().replaceAll(origin.getPath(), tag.getPath())); if (StringUtils.isNotBlank(originId)) {
p.setLevel(p.getPath().split(",").length); //update
}); Tag origin = mongoOperations.findOne(Query.query(Criteria.where("_id").is(tag.getId())), Tag.class);
tagRepository.saveAll(relationNamepathTags); List<Tag> relationNamepathTags = mongoOperations.find(
} Query.query(createRelationNamepathCriteria(userName, origin)), Tag.class);
tag.setLevel(tag.getPath().split(",").length); relationNamepathTags.forEach(p -> {
return tagRepository.save(tag); p.setIdPath(p.getIdPath().replaceAll(origin.getIdPath(), tag.getIdPath()));
} p.setPath(p.getPath().replaceAll(origin.getPath(), tag.getPath()));
p.setLevel(p.getPath().split(",").length);
private void changeNameToAvoidConflict(Tag tag, String userName) { });
Tag t = mongoOperations.findOne(Query.query(Criteria.where("path").is(tag.getPath()) tagRepository.saveAll(relationNamepathTags);
.and("dept").is(tag.getDept()) }
.and("creator").ne(userName)), Tag.class); tag.setLevel(tag.getPath().split(",").length);
if (t != null) { return tagRepository.save(tag);
String changeName = String.format("%s(%s)", t.getName(), userName); }
logger.info(String.format("other creator has create same name in target, change tagName to %s", changeName));
tag.setName(changeName); //删除标签
tag.setPath(t.getPath().substring(0, t.getPath().lastIndexOf(Constants.TAG_PATH_SEPARATOR)) + t.getName()); public void deleteTag(String tagId, String userName) throws TagException {
} Optional<Tag> optional = tagRepository.findById(tagId);
} if (optional.isPresent()) {
Tag parentTag = optional.get();
private Criteria createRelationNamepathCriteria(String userName, Tag origin) { List<Tag> childs = mongoOperations.find(Query.query(createRelationNamepathCriteria(userName,
if (Constants.TAG_DIMENSION_TRUE.equals(origin.getDimensionType())) { parentTag)), Tag.class);
return Criteria.where("path").regex("^" + origin.getPath() + Constants.TAG_PATH_SEPARATOR).and("dept").is(origin.getDept()); if (!childs.isEmpty()) {
} throw new TagException("存在子节点,不允许删除!");
return Criteria.where("path").regex("^" + origin.getPath() + Constants.TAG_PATH_SEPARATOR) }
.and("creator").is(userName); tagRepository.deleteById(tagId);
} }
}
public Tag getTagById(String tagId) throws TagNotExistException {
Tag t = mongoOperations.findOne(Query.query(Criteria.where("_id").is(tagId)), Tag.class); //判断标签是否有子节点
if (t == null) public boolean hasChild(String tagId, String userName) throws TagException {
throw new TagNotExistException("ID=[" + tagId + "] tag not exist!"); Optional<Tag> optional = tagRepository.findById(tagId);
return t; if (optional.isPresent()) {
} Tag parentTag = optional.get();
List<Tag> childs = mongoOperations.find(Query.query(createRelationNamepathCriteria(userName, parentTag)), Tag.class);
return !childs.isEmpty();
private void checkTagValid(Tag tag, String userName) throws TagDuplicateException, TagException { }
if (!Constants.TAG_PERSONAL_TYPE.equals(tag.getTagType()) return false;
&& !Constants.TAG_SYSTEM_TYPE.equals(tag.getTagType())) { }
throw new TagException(String.format("No such tagType %s", tag.getTagType()));
} //根据标签id获取标签
Tag t = mongoOperations.findOne(Query.query(Criteria.where("path").is(tag.getPath()) public Tag getTagById(String tagId) throws TagNotExistException {
.and("creator").is(userName)), Tag.class); Tag t = mongoOperations.findOne(Query.query(Criteria.where("_id").is(tagId)), Tag.class);
if (t != null && !t.getId().equals(tag.getId())) if (t == null)
throw new TagDuplicateException("标签 [" + tag.getName() + "] 已经存在!"); throw new TagNotExistException("ID=[" + tagId + "] tag not exist!");
return t;
} }
public JsonNode[] queryPersonalTagAsTree(String parentId, String userName, String dept) throws TagNotExistException { //获取维度标签树
List<Tag> tags = new ArrayList<>(); public JsonNode[] queryDimensionTagAsTree(String dept, String parentId) throws TagNotExistException {
if (StringUtils.isEmpty(parentId)) { List<Tag> tags = new ArrayList<>();
tags = mongoOperations.find(createPersonalTagQuery(userName, dept), Tag.class); if (StringUtils.isEmpty(parentId)) {//从根节点开始获取
} else { tags = mongoOperations.find(createDimensionTagQuery(dept), Tag.class);
Tag parentTag = getTagById(parentId); } else {
tags = getPersonSubTag(parentTag, userName); Tag parentTag = getTagById(parentId);
tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName()))); //获取父节点标签下的所有子标签
} tags = getDimensionSubTag(parentTag);
List<JsonNode> nodes = new ArrayList<>(); //tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName())));
tags.forEach(p -> { }
JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath()); List<JsonNode> nodes = new ArrayList<>();
nodes.add(node); tags.forEach(p -> {
}); JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath());
JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR); nodes.add(node);
if (root.children != null) });
return root.children; //自定拼接成树结构
else JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR);
return new JsonNode[] {}; if (root.children != null) {
} return root.children;
}
private Query createPersonalTagQuery(String userName, String dept, Criteria... serachCriterias) { else {
return Query.query( return new JsonNode[] {};
createPersonalTagCriteria(userName, dept, null)) }
.with(Sort.by(getDefaultTagOrders())); }
}
//获取个人标签树
private Criteria createPersonalTagCriteria(String userName, String dept, String path) { public JsonNode[] queryPersonalTagAsTree(String parentId, String userId,
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE) String dept)
.and("dept").is(dept); throws TagNotExistException{
if (StringUtils.isNotBlank(path)) { List<Tag> tags = new ArrayList<>();
criteria = criteria.and("path").regex("^"+path);; //根据用户机构id获取机构信息
} Org org = authService.getOrgs(dept);
return criteria.orOperator( if(org==null) {
Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE), throw new TagNotExistException("get org by id error;");
Criteria.where("isOpen").is(Constants.TAG_OPEN_STATUS), }
Criteria.where("creator").is(userName)); //获取机构fullname
} String fullname = org.getFullName();
//分隔fullname
private Criteria createSystemTagCriteria(String path) { String[] fullnames = fullname.split(",");
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_SYSTEM_TYPE); //如果fullname没有两层结构
if (StringUtils.isNotBlank(path)) { if(fullnames.length<2) {
return criteria.and("path").regex("^"+path); throw new TagNotExistException("get org by id the fullname:"+fullname+" at least 2 level;");
} }
return criteria; String companyPath = fullnames[0]+Constants.TAG_PATH_SEPARATOR+fullnames[1];
} //根据companyPath获取机构信息
Org companyOrg = authService.findByFullName(companyPath);
private Criteria createPersonalDimensionTagCriteria(String userName, String dept) { if(companyOrg==null) {
return Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE) throw new TagNotExistException("get company org by fullname is null;");
.and("dept").is(dept).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE); }
} String companyOrgId = String.valueOf(companyOrg.getId());
if (StringUtils.isEmpty(parentId)) {//从根目录开始查找
//
private Query createPersonalExcludeOpenTypeTagQuery(String userName, String dept) { tags = mongoOperations.find(this.createNewPersonalTagQuery(userId, dept, companyOrgId), Tag.class);
return Query.query(Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE) }else {
.and("dept").is(dept) Tag parentTag = getTagById(parentId);
.orOperator( tags = this.getNewPersonSubTag(parentTag, userId, dept, companyOrgId);
Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE), }
Criteria.where("creator").is(userName))) List<JsonNode> nodes = new ArrayList<>();
.with(Sort.by(getDefaultTagOrders())); tags.forEach(p -> {
} JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath());
nodes.add(node);
private List<Order> getDefaultTagOrders() { });
List<Order> orders = new ArrayList<>(); JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR);
orders.add(new Order(Direction.ASC, "level")); if (root.children != null) {
orders.add(new Order(Direction.DESC, "order")); return root.children;
return orders; }else {
} return new JsonNode[] {};
}
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) public Page searchPersonalDimensionTagByPage(String userName, String dept, String keyword, String path, Integer domain, Page page) {
.orOperator( Criteria andCriterias = createPersonalDimensionTagCriteria(userName, dept);
Criteria.where("openStatus").is(Constants.TAG_OPEN_STATUS), if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) {
Criteria.where("creator").is(userName))) andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword));
.with(Sort.by(getDefaultTagOrders())), Tag.class); }
dirs.add(parentTag); Query q = createPageQuery(page, andCriterias);
return dirs; List<Tag> tags = mongoOperations.find(q, Tag.class);
} long count = mongoOperations.count(q, Tag.class);
page.setData(decoratorToExtTag(tags, userName));
page.setTotal(count);
public Page searchPersonalTagByPage(String userName, String dept, String keyword, String path, Integer domain, Page page) { return page;
Criteria andCriterias = createPersonalTagCriteria(userName, dept, path); }
if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) {
andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword)); //根据关键字查找系统标签
} public Page searchSystemTagByPage(String userName, String keyword, String path, Integer domain, Page page) {
Query q = new Query(andCriterias); Criteria andCriterias = createSystemTagCriteria(path);
q.skip(page.getOffset()); if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) {
q.limit(page.getPageSize()); andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword));
List<Tag> tags = mongoOperations }
.find(q, Tag.class); Query q = createPageQuery(page, andCriterias);
long count = mongoOperations.count(q, Tag.class); List<Tag> tags = mongoOperations.find(q, Tag.class);
page.setData(decoratorToExtTag(tags, userName)); long count = mongoOperations.count(q, Tag.class);
page.setTotal(count); page.setData(decoratorToExtTag(tags, userName));
return page; page.setTotal(count);
return page;
} }
private Criteria createKeywordRegexQuery(List<String> asList, String keyword) { //根据关键字查找个人标签
Criteria criteriaSearch = new Criteria(); public Page searchPersonalTagByPage(String userName, String dept, String keyword, String path, Integer domain, Page page) {
return criteriaSearch.orOperator(asList.stream().map(col -> { Criteria andCriterias = createPersonalTagCriteria(userName, dept, path);
return Criteria.where(col).regex(keyword, "i"); if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) {
}).collect(Collectors.toList()).toArray(new Criteria[0])); andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword));
} }
Query q = new Query(andCriterias);
private Criteria createPathRegexQuery(String path) { q.skip(page.getOffset());
return Criteria.where("path").regex("^"+path); q.limit(page.getPageSize());
} List<Tag> tags = mongoOperations.find(q, Tag.class);
long count = mongoOperations.count(q, Tag.class);
public JsonNode[] querySystemTagAsTree(String parentId) throws TagNotExistException { page.setData(decoratorToExtTag(tags, userName));
List<Tag> tags = new ArrayList<>(); page.setTotal(count);
if (StringUtils.isEmpty(parentId)) { return page;
tags = mongoOperations.find(Query.query(Criteria }
.where("tagType").is(Constants.TAG_SYSTEM_TYPE)).with(Sort.by(getDefaultTagOrders())), Tag.class);
} else { //获取系统标签树
Tag parentTag = getTagById(parentId); public JsonNode[] querySystemTagAsTree(String parentId) throws TagNotExistException {
tags = getSystemSubTag(parentTag); List<Tag> tags = new ArrayList<>();
tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName()))); if (StringUtils.isEmpty(parentId)) {
} tags = mongoOperations.find(Query.query(Criteria
List<JsonNode> nodes = new ArrayList<>(); .where("tagType").is(Constants.TAG_SYSTEM_TYPE)).with(Sort.by(getDefaultTagOrders())), Tag.class);
tags.forEach(p -> { } else {
JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath()); Tag parentTag = getTagById(parentId);
nodes.add(node); tags = getSystemSubTag(parentTag);
}); //tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName())));
JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR); }
if (root.children != null) List<JsonNode> nodes = new ArrayList<>();
return root.children; tags.forEach(p -> {
else JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath());
return new JsonNode[] {}; nodes.add(node);
} });
JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR);
public Page searchSystemTagByPage(String userName, String keyword, String path, Integer domain, Page page) { if (root.children != null)
Criteria andCriterias = createSystemTagCriteria(path); return root.children;
if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) { else
andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword)); return new JsonNode[] {};
} }
Query q = createPageQuery(page, andCriterias);
List<Tag> tags = mongoOperations.find(q, Tag.class); //获取新增个人标签加载上级标签树接口
long count = mongoOperations.count(q, Tag.class); public JsonNode[] queryPersonalTagExcludeOpenTypeAsTree(String parentId, String userName, String dept) throws TagNotExistException {
page.setData(decoratorToExtTag(tags, userName)); List<Tag> tags = new ArrayList<>();
page.setTotal(count); //根据普通用户机构id获取机构信息
return page; Org org = authService.getOrgs(dept);
} if(org==null) {
throw new TagNotExistException("get org by id error;");
private Query createPageQuery(Page page, Criteria andCriterias) { }
Query q = new Query(andCriterias); //获取机构fullname
q.skip(page.getOffset()); String fullname = org.getFullName();
q.limit(page.getPageSize()); //分隔fullname
q.with(Sort.by(getDefaultTagOrders())); String[] fullnames = fullname.split(",");
return q; //如果fullname没有两层结构
} if(fullnames.length<2) {
throw new TagNotExistException("get org by id the fullname:"+fullname+" at least 2 level;");
private List<ExtTag> decoratorToExtTag(List<Tag> tags, String userName) { }
return tags.stream().map(t -> { String companyPath = fullnames[0]+Constants.TAG_PATH_SEPARATOR+fullnames[1];
return new ExtTag(t, t.getCreator().equals(userName) ? Constants.TAG_OPERABLE_TRUE : //根据companyPath获取机构信息
Constants.TAG_OPERABLE_FALSE); Org companyOrg = authService.findByFullName(companyPath);
}).collect(Collectors.toList()); if(companyOrg==null) {
} throw new TagNotExistException("get company org by fullname is null;");
}
private List<Tag> getSystemSubTag(Tag parentTag) { String companyOrgId = String.valueOf(companyOrg.getId());
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path") if (StringUtils.isEmpty(parentId)) {
.regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR) tags = mongoOperations.find(createPersonalExcludeOpenTypeTagQuery(userName, companyOrgId), Tag.class);
.and("tagType").is(Constants.TAG_SYSTEM_TYPE)) }
.with(Sort.by(getDefaultTagOrders())), Tag.class); /**else {
dirs.add(parentTag); Tag parentTag = getTagById(parentId);
return dirs; tags = getPersonSubTag(parentTag, userName);
} //tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName())));
}*/
public void deleteTag(String tagId, String userName) throws TagException { List<JsonNode> nodes = new ArrayList<>();
Optional<Tag> optional = tagRepository.findById(tagId); tags.forEach(p -> {
if (optional.isPresent()) { JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath());
Tag parentTag = optional.get(); nodes.add(node);
List<Tag> childs = mongoOperations.find(Query.query(createRelationNamepathCriteria(userName, parentTag)), Tag.class); });
if (!childs.isEmpty()) { JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR);
throw new TagException("存在子节点,不允许删除!"); if (root.children != null) {
} return root.children;
tagRepository.deleteById(tagId); }
} else {
} return new JsonNode[] {};
}
public boolean hasChild(String tagId, String userName) throws TagException { }
Optional<Tag> optional = tagRepository.findById(tagId);
if (optional.isPresent()) {
Tag parentTag = optional.get();
List<Tag> childs = mongoOperations.find(Query.query(createRelationNamepathCriteria(userName, parentTag)), Tag.class); //如果标签存在冲突,修改当前标签名字和路径
return !childs.isEmpty(); private void changeNameToAvoidConflict(Tag tag, String userName) {
} Tag t = mongoOperations.findOne(Query.query(Criteria.where("path").is(tag.getPath())
return false; .and("dept").is(tag.getDept())
} .and("creator").ne(userName)), Tag.class);
if (t != null) {
public void shareTags(List<String> tagIds) { String changeName = String.format("%s(%s)", t.getName(), userName);
Iterable<Tag> tags = tagRepository.findAllById(tagIds); logger.info(String.format("other creator has create same name in target, change tagName to %s", changeName));
tags.forEach(t -> { tag.setName(changeName);
t.setIsOpen(Constants.TAG_OPEN_STATUS); tag.setPath(t.getPath().substring(0, t.getPath().lastIndexOf(Constants.TAG_PATH_SEPARATOR)) + t.getName());
}); }
tagRepository.saveAll(tags); }
} //拼接path和username的查询条件
private Criteria createRelationNamepathCriteria(String userName, Tag origin) {
public JsonNode[] queryDimensionTagAsTree(String dept, String parentId) throws TagNotExistException { if (Constants.TAG_DIMENSION_TRUE.equals(origin.getDimensionType())) {
List<Tag> tags = new ArrayList<>(); return Criteria.where("path").regex("^" + origin.getPath() + Constants.TAG_PATH_SEPARATOR).and("dept").is(origin.getDept());
if (StringUtils.isEmpty(parentId)) { }
tags = mongoOperations.find(createDimensionTagQuery(dept), Tag.class); return Criteria.where("path").regex("^" + origin.getPath() + Constants.TAG_PATH_SEPARATOR)
} else { .and("creator").is(userName);
Tag parentTag = getTagById(parentId); }
tags = getDimensionSubTag(parentTag); //判断标签是否已经存在
tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName()))); private void checkTagValid(Tag tag, String userName) throws TagDuplicateException, TagException {
} if (!Constants.TAG_PERSONAL_TYPE.equals(tag.getTagType())
List<JsonNode> nodes = new ArrayList<>(); && !Constants.TAG_SYSTEM_TYPE.equals(tag.getTagType())) {
tags.forEach(p -> { throw new TagException(String.format("No such tagType %s", tag.getTagType()));
JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath()); }
nodes.add(node); Tag t = mongoOperations.findOne(Query.query(Criteria.where("path").is(tag.getPath())
}); .and("creator").is(userName)), Tag.class);
JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR); if (t != null && !t.getId().equals(tag.getId()))
if (root.children != null) throw new TagDuplicateException("标签 [" + tag.getName() + "] 已经存在!");
return root.children;
else }
return new JsonNode[] {}; //拼接个人维度标签树查询条件
} private Query createDimensionTagQuery(String dept) {
return Query.query(Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE)
private List<Tag> getDimensionSubTag(Tag parentTag) { .and("tagType").is(Constants.TAG_PERSONAL_TYPE)
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path") .and("dept").is(dept))
.regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR) .with(Sort.by(getDefaultTagOrders()));
.and("dimensionType").is(Constants.TAG_DIMENSION_TRUE) }
.and("dept").is(parentTag.getDept())) //根据机构获取当前维度标签的所有子标签
.with(Sort.by(getDefaultTagOrders())), Tag.class); private List<Tag> getDimensionSubTag(Tag parentTag) {
dirs.add(parentTag); List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
return dirs; .regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
} .and("dimensionType").is(Constants.TAG_DIMENSION_TRUE)
.and("dept").is(parentTag.getDept()))
private Query createDimensionTagQuery(String dept) { .with(Sort.by(getDefaultTagOrders())), Tag.class);
return Query.query(Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE) dirs.add(parentTag);
.and("tagType").is(Constants.TAG_PERSONAL_TYPE) return dirs;
.and("dept").is(dept)) }
.with(Sort.by(getDefaultTagOrders())); //拼接默认配许条件
} private List<Order> getDefaultTagOrders() {
List<Order> orders = new ArrayList<>();
public JsonNode[] queryPersonalTagExcludeOpenTypeAsTree(String parentId, String userName, String dept) throws TagNotExistException { orders.add(new Order(Direction.ASC, "level"));
List<Tag> tags = new ArrayList<>(); orders.add(new Order(Direction.DESC, "order"));
if (StringUtils.isEmpty(parentId)) { return orders;
tags = mongoOperations.find(createPersonalExcludeOpenTypeTagQuery(userName, dept), Tag.class); }
} else { //拼接查找个人标签条件
Tag parentTag = getTagById(parentId); private Query createNewPersonalTagQuery(String userId,String deptId,
tags = getPersonSubTag(parentTag, userName); String companyId) {
tags.forEach(tag -> tag.setPath(tag.getPath().replaceAll(parentTag.getPath(), parentTag.getName()))); Criteria criteria = Criteria.where("tagType").is("1");//获取自定义标签
} criteria.orOperator(
List<JsonNode> nodes = new ArrayList<>(); Criteria.where("dept").is(companyId),//标签是维度管理员机构的
tags.forEach(p -> { Criteria.where("dept").is(deptId).and("tagUser").is(userId)//标签是普通用户结构且普通用户名创建
JsonNode node = new JsonNode(p.getPath(), p.getId(), p.getPath(), p.getIdPath()); /**,Criteria.where("path").regex("^"+companyPath + Constants.TAG_PATH_SEPARATOR)
nodes.add(node); .and("isOpen").is(Constants.TAG_OPEN_STATUS)*/);//标签是维度标签路径下的
}); return Query.query(criteria)
JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR); .with(Sort.by(getDefaultTagOrders()));
if (root.children != null) }
return root.children; //根据父标签查找子标签
else private List<Tag> getNewPersonSubTag(Tag parentTag, String userId,String deptId,
return new JsonNode[] {}; String companyId) {
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)
public Page searchPersonalDimensionTagByPage(String userName, String dept, String keyword, String path, Integer domain, Page page) { .orOperator(
Criteria andCriterias = createPersonalDimensionTagCriteria(userName, dept); Criteria.where("dept").is(companyId),//标签是维度管理员机构的
if (StringUtils.isNotBlank(keyword) && !"*".equals(keyword)) { Criteria.where("dept").is(deptId).and("tagUser").is(userId)//标签是普通用户结构且普通用户名创建
andCriterias.andOperator(createKeywordRegexQuery(Arrays.asList("name", "nameEn", "desc"), keyword)); )).with(Sort.by(getDefaultTagOrders())), Tag.class);
} dirs.add(parentTag);
Query q = createPageQuery(page, andCriterias); return dirs;
List<Tag> tags = mongoOperations.find(q, Tag.class); }
long count = mongoOperations.count(q, Tag.class); //拼接关键子查询字段
page.setData(decoratorToExtTag(tags, userName)); private Criteria createKeywordRegexQuery(List<String> asList, String keyword) {
page.setTotal(count); Criteria criteriaSearch = new Criteria();
return page; return criteriaSearch.orOperator(asList.stream().map(col -> {
return Criteria.where(col).regex(keyword, "i");
} }).collect(Collectors.toList()).toArray(new Criteria[0]));
}
public List<SysTag> listSysTags() { //拼接根据机构id查询个人维度标签
return mongoOperations.findAll(SysTag.class); private Criteria createPersonalDimensionTagCriteria(String userName, String dept) {
} return Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("dept").is(dept).and("dimensionType").is(Constants.TAG_DIMENSION_TRUE);
public SysTag getSystemByCode(String code) { }
return mongoOperations.findOne(Query.query(Criteria.where("systemCode").is(code)), SysTag.class); //拼接查找系统标签条件
} private Criteria createSystemTagCriteria(String path) {
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_SYSTEM_TYPE);
public SysTag updateSystemExtractInfo(String code, boolean hasExtract, int tableNum, int columnNum) throws TagNotExistException { if (StringUtils.isNotBlank(path)) {
SysTag sysTag = mongoOperations.findOne(Query.query(Criteria.where("systemCode").is(code)), SysTag.class); return criteria.and("path").regex("^"+path);
if (sysTag == null) { }
throw new TagNotExistException(String.format("编码[为%s]的系统不存在", code)); return criteria;
} }
sysTag.setHasExtract(hasExtract); //拼接分页查找条件
sysTag.setTableNum(tableNum); private Query createPageQuery(Page page, Criteria andCriterias) {
sysTag.setColumnNum(columnNum); Query q = new Query(andCriterias);
mongoOperations.save(sysTag); q.skip(page.getOffset());
return sysTag; q.limit(page.getPageSize());
} q.with(Sort.by(getDefaultTagOrders()));
return q;
} }
//根据用户id标识该标签能否被操作
private List<ExtTag> decoratorToExtTag(List<Tag> tags, String userName) {
return tags.stream().map(t -> {
return new ExtTag(t, /**t.getCreator()*/t.getTagUser().equals(userName) ?
Constants.TAG_OPERABLE_TRUE : Constants.TAG_OPERABLE_FALSE);
}).collect(Collectors.toList());
}
//拼接个人标签查询条件
private Criteria createPersonalTagCriteria(String userName, String dept, String path) {
Criteria criteria = Criteria.where("tagType").is(Constants.TAG_PERSONAL_TYPE)
.and("dept").is(dept).and("tagUser").is(userName);
if (StringUtils.isNotBlank(path)) {
criteria = criteria.and("path").regex("^"+path);;
}
return criteria/**.orOperator(
Criteria.where("dimensionType").is(Constants.TAG_DIMENSION_TRUE),
Criteria.where("isOpen").is(Constants.TAG_OPEN_STATUS),
Criteria.where("creator").is(userName))*/;
}
//拼接查询当前系统标签子标签条件
private List<Tag> getSystemSubTag(Tag parentTag) {
List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
.regex("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
.and("tagType").is(Constants.TAG_SYSTEM_TYPE))
.with(Sort.by(getDefaultTagOrders())), Tag.class);
dirs.add(parentTag);
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))
.with(Sort.by(getDefaultTagOrders()));
}
// public JsonNode[] queryPersonalTagAsTree(String parentId, String userName, String dept) throws TagNotExistException {
// List<Tag> tags = new ArrayList<>();
// if (StringUtils.isEmpty(parentId)) {
// tags = mongoOperations.find(createPersonalTagQuery(userName, dept), 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());
// nodes.add(node);
// });
// JsonNode root = JsonTreeHelper.toJsonTree(nodes, Constants.TAG_PATH_SEPARATOR);
// if (root.children != null)
// return root.children;
// else
// return new JsonNode[] {};
// }
private Query createPersonalTagQuery(String userName, String dept, Criteria... serachCriterias) {
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 void shareTags(List<String> tagIds) {
Iterable<Tag> tags = tagRepository.findAllById(tagIds);
tags.forEach(t -> {
t.setIsOpen(Constants.TAG_OPEN_STATUS);
});
tagRepository.saveAll(tags);
}
public List<SysTag> listSysTags() {
return mongoOperations.findAll(SysTag.class);
}
public SysTag getSystemByCode(String code) {
return mongoOperations.findOne(Query.query(Criteria.where("systemCode").is(code)), SysTag.class);
}
public SysTag updateSystemExtractInfo(String code, boolean hasExtract, int tableNum, int columnNum) throws TagNotExistException {
SysTag sysTag = mongoOperations.findOne(Query.query(Criteria.where("systemCode").is(code)), SysTag.class);
if (sysTag == null) {
throw new TagNotExistException(String.format("编码[为%s]的系统不存在", code));
}
sysTag.setHasExtract(hasExtract);
sysTag.setTableNum(tableNum);
sysTag.setColumnNum(columnNum);
mongoOperations.save(sysTag);
return sysTag;
}
}
package com.keymobile.tagmanager.util; package com.keymobile.tagmanager.util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
...@@ -38,10 +43,6 @@ public class UserInfoUtils { ...@@ -38,10 +43,6 @@ public class UserInfoUtils {
return domainIds; return domainIds;
} }
public static String getUserName() {
return SecurityContextHolder.getContext().getAuthentication().getName().split(":")[0];
}
public static String getUserCompanyIdPath() { public static String getUserCompanyIdPath() {
if (SecurityContextHolder.getContext().getAuthentication().getName().split(":").length > 5) { if (SecurityContextHolder.getContext().getAuthentication().getName().split(":").length > 5) {
String deptIdPath = SecurityContextHolder.getContext().getAuthentication().getName().split(":")[5]; String deptIdPath = SecurityContextHolder.getContext().getAuthentication().getName().split(":")[5];
...@@ -67,8 +68,34 @@ public class UserInfoUtils { ...@@ -67,8 +68,34 @@ public class UserInfoUtils {
// return SecurityContextHolder.getContext().getAuthentication().getName().split(":")[5]; // return SecurityContextHolder.getContext().getAuthentication().getName().split(":")[5];
// } // }
public static Integer getUserId() { //author:zhangkb time:2020-1-6 desc:添加标签用到获取session属性接口
return Integer.valueOf(SecurityContextHolder.getContext().getAuthentication().getName().split(":")[1]); public static String getUserName() {
return SecurityContextHolder.getContext().getAuthentication().getName().split(":")[0];
}
public static String getUserId() {
return SecurityContextHolder.getContext().getAuthentication().getName().split(":")[1];
} }
//获取当前用户所属机构(id:name)
public static String[] getUserOrg() {
GrantedAuthority userOrg = SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
.filter(auth -> auth.getAuthority().contains("USER_ORG_")).findFirst().get();
if (userOrg == null) {
return null;
} else {
String[] userOrgParts = userOrg.getAuthority().split(":");
return new String[] { userOrgParts[0].substring("USER_ORG_".length()), userOrgParts[1] };
}
}
public static String getDataRoleOrg() {
GrantedAuthority dataRoleOrg = SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
.filter(auth -> auth.getAuthority().contains("USER_DATA_ROLE_ORG_")).findFirst().get();
if (dataRoleOrg == null) {
return null;
} else {
return dataRoleOrg.getAuthority().substring("USER_DATA_ROLE_ORG_".length());
}
}
} }
mongodb:
database: tagManagerCGN_dev
uri: dev-vm-00:27017
username: root
password: dataPlatform
maxConnectionIdleTime: 120000
eureka:
client:
registryFetchIntervalSeconds: 5
region: default
serviceUrl:
defaultZone: http://dev-vm-22:8081/eureka/
instance:
prefer-ip-address: false
hostname: 192.168.0.109
spring:
application:
name: tagManager
session:
store-type: redis
redis:
namespace: cgn2
redis:
host: dev-vm-00
port: 6379
datasource:
url: jdbc:mysql://dev-vm-00:3306/cgn2_dev?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
username: test
password: test
hikari:
maximum-pool-size: 3
server:
port: 8072
#security permit true :permitAll ;flase:authenticated
security:
authUser: root
authPwd: pwd
permit: false
feign:
client:
config:
default:
ReadTimeout: 30000
ConnectTimeout: 30000
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