考勤数据库,组织架构、人员信息同步

kangrui
dxfeng 10 months ago
parent 8075137807
commit 75a145fbb9

@ -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;
}
}

@ -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;
}
}

@ -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<String, KqOrgData> 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<KqOrgData> 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<String, KqOrgData> keyMap = dataList.stream().collect(Collectors.toMap(KqOrgData::getDptprcno, item -> item));
// 上级编号 、 子元素集合
Map<String, List<KqOrgData>> 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<KqOrgData> subCompanyList = parentMap.get(companyData.getDptprcno());
for (KqOrgData subCompany : subCompanyList) {
// 同步分部数据
syncSubCompany(rs, subCompany, companyId);
// 处理该分部下的部门数据
List<KqOrgData> 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<KqResourceData> 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<String, List<KqOrgData>> parentMap, String subCompanyId, String supDepId) {
//TODO 同步部门数据
syncDepartmentData(rs, departmentData, subCompanyId, supDepId);
List<KqOrgData> 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<String, Object> 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<String, Object> 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<String, Object> 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));
}
}
/**
* OAID
*
* @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<String, Object> dataMap, String tableName) {
List<String> fieldList = new ArrayList<>();
List<String> dataList = new ArrayList<>();
List<String> 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<String, Object> dataMap, String tableName) {
List<String> fieldList = new ArrayList<>();
List<Object> 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<String, Object> dataMap) {
List<String> fieldList = new ArrayList<>();
List<Object> 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());
}
}
}
Loading…
Cancel
Save