From 1a000b6c4c30d42f6b8ef4c8e8687c830dacd1c0 Mon Sep 17 00:00:00 2001 From: Administrator <704728292@qq.com> Date: Fri, 26 Sep 2025 16:02:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmployeeRelationController.java | 73 +- .../esb/SyncOrganizationPersonInfo.java | 10 +- .../esb/cbd/SyncDepartmentChanges.java | 52 +- .../esb/cbd/XmindDataFilterCmd.java | 830 ++++++++++++++---- 4 files changed, 738 insertions(+), 227 deletions(-) diff --git a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/controller/EmployeeRelationController.java b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/controller/EmployeeRelationController.java index 3e5e4e4..49b72d8 100644 --- a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/controller/EmployeeRelationController.java +++ b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/controller/EmployeeRelationController.java @@ -3,6 +3,7 @@ package com.weaver.seconddev.jcl.organization.controller; import com.weaver.common.authority.annotation.WeaPermission; import com.weaver.common.base.entity.result.WeaResult; import com.weaver.ebuilder.form.client.entity.field.ModuleField; +import com.weaver.framework.rpc.annotation.RpcReference; import com.weaver.seconddev.jcl.common.service.CommonService; import com.weaver.seconddev.jcl.organization.service.EmployeeRelationService; import com.weaver.seconddev.jcl.organization.util.RecruitModuleUtils; @@ -34,6 +35,8 @@ public class EmployeeRelationController { private EmployeeRelationService employeeRelationService; @Autowired private CommonService commonService; + @RpcReference + HrRemoteApiService hrRemoteApiService; /** * 员工管理-根据姓名+手机号/姓名+邮箱/身份证号判断是否黑名单 @@ -398,36 +401,48 @@ public class EmployeeRelationController { return personYdzqMonthList; } + /** + * 根据数据源名称获得该数据源下所有数据 + * @return + */ + @GetMapping("/getUserDatasBySourceName") + @WeaPermission(publicPermission = true) + public List> getUserDatasBySourceName(){ + List> personYdzqMonthList = commonService.getListDatasBySourceName("人员编制统计数据","LOGIC","weaver-hr-service"); + log.error("getListDatasBySourceName.personYdzqMonthList:{}",personYdzqMonthList); + return personYdzqMonthList; + } + /** * 部门编制数查询 */ -// @GetMapping("/getPreparationsByBm") -// @WeaPermission(publicPermission = true) -// public List> getPreparationsByBm(@RequestParam("deptId") String deptId){ -// log.error("getPreparationsByBm.deptId:{}", deptId); -// log.error("getPreparationsByBm.hrRemoteApiService:{}", hrRemoteApiService); -// log.error("getPreparationsByBm.tenant_key:{}", tenant_key); -// List> list = new ArrayList<>(); -// HrComEstCfgInfoParam hrComEstCfgInfoParam = new HrComEstCfgInfoParam(); -// hrComEstCfgInfoParam.setFindLatestParent(false); -// hrComEstCfgInfoParam.setOrgId(Long.parseLong(deptId)); -// log.error("getPreparationsByBm.hrComEstCfgInfoParam:{}", hrComEstCfgInfoParam); -// long employeeId = Long.parseLong("1167276462243069953"); -// WeaResult estCfgInfo = hrRemoteApiService.getEstCfgInfo(tenant_key, employeeId, hrComEstCfgInfoParam); -// log.error("getPreparationsByBm.estCfgInfo:{}", estCfgInfo); -// HrComEstCfgInfoDto data = new HrComEstCfgInfoDto(); -// if (estCfgInfo != null && estCfgInfo.isStatus()) { -// data = estCfgInfo.getData(); -// } -// Map map = new HashMap<>(); -// map.put("data",data); -// map.put("deptId",deptId); -// map.put("hrRemoteApiService",hrRemoteApiService); -// map.put("tenant_key",tenant_key); -// map.put("hrComEstCfgInfoParam",hrComEstCfgInfoParam); -// map.put("estCfgInfo",estCfgInfo); -// list.add(map); -// log.error("getPreparationsByBm.HrComEstCfgInfoDto:{}",data); -// return list; -// } + @GetMapping("/getPreparationsByBm") + @WeaPermission(publicPermission = true) + public List> getPreparationsByBm(@RequestParam("deptId") String deptId){ + log.error("getPreparationsByBm.deptId:{}", deptId); + log.error("getPreparationsByBm.hrRemoteApiService:{}", hrRemoteApiService); + log.error("getPreparationsByBm.tenant_key:{}", tenant_key); + List> list = new ArrayList<>(); + HrComEstCfgInfoParam hrComEstCfgInfoParam = new HrComEstCfgInfoParam(); + hrComEstCfgInfoParam.setFindLatestParent(false); + hrComEstCfgInfoParam.setOrgId(Long.parseLong(deptId)); + log.error("getPreparationsByBm.hrComEstCfgInfoParam:{}", hrComEstCfgInfoParam); + long employeeId = Long.parseLong("1167276462243069953"); + WeaResult estCfgInfo = hrRemoteApiService.getEstCfgInfo(tenant_key, employeeId, hrComEstCfgInfoParam); + log.error("getPreparationsByBm.estCfgInfo:{}", estCfgInfo); + HrComEstCfgInfoDto data = new HrComEstCfgInfoDto(); + if (estCfgInfo != null && estCfgInfo.isStatus()) { + data = estCfgInfo.getData(); + } + Map map = new HashMap<>(); + map.put("data",data); + map.put("deptId",deptId); + map.put("hrRemoteApiService",hrRemoteApiService); + map.put("tenant_key",tenant_key); + map.put("hrComEstCfgInfoParam",hrComEstCfgInfoParam); + map.put("estCfgInfo",estCfgInfo); + list.add(map); + log.error("getPreparationsByBm.HrComEstCfgInfoDto:{}",data); + return list; + } } \ No newline at end of file diff --git a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/SyncOrganizationPersonInfo.java b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/SyncOrganizationPersonInfo.java index 6ef614a..ddc1cda 100644 --- a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/SyncOrganizationPersonInfo.java +++ b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/SyncOrganizationPersonInfo.java @@ -178,7 +178,7 @@ public class SyncOrganizationPersonInfo implements EsbServerlessRpcRemoteInterfa String databaseId = DatabaseUtil.getDatabaseId(); if(databaseId.equalsIgnoreCase("sqlserver")){ listOfEmployees = getTableColumnsOfTableNameBySqlServer(); - log.error("SyncOrganizationPersonInfo.listOfEmployees:{}", listOfEmployees); + log.error("SyncOrganizationPersonInfo.sqlserver.listOfEmployees:{}", listOfEmployees); }else { listOfEmployee = getTableColumnsOfTableName("employee"); log.error("SyncOrganizationPersonInfo.listOfEmployee:{}", listOfEmployee); @@ -336,7 +336,13 @@ public class SyncOrganizationPersonInfo implements EsbServerlessRpcRemoteInterfa } } //增加必填字段 - userInfo_new.put("USER", getIgnoreCase(employee_info, "id")); + if(databaseId.equalsIgnoreCase("sqlserver")){ + log.error("SyncOrganizationPersonInfo.sqlserver.USER:{}","111"); + userInfo_new.put("[USER]", getIgnoreCase(employee_info, "id")); + }else{ + log.error("SyncOrganizationPersonInfo.Other.USER:{}","111"); + userInfo_new.put("USER", getIgnoreCase(employee_info, "id")); + } // 生成随机 ID long formuserdataid = IdGenerator.generate(); userInfo_new.put("FORM_DATA",formuserdataid); diff --git a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/SyncDepartmentChanges.java b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/SyncDepartmentChanges.java index f922e6b..2e655ac 100644 --- a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/SyncDepartmentChanges.java +++ b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/SyncDepartmentChanges.java @@ -499,6 +499,14 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { String bmsqcj = null!=map.get("bmsqcj")? map.get("bmsqcj") :""; String bz = null!=map.get("bz")? map.get("bz") :""; String zzmc = null!=map.get("zzmc")? map.get("zzmc") :""; + //2025/09/23 新增字段 + String zzsx = null!=map.get("zzsx")? map.get("zzsx") :""; + String hrbp = null!=map.get("hrbp")? map.get("hrbp") :""; + String frgs = null!=map.get("frgs")? map.get("frgs") :""; + //根据人员id查询人员工号 + String job_num1 = queryJobNumById(bmfzr); + String job_num2 = queryJobNumById(fgld); + String job_num3 = queryJobNumById(hrbp); //新增临时上级部门编号 String sjzzidls = "1147262691928662018"; //根据id查询部门code @@ -559,10 +567,10 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { if(b){ //修改部门信息 String formData = getDeptFormData(bh); - updatatDeptCustomField(tableName, formData, bmfzr, fgld, sscb, bmsqcj); + updatatDeptCustomField(tableName, formData, bmfzr, fgld, sscb, bmsqcj,zzsx,hrbp,frgs,job_num1,job_num2,job_num3); }else{ //给部门自定义表插入入参信息 - insertDeptCustomField(tableName,bh,bmfzr,fgld,sscb,bmsqcj,form_id,layout_id); + insertDeptCustomField(tableName,bh,bmfzr,fgld,sscb,bmsqcj,zzsx,hrbp,frgs,job_num1,job_num2,job_num3,form_id,layout_id); } }else{ result.put("status2","fail"); @@ -625,6 +633,14 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { String bmsqcj = null!=map.get("bmsqcj")? map.get("bmsqcj") :""; String bz = null!=map.get("bz")? map.get("bz") :""; String zzmc = null!=map.get("zzmc")? map.get("zzmc") :""; + //2025/09/23 新增字段 + String zzsx = null!=map.get("zzsx")? map.get("zzsx") :""; + String hrbp = null!=map.get("hrbp")? map.get("hrbp") :""; + String frgs = null!=map.get("frgs")? map.get("frgs") :""; + //根据人员id查询人员工号 + String job_num1 = queryJobNumById(bmfzr); + String job_num2 = queryJobNumById(fgld); + String job_num3 = queryJobNumById(hrbp); /** * 3.组装数据 @@ -681,10 +697,10 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { if(b){ //修改部门信息 String formData = getDeptFormData(bh); - updatatDeptCustomField(tableName, formData, bmfzr, fgld, sscb, bmsqcj); + updatatDeptCustomField(tableName, formData, bmfzr, fgld, sscb, bmsqcj,zzsx,hrbp,frgs,job_num1,job_num2,job_num3); }else{ //给部门自定义表插入入参信息 - insertDeptCustomField(tableName,bh,bmfzr,fgld,sscb,bmsqcj,form_id,layout_id); + insertDeptCustomField(tableName,bh,bmfzr,fgld,sscb,bmsqcj,zzsx,hrbp,frgs,job_num1,job_num2,job_num3,form_id,layout_id); } } else { result.put("status2", "fail"); @@ -806,7 +822,7 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { * 写入部门自定义表 * @return */ - public void insertDeptCustomField(String tableName,String code,String bmfzr,String fgld,String cbzx,String sqcj,String form_id,String layout_id){ + public void insertDeptCustomField(String tableName,String code,String bmfzr,String fgld,String cbzx,String sqcj,String zzsx,String hrbp,String frgs,String job_num1,String job_num2,String job_num3,String form_id,String layout_id){ // 生成随机 ID long id = IdGenerator.generate(); log.error("insertDeptCustomField.id:{}", id); @@ -830,9 +846,9 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { log.error("insertDeptCustomField.userId:{}", userId); String tableNameNew = "eteams."+tableName; String sql="insert into "+tableNameNew+"(ID, FORM_DATA_ID, DATA_INDEX, CREATE_TIME, UPDATE_TIME, TENANT_KEY, " + - " IS_DELETE, CREATOR, UPDATER, DELETE_TYPE, FT_STATUS, bmfzr,fgld,cbzx,sqcj)" + + " IS_DELETE, CREATOR, UPDATER, DELETE_TYPE, FT_STATUS, bmfzr,fgld,cbzx,sqcj,zzsx,hrbp,frgs,bmfzrgh,bmfgldgh,hrbgh)" + " values('" + id + "','" + id + "','0','"+nowData+"','" + nowData + "','" + tenant_key + "','0'," + - " '"+userId+"','"+userId+"','0','0','" + bmfzr + "','" + fgld + "','" + cbzx + "','" + sqcj + "')"; + " '"+userId+"','"+userId+"','0','0','" + bmfzr + "','" + fgld + "','" + cbzx + "','" + sqcj + "','" + zzsx + "','" + hrbp + "','" + frgs + "','" + job_num1 + "','" + job_num2 + "','" + job_num3 + "')"; log.error("insertDeptCustomField.sql:{}", sql); Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); List> recordList = databaseUtils.getDataSourceList(rs); @@ -863,9 +879,9 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { * 修改部门自定义表 * @return */ - public void updatatDeptCustomField(String tableName,String deptFormData,String bmfzr,String fgld,String cbzx,String sqcj){ + public void updatatDeptCustomField(String tableName,String deptFormData,String bmfzr,String fgld,String cbzx,String sqcj,String zzsx,String hrbp,String frgs,String job_num1,String job_num2,String job_num3){ String tableNameNew = "eteams."+tableName; - String sql="update "+tableNameNew+" set bmfzr = '"+bmfzr+"',fgld = '"+fgld+"',cbzx='"+cbzx+"',sqcj='"+sqcj+"'" + + String sql="update "+tableNameNew+" set bmfzr = '"+bmfzr+"',fgld = '"+fgld+"',cbzx='"+cbzx+"',sqcj='"+sqcj+"',zzsx='"+zzsx+"',hrbp='"+hrbp+"',frgs='"+frgs+"',bmfzrgh='"+job_num1+"',bmfgldgh='"+job_num2+"',hrbgh='"+job_num3+"'" + " where FORM_DATA_ID = '"+deptFormData+"' "; log.error("updatatDeptCustomField.sql:{}", sql); Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); @@ -873,6 +889,24 @@ public class SyncDepartmentChanges implements EsbServerlessRpcRemoteInterface { log.error("updatatDeptCustomField.recordList:{}", recordList); } + /** + * 根据人员id查询人员工号:job_num + * @return + */ + public String queryJobNumById(String id){ + String job_num = ""; + log.error("queryJobNumById.code:{}", id); + String sql = "select job_num from eteams.employee where id = '"+ id +"' and tenant_key = '"+RecruitModuleUtils.getCurrentTenantKey()+"' "; + log.error("queryJobNumById.sql:{}", sql); + Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); + List> recordList = databaseUtils.getDataSourceList(rs); + log.error("queryJobNumById.recordList:{}", recordList); + if(CollectionUtils.isNotEmpty(recordList)){ + job_num = String.valueOf(recordList.get(0).get("job_num")); + } + return job_num; + } + /** * 根据部门code查询是否存在此部门 * @return diff --git a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/XmindDataFilterCmd.java b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/XmindDataFilterCmd.java index 8398672..53cd5b0 100644 --- a/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/XmindDataFilterCmd.java +++ b/jcl-hrmorganization/secondev-jcl-hrmorganization/src/main/java/com/weaver/seconddev/jcl/organization/esb/cbd/XmindDataFilterCmd.java @@ -1,6 +1,7 @@ package com.weaver.seconddev.jcl.organization.esb.cbd; import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.common.hrm.util.ImmutableMapUtil; import com.weaver.framework.rpc.annotation.RpcReference; import com.weaver.loom.context.annotation.WeaHookReg; import com.weaver.loom.context.domain.AppInfo; @@ -9,19 +10,19 @@ import com.weaver.loom.context.domain.WeaHookResponse; import com.weaver.loom.context.register.RegHookEvent; import com.weaver.seconddev.jcl.common.service.CommonService; import com.weaver.seconddev.jcl.organization.entity.Deft; -import com.weaver.seconddev.jcl.organization.entity.Node; -import com.weaver.seconddev.jcl.organization.entity.Sheet; +import com.weaver.common.hrm.dto.xmind.Node; +import com.weaver.common.hrm.dto.xmind.Sheet; import com.weaver.seconddev.jcl.organization.util.DatabaseUtils; import com.weaver.seconddev.jcl.organization.util.RecruitModuleUtils; import com.weaver.teams.hrapp.dto.est.HrComEstCfgInfoDto; import com.weaver.teams.hrapp.dto.est.param.HrComEstCfgInfoParam; import com.weaver.teams.hrapp.rest.HrRemoteApiService; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @WeaHookReg(code = "HRM_XMIND_DATA_FILTER_001") @@ -29,19 +30,79 @@ public class XmindDataFilterCmd extends RegHookEvent { private static final Logger log = LoggerFactory.getLogger(XmindDataFilterCmd.class); private static String tenant_key = RecruitModuleUtils.getCurrentTenantKey(); + // 线程安全的全局岗位映射 + private static final Map>> DEPT_POSITION_MAP = new ConcurrentHashMap<>(); + private static final List> DEPT_POSITION_EST_MAP = new ArrayList<>(); + private static final List> POSITION_EST_MAP = new ArrayList<>(); + private static final Map DEPT_EMPLOYEE_COUNT_MAP = new ConcurrentHashMap<>(); + private static final Map POSITION_EMPLOYEE_COUNT_MAP = new ConcurrentHashMap<>(); + private static final Map>> USERINFO_MAP = new ConcurrentHashMap<>(); + private static final Map USERINFO_Level_MAP = new ConcurrentHashMap<>(); + private static final Map USERINFO_ZW_MAP = new ConcurrentHashMap<>(); @Autowired private DatabaseUtils databaseUtils; - @RpcReference - HrRemoteApiService hrRemoteApiService; @Autowired private CommonService commonService; +// @Override +// public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception { +// //入参,修改入参并不会影响到埋点的原始数据 +// Map param = request.getParams(); +// +// //创建Sheet数据 +// List sheets = new ArrayList<>(); +// Sheet allDataSheet = new Sheet().setId("1").setTitle("组织架构"); +//// Sheet orgDataSheet = new Sheet().setId("2").setTitle("组织详情"); +// sheets.add(allDataSheet); +//// sheets.add(orgDataSheet); +// +// //创建Sheet1数据 +// Node sheetData1 = new Node().setId(1147262691928662018L).setName("百茶百道").setType("department").setRemark("部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:岗位名称:百茶百道、编制数:0、在岗人数:1、缺编数:0\n人员:\n缺编:2"); +// allDataSheet.setNode(sheetData1); +// sheetData1.setChildren(Arrays.asList( +// new Node() +// .setId(1151352978370437120L) +// .setName("测试部门") +// .setType("department") +// .setRemark("部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:\n人员:\n缺编:2") +// .setChildren(Arrays.asList( +// new Node().setId(1154629364206919680L).setName("测试部门-1").setType("department") +// .setRemark("部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:\n人员:\n缺编:2") +// .setChildren(Arrays.asList( +// new Node().setId(1154629364206919681L).setName("测试部门-1-1").setType("department") +// .setRemark("部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:\n人员:\n缺编:2") +// )) +// )) +// )); +// Map result = ImmutableMapUtil.of("data", sheets); +// log.error("XmindDataFilterCmd666.result:{}", result); +// //设置出参 +// response.setResult(result); +// return response; +// } + @Override public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception { //入参,修改入参并不会影响到埋点的原始数据 Map param = request.getParams(); - + long start = System.nanoTime(); + //初始化部门岗位数据 + initialize(); + //初始化部门岗位数据 + initializeDeptEmployeeCount(); + //初始化各岗位人数 + initializePositionEmployeeCount(); + //初始化人员信息 + initializeUserInfo(); + //初始化人员职级 + initializeUserJobsetLevel(); + //初始化人员职位 + initializeUserZw(); + //初始化部门编制 + getDeptDatasBySourceName(); + //初始化岗位编制 + getListDatasBySourceName(); //创建Sheet数据 List sheets = new ArrayList<>(); Sheet allDataSheet = new Sheet().setId("1").setTitle("组织架构"); @@ -59,141 +120,98 @@ public class XmindDataFilterCmd extends RegHookEvent { deft.setName(String.valueOf(allDepartment.get("name"))); deft.setParent_id(String.valueOf(allDepartment.get("parent"))); //这里要根据部门id查询 - HrComEstCfgInfoDto cfgInfoDto = getPreparationsByBm(id); + List> bmBzList = getBzListByBmId(id); + log.error("XmindDataFilterCmd.bmBzList:{}", bmBzList); + // 处理数据(增加空列表校验) //编制数 - int estCount = cfgInfoDto.getEstCount(); + int estCount =0; //缺编数 - Integer estLackCount = cfgInfoDto.getEstLackCount(); + int estLackCount =0; //超编数 - Integer estOverCount = cfgInfoDto.getEstOverCount(); - //查询在岗人数 - int positionCount = getPositionCount(id); + int estOverCount =0; + if (bmBzList != null && !bmBzList.isEmpty()) { + Map data = bmBzList.get(0); + String value1 = String.valueOf(data.get("estCount")); + String value2 = String.valueOf(data.get("estLackCount")); + String value3 = String.valueOf(data.get("estOverCount")); + if (value1 == null || value1.trim().isEmpty()) { + }else { + estCount = Integer.parseInt(value1.trim()); + } + if (value2 == null || value2.trim().isEmpty()) { + }else { + estLackCount = Integer.parseInt(value2.trim()); + } + if (value3 == null || value3.trim().isEmpty()) { + }else { + estOverCount = Integer.parseInt(value3.trim()); + } + } + //查询部门在岗人数 + // 在调用前添加日志检查 + log.error("DEPT_EMPLOYEE_COUNT_MAP size: {}", DEPT_EMPLOYEE_COUNT_MAP != null ? DEPT_EMPLOYEE_COUNT_MAP.size() : "null"); + log.error("XmindDataFilterCmd.id8888:{}", id); + int positionCount = Optional.ofNullable(DEPT_EMPLOYEE_COUNT_MAP) + .map(map -> map.getOrDefault(id, 0)) + .orElse(0); //查询部门岗位名称 - List> positionByDept = getPositionByDept(id); + List> positionByDept = getPositionsByDept(id); + log.error("XmindDataFilterCmd.positionByDept:{}", positionByDept); //遍历部门岗位,查询岗位编制等相关信息 StringJoiner joiner = new StringJoiner(","); - for (Map map : positionByDept) { - String gwId = String.valueOf(map.get("id")); - String gwName = String.valueOf(map.get("name")); - //查询岗位编制数/缺编数 - List> personYdzqMonthList = getListDatasBySourceName(gwId); - // 处理数据(增加空列表校验) - int estCountGw = 0; - int estLackCountGw = 0; - if (!personYdzqMonthList.isEmpty()) { - Map data = personYdzqMonthList.get(0); - estCountGw = Integer.parseInt(String.valueOf(data.getOrDefault("estCount", 0))); - estLackCountGw = Integer.parseInt(String.valueOf(data.getOrDefault("estLackCount", 0))); - } - //查询岗位人数 - int countGw = getPositionCountGw(gwId); - String gwInfo = String.format("岗位名称:%s、编制数:%d、在岗人数:%d、缺编数:%d", - gwName, estCountGw, countGw, estLackCountGw); - joiner.add(gwInfo); - } - //查询人员:姓名/职级/职位 - StringBuilder sb = new StringBuilder(); - List> userNameByDept = getUserNameByDept(id); - for (Map map : userNameByDept) { - String userId = String.valueOf(map.get("id")); - String userName = String.valueOf(map.get("username")); - String jobset_level = String.valueOf(map.get("jobset_level")); - //职级 - String jobsetLevel = getJobsetLevel(jobset_level); - //职位 - String zw = getZw(userId); - // 格式化当前人员信息 - String personInfo = String.format("姓名:%s、职级:%s、职位:%s", - userName, jobsetLevel, zw); - - // 非首条数据添加分隔符 - if (sb.length() > 0) { - sb.append(","); - } - sb.append(personInfo); - } - // 计算remark - String remark = String.format("部门编制数:%d\n部门在岗人数:%d\n部门缺编数:%d\n岗位:%s\n人员:%s", - estCount, - positionCount, - estLackCount, - joiner.toString(), - sb.toString()); - if (null!=estLackCount&&estLackCount >0) { - remark += "\n缺编:" + (estLackCount); - } - if (null!=estOverCount&&estOverCount >0) { - remark += "\n超编:" + (estOverCount); - } - deft.setRemark(remark); - if((null!=estLackCount&&estLackCount >0) || (null!=estOverCount&&estOverCount >0)){ - deft.setBgColor("#F1F1F1"); - } - defts.add(deft); - } - //3.组装 - Node root = buildDepartmentTree(defts); - //4.塞入节点 - allDataSheet.setNode(root); - //独立部门 - List> getsfdcdlzzjgBm = getsfdcdlzzjgBm(); - //2.组装部门数据2 - List defts2 = new ArrayList<>(); - for (int i = 0; i < getsfdcdlzzjgBm.size(); i++) { - String id = String.valueOf(getsfdcdlzzjgBm.get(i).get("id")); - String name = String.valueOf(getsfdcdlzzjgBm.get(i).get("name")); - Sheet orgDataSheet = new Sheet().setId(String.valueOf(i+2)).setTitle(name); - //这里先要根据部门id分别查询其所有下级部门(包含自身) - List> allLinkDept = getAllLinkDept(id); - for (Map objectMap : allLinkDept) { - Deft deft = new Deft(); - deft.setId(String.valueOf(objectMap.get("id"))); - deft.setName(String.valueOf(objectMap.get("name"))); - deft.setParent_id(String.valueOf(objectMap.get("parent"))); - //这里要根据部门id查询 - HrComEstCfgInfoDto cfgInfoDto = getPreparationsByBm(id); - //编制数 - int estCount = cfgInfoDto.getEstCount(); - //缺编数 - Integer estLackCount = cfgInfoDto.getEstLackCount(); - //超编数 - Integer estOverCount = cfgInfoDto.getEstOverCount(); - //查询在岗人数 - int positionCount = getPositionCount(id); - //查询部门岗位名称 - List> positionByDept = getPositionByDept(id); - //遍历部门岗位,查询岗位编制等相关信息 - StringJoiner joiner = new StringJoiner(","); + if(CollectionUtils.isNotEmpty(positionByDept)){ for (Map map : positionByDept) { String gwId = String.valueOf(map.get("id")); String gwName = String.valueOf(map.get("name")); //查询岗位编制数/缺编数 - List> personYdzqMonthList = getListDatasBySourceName(gwId); + List> personYdzqMonthList = getBzListByGwId(gwId); + log.error("XmindDataFilterCmd.personYdzqMonthList:{}", personYdzqMonthList); // 处理数据(增加空列表校验) int estCountGw = 0; int estLackCountGw = 0; - if (!personYdzqMonthList.isEmpty()) { + if (personYdzqMonthList != null && !personYdzqMonthList.isEmpty()) { Map data = personYdzqMonthList.get(0); - estCountGw = Integer.parseInt(String.valueOf(data.getOrDefault("estCount", 0))); - estLackCountGw = Integer.parseInt(String.valueOf(data.getOrDefault("estLackCount", 0))); + String value1 = String.valueOf(data.get("estLackCount")); + String value2 = String.valueOf(data.get("estLackCount")); + if (value1 == null || value1.trim().isEmpty()) { + estCountGw = 0; + }else { + estCountGw = Integer.parseInt(value1.trim()); + } + if (value2 == null || value2.trim().isEmpty()) { + estCountGw = 0; + }else { + estLackCountGw = Integer.parseInt(value2.trim()); + } } //查询岗位人数 - int countGw = getPositionCountGw(gwId); + int countGw = Optional.ofNullable(POSITION_EMPLOYEE_COUNT_MAP) + .map(map1 -> map1.getOrDefault(gwId, 0)) + .orElse(0); + log.error("XmindDataFilterCmd.countGw:{}", countGw); String gwInfo = String.format("岗位名称:%s、编制数:%d、在岗人数:%d、缺编数:%d", gwName, estCountGw, countGw, estLackCountGw); joiner.add(gwInfo); } - //查询人员:姓名/职级/职位 - StringBuilder sb = new StringBuilder(); - List> userNameByDept = getUserNameByDept(id); + } + //查询人员:姓名/职级/职位 + StringBuilder sb = new StringBuilder(); + List> userNameByDept = getUserinfoByDept(id); + if(CollectionUtils.isNotEmpty(userNameByDept)){ for (Map map : userNameByDept) { String userId = String.valueOf(map.get("id")); String userName = String.valueOf(map.get("username")); String jobset_level = String.valueOf(map.get("jobset_level")); //职级 - String jobsetLevel = getJobsetLevel(jobset_level); + //String jobsetLevel = USERINFO_Level_MAP.get(jobset_level); + String jobsetLevel = Optional.ofNullable(USERINFO_Level_MAP) + .map(map1 -> map1.getOrDefault(jobset_level, "")) + .orElse(""); //职位 - String zw = getZw(userId); + //String zw = USERINFO_ZW_MAP.get(userId); + String zw = Optional.ofNullable(USERINFO_ZW_MAP) + .map(map1 -> map1.getOrDefault(userId, "")) + .orElse(""); // 格式化当前人员信息 String personInfo = String.format("姓名:%s、职级:%s、职位:%s", userName, jobsetLevel, zw); @@ -204,37 +222,186 @@ public class XmindDataFilterCmd extends RegHookEvent { } sb.append(personInfo); } - // 计算remark - String remark = String.format("部门编制数:%d\n部门在岗人数:%d\n部门缺编数:%d\n岗位:%s\n人员:%s", - estCount, - positionCount, - estLackCount, - joiner.toString(), - sb.toString()); - if (null!=estLackCount&&estLackCount >0) { - remark += "\n缺编:" + (estLackCount); - } - if (null!=estOverCount&&estOverCount >0) { - remark += "\n超编:" + (estOverCount); - } - deft.setRemark(remark); - if((null!=estLackCount&&estLackCount >0) || (null!=estOverCount&&estOverCount >0)){ - deft.setBgColor("#F1F1F1"); - } - defts2.add(deft); } - //3.组装 - Node root2 = buildDepartmentTree(defts2); - //4.塞入节点 - orgDataSheet.setNode(root2); - sheets.add(orgDataSheet); + // 计算remark + String remark = String.format("部门编制数:%d\n部门在岗人数:%d\n部门缺编数:%d\n岗位:%s\n人员:%s", + estCount, + positionCount, + estLackCount, + joiner.toString(), + sb.toString()); + log.error("XmindDataFilterCmd.remark11:{}", remark); + if (estLackCount >0) { + remark += "\n缺编:" + (estLackCount); + } + if (estOverCount >0) { + remark += "\n超编:" + (estOverCount); + } + deft.setRemark(remark); + if((estLackCount >0) || (estOverCount >0)){ + deft.setBgColor("#F1F1F1"); + } + defts.add(deft); + } + //3.组装 + Node root = buildDepartmentTree(defts); + //4.塞入节点 + allDataSheet.setNode(root); + log.error("XmindDataFilterCmd.allDataSheet11:{}", allDataSheet); + //独立部门 + List> getsfdcdlzzjgBm = getsfdcdlzzjgBm(); + if(CollectionUtils.isNotEmpty(getsfdcdlzzjgBm)){ + //2.组装部门数据2 + List defts2 = new ArrayList<>(); + for (int i = 0; i < getsfdcdlzzjgBm.size(); i++) { + String id = String.valueOf(getsfdcdlzzjgBm.get(i).get("id")); + String name = String.valueOf(getsfdcdlzzjgBm.get(i).get("name")); + Sheet orgDataSheet = new Sheet().setId(String.valueOf(i+2)).setTitle(name); + //这里先要根据部门id分别查询其所有下级部门(包含自身) + List> allLinkDept = getAllLinkDept(id); + for (Map objectMap : allLinkDept) { + Deft deft = new Deft(); + String id2 = String.valueOf(objectMap.get("id")); + deft.setId(id2); + deft.setName(String.valueOf(objectMap.get("name"))); + deft.setParent_id(String.valueOf(objectMap.get("parent"))); + //这里要根据部门id查询 + List> bmBzList = getBzListByBmId(id2); + log.error("XmindDataFilterCmd.bmBzList222:{}", bmBzList); + // 处理数据(增加空列表校验) + //编制数 + int estCount =0; + //缺编数 + int estLackCount =0; + //超编数 + int estOverCount =0; + if (bmBzList != null && !bmBzList.isEmpty()) { + Map data = bmBzList.get(0); + String value1 = String.valueOf(data.get("estCount")); + String value2 = String.valueOf(data.get("estLackCount")); + String value3 = String.valueOf(data.get("estOverCount")); + if (value1 == null || value1.trim().isEmpty()) { + }else { + estCount = Integer.parseInt(value1.trim()); + } + if (value2 == null || value2.trim().isEmpty()) { + }else { + estLackCount = Integer.parseInt(value2.trim()); + } + if (value3 == null || value3.trim().isEmpty()) { + }else { + estOverCount = Integer.parseInt(value3.trim()); + } + } + //查询在岗人数 + int positionCount = Optional.ofNullable(DEPT_EMPLOYEE_COUNT_MAP) + .map(map -> map.getOrDefault(id, 0)) + .orElse(0); + //查询部门岗位名称 + List> positionByDept = getPositionsByDept(id); + //遍历部门岗位,查询岗位编制等相关信息 + StringJoiner joiner = new StringJoiner(","); + if(CollectionUtils.isNotEmpty(positionByDept)){ + for (Map map : positionByDept) { + String gwId = String.valueOf(map.get("id")); + String gwName = String.valueOf(map.get("name")); + //查询岗位编制数/缺编数 + List> personYdzqMonthList = getBzListByGwId(gwId); + // 处理数据(增加空列表校验) + int estCountGw = 0; + int estLackCountGw = 0; + if (personYdzqMonthList != null && !personYdzqMonthList.isEmpty()) { + Map data = personYdzqMonthList.get(0); + String value1 = String.valueOf(data.get("estLackCount")); + String value2 = String.valueOf(data.get("estLackCount")); + if (value1 == null || value1.trim().isEmpty()) { + estCountGw = 0; + }else { + estCountGw = Integer.parseInt(value1.trim()); + } + if (value2 == null || value2.trim().isEmpty()) { + estCountGw = 0; + }else { + estLackCountGw = Integer.parseInt(value2.trim()); + } + } + //查询岗位人数 + int countGw = Optional.ofNullable(POSITION_EMPLOYEE_COUNT_MAP) + .map(map1 -> map1.getOrDefault(gwId, 0)) + .orElse(0); + String gwInfo = String.format("岗位名称:%s、编制数:%d、在岗人数:%d、缺编数:%d", + gwName, estCountGw, countGw, estLackCountGw); + joiner.add(gwInfo); + } + } + //查询人员:姓名/职级/职位 + StringBuilder sb = new StringBuilder(); + List> userNameByDept = getUserinfoByDept(id); + if(CollectionUtils.isNotEmpty(userNameByDept)){ + for (Map map : userNameByDept) { + String userId = String.valueOf(map.get("id")); + String userName = String.valueOf(map.get("username")); + String jobset_level = String.valueOf(map.get("jobset_level")); + //职级 + //String jobsetLevel = USERINFO_Level_MAP.get(jobset_level); + String jobsetLevel = Optional.ofNullable(USERINFO_Level_MAP) + .map(map1 -> map1.getOrDefault(jobset_level, "")) + .orElse(""); + //职位 + //String zw = USERINFO_ZW_MAP.get(userId); + String zw = Optional.ofNullable(USERINFO_ZW_MAP) + .map(map1 -> map1.getOrDefault(userId, "")) + .orElse(""); + // 格式化当前人员信息 + String personInfo = String.format("姓名:%s、职级:%s、职位:%s", + userName, jobsetLevel, zw); + + // 非首条数据添加分隔符 + if (sb.length() > 0) { + sb.append(","); + } + sb.append(personInfo); + } + } + // 计算remark + String remark = String.format("部门编制数:%d\n部门在岗人数:%d\n部门缺编数:%d\n岗位:%s\n人员:%s", + estCount, + positionCount, + estLackCount, + joiner.toString(), + sb.toString()); + log.error("XmindDataFilterCmd.remark222:{}", remark); + if (estLackCount >0) { + remark += "\n缺编:" + (estLackCount); + } + if (estOverCount >0) { + remark += "\n超编:" + (estOverCount); + } + deft.setRemark(remark); + if((estLackCount >0) || (estOverCount >0)){ + deft.setBgColor("#F1F1F1"); + } + defts2.add(deft); + } + //3.组装 + if(CollectionUtils.isNotEmpty(defts2)){ + Node root2 = buildDepartmentTree(defts2); + //4.塞入节点 + orgDataSheet.setNode(root2); + sheets.add(orgDataSheet); + } + } } //返回 - Map result = new HashMap(); - result.put("data", sheets); - //Map result = ImmutableMapUtil.of("data", sheets); + //Map result = new HashMap(); + //result.put("data", sheets); + log.error("XmindDataFilterCmd.data:{}", sheets); + Map result = ImmutableMapUtil.of("data", sheets); + log.error("XmindDataFilterCmd.result:{}", result); //设置出参 response.setResult(result); + long duration = System.nanoTime() - start; + log.error("XmindDataFilterCmd.duration:{}", duration); return response; } @@ -248,50 +415,109 @@ public class XmindDataFilterCmd extends RegHookEvent { * @param departments * @return */ - public Node buildDepartmentTree(List departments) { + public Node buildDepartmentTree(List departments) { + log.error("XmindDataFilterCmd.departments:{}", departments); // 创建ID到Node的映射 Map nodeMap = new HashMap<>(); + List rootCandidates = new ArrayList<>(); // 记录无父节点的节点 - // 第一步:创建所有节点 + // 第一步:创建所有节点并初始化children for (Deft dept : departments) { Node node = new Node() .setId(Long.parseLong(dept.getId())) .setName(dept.getName()) .setType("department") .setRemark(dept.getRemark()) - .setBgColor(dept.getBgColor()); + .setBgColor(dept.getBgColor()) + .setChildren(new ArrayList<>()); // 初始化children列表 nodeMap.put(dept.getId(), node); } // 第二步:建立父子关系 - Node root = null; for (Deft dept : departments) { Node node = nodeMap.get(dept.getId()); String parentId = dept.getParent_id(); - if (parentId == null || parentId.equals("null") || StringUtils.isBlank(parentId)) { - root = node; // 找到根节点 + if (isRootNode(parentId)) { + rootCandidates.add(node); } else { Node parent = nodeMap.get(parentId); if (parent != null) { parent.getChildren().add(node); + } else { + logOrphanNode(dept, parentId); + rootCandidates.add(node); // 降级处理:作为根节点候选 } } } + // 处理最终根节点选择 + Node node = resolveRootNode(rootCandidates); + log.error("buildDepartmentTree.rootCandidates:{}", node); + return node; + } + // 判断是否为根节点 + private boolean isRootNode(String parentId) { + return parentId == null + || "null".equals(parentId) + || parentId.trim().isEmpty(); + } + + // 处理孤儿节点 + private void logOrphanNode(Deft dept, String parentId) { + log.error("警告: 父节点不存在 - 部门ID: %s, 父部门ID: %s%n", + dept.getId(), parentId); + } + + // 根节点选择策略 + private Node resolveRootNode(List rootCandidates) { + if (rootCandidates.isEmpty()) { + throw new IllegalStateException("未找到有效根节点"); + } + + // 策略:选择第一个根节点作为根 + Node root = rootCandidates.get(0); + + // 日志记录多根节点情况 + if (rootCandidates.size() > 1) { + log.error("发现多个根节点,使用首个节点作为根节点。候选根节点数: %d%n", + rootCandidates.size()); + } + return root; } + // 测试用例 +// public static void main(String[] args) { +// List departments = Arrays.asList( +// new Deft("1147262691928662018", "百茶百道", null, +// "部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:岗位名称:百茶百道、编制数:0、在岗人数:1、缺编数:0\n人员:\n缺编:2", +// "#F1F1F1"), +// new Deft("1151352978370437120", "测试部门", "1147262691928662018", +// "部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:\n人员:\n缺编:2", +// "#F1F1F1"), +// new Deft("1154629364206919680", "测试部门-1", "1151352978370437120", +// "部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:\n人员:\n缺编:2", +// "#F1F1F1"), +// new Deft("1154629445853241345", "测试部门-1-1", "1154629364206919680", +// "部门编制数:8\n部门在岗人数:0\n部门缺编数:2\n岗位:\n人员:\n缺编:2", +// "#F1F1F1") +// ); +// +// Node root = buildDepartmentTree(departments); +// System.out.println("根节点: " + root.getName()); +// } + /** * 查询所有部门 */ private List> getAllDepartments(){ - String sql="select id,name,parent from eteams.department where 1=1 "; + String sql="select id,name,parent from eteams.department where 1=1"; log.error("getAllDept.sql:{}", sql); Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); List> recordList = databaseUtils.getDataSourceList(rs); - log.error("getAllDept.recordList:{}", recordList); + log.error("getAllDept.recordList11:{}", recordList); return recordList; } /** @@ -311,29 +537,193 @@ public class XmindDataFilterCmd extends RegHookEvent { } /** - * 查询所有部门 + * 初始化岗位编制 */ - private List> getListDatasBySourceName(String gwId){ + private void getListDatasBySourceName(){ List> personYdzqMonthList = commonService.getListDatasBySourceName("人员编制控编维度统计数据","LOGIC","weaver-hr-service"); log.error("getListDatasBySourceName.personYdzqMonthList:{}", personYdzqMonthList); - return personYdzqMonthList.stream().filter(e->e.get("position").equals(gwId)).collect(Collectors.toList()); + POSITION_EST_MAP.addAll(personYdzqMonthList); + } + + // 判断是否包含目标position + private static boolean hasTargetPosition(List positions,String gwId) { + if (positions == null || positions.isEmpty()) return false; + + return positions.stream() + .map(pos -> ((Map) pos).get("id")) + .filter(Objects::nonNull) + .anyMatch(id -> gwId.equals(id)); + } + + /** + * 筛选岗位对应编制 + * @param gwId + * @return + */ + private List> getBzListByGwId(String gwId) { + // 执行筛选 + List> filteredList = POSITION_EST_MAP.stream() + .filter(data -> hasTargetPosition((List) data.get("position"),gwId)) + .collect(Collectors.toList()); + log.error("getListDatasBySourceName.filteredList:{}", filteredList); + return filteredList; + } + + /** + * 初始化部门编制 + */ + private void getDeptDatasBySourceName(){ + List> personYdzqMonthList = commonService.getListDatasBySourceName("人员编制统计数据","LOGIC","weaver-hr-service"); + log.error("getListDatasBySourceName.personYdzqMonthList222:{}", personYdzqMonthList); + DEPT_POSITION_EST_MAP.addAll(personYdzqMonthList); + } + + /** + * 筛选岗位对应编制 + * @param deptId + * @return + */ + private List> getBzListByBmId(String deptId) { + // 执行筛选 + List> filteredList = DEPT_POSITION_EST_MAP.stream() + .filter(item -> { + List> orgIds = (List>) item.get("orgId"); + return orgIds != null && orgIds.stream() + .anyMatch(org -> deptId.equals(org.get("id"))); + }) + .collect(Collectors.toList()); + log.error("getBzListByBmId.filteredList:{}", filteredList); + return filteredList; + } + + + /** + * 根据部门获取部门人数 + * @return + */ + public void initializeDeptEmployeeCount() { + DEPT_EMPLOYEE_COUNT_MAP.clear(); + // 执行SQL查询 + String sql = "SELECT p.id AS dept_id, COUNT(e.id) AS employee_count FROM eteams.department\n" + + "p LEFT JOIN eteams.employee e ON p.id = e.department WHERE p.TENANT_KEY = 't024j0gfn0'\n" + + "AND p.is_delete = '0' GROUP BY p.id "; + + // 获取原始结果集 + log.error("initializeDeptEmployeeCount.sql:{}", sql); + Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); + List> recordList = databaseUtils.getDataSourceList(rs); + log.error("initializeDeptEmployeeCount.recordList:{}", recordList); + + // 转换为Map + Map map = recordList.stream() + .collect(Collectors.toMap( + row -> row.get("dept_id").toString(), // Key: 岗位ID + row -> ((Number) row.get("employee_count")).intValue() // Value: 人员数量 + )); + DEPT_EMPLOYEE_COUNT_MAP.putAll(map); + log.error("initializeDeptEmployeeCount.DEPT_EMPLOYEE_COUNT_MAP:{}", DEPT_EMPLOYEE_COUNT_MAP); + } + + + /** + * 根据岗位获取岗位人数 + * @return + */ + public void initializePositionEmployeeCount() { + POSITION_EMPLOYEE_COUNT_MAP.clear(); + // 执行SQL查询 + String sql = "SELECT p.id AS position_id, COUNT(e.id) AS employee_count " + + "FROM eteams.position p " + + "LEFT JOIN eteams.employee e ON p.id = e.position " + + "WHERE p.TENANT_KEY = 't024j0gfn0' " + + "AND p.is_delete = '0' " + + "AND (p.delete_type = '0' OR p.delete_type IS NULL) " + + "AND p.is_canceled = '0' " + + "GROUP BY p.id"; + + // 获取原始结果集 + log.error("initializePositionEmployeeCount.sql:{}", sql); + Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); + List> recordList = databaseUtils.getDataSourceList(rs); + log.error("initializePositionEmployeeCount.recordList:{}", recordList); + + // 转换为Map + Map map = recordList.stream() + .collect(Collectors.toMap( + row -> row.get("position_id").toString(), // Key: 岗位ID + row -> ((Number) row.get("employee_count")).intValue() // Value: 人员数量 + )); + POSITION_EMPLOYEE_COUNT_MAP.putAll(map); + log.error("initializePositionEmployeeCount.POSITION_EMPLOYEE_COUNT_MAP:{}", POSITION_EMPLOYEE_COUNT_MAP); + } + + /** + * 初始化人员职级 + * @return + */ + public void initializeUserJobsetLevel() { + USERINFO_Level_MAP.clear(); + // 执行SQL查询 + String sql = "select id,jobset_level from eteams.hrm_jobset_level where 1=1 "; + + // 获取原始结果集 + log.error("initializeUserJobsetLevel.sql:{}", sql); + Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); + List> recordList = databaseUtils.getDataSourceList(rs); + log.error("initializeUserJobsetLevel.recordList:{}", recordList); + + // 转换为Map + Map map = recordList.stream() + .filter(row -> row.get("id") != null && row.get("jobset_level") != null) + .collect(Collectors.toMap( + row -> row.get("id").toString(), // id转String + row -> row.get("jobset_level").toString() // jobset_level转String + )); + USERINFO_Level_MAP.putAll(map); + log.error("initializeUserJobsetLevel.USERINFO_Level_MAP:{}", USERINFO_Level_MAP); + } + + /** + * 初始化人员职位 + * @return + */ + public void initializeUserZw() { + USERINFO_ZW_MAP.clear(); + // 执行SQL查询 + String sql = "select form_data_id ,zw from eteams.ft_1152026012537184302 where 1=1 "; + + // 获取原始结果集 + log.error("initializeUserZw.sql:{}", sql); + Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); + List> recordList = databaseUtils.getDataSourceList(rs); + log.error("initializeUserZw.recordList:{}", recordList); + + // 转换为Map + Map map = recordList.stream() + .filter(row -> row.get("form_data_id") != null && row.get("zw") != null) + .collect(Collectors.toMap( + row -> row.get("form_data_id").toString(), // id转String + row -> row.get("zw").toString() // jobset_level转String + )); + USERINFO_ZW_MAP.putAll(map); + log.error("initializeUserZw.USERINFO_ZW_MAP:{}", USERINFO_ZW_MAP); } /** * 查询岗位在岗人数 */ - private int getPositionCountGw(String position){ - int num = 0; - String sql="select count(*) as num from eteams.employee where position = '"+position+"' "; - log.error("getPositionCountGw.sql:{}", sql); - Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); - List> recordList = databaseUtils.getDataSourceList(rs); - log.error("getPositionCountGw.recordList:{}", recordList); - if(CollectionUtils.isNotEmpty(recordList)){ - num = Integer.parseInt(String.valueOf(recordList.get(0).get("num"))); - } - return num; - } +// private int getPositionCountGw(String position){ +// int num = 0; +// String sql="select count(*) as num from eteams.employee where position = '"+position+"' "; +// log.error("getPositionCountGw.sql:{}", sql); +// Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); +// List> recordList = databaseUtils.getDataSourceList(rs); +// log.error("getPositionCountGw.recordList:{}", recordList); +// if(CollectionUtils.isNotEmpty(recordList)){ +// num = Integer.parseInt(String.valueOf(recordList.get(0).get("num"))); +// } +// return num; +// } /** * 查询部门人员姓名 @@ -382,24 +772,87 @@ public class XmindDataFilterCmd extends RegHookEvent { /** * 根据部门查岗位 */ - private List> getPositionByDept(String deptId){ - String sql="select p.id,p.name\n" + + private void initialize(){ + // 清空旧数据 + DEPT_POSITION_MAP.clear(); + String sql="select pdl.department_id,p.id,p.name\n" + "from eteams.position p\n" + "left join eteams.hrm_pos_dep_link pdl on p.id = pdl.position_id\n" + - "where p.TENANT_KEY = '"+tenant_key+"'\n"+ - "AND p.is_delete = '0'\n" + + "where p.TENANT_KEY = 't024j0gfn0'\n"+ + "AND p.is_delete = '0'\n" + "AND (\n" + " p.delete_type = '0'\n" + " OR p.delete_type IS NULL\n" + ")\n" + "AND p.is_canceled = '0'\n" + "and pdl.delete_type = 0\n" + - "and pdl.department_id = '"+deptId+"'"; - log.error("getPositionByDept.sql:{}", sql); + "and pdl.department_id in (select id from eteams.department where 1=1) "; + log.error("initialize.sql:{}", sql); Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); List> recordList = databaseUtils.getDataSourceList(rs); - log.error("getPositionByDept.recordList:{}", recordList); - return recordList; + log.error("initialize.recordList:{}", recordList); + // 按部门ID分组(Java 8 Stream) + Map>> tempMap = recordList.stream() + .filter(row -> row.get("department_id") != null) + .collect(Collectors.groupingBy( + row -> String.valueOf(row.get("department_id")), + ConcurrentHashMap::new, + Collectors.toList() + )); + + // 更新全局映射 + DEPT_POSITION_MAP.putAll(tempMap); + log.error("initialize.DEPT_POSITION_MAP:{}", DEPT_POSITION_MAP); + } + + /** + * 根据部门ID获取岗位列表 + * @param deptId 部门ID + * @return List> 岗位信息列表 + */ + public List> getPositionsByDept(String deptId) { + return Optional.ofNullable(DEPT_POSITION_MAP.get(deptId)) + .map(List::stream) + .map(stream -> stream.collect(Collectors.toList())) + .orElseGet(Collections::emptyList); + } + + + /** + * 初始化人员信息 + */ + private void initializeUserInfo(){ + // 清空旧数据 + USERINFO_MAP.clear(); + String sql="select department,id,username,jobset_level from eteams.employee where 1=1 "; + log.error("initializeUserInfo.sql:{}", sql); + Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); + List> recordList = databaseUtils.getDataSourceList(rs); + log.error("initializeUserInfo.recordList:{}", recordList); + // 按部门ID分组(Java 8 Stream) + Map>> tempMap = recordList.stream() + .filter(row -> row.get("department") != null) + .collect(Collectors.groupingBy( + row -> String.valueOf(row.get("department")), + ConcurrentHashMap::new, + Collectors.toList() + )); + + // 更新全局映射 + USERINFO_MAP.putAll(tempMap); + log.error("initializeUserInfo.USERINFO_MAP:{}", USERINFO_MAP); + } + + /** + * 根据部门ID获取人员列表 + * @param deptId 部门ID + * @return List> 人员信息列表 + */ + public List> getUserinfoByDept(String deptId) { + return Optional.ofNullable(USERINFO_MAP.get(deptId)) + .map(List::stream) + .map(stream -> stream.collect(Collectors.toList())) + .orElseGet(Collections::emptyList); } /** @@ -409,7 +862,7 @@ public class XmindDataFilterCmd extends RegHookEvent { String sql="select * from grade g\n" + "left join position p on g.ID = p.grade_id \n" + "where p.ID = '"+positionId+"'\n" + - "and g.TENANT_KEY = '"+tenant_key+"'\n" + + "and g.TENANT_KEY = 't024j0gfn0'\n" + "and g.ISDELETE = 0 "; log.error("getRankByPosition.sql:{}", sql); Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); @@ -422,8 +875,8 @@ public class XmindDataFilterCmd extends RegHookEvent { * 查询独立导出组织架构 */ private List> getsfdcdlzzjgBm(){ - String sql=" select id,name,parent from department where formdata in(\n" + - " select form_data_id from eteams.ft_1154218872715993098 where sfdcdlzzjg=1)"; + String sql=" select id,name,parent from eteams.department where formdata in(\n" + + " select form_data_id from eteams.ft_1154218872715993098 where sfdcdlzzjg=11)"; log.error("getsfdcdlzzjgBm.sql:{}", sql); Map rs = databaseUtils.execute("LOGIC", "weaver-ebuilder-form-service", sql); List> recordList = databaseUtils.getDataSourceList(rs); @@ -449,17 +902,20 @@ public class XmindDataFilterCmd extends RegHookEvent { /** * 部门编制数查询 */ - private HrComEstCfgInfoDto getPreparationsByBm(String deptId){ - HrComEstCfgInfoParam hrComEstCfgInfoParam = new HrComEstCfgInfoParam(); - hrComEstCfgInfoParam.setFindLatestParent(false); - hrComEstCfgInfoParam.setOrgId(Long.parseLong(deptId)); - WeaResult estCfgInfo = hrRemoteApiService.getEstCfgInfo(tenant_key, 1167276462243069953L, hrComEstCfgInfoParam); - log.error("getPreparations.estCfgInfo:{}", estCfgInfo); - HrComEstCfgInfoDto data = new HrComEstCfgInfoDto(); - if (estCfgInfo != null && estCfgInfo.isStatus()) { - data = estCfgInfo.getData(); - } - return data; - } +// private HrComEstCfgInfoDto getPreparationsByBm(String deptId){ +// HrComEstCfgInfoParam hrComEstCfgInfoParam = new HrComEstCfgInfoParam(); +// hrComEstCfgInfoParam.setFindLatestParent(false); +// hrComEstCfgInfoParam.setOrgId(Long.parseLong(deptId)); +// long employeeId = Long.parseLong("1167276462243069953"); +// WeaResult estCfgInfo = hrRemoteApiService.getEstCfgInfo(tenant_key, employeeId, hrComEstCfgInfoParam); +// log.error("getPreparations.estCfgInfo:{}", estCfgInfo); +// HrComEstCfgInfoDto data = new HrComEstCfgInfoDto(); +// log.error("getPreparations.isStatus:{}", estCfgInfo.isStatus()); +// log.error("getPreparations.data:{}", estCfgInfo.getData()); +// if (estCfgInfo.isStatus()&&null!=estCfgInfo.getData()) { +// data = estCfgInfo.getData(); +// } +// return data; +// } }