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-hrm-organization/src/com/engine/organization/service/impl/ChartServiceImpl.java

449 lines
23 KiB
Java

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<String, Object> getCompanyData(Map<String, Object> params) {
Map<String, Object> 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<ChartPO> 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<String, Object> asyncCompanyData(Map<String, Object> 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<ChartPO> 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<String, Object> result = new HashMap<>();
result.put("api_status", true);
result.put("data", dataList);
return result;
}
@Override
public Map<String, Object> getDepartmentDetail(Map<String, Object> 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<ChartPO> dataList = new ArrayList<>();
List<ChartPO> resourceList = new ArrayList<>();
Set<String> jobTitleSet = new HashSet<>();
int departmentOnJob = 0;
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.setId(chartPO.getFobjid());
chartPO.setFname(rs.getString("name"));
// 岗位处理后的ID
chartPO.setParentId(departmentId + "_" + jobTitle);
chartPO.setExpand("1");
chartPO.setHasChildren("0");
resourceList.add(chartPO);
jobTitleSet.add(jobTitle);
}
Map<String, List<ChartPO>> 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<ChartPO> chartPOS = resourceMap.get(chartPO.getId());
if (CollectionUtils.isNotEmpty(chartPOS)) {
dataList.addAll(chartPOS);
chartPO.setFonjob(chartPOS.size());
departmentOnJob += chartPO.getFonjob();
}
}
}
// 查询部门本身
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");
chartPO.setFonjob(departmentOnJob);
dataList.add(chartPO);
}
Map<String, Object> 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<ChartPO> 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<ChartPO> 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;
}
}