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 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 selectCusSiteHead() { RecordSet rs = new RecordSet(); BaseBean bb = new BaseBean(); String fieldid = bb.getPropValue("sship", "fieldid"); String sitehead = bb.getPropValue("sship", "sitehead"); List 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 selectPerson(PersonTableParam personTableParam) { List 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 setTreeStructure(List 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 getVirtualSubDept(String supdepid,String virtualType) { RecordSet rs = new RecordSet(); List 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 getVirtualSub(String supdepid,String virtualType) { RecordSet rs = new RecordSet(); List 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 getVirtualSubDeptData(String supdepid,String virtualType) { RecordSet rs = new RecordSet(); List 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 selectVirtualPerson(PersonTableParam personTableParam) { RecordSet rs = new RecordSet(); List idList = new ArrayList<>(); ResourceComInfo rInfo = new ResourceComInfo(); List voList = new ArrayList<>(); List 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 selectVirtualTop() { List 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 selectVirtualTopTwo(String virtualType) { RecordSet rs = new RecordSet(); BaseBean bb = new BaseBean(); List 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 selectVirtualTopThree(VirtualTopParam virtualTopParam) { RecordSet rs = new RecordSet(); List voList = assembleSelectVOList(); TreeDataVO build; int num = 1; List 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 assembleSelectVOList() { List 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 selectByLevel(Integer level) { RecordSet rs = new RecordSet(); List 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 selectByDeptId(String id) { RecordSet rs = new RecordSet(); List 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 committeeList = Collections.singletonList(committee); return TreeDataVO.builder().id("S-1") .label("Shareholder") .childrens(committeeList) .build(); } @SneakyThrows private List getSiteHead() { List idList = selectCusSiteHead(); List 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 recursionDepartment(Integer id) { List vos = new ArrayList<>(); DepartmentComInfo dInfo = new DepartmentComInfo(); ResourceComInfo rInfo = new ResourceComInfo(); String underling = hrmCommonService.getUnderling(id); String localId = rInfo.getDepartmentID(String.valueOf(id)); //获取直接下属 List 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; } }