You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-develop/src/weaver/interfaces/kr/cornjob/SyncKqOrgDataJob.java

375 lines
15 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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));
}
}
/**
* 获取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<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());
}
}
}