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

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());
}
}
}