You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-develop/src/com/engine/sship/service/impl/OrgChartServiceImpl.java

609 lines
27 KiB
Java

package com.engine.sship.service.impl;
import com.engine.common.service.HrmCommonService;
import com.engine.common.service.impl.HrmCommonServiceImpl;
import com.engine.core.impl.Service;
import com.engine.sship.entity.*;
import com.engine.sship.service.OrgChartService;
import com.weaver.general.BaseBean;
import com.weaver.general.Util;
import lombok.SneakyThrows;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.hrm.company.DepartmentComInfo;
import weaver.hrm.resource.ResourceComInfo;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author liang.cheng
* @Date 2023/9/26 5:52 PM
* @Description:
* @Version 1.0
*/
public class OrgChartServiceImpl extends Service implements OrgChartService {
private final HrmCommonService hrmCommonService = new HrmCommonServiceImpl();
@Override
public boolean selectIdsByRole(String roleId,String rolelevel) {
String roleMemberIds = hrmCommonService.getRoleMemberIds(roleId, rolelevel);
List<String> roleMemberList = Arrays.stream(roleMemberIds.split(","))
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
return roleMemberList.stream()
.anyMatch(s -> Integer.parseInt(s) == user.getUID());
}
@Override
public TreeDataVO selectResourceChart() {
BaseBean bb = new BaseBean();
String roleId = bb.getPropValue("sship", "roleId");
String rolelevel = bb.getPropValue("sship", "rolelevel");
boolean isExsit = selectIdsByRole(roleId, rolelevel);
if (isExsit || (user.getUID() == 1)) {
return getAllTreeData();
}
return getBaseTreeData();
}
@Override
public List<Integer> selectCusSiteHead() {
RecordSet rs = new RecordSet();
BaseBean bb = new BaseBean();
String fieldid = bb.getPropValue("sship", "fieldid");
String sitehead = bb.getPropValue("sship", "sitehead");
List<Integer> ids = new ArrayList<>();
rs.executeQuery("select id from cus_fielddata where "+fieldid+" = ? and scopeid = 3 and scope = 'HrmCustomFieldByInfoType'",sitehead);
while (rs.next()) {
ids.add(Util.getIntValue(rs.getString("id")));
}
return ids;
}
@SneakyThrows
@Override
public List<PersonTableVO> selectPerson(PersonTableParam personTableParam) {
List<PersonTablePO> poList;
ResourceComInfo rInfo = new ResourceComInfo();
BaseBean bb = new BaseBean();
String shareholder = bb.getPropValue("sship", "shareholder");
String committee = bb.getPropValue("sship", "committee");
switch(personTableParam.getId()){
case "S-1":
poList = selectByLevel(Integer.valueOf(shareholder));
break;
case "C-1":
poList = selectByLevel(Integer.valueOf(committee));
break;
default:
poList = selectByDeptId(personTableParam.getId());
}
return poList.stream()
.map(po -> new PersonTableVO(po.getId(), po.getLastname(), po.getWorkcode(),
po.getSex() == 0 ? "男" : "女",
po.getManagerid() != null ? rInfo.getLastname(String.valueOf(po.getManagerid())) : "",
po.getLoginid()))
.collect(Collectors.toList());
}
@Override
public TreeDataVO selectOrganizationChart(OrgTreeParam orgTreeParam) {
RecordSet rs = new RecordSet();
BaseBean bb = new BaseBean();
String virtualType = orgTreeParam.getVirtualType();
String root = orgTreeParam.getRoot();
String level = orgTreeParam.getLevel();
TreeDataVO build;
String roleId = bb.getPropValue("sship", "roleId");
String rolelevel = bb.getPropValue("sship", "rolelevel");
boolean isExsit = selectIdsByRole(roleId, rolelevel);
String id = "";
if (isExsit || (user.getUID() == 1)) {
//ShareHolder唯一
if (StringUtils.isBlank(root)) {
rs.executeQuery("select a.id,departmentmark,bmfzrid from hrmdepartmentvirtual a " +
"left join uf_xnbmfzr on a.id =xnzzid where supdepid = 0 and virtualtype = ? order by showorder", virtualType);
rs.next();
id = rs.getString("id");
} else {
rs.executeQuery("select departmentmark from hrmdepartmentvirtual where id = ? and virtualtype = ? order by showorder", root.substring(3),virtualType);
rs.next();
id = root.substring(3);
}
build = TreeDataVO.builder()
.id(id)
.label(Util.null2String(rs.getString("departmentmark"))+"("+Util.null2String(rs.getString("bmfzrid"))+")")
.build();
if (isVirtualSubDepartment(id,virtualType)) {
build.setChildrens(getVirtualSubDept(id,virtualType));
}
//level等于1
if(StringUtils.isNotBlank(level)){
if(Integer.parseInt(level)==1){
build.setChildrens(null);
}else {
build.setChildrens(setTreeStructure(build.getChildrens(),Integer.parseInt(level)));
}
}
} else {
String departmentId = "";
//获取当前部门
if(StringUtils.isBlank(root)){
rs.executeQuery("select departmentid from hrmresourcevirtual where resourceid = ? and virtualtype = ?",user.getUID(),virtualType);
rs.next();
departmentId = rs.getString("departmentid");
}else{
departmentId = root.substring(3);
}
rs.executeQuery("select departmentmark,bmfzrid from hrmdepartmentvirtual a left join uf_xnbmfzr on a.id =xnzzid where a.id = ? and virtualtype = ? order by showorder",departmentId,virtualType);
rs.next();
build = TreeDataVO.builder()
.id(departmentId)
.label(Util.null2String(rs.getString("departmentmark"))+"("+Util.null2String(rs.getString("bmfzrid"))+")")
.build();
if (isVirtualSubDepartment(departmentId,virtualType)) {
build.setChildrens(getVirtualSubDept(departmentId,virtualType));
}
//level等于1
if(StringUtils.isNotBlank(level)){
if(Integer.parseInt(level)==1){
build.setChildrens(null);
}else {
build.setChildrens(setTreeStructure(build.getChildrens(),Integer.parseInt(level)));
}
}
}
return build;
}
/**
* 根据层级修改树结构
* @param childrens
*/
public static List<ChartChildrensVO> setTreeStructure(List<ChartChildrensVO> childrens,int level) {
switch(level){
case 2:
childrens.forEach(childrensVO->childrensVO.setChildrens(null));
break;
case 3:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 -> childrensVO1.setChildrens(null)));
break;
case 4:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.setChildrens(null))));
break;
case 5:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.getChildrens().forEach(childrensVO3 ->
childrensVO3.setChildrens(null)))));
break;
case 6:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.getChildrens().forEach(childrensVO3 ->
childrensVO3.getChildrens().forEach(childrensVO4 -> childrensVO4.setChildrens(null))))));
break;
case 7:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.getChildrens().forEach(childrensVO3 ->
childrensVO3.getChildrens().forEach(childrensVO4 -> childrensVO4.getChildrens().
forEach(childrensVO5 -> childrensVO5.setChildrens(null)))))));
break;
case 8:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.getChildrens().forEach(childrensVO3 ->
childrensVO3.getChildrens().forEach(childrensVO4 -> childrensVO4.getChildrens().
forEach(childrensVO5 -> childrensVO5.getChildrens().forEach(childrensVO6 -> childrensVO6.setChildrens(null))))))));
break;
case 9:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.getChildrens().forEach(childrensVO3 ->
childrensVO3.getChildrens().forEach(childrensVO4 -> childrensVO4.getChildrens().
forEach(childrensVO5 -> childrensVO5.getChildrens().forEach(childrensVO6 ->
childrensVO6.getChildrens().forEach(childrensVO7 -> childrensVO7.setChildrens(null)))))))));
break;
case 10:
childrens.forEach(childrensVO->childrensVO.getChildrens().forEach(childrensVO1 ->
childrensVO1.getChildrens().forEach(childrensVO2 -> childrensVO2.getChildrens().forEach(childrensVO3 ->
childrensVO3.getChildrens().forEach(childrensVO4 -> childrensVO4.getChildrens().
forEach(childrensVO5 -> childrensVO5.getChildrens().forEach(childrensVO6 ->
childrensVO6.getChildrens().forEach(childrensVO7 ->
childrensVO7.getChildrens().forEach(childrensVO8 -> childrensVO8.setChildrens(null))))))))));
break;
default:
childrens.forEach(childrensVO->childrensVO.setChildrens(null));
}
return childrens;
}
/**
* 遍历n叉树最大深度
* @param root
*/
public static int maxDepth(ChartChildrensVO root) {
if(CollectionUtils.isEmpty(root.getChildrens())){
return 0;
}
int num = 0;
if(!CollectionUtils.isEmpty(root.getChildrens())){
for (int i = 0; i < root.getChildrens().size(); i++) {
num = Math.max(num, 1 + maxDepth(root.getChildrens().get(i)));
}
}
return num;
}
private List<ChartChildrensVO> getVirtualSubDept(String supdepid,String virtualType) {
RecordSet rs = new RecordSet();
List<ChartChildrensVO> voList = new ArrayList<>();
rs.executeQuery("select a.id,departmentmark,bmfzrid from hrmdepartmentvirtual a left join uf_xnbmfzr on a.id =xnzzid where supdepid <> '' and supdepid = ? and virtualtype = ? order by showorder",supdepid,virtualType);
while (rs.next()) {
String id = Util.null2String(rs.getString("id"));
ChartChildrensVO build = ChartChildrensVO.builder()
.pid(supdepid)
.id(id)
.label(Util.null2String(rs.getString("departmentmark"))+"("+Util.null2String(rs.getString("bmfzrid"))+")")
.build();
if (isVirtualSubDepartment(id,virtualType)) {
build.setChildrens(getVirtualSubDept(id,virtualType));
}
voList.add(build);
}
return voList;
}
private List<ChartChildrensVO> getVirtualSub(String supdepid,String virtualType) {
RecordSet rs = new RecordSet();
List<ChartChildrensVO> voList = new ArrayList<>();
rs.executeQuery("select id,departmentmark from hrmdepartmentvirtual where supdepid <> '' and supdepid = ? and virtualtype = ? order by showorder", supdepid, virtualType);
while (rs.next()) {
String id = Util.null2String(rs.getString("id"));
ChartChildrensVO build = ChartChildrensVO.builder()
.pid(supdepid)
.id(id)
.label(Util.null2String(rs.getString("departmentmark")))
.build();
if (isVirtualSubDepartment(id, virtualType)) {
build.setChildrens(getVirtualSub(id, virtualType));
}
voList.add(build);
}
return voList;
}
private List<DropTreeDataVO> getVirtualSubDeptData(String supdepid,String virtualType) {
RecordSet rs = new RecordSet();
List<DropTreeDataVO> voList = new ArrayList<>();
rs.executeQuery("select id,departmentmark from hrmdepartmentvirtual where supdepid <> '' and supdepid = ? and virtualtype = ? order by showorder",supdepid,virtualType);
while (rs.next()) {
String id = Util.null2String(rs.getString("id"));
DropTreeDataVO build = DropTreeDataVO.builder()
.value(getRandomData()+id)
.label(Util.null2String(rs.getString("departmentmark")))
.build();
if (isVirtualSubDepartment(id,virtualType)) {
build.setChildren(getVirtualSubDeptData(id,virtualType));
}
voList.add(build);
}
return voList;
}
private String getRandomData() {
String name="";//先定义空字符串
for (int i=0;i<3;i++){
char n=(char)(new Random().nextInt(26)+97) ;
name += n;//name=name+n;
}
return name;
}
@Override
public boolean isVirtualSubDepartment(String supdepid,String virtualType) {
RecordSet rs = new RecordSet();
boolean isSupdepid = false;
rs.executeQuery("select count(1) from hrmdepartmentvirtual where supdepid <> '' and supdepid = ? and virtualtype = ? ",supdepid,virtualType);
if (rs.next()) {
isSupdepid = rs.getInt(1) > 0;
}
return isSupdepid;
}
@SneakyThrows
@Override
public List<PersonTableVO> selectVirtualPerson(PersonTableParam personTableParam) {
RecordSet rs = new RecordSet();
List<Integer> idList = new ArrayList<>();
ResourceComInfo rInfo = new ResourceComInfo();
List<PersonTableVO> voList = new ArrayList<>();
List<PersonTablePO> poList = new ArrayList<>();
rs.executeQuery("select resourceid from hrmresourcevirtual where departmentid = ?",personTableParam.getId());
while (rs.next()) {
idList.add(Util.getIntValue(rs.getString("resourceid")));
}
if (CollectionUtils.isNotEmpty(idList)) {
rs.executeQuery("select id,lastname,workcode,sex,managerid,loginid from hrmresource where status < 4 and id in ("+ StringUtils.join(idList,",")+")");
while (rs.next()) {
poList.add(
PersonTablePO.builder()
.id(Util.getIntValue(rs.getString("id")))
.lastname(Util.null2String(rs.getString("lastname")))
.workcode(Util.null2String(rs.getString("workcode")))
.sex(Util.getIntValue(rs.getString("sex")))
.managerid(Util.getIntValue(rs.getString("managerid")))
.loginid(Util.null2String(rs.getString("loginid")))
.build()
);
}
voList = poList.stream()
.map(po -> new PersonTableVO(po.getId(), po.getLastname(), po.getWorkcode(),
po.getSex() == 0 ? "男" : "女",
po.getManagerid() != null ? rInfo.getLastname(String.valueOf(po.getManagerid())) : "",
po.getLoginid()))
.collect(Collectors.toList());
}
return voList;
}
@Override
public List<SelectVO> selectVirtualTop() {
List<SelectVO> voList = new ArrayList<>();
RecordSet rs = new RecordSet();
rs.executeQuery("select id,companyname from hrmcompanyvirtual");
while (rs.next()) {
voList.add(SelectVO.builder()
.value(Util.null2String(rs.getString("id")))
.label(Util.null2String(rs.getString("companyname"))).build());
}
return voList;
}
@Override
public List<DropTreeDataVO> selectVirtualTopTwo(String virtualType) {
RecordSet rs = new RecordSet();
BaseBean bb = new BaseBean();
List<DropTreeDataVO> dataVOS = new ArrayList<>();
DropTreeDataVO build;
String roleId = bb.getPropValue("sship", "roleId");
String rolelevel = bb.getPropValue("sship", "rolelevel");
boolean isExsit = selectIdsByRole(roleId, rolelevel);
if (isExsit || (user.getUID() == 1)) {
//ShareHolder唯一
rs.executeQuery("select id,departmentmark from hrmdepartmentvirtual where supdepid = 0 and virtualtype = ? order by showorder",virtualType);
rs.next();
String id = Util.null2String(rs.getString("id"));
build = DropTreeDataVO.builder()
.value(getRandomData()+id)
.label(Util.null2String(rs.getString("departmentmark")))
.build();
if (isVirtualSubDepartment(id,virtualType)) {
build.setChildren(getVirtualSubDeptData(id,virtualType));
}
dataVOS.add(build);
} else {
//获取当前部门
rs.executeQuery("select departmentid from hrmresourcevirtual where resourceid = ? and virtualtype = ?",user.getUID(),virtualType);
rs.next();
String departmentId = Util.null2String(rs.getString("departmentid"));
rs.executeQuery("select departmentmark from hrmdepartmentvirtual where id = ? and virtualtype = ? order by showorder",departmentId,virtualType);
rs.next();
build = DropTreeDataVO.builder()
.value(getRandomData()+departmentId)
.label(Util.null2String(rs.getString("departmentmark")))
.build();
if (isVirtualSubDepartment(departmentId,virtualType)) {
build.setChildren(getVirtualSubDeptData(departmentId,virtualType));
}
dataVOS.add(build);
}
return dataVOS;
}
@Override
public List<SelectVO> selectVirtualTopThree(VirtualTopParam virtualTopParam) {
RecordSet rs = new RecordSet();
List<SelectVO> voList = assembleSelectVOList();
TreeDataVO build;
int num = 1;
List<Integer> list = new ArrayList<>();
list.add(num);
rs.executeQuery("select departmentmark from hrmdepartmentvirtual where id = ? and virtualtype = ? order by showorder",virtualTopParam.getId(),virtualTopParam.getVirtualType());
rs.next();
build = TreeDataVO.builder()
.id(virtualTopParam.getId())
.label(Util.null2String(rs.getString("departmentmark")))
.build();
if (isVirtualSubDepartment(virtualTopParam.getId(),virtualTopParam.getVirtualType())) {
build.setChildrens(getVirtualSub(virtualTopParam.getId(),virtualTopParam.getVirtualType()));
}
if(null!=build.getChildrens()&&build.getChildrens().size()>0){
for (ChartChildrensVO children : build.getChildrens()) {
num = maxDepth(children)+1;
list.add(num);
}
build.setNum(Collections.max(list)+1);
}else{
build.setNum(num);
}
// 判断是否满足删除条件
for (int i = voList.size() - 1; i >= 0; i--) {
if(Integer.parseInt(voList.get(i).getValue())>build.getNum()){
voList.remove(i);
}
}
//MAP.entrySet().removeIf(entry -> Integer.parseInt(entry.getKey()) > build.getNum());
return voList;
}
private static List<SelectVO> assembleSelectVOList() {
List<SelectVO> voList = new ArrayList<>();
voList.add(SelectVO.builder().value("1").label("一级").build());
voList.add(SelectVO.builder().value("2").label("二级").build());
voList.add(SelectVO.builder().value("3").label("三级").build());
voList.add(SelectVO.builder().value("4").label("四级").build());
voList.add(SelectVO.builder().value("5").label("五级").build());
voList.add(SelectVO.builder().value("6").label("六级").build());
voList.add(SelectVO.builder().value("7").label("七级").build());
voList.add(SelectVO.builder().value("8").label("八级").build());
voList.add(SelectVO.builder().value("9").label("九级").build());
voList.add(SelectVO.builder().value("10").label("十级").build());
return voList;
}
private List<PersonTablePO> selectByLevel(Integer level) {
RecordSet rs = new RecordSet();
List<PersonTablePO> poList = new ArrayList<>();
BaseBean bb = new BaseBean();
String fieldid = bb.getPropValue("sship", "fieldid");
rs.executeQuery("select h.id,h.lastname,h.workcode,h.sex,h.managerid,h.loginid from hrmresource h\n" +
" left join cus_fielddata c on h.id = c.id\n" +
" where c.scopeid = 3 and c.scope = 'HrmCustomFieldByInfoType' and c."+fieldid+" = ?",level);
while (rs.next()) {
poList.add(
PersonTablePO.builder()
.id(Util.getIntValue(rs.getString("id")))
.lastname(Util.null2String(rs.getString("lastname")))
.workcode(Util.null2String(rs.getString("workcode")))
.sex(Util.getIntValue(rs.getString("sex")))
.managerid(Util.getIntValue(rs.getString("managerid")))
.loginid(Util.null2String(rs.getString("loginid")))
.build()
);
}
return poList;
}
private List<PersonTablePO> selectByDeptId(String id) {
RecordSet rs = new RecordSet();
List<PersonTablePO> poList = new ArrayList<>();
rs.executeQuery("select id,lastname,workcode,sex,managerid,loginid from hrmresource where status < 4 and departmentid = ?",id);
while (rs.next()) {
poList.add(
PersonTablePO.builder()
.id(Util.getIntValue(rs.getString("id")))
.lastname(Util.null2String(rs.getString("lastname")))
.workcode(Util.null2String(rs.getString("workcode")))
.sex(Util.getIntValue(rs.getString("sex")))
.managerid(Util.getIntValue(rs.getString("managerid")))
.loginid(Util.null2String(rs.getString("loginid")))
.build()
);
}
return poList;
}
/**
* 获取指定组织树
* @return
*/
@SneakyThrows
private TreeDataVO getBaseTreeData() {
int uid = user.getUID();
DepartmentComInfo dInfo = new DepartmentComInfo();
ResourceComInfo rInfo = new ResourceComInfo();
String departmentId = rInfo.getDepartmentID(String.valueOf(uid));
TreeDataVO build = TreeDataVO.builder()
.id(departmentId)
.label(dInfo.getDepartmentName(departmentId))
.build();
boolean manager = hrmCommonService.isManager(uid);
if (manager) {
build.setChildrens(recursionDepartment(uid));
}
return build;
}
/**
* 获取全量组织树
* @return
*/
private TreeDataVO getAllTreeData() {
//1.股东及委员会层级指定
ChartChildrensVO committee = ChartChildrensVO.builder().id("C-1")
.pid("S-1")
.label("Committee")
.childrens(getSiteHead())
.build();
List<ChartChildrensVO> committeeList = Collections.singletonList(committee);
return TreeDataVO.builder().id("S-1")
.label("Shareholder")
.childrens(committeeList)
.build();
}
@SneakyThrows
private List<ChartChildrensVO> getSiteHead() {
List<Integer> idList = selectCusSiteHead();
List<ChartChildrensVO> siteHeadList = new ArrayList<>();
DepartmentComInfo dInfo = new DepartmentComInfo();
ResourceComInfo rInfo = new ResourceComInfo();
idList.forEach(item -> {
String departmentId = rInfo.getDepartmentID(String.valueOf(item));
ChartChildrensVO build = ChartChildrensVO.builder()
.id(departmentId)
.pid("C-1")
.label(dInfo.getDepartmentmark(departmentId))
.build();
boolean manager = hrmCommonService.isManager(item);
if (manager) {
build.setChildrens(recursionDepartment(item));
}
siteHeadList.add(build);
});
return siteHeadList;
}
/**
* 递归获取
* @param id
* @return
*/
@SneakyThrows
private List<ChartChildrensVO> recursionDepartment(Integer id) {
List<ChartChildrensVO> vos = new ArrayList<>();
DepartmentComInfo dInfo = new DepartmentComInfo();
ResourceComInfo rInfo = new ResourceComInfo();
String underling = hrmCommonService.getUnderling(id);
String localId = rInfo.getDepartmentID(String.valueOf(id));
//获取直接下属
List<String> underList = Arrays.stream(underling.split(","))
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
for (String item : underList) {
String departmentId = rInfo.getDepartmentID(String.valueOf(item));
//过滤同部门和子部门
boolean exists = vos.stream()
.anyMatch(e -> e.getId().equals(departmentId));
if (departmentId.equals(localId) || exists){
continue;
}
ChartChildrensVO build = ChartChildrensVO.builder()
.id(departmentId)
.pid(item)
.label(dInfo.getDepartmentmark(departmentId))
.build();
boolean manager = hrmCommonService.isManager(Integer.valueOf(item));
if (manager) {
build.setChildrens(recursionDepartment(Integer.valueOf(item)));
}
vos.add(build);
}
return vos;
}
}