package com.engine.organization.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.organization.entity.chart.ChartPO; import com.engine.organization.service.ChartService; import com.engine.organization.util.HasRightUtil; import com.engine.organization.util.OrganizationAssert; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.general.Util; import java.util.*; import java.util.stream.Collectors; /** * @author:dxfeng * @createTime: 2023/06/29 * @version: 1.0 */ public class ChartServiceImpl extends Service implements ChartService { private static final String COMPANY_RIGHT = "OrgChart:All"; public String COMPANY_TABLE = ""; public String SUB_COMPANY_TABLE = ""; public String SUB_COMPANY_DEFINED_TABLE = ""; public String DEPARTMENT_TABLE = ""; public String DEPARTMENT_DEFINED_TABLE = ""; /** * 显示虚拟组织 */ boolean showVirtual = false; /** * 是否已创建虚拟组织字段 */ boolean hasVirtualFields; @Override public Map getCompanyData(Map params) { Map result = new HashMap<>(); boolean hasRight = HasRightUtil.hasRight(user, COMPANY_RIGHT, true); result.put("hasRight", hasRight); if (!hasRight) { return result; } // 根结点 String root = Util.null2String(params.get("root")); root = StringUtils.isBlank(root) ? "0" : root; // 维度 String dimension = Util.null2String(params.get("fclass")); dimension = StringUtils.isBlank(dimension) ? "0" : dimension; // 是否展示虚拟组织 String isVirtual = Util.null2String(params.get("fisvitual")); showVirtual = "1".equals(isVirtual); // 初始化表名 initTableNameByClass(dimension); RecordSet rs = new RecordSet(); List dataList = new ArrayList<>(); String sql = ""; ChartPO topChartPO = null; //TODO 查询当前实际数据 sql = getRealTimeTopSql(root, dimension); rs.executeQuery(sql); // 封装顶部节点 if (rs.next()) { topChartPO = new ChartPO(); topChartPO.setFtype(rs.getString("type")); topChartPO.setFobjid(rs.getString("id")); topChartPO.setFname(rs.getString("name")); topChartPO.setParentId(null); topChartPO.setExpand("1"); topChartPO.setFisvitual(rs.getString("isvitual")); topChartPO.setHasChildren(getHasChildren(topChartPO.getFtype(), topChartPO.getFobjid()).toString()); dataList.add(topChartPO); } // 向下查询数据 if (null != topChartPO) { findChildData(topChartPO, dataList); } result.put("api_status", true); result.put("data", dataList); return result; } @Override public Map asyncCompanyData(Map params) { // 维度 String dimension = Util.null2String(params.get("fclass")); dimension = StringUtils.isBlank(dimension) ? "0" : dimension; // 是否展示虚拟组织 String isVirtual = Util.null2String(params.get("fisvitual")); showVirtual = "1".equals(isVirtual); // 初始化表名 initTableNameByClass(dimension); String ids = (String) params.get("ids"); List dataList = new ArrayList<>(); if (StringUtils.isNotBlank(ids)) { RecordSet rs = new RecordSet(); String[] split = ids.split(","); for (String s : split) { //TODO 查询当前实际数据 if (s.contains("_")) { String fObjId = s.split("_")[1]; if (s.startsWith("s")) { if (hasVirtualFields) { if (showVirtual) { rs.executeQuery("select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and a.supsubcomid = '" + fObjId + "'" + " union select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and (a.supdepid is null or a.supdepid = '0') and subcompanyid1 = '" + fObjId + "'"); } else { rs.executeQuery("select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and (b.fblx is null or b.fblx != '1') and a.supsubcomid = '" + fObjId + "'" + " union select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and (a.supdepid is null or a.supdepid = '0') and (b.bmlx is null or b.bmlx != '1') and subcompanyid1 = '" + fObjId + "'"); } } else { rs.executeQuery("select a.id,a.subcompanyname as 'name','1' as 'type' from " + SUB_COMPANY_TABLE + " a where (canceled is null or canceled != '1') and supsubcomid = '" + fObjId + "'" + " union select a.id,a.departmentname as 'name','2' as 'type' from " + DEPARTMENT_TABLE + " a where (canceled is null or canceled != '1') and (supdepid is null or supdepid = '0') and subcompanyid1 = '" + fObjId + "'"); } } else if (s.startsWith("d")) { if (hasVirtualFields) { if (showVirtual) { rs.executeQuery( "select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and supdepid = '" + fObjId + "'"); } else { rs.executeQuery( "select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join hrmdepartmentdefined b on a.id = b.deptid where (canceled is null or canceled != '1') and (b.bmlx is null or b.bmlx != '1') and a.supdepid = '" + fObjId + "'"); } } else { rs.executeQuery( "select a.id,a.departmentname as 'name','2' as 'type' from " + DEPARTMENT_TABLE + " a where (canceled is null or canceled != '1') and supdepid = '" + fObjId + "'"); } } while (rs.next()){ ChartPO chartPO = new ChartPO(); chartPO.setFtype(rs.getString("type")); chartPO.setFobjid(rs.getString("id")); chartPO.setFname(rs.getString("name")); chartPO.setParentId(s); chartPO.setExpand("0"); chartPO.setFisvitual(rs.getString("isvitual")); chartPO.setHasChildren(getHasChildren(chartPO.getFtype(), chartPO.getFobjid()).toString()); dataList.add(chartPO); } } } } Map result = new HashMap<>(); result.put("api_status", true); result.put("data", dataList); return result; } @Override public Map getDepartmentDetail(Map params) { String rootId = Util.null2String(params.get("rootId")); OrganizationAssert.isFalse(StringUtils.isBlank(rootId) || !rootId.startsWith("d_"), "数据有误,未查询到对应数据"); String departmentId = rootId.split("_")[1]; String detauleType = Util.null2String(params.get("detauleType")); if(!"chart".equals(detauleType)){ return ServiceUtil.getService(HrmResourceServiceImpl.class, user).chartResourceList(Integer.parseInt(departmentId)); } // 维度 String dimension = Util.null2String(params.get("fclass")); dimension = StringUtils.isBlank(dimension) ? "0" : dimension; // 初始化表名 initTableNameByClass(dimension); List dataList = new ArrayList<>(); List resourceList = new ArrayList<>(); Set jobTitleSet = new HashSet<>(); RecordSet rs = new RecordSet(); // TODO 查询当前实际的数据 String sql; // 查询当当前部门下的人员 if ("0".equals(dimension)) { sql = "select a.id,a.lastname as 'name' ,a.jobtitle from hrmresource a where a.departmentid = '" + departmentId + "'"; } else { sql = "select a.id,a.lastname as 'name' ,a.jobtitle from hrmresource a inner join hrmresourcevirtual b on a.id = b.resourceid where b.departmentid = '" + departmentId + "'"; } rs.executeQuery(sql); while (rs.next()){ String jobTitle = Util.null2String(rs.getString("jobtitle")); ChartPO chartPO = new ChartPO(); chartPO.setFtype("4"); chartPO.setFobjid(rs.getString("id")); chartPO.setFname(rs.getString("name")); // 岗位处理后的ID chartPO.setParentId(departmentId + "_" + jobTitle); chartPO.setExpand("1"); chartPO.setHasChildren("0"); resourceList.add(chartPO); jobTitleSet.add(jobTitle); } Map> resourceMap = resourceList.stream().collect(Collectors.groupingBy(ChartPO::getParentId)); // 查询人员的岗位 if(CollectionUtils.isNotEmpty(jobTitleSet)) { sql = "select a.id,a.jobtitlename as 'name' from hrmjobtitles a where a.id in(" + StringUtils.join(jobTitleSet, ",") + ")"; rs.executeQuery(sql); while (rs.next()){ ChartPO chartPO = new ChartPO(); chartPO.setFtype("3"); chartPO.setFobjid(rs.getString("id")); chartPO.setId(departmentId + "_" + chartPO.getFobjid()); chartPO.setFname(rs.getString("name")); // 岗位处理后的ID chartPO.setParentId(rootId); chartPO.setExpand("1"); chartPO.setHasChildren("1"); dataList.add(chartPO); // 避免出现人员没有上级岗位的情况 List chartPOS = resourceMap.get(chartPO.getId()); if (CollectionUtils.isNotEmpty(chartPOS)) { dataList.addAll(chartPOS); } } } // 查询部门本身 sql = "select a.id,a.departmentname as 'name' from " + DEPARTMENT_TABLE + " a where id = '" + departmentId + "'"; rs.executeQuery(sql); if(rs.next()){ ChartPO chartPO = new ChartPO(); chartPO.setFtype("2"); chartPO.setFobjid(departmentId); chartPO.setId(rootId); chartPO.setFname(rs.getString("name")); // 岗位处理后的ID chartPO.setExpand("1"); chartPO.setHasChildren(CollectionUtils.isNotEmpty(dataList) ? "1" : "0"); dataList.add(chartPO); } Map result = new HashMap<>(); result.put("api_status", true); result.put("data", dataList); return result; } /** * 查询实时数据,顶级元素SQL * * @param root 顶级元素ID * @param dimension 维度ID * @return 查询SQL */ private String getRealTimeTopSql(String root, String dimension) { if ("0".equals(root)) { // 查询集团数据 if ("0".equals(dimension)) { // 查询实际集团表 return "select id,companyname as 'name','0' as 'type' from " + COMPANY_TABLE; } else { // 查询其他维度集团信息 return "select id,companyname as 'name','0' as 'type' from " + COMPANY_TABLE + " where id = '" + dimension + "'"; } } else { if (hasVirtualFields) { if (showVirtual) { return "select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where a.id = '" + root + "'"; } else { return "select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where a.id = '" + root + "' and (b.fblx is null or b.fblx!='1')"; } } else { return "select id,subcompanyname as 'name','1' as 'type' from " + SUB_COMPANY_TABLE + " where id = '" + root + "'"; } } } /** * 查询实时数据,子节点元素 * * @param topChartPO 父级元素 * @param dataList 所有元素集合 */ private void findChildData(ChartPO topChartPO, List dataList) { String fType = topChartPO.getFtype(); String fObjId = topChartPO.getFobjid(); String sql = ""; if (StringUtils.isNotBlank(fType)) { switch (fType) { case "0": if (hasVirtualFields) { if (showVirtual) { sql = "select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and (a.supsubcomid is null or a.supsubcomid = '0') and a.companyid = '" + fObjId + "'"; } else { sql = "select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and (a.supsubcomid is null or a.supsubcomid = '0') and (b.fblx is null or b.fblx != '1') and a.companyid = '" + fObjId + "'"; } } else { sql = "select a.id,a.subcompanyname as 'name','1' as 'type' from " + SUB_COMPANY_TABLE + " a where (a.canceled is null or a.canceled != '1') and (a.supsubcomid is null or a.supsubcomid = '0') and a.companyid = '" + fObjId + "'"; } break; case "1": if (hasVirtualFields) { if (showVirtual) { sql = "select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and a.supsubcomid = '" + fObjId + "'" + " union select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and (a.supdepid is null or a.supdepid = '0') and subcompanyid1 = '" + fObjId + "'"; } else { sql = "select a.id,a.subcompanyname as 'name','1' as 'type' ,b.fblx as 'isvitual' from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and (b.fblx is null or b.fblx != '1') and a.supsubcomid = '" + fObjId + "'" + " union select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and (a.supdepid is null or a.supdepid = '0') and (b.bmlx is null or b.bmlx != '1') and subcompanyid1 = '" + fObjId + "'"; } } else { sql = "select a.id,a.subcompanyname as 'name','1' as 'type' from " + SUB_COMPANY_TABLE + " a where (canceled is null or canceled != '1') and supsubcomid = '" + fObjId + "'" + " union select a.id,a.departmentname as 'name','2' as 'type' from " + DEPARTMENT_TABLE + " a where (canceled is null or canceled != '1') and (supdepid is null or supdepid = '0') and subcompanyid1 = '" + fObjId + "'"; } break; case "2": if (hasVirtualFields) { if (showVirtual) { sql = "select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and supdepid = '" + fObjId + "'"; } else { sql = "select a.id,a.departmentname as 'name','2' as 'type' ,b.bmlx as 'isvitual' from " + DEPARTMENT_TABLE + " a left join hrmdepartmentdefined b on a.id = b.deptid where (canceled is null or canceled != '1') and (b.bmlx is null or b.bmlx != '1') and a.supdepid = '" + fObjId + "'"; } } else { sql = "select a.id,a.departmentname as 'name','2' as 'type' from " + DEPARTMENT_TABLE + " a where (canceled is null or canceled != '1') and supdepid = '" + fObjId + "'"; } break; default: break; } } if (StringUtils.isNotBlank(sql)) { List currentList = new ArrayList<>(); RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); while (recordSet.next()) { ChartPO chartPO = new ChartPO(); chartPO.setFtype(recordSet.getString("type")); chartPO.setFobjid(recordSet.getString("id")); chartPO.setFname(recordSet.getString("name")); chartPO.setParentId(topChartPO.getId()); // 非部门元素展开 chartPO.setExpand(topChartPO.getId().startsWith("d") ? "0" : "1"); chartPO.setFisvitual(recordSet.getString("isvitual")); chartPO.setHasChildren(getHasChildren(chartPO.getFtype(), chartPO.getFobjid()).toString()); currentList.add(chartPO); } for (ChartPO chartPO : currentList) { if (chartPO.getParentId().startsWith("d")) { // 部门只展示一级 continue; } findChildData(chartPO, dataList); } dataList.addAll(currentList); } } /** * 根据维度初始化表名 * * @param fClass 所选维度 */ public void initTableNameByClass(String fClass) { if (StringUtils.isBlank(fClass) || "0".equals(fClass)) { COMPANY_TABLE = "hrmcompany"; SUB_COMPANY_TABLE = "hrmsubcompany"; SUB_COMPANY_DEFINED_TABLE = "hrmsubcompanydefined"; DEPARTMENT_TABLE = "hrmdepartment"; DEPARTMENT_DEFINED_TABLE = "hrmdepartmentdefined"; RecordSet rs = new RecordSet(); rs.executeQuery("select count(1) as num from hrm_formfield where (GROUPID =6 and FIELDNAME = 'fblx') or (GROUPID =7 and FIELDNAME = 'bmlx')"); if (rs.next()) { String num = rs.getString("num"); hasVirtualFields = "2".equals(num); } else { hasVirtualFields = false; } } else { COMPANY_TABLE = "hrmcompanyvirtual"; SUB_COMPANY_TABLE = "hrmsubcompanyvirtual"; DEPARTMENT_TABLE = "hrmdepartmentvirtual"; // 其他维度,无虚拟组织 hasVirtualFields = false; } } /** * 判断是否有子元素 * * @param fType 元素类型 * @param fObjId 元素ID * @return boolean 包含子元素:true,不包含子元素:false */ private Boolean getHasChildren(String fType, String fObjId) { String sql = ""; if (StringUtils.isNotBlank(fType)) { switch (fType) { case "0": sql = "select id from " + SUB_COMPANY_TABLE + " where (supsubcomid is null or supsubcomid = '0') and companyid = '" + fObjId + "'"; break; case "1": if (hasVirtualFields && !showVirtual) { sql = "select a.id from " + SUB_COMPANY_TABLE + " a left join " + SUB_COMPANY_DEFINED_TABLE + " b on a.id = b.subcomid where (a.canceled is null or a.canceled != '1') and (b.fblx is null or b.fblx != '1') and a.supsubcomid = '" + fObjId + "' union select a.id from " + DEPARTMENT_TABLE + " a left join " + DEPARTMENT_DEFINED_TABLE + " b on a.id = b.deptid where (a.canceled is null or a.canceled != '1') and (a.supdepid is null or a.supdepid = '0') and (b.bmlx is null or b.bmlx != '1') and subcompanyid1 = '" + fObjId + "'"; } else { sql = "select id from " + SUB_COMPANY_TABLE + " where (canceled is null or canceled != '1') and supsubcomid = '" + fObjId + "' union select id from " + DEPARTMENT_TABLE + " where (canceled is null or canceled != '1') and (supdepid is null or supdepid = '0') and subcompanyid1 = '" + fObjId + "'"; } break; case "2": if (hasVirtualFields && !showVirtual) { sql = "select a.id from " + DEPARTMENT_TABLE + " a left join hrmdepartmentdefined b on a.id = b.deptid where (canceled is null or canceled != '1') and (b.bmlx is null or b.bmlx != '1') and a.supdepid = '" + fObjId + "'"; } else { sql = "select id from " + DEPARTMENT_TABLE + " where (canceled is null or canceled != '1') and supdepid = '" + fObjId + "'"; } break; default: break; } } if (StringUtils.isNotBlank(sql)) { RecordSet rs = new RecordSet(); rs.executeQuery(sql); return rs.next(); } return false; } }