package com.engine.organization.service.impl; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import com.engine.core.impl.Service; import com.engine.organization.service.OrgChartService; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.hrm.User; import java.util.*; /** * @className: OrgChartServiceImpl * @author: dengjp * @date: 2022/7/7 * @description: 组织架构图ServiceImpl **/ public class OrgChartServiceImpl extends Service implements OrgChartService { private RecordSet grs = new RecordSet(); @Override public Map getOptionCondition(Map request2Map, User user) { RecordSet rs = new RecordSet(); String type = (String) request2Map.get("type"); rs.executeQuery("select id, companyname from HrmCompanyVirtual order by id"); Map result = new HashMap<>(); List> fclasslist = new ArrayList<>(); Map defaultItem = new HashMap<>(); defaultItem.put("id", "0"); defaultItem.put("companyname", "行政维度"); fclasslist.add(defaultItem); while(rs.next()) { Map item = new HashMap<>(); item.put("id", rs.getString("id")); item.put("companyname", rs.getString("companyname")); fclasslist.add(item); } rs.executeQuery("select id, fnumber, fname from jcl_org_map " +("company".equals(type) ? "where ftype in (0, 1, 2)" : "") +" order by ftype , id "); List> companylist = new ArrayList<>(); Map defaultCompanyItem = new HashMap<>(); defaultCompanyItem.put("id", "0"); defaultCompanyItem.put("fname", "集团"); companylist.add(defaultCompanyItem); while(rs.next()) { Map item = new HashMap<>(); item.put("id", rs.getString("id")); item.put("fnumber", rs.getString("fnumber")); item.put("fname", rs.getString("fname")); companylist.add(item); } result.put("api_status", true); result.put("fclasslist", fclasslist); result.put("companylist", companylist); return result; } private String companyDateWhereSql(Map request2Map) { String date = (String) request2Map.get("date"); // 数据日期 if(StringUtils.isBlank(date)) { date = DateUtil.format( DateUtil.offset(new Date() , DateField.DAY_OF_MONTH, 1), "yyyy-MM-dd"); } String fclass = (String) request2Map.get("fclass"); // 维度 String fisvitual = (String) request2Map.get("fisvitual"); // 是否显示虚拟组织 if(StringUtils.isBlank(fisvitual)) { fisvitual = "0"; } String whereSql = " where 1 = 1 "; whereSql += " and ((fdatebegin <= '"+ date +"' and fdateend >= '"+ date +"') or (fdatebegin <= '"+ date +"' and fdateend is null )) "; whereSql += " and fclass = " + fclass +" "; if("0".equals(fisvitual)) { whereSql += " and fisvitual = 0 "; }else { whereSql += " and fisvitual in (0, 1) "; } whereSql += " and ftype in (0 , 1 ,2) "; return whereSql; } @Override public Map getCompanyData(Map request2Map, User user) { String root = (String) request2Map.get("root"); // 根节点 String level = (String) request2Map.get("level"); // 显示层级 if(StringUtils.isBlank(level)) { level = "3"; } String whereSql = companyDateWhereSql(request2Map); String whereItemSql = " "; if("0".equals(root)) { // 集团的情况 whereItemSql += " and ftype = 0 "; } else { whereItemSql += " and id = '" + root +"' "; } // 获取根节点 RecordSet rs = new RecordSet(); rs.executeQuery("select id, fname, ftype, fparentid, fnumber from jcl_org_map " + whereSql + whereItemSql); List> list = new ArrayList<>(); String id = null; if(rs.next()) { Map item = new HashMap<>(); id = rs.getString("id"); item.put("id", rs.getString("id")); item.put("fname", rs.getString("fname")); item.put("ftype", rs.getString("ftype")); item.put("fnumber", rs.getString("fnumber")); item.put("parentId", null); item.put("expand", "1"); item.put("hasChildren", hasChildren(rs.getString("id"), true)); list.add(item); } int currentLevel = 1; if(currentLevel + 1 <= Integer.parseInt(level)) { findCompanyItemByParantId(id, currentLevel + 1, level, rs, list, whereSql, true); } Map result = new HashMap<>(); result.put("api_status", true); result.put("data", list); return result; } private void findCompanyItemByParantId(String id, int currentLevel, String level, RecordSet rs, List> list, String whereSql, boolean expand) { rs.executeQuery("select id, fname, ftype, fparentid, fnumber from jcl_org_map " + whereSql + " and fparentid = " + id); List> currentList = new ArrayList<>(); while(rs.next()) { Map item = new HashMap<>(); item.put("id", rs.getString("id")); item.put("fname", rs.getString("fname")); item.put("ftype", rs.getString("ftype")); item.put("parentId", rs.getString("fparentid")); item.put("fnumber", rs.getString("fnumber")); item.put("expand", expand ? "1" : "0"); item.put("hasChildren", hasChildren(rs.getString("id"), true)); currentList.add(item); } list.addAll(currentList); for (Map stringObjectMap : currentList) { if(currentLevel + 1 <= Integer.parseInt(level)) { findCompanyItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, true); } else if(currentLevel == Integer.parseInt(level)) { findCompanyItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, false); } } } private String userWhereSql(Map request2Map) { String date = (String) request2Map.get("date"); // 数据日期 if(StringUtils.isBlank(date)) { date = DateUtil.format( DateUtil.offset(new Date() , DateField.DAY_OF_MONTH, 1), "yyyy-MM-dd"); } String fclass = (String) request2Map.get("fclass"); // 维度 String fisvitual = (String) request2Map.get("fisvitual"); // 是否显示虚拟组织 if(StringUtils.isBlank(fisvitual)) { fisvitual = "0"; } String whereSql = " where 1 = 1 "; whereSql += " and ((t.fdatebegin <= '"+ date +"' and t.fdateend >= '"+ date +"') or (t.fdatebegin <= '"+ date +"' and t.fdateend is null )) "; whereSql += " and t.fclass = " + fclass +" "; if("0".equals(fisvitual)) { whereSql += " and t.fisvitual = 0 "; }else { whereSql += " and t.fisvitual in (0, 1) "; } return whereSql; } @Override public Map getUserData(Map request2Map, User user) { String root = (String) request2Map.get("root"); // 根节点 String level = (String) request2Map.get("level"); // 显示层级 if(StringUtils.isBlank(level)) { level = "3"; } String whereSql = userWhereSql(request2Map); String whereItemSql = " "; if("0".equals(root)) { // 集团的情况 whereItemSql += " and t.ftype = 0 "; } else { whereItemSql += " and t.id = '" + root +"' "; } // 获取根节点 RecordSet rs = new RecordSet(); rs.executeQuery("select t.id, t.fname, t.ftype, t.fparentid, t.fleadername, t.fleaderimg, t.fleaderjob, t.fplan, t.fonjob, t.fnumber, t.fleader from jcl_org_map t " + whereSql + whereItemSql); List> list = new ArrayList<>(); String id = null; if(rs.next()) { Map item = new HashMap<>(); id = rs.getString("id"); item.put("id", rs.getString("id")); item.put("fname", rs.getString("fname")); item.put("ftype", rs.getString("ftype")); item.put("parentId", null); item.put("fleadername", rs.getString("fleadername")); item.put("fleaderimg", rs.getString("fleaderimg")); item.put("fleaderjob", rs.getString("fleaderjob")); item.put("fplan", rs.getString("fplan")); item.put("fonjob", rs.getString("fonjob")); item.put("hasChildren", hasChildren(rs.getString("id"), false)); item.put("expand", "1"); item.put("fnumber", rs.getString("fnumber")); item.put("fleader", rs.getString("fleader")); list.add(item); } int currentLevel = 1; if(currentLevel + 1 <= Integer.parseInt(level)) { findUserItemByParantId(id, currentLevel + 1, level, rs, list, whereSql, true); } Map result = new HashMap<>(); result.put("api_status", true); result.put("data", list); return result; } @Override public Map asyncUserData(Map request2Map, User user) { String ids = (String) request2Map.get("ids"); String whereSql = userWhereSql(request2Map); whereSql += " and fparentid in (" +ids+ ") "; RecordSet rs = new RecordSet(); rs.executeQuery("select t.id, t.fname, t.ftype, t.fparentid, t.fleadername, t.fleaderimg, t.fleaderjob, t.fplan, t.fonjob, t.fnumber, t.fleader from jcl_org_map t " + whereSql ); List> currentList = new ArrayList<>(); while(rs.next()) { Map item = new HashMap<>(); item.put("id", rs.getString("id")); item.put("fname", rs.getString("fname")); item.put("ftype", rs.getString("ftype")); item.put("parentId", rs.getString("fparentid")); item.put("fleadername", rs.getString("fleadername")); item.put("fleaderimg", rs.getString("fleaderimg")); item.put("fleaderjob", rs.getString("fleaderjob")); item.put("fplan", rs.getString("fplan")); item.put("fonjob", rs.getString("fonjob")); item.put("fnumber", rs.getString("fnumber")); item.put("hasChildren", hasChildren(rs.getString("id"), false)); item.put("fleader", rs.getString("fleader")); currentList.add(item); } for (Map stringObjectMap : currentList) { if ("4".equals(stringObjectMap.get("ftype"))) { // 员工信息 rs.executeQuery("select id, mobile, homeaddress from hrmresource where id = ? ", stringObjectMap.get("fnumber")); if (rs.next()) { stringObjectMap.put("mobile", rs.getString("mobile")); stringObjectMap.put("address", rs.getString("homeaddress")); } rs.executeQuery("select departmentname from hrmresource hrm \n" + "left join hrmdepartment d\n" + "on hrm.departmentid = d.id\n" + "where hrm.id = ? ", stringObjectMap.get("fnumber")); if (rs.next()) { stringObjectMap.put("department", rs.getString("departmentname")); } } } Map result = new HashMap<>(); result.put("api_status", true); result.put("data", currentList); return result; } @Override public Map asyncCompanyData(Map request2Map, User user) { String ids = (String) request2Map.get("ids"); String whereSql = companyDateWhereSql(request2Map); whereSql += " and fparentid in (" +ids+ ") "; RecordSet rs = new RecordSet(); rs.executeQuery("select id, fname, ftype, fparentid, fnumber from jcl_org_map " + whereSql); List> currentList = new ArrayList<>(); while(rs.next()) { Map item = new HashMap<>(); item.put("id", rs.getString("id")); item.put("fname", rs.getString("fname")); item.put("ftype", rs.getString("ftype")); item.put("parentId", rs.getString("fparentid")); item.put("fnumber", rs.getString("fnumber")); item.put("hasChildren", hasChildren(rs.getString("id"), true)); currentList.add(item); } Map result = new HashMap<>(); result.put("api_status", true); result.put("data", currentList); return result; } private void findUserItemByParantId(String id, int currentLevel, String level, RecordSet rs, List> list, String whereSql, boolean expand) { rs.executeQuery("select t.id, t.fname, t.ftype, t.fparentid, t.fleadername, t.fleaderimg, t.fleaderjob, t.fplan, t.fonjob, t.fnumber from jcl_org_map t " + whereSql + " and t.fparentid = " + id); List> currentList = new ArrayList<>(); while(rs.next()) { Map item = new HashMap<>(); item.put("id", rs.getString("id")); item.put("fname", rs.getString("fname")); item.put("ftype", rs.getString("ftype")); item.put("parentId", rs.getString("fparentid")); item.put("fleadername", rs.getString("fleadername")); item.put("fleaderimg", rs.getString("fleaderimg")); item.put("fleaderjob", rs.getString("fleaderjob")); item.put("fplan", rs.getString("fplan")); item.put("fonjob", rs.getString("fonjob")); item.put("fnumber", rs.getString("fnumber")); item.put("expand", expand ? "1" : "0"); item.put("hasChildren", hasChildren(rs.getString("id"), false)); currentList.add(item); } for (Map stringObjectMap : currentList) { if("4".equals(stringObjectMap.get("ftype"))) { // 员工信息 rs.executeQuery("select id, mobile, homeaddress from hrmresource where id = ? ", stringObjectMap.get("fnumber")); if(rs.next()) { stringObjectMap.put("mobile", rs.getString("mobile")); stringObjectMap.put("address", rs.getString("homeaddress")); } rs.executeQuery("select departmentname from hrmresource hrm \n" + "left join hrmdepartment d\n" + "on hrm.departmentid = d.id\n" + "where hrm.id = ? ", stringObjectMap.get("fnumber")); if(rs.next()) { stringObjectMap.put("department", rs.getString("departmentname")); } } if(currentLevel + 1 <= Integer.parseInt(level)) { findUserItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, true); } else if(currentLevel == Integer.parseInt(level) ) { // 多查一层 findUserItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, false); } } list.addAll(currentList); } private boolean hasChildren(String id, boolean isCompany) { String whereSql = " where fparentid = " + id + " "; if(isCompany) { whereSql += " and ftype in (0, 1, 2) "; } grs.executeQuery("select count(1) as count from jcl_org_map " + whereSql); String count = "0"; if(grs.next()) { count = grs.getString("count"); } return !"0".equals(count); } }