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