增加组织架构层级树,用于流程计算处理人

This commit is contained in:
zsvg
2022-06-20 18:32:30 +08:00
parent 9967290ff9
commit 9056c0ad27
10 changed files with 463 additions and 4 deletions
@@ -0,0 +1,52 @@
package vboot.core.module.sys.org.tier;
import lombok.Data;
import vboot.core.module.sys.org.root.SysOrg;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
//层级节点
@Entity
@Data
public class SysOrgTierNode {
@Id
@Column(length = 32)
private String id;//ID
@Column(length = 100)
private String name;//名称
@Transient
private List<SysOrgTierNode> children = new ArrayList<>(); //行项目
@Transient
private String pid;//父ID
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "pid")
private SysOrgTierNode parent;//父元素
private Integer tieid;//1为机构,2为部门,4为岗位,8为用户,16为常用群组,32为角色线
@Column(length = 1000)
private String tier;//层级
private String notes;//备注
private Integer ornum;//排序号
@Column(updatable = false)
private Date crtim = new Date();//创建时间
private Date uptim;//更新时间
private Boolean avtag;//可用标记
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "memid")
private SysOrg member;
}
@@ -0,0 +1,92 @@
package vboot.core.module.sys.org.tier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import vboot.core.common.api.R;
import vboot.core.common.dao.JdbcDao;
import vboot.core.common.dao.Sqler;
import vboot.core.common.pojo.Ztree;
import vboot.core.xutil.lang.XstrUtil;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
@RequestMapping("sys/org/tnode")
public class SysOrgTierNodeApi {
private String table = "sys_org_tier_node";
@GetMapping
public R get(String name, String pid, String notes) {
Sqler sqler = new Sqler(table);
if (XstrUtil.isNotBlank(name)) {
sqler.addLike("t.name" , name);
} else {
if ("".equals(pid)) {
sqler.addWhere("t.pid is null");
} else if (XstrUtil.isNotBlank(pid)) {
sqler.addEqual("t.pid" , pid);
}
}
sqler.addLike("t.notes" , notes);
sqler.addWhere("t.avtag=1");
sqler.addOrder("t.ornum");
sqler.addSelect("t.ornum,t.notes,t.pid,t.crtim,t.uptim");
return R.ok(jdbcDao.findPageData(sqler));
}
//查询层级树
@GetMapping("tree")
public R getTree(String name) {
Sqler sqler = new Sqler("sys_org_tier_node");
sqler.addSelect("t.pid");
sqler.addLike("t.name", name);
sqler.addOrder("t.ornum");
sqler.addWhere("t.avtag=1");
List<Ztree> list = jdbcDao.findTreeList(sqler);
return R.ok(list);
}
//排除了自己
// @GetMapping("listn")
// public R listn(String name, String id) {
// Sqler sqler = new Sqler(table);
// sqler.addLike("t.name", name);
// sqler.addWhere("t.avtag=1");
// sqler.addOrder("t.ornum");
// sqler.addSelect("t.pid");
// return R.ok(service.findWithoutItself(sqler, id));
// }
@GetMapping("one/{id}")
public R getOne(@PathVariable String id, HttpServletRequest request) {
SysOrgTierNode main = service.findById(id);
return R.ok(main);
}
@PostMapping
public R post(@RequestBody SysOrgTierNode main) {
service.insert(main);
return R.ok(main.getId());
}
@PutMapping
public R put(@RequestBody SysOrgTierNode main) throws Exception {
service.update(main);
return R.ok(main.getId());
}
@DeleteMapping("{ids}")
public R delete(@PathVariable String[] ids) {
return R.ok(service.delete(ids));
}
@Autowired
private JdbcDao jdbcDao;
@Autowired
private SysOrgTierNodeService service;
}
@@ -0,0 +1,8 @@
package vboot.core.module.sys.org.tier;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SysOrgTierNodeRepo extends JpaRepository<SysOrgTierNode,String> {
}
@@ -0,0 +1,184 @@
package vboot.core.module.sys.org.tier;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vboot.core.common.api.PageData;
import vboot.core.common.dao.JdbcDao;
import vboot.core.common.dao.Sqler;
import vboot.core.common.pojo.ZidName;
import vboot.core.xutil.lang.XstrUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Service
@Transactional(rollbackFor = Exception.class)
public class SysOrgTierNodeService {
@Transactional(readOnly = true)
public SysOrgTierNode findById(String id) {
return nodeRepo.findById(id).get();
}
public SysOrgTierNode insert(SysOrgTierNode main) {
if (main.getId() == null || "".equals(main.getId())) {
main.setId(XstrUtil.getUUID());
}
if (main.getParent() == null || StrUtil.isBlank(main.getParent().getId())) {
main.setTier("x" + main.getId() + "x");
} else {
String tier = jdbcDao.findOneString("select tier from sys_org_tier_node where id=?", main.getParent().getId());
main.setTier(tier + main.getId() + "x");
}
return nodeRepo.save(main);
}
public SysOrgTierNode update(SysOrgTierNode main) throws Exception {
main.setUptim(new Date());
if (main.getParent() == null || StrUtil.isBlank(main.getParent().getId())) {
main.setTier("x" + main.getId() + "x");
} else {
String tier = jdbcDao.findOneString("select tier from sys_org_tier_node where id=?", main.getParent().getId());
main.setTier(tier + main.getId() + "x");
String[] arr = tier.split("x");
for (String str : arr) {
if (main.getId().equals(str)) {
throw new Exception("父层级不能为自己或者自己的子层级");
}
}
}
SysOrgTierNode backTier = nodeRepo.save(main);
String oldTier = jdbcDao.findOneString("select tier from sys_org_tier_node where id=?", main.getId());
dealTier(oldTier, main.getTier(), main.getId());
return backTier;
}
public int delete(String[] ids) {
for (String str : ids) {
nodeRepo.deleteById(str);
}
return ids.length;
}
private void dealTier(String oldTier, String newTier, String id) {
String sql = "select id,tier as name from sys_org_tier_node where tier like ? and id<>?";
List<ZidName> list = jdbcDao.findIdNameList(sql, oldTier + "%", id);
String updateSql = "update sys_org_tier_node set tier=? where id=?";
List<Object[]> updateList = new ArrayList<Object[]>();
batchReady(oldTier, newTier, list, updateList);
jdbcDao.batch(updateSql, updateList);
}
private void batchReady(String oldTier, String newTier, List<ZidName> list, List<Object[]> updateList) {
for (ZidName ztwo : list) {
Object[] arr = new Object[2];
arr[1] = ztwo.getId();
arr[0] = ztwo.getName().replace(oldTier, newTier);
updateList.add(arr);
}
}
public List<SysOrgTierNode> findAll(Sqler sqler) {
List<SysOrgTierNode> list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(), new BeanPropertyRowMapper<>(SysOrgTierNode.class));
return list;
}
public PageData findPageData(Sqler sqler) {
return jdbcDao.findPageData(sqler);
}
public List<SysOrgTierNode> findTree(Sqler sqler) {
List<SysOrgTierNode> list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(), new BeanPropertyRowMapper<>(SysOrgTierNode.class));
return buildByRecursive(list);
}
//使用递归方法建树
private List<SysOrgTierNode> buildByRecursive(List<SysOrgTierNode> nodes) {
List<SysOrgTierNode> list = new ArrayList<>();
for (SysOrgTierNode node : nodes) {
if (node.getPid() == null) {
list.add(findChildrenByTier(node, nodes));
} else {
boolean flag = false;
for (SysOrgTierNode node2 : nodes) {
if (node.getPid().equals(node2.getId())) {
flag = true;
break;
}
}
if (!flag) {
list.add(findChildrenByTier(node, nodes));
}
}
}
return list;
}
//递归查找子节点
private SysOrgTierNode findChildrenByTier(SysOrgTierNode node, List<SysOrgTierNode> nodes) {
for (SysOrgTierNode item : nodes) {
if (node.getId().equals(item.getPid())) {
if (node.getChildren() == null) {
node.setChildren(new ArrayList<>());
}
node.getChildren().add(findChildrenByTier(item, nodes));
}
}
return node;
}
// public List<SysOrgTierTree> findWithoutItself(Sqler sqler, String id) {
// List<SysOrgTierTree> list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(), new BeanPropertyRowMapper<>(SysOrgTierTree.class));
// return buildByRecursiveWithoutItself(list, id);
// }
//使用递归方法建树不包含自己
// private List<SysOrgTierTree> buildByRecursiveWithoutItself(List<SysOrgTierTree> nodes, String id) {
// List<SysOrgTierTree> list = new ArrayList<>();
// for (SysOrgTierTree node : nodes) {
// if (node.getPid() == null && !node.getId().equals(id)) {
// list.add(findChildrenByTierWithoutItself(node, nodes, id));
// } else {
// boolean flag = false;
// for (SysOrgTierTree node2 : nodes) {
// if (node.getPid() != null && node.getPid().equals(node2.getId())) {
// flag = true;
// break;
// }
// }
// if (!flag && !node.getId().equals(id)) {
// list.add(findChildrenByTierWithoutItself(node, nodes, id));
// }
// }
// }
// return list;
// }
//递归查找子节点不包含自己
// private SysOrgTierTree findChildrenByTierWithoutItself(SysOrgTierTree node, List<SysOrgTierTree> nodes, String id) {
// for (SysOrgTierTree item : nodes) {
// if (node.getId().equals(item.getPid()) && (!item.getId().equals(id))) {
// if (node.getChildren() == null) {
// node.setChildren(new ArrayList<>());
// }
// node.getChildren().add(findChildrenByTierWithoutItself(item, nodes, id));
// }
// }
// return node;
// }
@Autowired
private JdbcDao jdbcDao;
@Autowired
private SysOrgTierNodeRepo nodeRepo;
}
@@ -0,0 +1,23 @@
package vboot.core.module.sys.org.tier;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
//层级角色
@Data
@Entity
public class SysOrgTierRole {
@Id
@Column(length = 36)
private String id;//主键
@Column(length = 64)
private String name;//角色名称
private Integer ornum;//排序号
private String notes;//备注
}
@@ -0,0 +1,25 @@
package vboot.core.module.sys.org.tier;
import lombok.Getter;
import lombok.Setter;
import vboot.core.common.entity.BaseMainEntity;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
//层级树
@Entity
@Getter
@Setter
public class SysOrgTierTree extends BaseMainEntity {
private Integer ornum;//排序号
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "treid")
@OrderBy("ornum ASC")
private List<SysOrgTierRole> roles = new ArrayList<>();//层级角色
}
@@ -0,0 +1,44 @@
package vboot.core.module.sys.org.tier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import vboot.core.common.api.R;
import vboot.core.common.dao.Sqler;
@RestController
@RequestMapping("sys/org/ttree")
public class SysOrgTierTreeApi {
@GetMapping
public R get(String name) {
Sqler sqler = new Sqler("sys_org_tier_tree");
sqler.addLike("t.name", name);
sqler.addSelect("t.notes");
return R.ok(service.findPageData(sqler));
}
@GetMapping("one/{id}")
public R getOne(@PathVariable String id) {
SysOrgTierTree main = service.findOne(id);
return R.ok(main);
}
@PostMapping
public R post(@RequestBody SysOrgTierTree main) {
return R.ok(service.insert(main));
}
@PutMapping
public R put(@RequestBody SysOrgTierTree main) {
return R.ok(service.update(main));
}
@DeleteMapping("{ids}")
public R delete(@PathVariable String[] ids) {
return R.ok(service.delete(ids));
}
@Autowired
private SysOrgTierTreeService service;
}
@@ -0,0 +1,10 @@
package vboot.core.module.sys.org.tier;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SysOrgTierTreeRepo extends JpaRepository<SysOrgTierTree,String> {
}
@@ -0,0 +1,21 @@
package vboot.core.module.sys.org.tier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import vboot.core.common.service.BaseMainService;
import javax.annotation.PostConstruct;
@Service
public class SysOrgTierTreeService extends BaseMainService<SysOrgTierTree> {
@Autowired
private SysOrgTierTreeRepo repo;
@PostConstruct
public void initDao() {
super.setRepo(repo);
}
}
@@ -15,8 +15,8 @@ public class SysPortalMain extends BaseMainEntity {
private Integer ornum;
@ManyToMany
@JoinTable(name = "sys_portal_main_viewer", joinColumns = {@JoinColumn(name = "mid")},
inverseJoinColumns = {@JoinColumn(name = "oid")})
private List<SysOrg> viewers;
// @ManyToMany
// @JoinTable(name = "sys_portal_viewer", joinColumns = {@JoinColumn(name = "mid")},
// inverseJoinColumns = {@JoinColumn(name = "oid")})
// private List<SysOrg> viewers;
}