From 75a145fbb9642e7164f7f1c2d45866928e7e777a Mon Sep 17 00:00:00 2001 From: dxfeng Date: Sun, 25 Aug 2024 20:23:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E7=BB=84=E7=BB=87=E6=9E=B6=E6=9E=84=E3=80=81=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/kr/entity/sync/KqOrgData.java | 93 +++++ .../engine/kr/entity/sync/KqResourceData.java | 155 ++++++++ .../kr/cornjob/SyncKqOrgDataJob.java | 374 ++++++++++++++++++ 3 files changed, 622 insertions(+) create mode 100644 src/com/engine/kr/entity/sync/KqOrgData.java create mode 100644 src/com/engine/kr/entity/sync/KqResourceData.java create mode 100644 src/weaver/interfaces/kr/cornjob/SyncKqOrgDataJob.java diff --git a/src/com/engine/kr/entity/sync/KqOrgData.java b/src/com/engine/kr/entity/sync/KqOrgData.java new file mode 100644 index 0000000..28a9cd4 --- /dev/null +++ b/src/com/engine/kr/entity/sync/KqOrgData.java @@ -0,0 +1,93 @@ +package com.engine.kr.entity.sync; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2024/08/20 + * @version: 1.0 + */ +public class KqOrgData { + private String dptprcno; + private String dptno; + private String dptname; + private String isdelete; + private String dptsysid; + + private String parentNo; + + private String subCompanyId; + + private String oaId; + + public String getSubCompanyId() { + return subCompanyId; + } + + public void setSubCompanyId(String subCompanyId) { + this.subCompanyId = subCompanyId; + } + + public String getOaId() { + return oaId; + } + + public void setOaId(String oaId) { + this.oaId = oaId; + } + + public String getParentNo() { + if (StringUtils.isNotBlank(dptprcno) && dptprcno.length() > 3) { + return dptprcno.substring(0, dptprcno.length() - 3); + } + return parentNo; + } + + public String getDptprcno() { + return dptprcno; + } + + public void setDptprcno(String dptprcno) { + this.dptprcno = dptprcno; + } + + public String getDptno() { + return dptno; + } + + public void setDptno(String dptno) { + this.dptno = dptno; + } + + public String getDptname() { + return dptname; + } + + public void setDptname(String dptname) { + this.dptname = dptname; + } + + /** + * N 未封存 + * + * @return + */ + public String getIsdelete() { + if ("N".equalsIgnoreCase(isdelete)) { + return "0"; + } + return "1"; + } + + public void setIsdelete(String isdelete) { + this.isdelete = isdelete; + } + + public String getDptsysid() { + return dptsysid; + } + + public void setDptsysid(String dptsysid) { + this.dptsysid = dptsysid; + } +} diff --git a/src/com/engine/kr/entity/sync/KqResourceData.java b/src/com/engine/kr/entity/sync/KqResourceData.java new file mode 100644 index 0000000..24a97bd --- /dev/null +++ b/src/com/engine/kr/entity/sync/KqResourceData.java @@ -0,0 +1,155 @@ +package com.engine.kr.entity.sync; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2024/08/20 + * @version: 1.0 + */ +public class KqResourceData { + private String empno; + private String empname; + private String empsexid; + private String empstatusid; + private String dptsysid; + private String empbirthday; + private String empidno; + private String empgrpdate; + private String empnormaldate; + private String empleavedate; + private String empmobile; + private String emplocaladdr; + private String emphomeaddr; + + + public String getEmpno() { + return empno; + } + + public void setEmpno(String empno) { + this.empno = empno; + } + + public String getEmpname() { + return empname; + } + + public void setEmpname(String empname) { + this.empname = empname; + } + + public String getEmpsexid() { + if(StringUtils.isNotBlank(empsexid)){ + if("1".equals(empsexid)){ + return "0"; + }else if("2".equals(empsexid)){ + return "1"; + } + } + return null; + } + + public void setEmpsexid(String empsexid) { + this.empsexid = empsexid; + } + + public String getEmpstatusid() { + if(StringUtils.isNotBlank(empstatusid)){ + if("20".equals(empstatusid)){ + return "1"; + }else if("30".equals(empstatusid)){ + return "5"; + } + } + return empstatusid; + } + + public void setEmpstatusid(String empstatusid) { + this.empstatusid = empstatusid; + } + + public String getDptsysid() { + return dptsysid; + } + + public void setDptsysid(String dptsysid) { + this.dptsysid = dptsysid; + } + + public String getEmpbirthday() { + if(StringUtils.isNotBlank(empbirthday)){ + return empbirthday.replace(" 00:00:00.0",""); + } + return empbirthday; + } + + public void setEmpbirthday(String empbirthday) { + this.empbirthday = empbirthday; + } + + public String getEmpidno() { + return empidno; + } + + public void setEmpidno(String empidno) { + this.empidno = empidno; + } + + public String getEmpgrpdate() { + if(StringUtils.isNotBlank(empgrpdate)){ + return empgrpdate.replace(" 00:00:00.0",""); + } + return empgrpdate; + } + + public void setEmpgrpdate(String empgrpdate) { + this.empgrpdate = empgrpdate; + } + + public String getEmpnormaldate() { + if(StringUtils.isNotBlank(empnormaldate)){ + return empnormaldate.replace(" 00:00:00.0",""); + } + return empnormaldate; + } + + public void setEmpnormaldate(String empnormaldate) { + this.empnormaldate = empnormaldate; + } + + public String getEmpleavedate() { + if(StringUtils.isNotBlank(empleavedate)){ + return empleavedate.replace(" 00:00:00.0",""); + } + return empleavedate; + } + + public void setEmpleavedate(String empleavedate) { + this.empleavedate = empleavedate; + } + + public String getEmpmobile() { + return empmobile; + } + + public void setEmpmobile(String empmobile) { + this.empmobile = empmobile; + } + + public String getEmplocaladdr() { + return emplocaladdr; + } + + public void setEmplocaladdr(String emplocaladdr) { + this.emplocaladdr = emplocaladdr; + } + + public String getEmphomeaddr() { + return emphomeaddr; + } + + public void setEmphomeaddr(String emphomeaddr) { + this.emphomeaddr = emphomeaddr; + } +} diff --git a/src/weaver/interfaces/kr/cornjob/SyncKqOrgDataJob.java b/src/weaver/interfaces/kr/cornjob/SyncKqOrgDataJob.java new file mode 100644 index 0000000..a0f51d5 --- /dev/null +++ b/src/weaver/interfaces/kr/cornjob/SyncKqOrgDataJob.java @@ -0,0 +1,374 @@ +package weaver.interfaces.kr.cornjob; + +import com.alibaba.fastjson.JSON; +import com.engine.kr.entity.sync.KqOrgData; +import com.engine.kr.entity.sync.KqResourceData; +import com.engine.kr.exception.CustomizeRunTimeException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import weaver.conn.RecordSet; +import weaver.formmode.IgnoreCaseHashMap; +import weaver.general.Util; +import weaver.hrm.company.DepartmentComInfo; +import weaver.hrm.company.SubCompanyComInfo; +import weaver.hrm.resource.ResourceComInfo; +import weaver.interfaces.hrm.HrmServiceManager; +import weaver.interfaces.schedule.BaseCronJob; +import weaver.matrix.MatrixUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author:dxfeng + * @createTime: 2024/08/19 + * @version: 1.0 + */ +public class SyncKqOrgDataJob extends BaseCronJob { + private static final String COMPANY_TABLE = "hrmcompany"; + private static final String SUB_COMPANY_TABLE = "uf_hrmsubcompany"; + private static final String DEPARTMENT_TABLE = "uf_hrmdepartment"; + private static final String RESOURCE_TABLE = "uf_hrmresource"; + + private static final boolean IS_DEV = false; + + // 组织唯一代码 + Map sysIdMap = new HashMap<>(); + + @Override + public void execute() { + RecordSet rs = new RecordSet(); + rs.writeLog("考勤组织信息同步任务开始"); + try { + // 查询组织数据,排除外协 + rs.executeSqlWithDataSource("select dptprcno,dptno,dptname,isdelete,dptsysid from rs_dpt where dptname != '外协' ", "KAOQIN"); + List dataList = new ArrayList<>(); + while (rs.next()) { + // 获取考勤组织表的所有数据 + KqOrgData kqOrgData = new KqOrgData(); + kqOrgData.setDptprcno(rs.getString("dptprcno")); + kqOrgData.setDptno(rs.getString("dptno")); + kqOrgData.setDptname(rs.getString("dptname")); + kqOrgData.setIsdelete(rs.getString("isdelete")); + kqOrgData.setDptsysid(rs.getString("dptsysid")); + dataList.add(kqOrgData); + } + // 完整编号、组织对象 + Map keyMap = dataList.stream().collect(Collectors.toMap(KqOrgData::getDptprcno, item -> item)); + + + // 上级编号 、 子元素集合 + Map> parentMap = dataList.stream().filter(item -> item.getParentNo() != null).collect(Collectors.groupingBy(KqOrgData::getParentNo)); + + // 集团 + KqOrgData companyData = keyMap.get("001"); + + String companyId = getCompanyId(rs); + if (StringUtils.isBlank(companyId)) { + throw new CustomizeRunTimeException("获取集团数据失败"); + } + companyData.setOaId(companyId); + sysIdMap.put(companyData.getDptsysid(), companyData); + + // 分部数据 + List subCompanyList = parentMap.get(companyData.getDptprcno()); + for (KqOrgData subCompany : subCompanyList) { + // 同步分部数据 + syncSubCompany(rs, subCompany, companyId); + + // 处理该分部下的部门数据 + List departmentList = parentMap.get(subCompany.getDptprcno()); + if (CollectionUtils.isNotEmpty(departmentList)) { + for (KqOrgData departmentData : departmentList) { + dealDepartmentData(rs, departmentData, parentMap, subCompany.getOaId(), departmentData.getOaId()); + } + } + } + + if (IS_DEV) { + // 查询人员数据 + rs.executeSqlWithDataSource("select empno,empname,empsexid,empstatusid,dptsysid,empbirthday,empidno,empgrpdate,empnormaldate,empleavedate,empmobile,emplocaladdr,emphomeaddr from rs_emp ", "KAOQIN"); + List resourceList = new ArrayList<>(); + while (rs.next()) { + KqResourceData resourceData = new KqResourceData(); + resourceData.setEmpno(rs.getString("empno")); + resourceData.setEmpname(rs.getString("empname")); + resourceData.setEmpsexid(rs.getString("empsexid")); + resourceData.setEmpstatusid(rs.getString("empstatusid")); + resourceData.setDptsysid(rs.getString("dptsysid")); + resourceData.setEmpbirthday(rs.getString("empbirthday")); + resourceData.setEmpidno(rs.getString("empidno")); + resourceData.setEmpgrpdate(rs.getString("empgrpdate")); + resourceData.setEmpnormaldate(rs.getString("empnormaldate")); + resourceData.setEmpleavedate(rs.getString("empleavedate")); + resourceData.setEmpmobile(rs.getString("empmobile")); + resourceData.setEmplocaladdr(rs.getString("emplocaladdr")); + resourceData.setEmphomeaddr(rs.getString("emphomeaddr")); + + resourceList.add(resourceData); + } + + + // 处理人员数据 + for (KqResourceData resourceData : resourceList) { + KqOrgData kqOrgData = sysIdMap.get(resourceData.getDptsysid()); + if (null == kqOrgData || StringUtils.isBlank(kqOrgData.getOaId()) || StringUtils.isBlank(kqOrgData.getSubCompanyId())) { + // 上级部门不存在的,或者非部门下的人员,该组织下的人员跳过处理 + continue; + } + String departmentId = kqOrgData.getOaId(); + String subCompanyId = kqOrgData.getSubCompanyId(); + + // 只做更新,不新增 + syncResourceData(rs, resourceData, subCompanyId, departmentId); + + + } + } + rs.writeLog("考勤组织信息同步任务结束"); + } catch (Exception e) { + rs.writeLog("组织同步计划任务异常", e); + } + } + + private void dealDepartmentData(RecordSet rs, KqOrgData departmentData, Map> parentMap, String subCompanyId, String supDepId) { + //TODO 同步部门数据 + syncDepartmentData(rs, departmentData, subCompanyId, supDepId); + + List departmentList = parentMap.get(departmentData.getDptprcno()); + if (CollectionUtils.isNotEmpty(departmentList)) { + for (KqOrgData child : departmentList) { + dealDepartmentData(rs, child, parentMap, subCompanyId, departmentData.getOaId()); + } + } + + } + + private void syncResourceData(RecordSet rs, KqResourceData resourceData, String subCompanyId, String departmentId) throws Exception { + rs.executeQuery("select id from " + RESOURCE_TABLE + " where workcode = ? ", resourceData.getEmpno()); + String id = ""; + if (rs.next()) { + id = rs.getString("id"); + } + + if (StringUtils.isBlank(id)) { + // rs.writeLog("当前人员未在OA中查询到,"+JSON.toJSONString(resourceData)); + return; + } + + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + dataMap.put("id", id); + //dataMap.put("workcode",resourceData.getEmpno()); + + dataMap.put("subcompanyid1", subCompanyId); + dataMap.put("departmentid", departmentId); + dataMap.put("lastname", resourceData.getEmpname()); + dataMap.put("sex", resourceData.getEmpsexid()); + dataMap.put("status", resourceData.getEmpstatusid()); + dataMap.put("birthday", resourceData.getEmpbirthday()); + dataMap.put("certificatenum", resourceData.getEmpidno()); + dataMap.put("companystartdate", resourceData.getEmpgrpdate()); + dataMap.put("probationenddate", resourceData.getEmpnormaldate()); + dataMap.put("mobile", resourceData.getEmpmobile()); + dataMap.put("residentplace", resourceData.getEmplocaladdr()); + dataMap.put("regresidentplace", resourceData.getEmphomeaddr()); + + updateDataById(dataMap, RESOURCE_TABLE); + + + // 更新离职日期 + + new ResourceComInfo().updateCache(id); + } + + /** + * 同步部门 + * + * @param rs + * @param departmentData + * @param subCompanyId + * @param supDepId + */ + private void syncDepartmentData(RecordSet rs, KqOrgData departmentData, String subCompanyId, String supDepId) { + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + dataMap.put("departmentmark", departmentData.getDptname()); + dataMap.put("departmentname", departmentData.getDptname()); + dataMap.put("departmentcode", departmentData.getDptprcno()); + dataMap.put("subcompanyid1", subCompanyId); + dataMap.put("supdepid", supDepId); + dataMap.put("canceled", departmentData.getIsdelete()); + // 判断有无当前分部数据 + rs.executeQuery("select id from " + DEPARTMENT_TABLE + " where departmentcode = ? ", departmentData.getDptprcno()); + if (rs.next()) { + // 更新 + dataMap.put("id", rs.getString("id")); + updateDataById(dataMap, DEPARTMENT_TABLE); + } else { + // 新增 + insertData(dataMap, DEPARTMENT_TABLE); + } + rs.executeQuery("select id from " + DEPARTMENT_TABLE + " where departmentcode = ? ", departmentData.getDptprcno()); + if (rs.next()) { + // 赋值OA中的ID + departmentData.setOaId(rs.getString("id")); + departmentData.setSubCompanyId(subCompanyId); + sysIdMap.put(departmentData.getDptsysid(), departmentData); + + if(IS_DEV) { + DepartmentComInfo dci = new DepartmentComInfo(); + dci.removeCompanyCache(); + dci.addCache(departmentData.getOaId()); + HrmServiceManager hrmServiceManager = new HrmServiceManager(); + hrmServiceManager.SynInstantDepartment(departmentData.getOaId(), "2"); + MatrixUtil.updateDepartmentData(departmentData.getOaId()); + } + } else { + throw new CustomizeRunTimeException("当前部门同步失败," + JSON.toJSONString(departmentData)); + } + + } + + + /** + * 同步分部 + * + * @param rs + * @param subCompany + * @param companyId + */ + private void syncSubCompany(RecordSet rs, KqOrgData subCompany, String companyId) { + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + dataMap.put("subcompanyname", subCompany.getDptname()); + dataMap.put("subcompanydesc", subCompany.getDptname()); + dataMap.put("subcompanycode", subCompany.getDptprcno()); + dataMap.put("companyid", companyId); + dataMap.put("supsubcomid", "0"); + dataMap.put("canceled", subCompany.getIsdelete()); + // 判断有无当前分部数据 + rs.executeQuery("select id from " + SUB_COMPANY_TABLE + " where subcompanycode = ? ", subCompany.getDptprcno()); + if (rs.next()) { + // 更新 + dataMap.put("id", rs.getString("id")); + updateDataById(dataMap, SUB_COMPANY_TABLE); + } else { + // 新增 + insertData(dataMap, SUB_COMPANY_TABLE); + } + rs.executeQuery("select id from " + SUB_COMPANY_TABLE + " where subcompanycode = ? ", subCompany.getDptprcno()); + if (rs.next()) { + // 赋值OA中的ID + subCompany.setOaId(rs.getString("id")); + sysIdMap.put(subCompany.getDptsysid(), subCompany); + + // 刷新缓存 + if (IS_DEV) { + SubCompanyComInfo sci = new SubCompanyComInfo(); + sci.removeCompanyCache(); + sci.addCache(subCompany.getOaId()); + MatrixUtil.updateSubcompayData(subCompany.getOaId()); + new weaver.hrm.appdetach.AppDetachComInfo().initSubDepAppData(); + } + } else { + throw new CustomizeRunTimeException("当前分部同步失败," + JSON.toJSONString(subCompany)); + } + } + + + /** + * 获取OA中集团的ID + * + * @param rs + * @return + */ + private String getCompanyId(RecordSet rs) { + rs.executeQuery("select id from " + COMPANY_TABLE); + if (rs.next()) { + return rs.getString("id"); + } + return ""; + } + + /** + * 插入数据 + * + * @param dataMap 数据集合 + * @param tableName 表名 + */ + public static void insertData(Map dataMap, String tableName) { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + List paramList = new ArrayList<>(); + + dataMap.forEach((key, value) -> { + if (null != value) { + String valueStr = String.valueOf(value); + if (StringUtils.isNotBlank(valueStr)) { + fieldList.add(key); + dataList.add(valueStr); + paramList.add("?"); + } + } + }); + String insertSql = " insert into " + tableName + "(" + StringUtils.join(fieldList, ",") + ") values (" + StringUtils.join(paramList, ",") + ")"; + RecordSet rs = new RecordSet(); + rs.executeUpdate(insertSql, dataList); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + + /** + * 根据ID更新数据 + * + * @param dataMap + * @param tableName + */ + public static void updateDataById(Map dataMap, String tableName) { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + String id = Util.null2String(dataMap.get("id")); + dataMap.remove("id"); + + dataMap.forEach((key, value) -> { + fieldList.add(key + " = ? "); + dataList.add(value); + }); + dataList.add(id); + String updateSql = "update " + tableName + " set " + StringUtils.join(fieldList, ",") + " where id = ? "; + RecordSet rs = new RecordSet(); + rs.executeUpdate(updateSql, dataList); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + /** + * 根据ID更新数据 + * + * @param dataMap + */ + public static void updateDataByWorkCode(Map dataMap) { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + String workCode = Util.null2String(dataMap.get("workcode")); + dataMap.remove("workcode"); + + dataMap.forEach((key, value) -> { + fieldList.add(key + " = ? "); + dataList.add(value); + }); + dataList.add(workCode); + String updateSql = "update hrmresource set " + StringUtils.join(fieldList, ",") + " where workcode = ? "; + RecordSet rs = new RecordSet(); + rs.executeUpdate(updateSql, dataList); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + +}