企微用户导入HR系统流程说明
概述
本文档详细说明了WechatUserImportServiceImpl.importWechatUsersToHrs()
方法的业务流程和实现逻辑。该方法负责将企业微信用户数据同步导入到HR管理系统中,包括员工信息、工作信息和任职记录的创建与更新。
主要功能
- 数据同步:将企微用户数据同步到HR系统
- 员工管理:创建新员工或更新现有员工信息
- 组织架构:处理员工的部门归属和任职关系
- 数据完整性:确保相关表数据的一致性和完整性
详细流程
1. 初始化阶段
// 查询所有生效的企微用户
List<WechatWorkUserEntity> wechatUserList = getActiveWechatUsers();
- 查询企微用户表中
deleted = '0'
的所有用户 - 如果没有数据,直接返回0
- 记录找到的用户数量
2. 用户处理循环
对每个企微用户执行以下处理流程:
2.1 数据验证
- 工号验证:检查
staffCode
是否为空 - 用户信息提取:获取
userid
、position
、name
等基本信息
2.2 员工存在性判断
根据工号查询HR系统中是否已存在该员工:
SELECT * FROM staff_member WHERE staff_code = ?
3. 已存在员工处理流程
当员工已存在时:
3.1 更新企微ID
staffMember.setWechatSourceId(wechatUserId);
3.2 任职记录处理
- 查询任职记录:检查是否已有
history_type = 'employment'
的记录 - 添加兼职记录:如果已有任职记录,只添加兼职记录
- 完整记录添加:如果没有任职记录,添加任职和兼职记录
4. 新员工处理流程
当员工不存在时:
4.1 创建员工记录
StaffMemberEntity staffMember = new StaffMemberEntity();
staffMember.setId(IdUtil.getSnowflake().nextId());
staffMember.setStaffName(wechatUser.getName());
staffMember.setStaffCode(wechatUser.getStaffCode());
// ... 其他字段设置
关键字段设置:
tenantCode
:租户代码(yishion)sourceSysCode
:来源系统(wechat)wechatSourceId
:企微用户IDcirculationStatus
:流转状态(archives)status
:员工状态(10)
4.2 部门信息处理
获取用户的部门列表并根据主部门设置处理:
有主部门情况:
- 主部门创建任职记录(
employment
) - 其他部门创建兼职记录(
partTime
)
无主部门情况:
- 第一个部门创建任职记录
- 其他部门创建兼职记录
5. 工作信息和任职记录创建
5.1 工作信息表(staff_work_info)
// 检查是否已存在
String sourceId = userid + "-" + deptId;
// 存在则更新,不存在则创建
关键字段:
staffId
:员工IDposition
:职位employeeStatus
:员工状态(status_on)sourceOrgId
/sourceDeptId
:来源组织/部门ID
5.2 任职记录表(staff_work_history)
// 区分任职类型
String historyType = "employment" | "partTime";
关键字段:
historyType
:记录类型(employment/partTime)workStatus
:工作状态(status_on)- 其他字段与工作信息表类似
6. 事务处理策略
- 单用户事务:每个用户的处理使用独立事务
- 异常隔离:单个用户失败不影响其他用户处理
- 错误记录:失败时记录详细错误日志
@Transactional(rollbackFor = Exception.class)
public boolean processWechatUserInTransaction(WechatWorkUserEntity wechatUser) {return processWechatUser(wechatUser);
}
7. 批量更新阶段
所有用户处理完成后,执行批量更新操作:
7.1 组织架构更新
// 更新任职记录表的组织ID和部门ID
updateWorkHistoryOrgAndDeptIdsInTransaction();
// 更新工作信息表的组织ID和部门ID
updateWorkInfoOrgAndDeptIdsInTransaction();
7.2 数据修正
// 更新零值组织ID
staffWorkInfoMapper.updateWorkInfoZeroOrgIds();
staffWorkHistoryMapper.updateWorkHistoryZeroOrgIds();
7.3 枚举更新
// 更新职位枚举
updateWorkInfoPositionEnumInTransaction();
updateWorkHistoryPositionEnumInTransaction();
7.4 关联数据更新
// 更新人员身份
staffMemberMapper.updateIdentity();
// 更新组织负责人
organizationMapper.updateOrgLeader();
// 更新部门负责人
departmentMapper.updateDeptLeader();
// 同步总公司人员企微ID
staffMemberMapper.updateHeadOfficeWechatSourceId();
常量配置
private static final String TENANT_CODE = "yishion";
private static final String SOURCE_SYS_CODE = "wechat";
private static final String WORK_STATUS_ON = "status_on";
private static final String EMPLOYEE_STATUS_ON = "status_on";
private static final String HISTORY_TYPE_EMPLOYMENT = "employment";
private static final String HISTORY_TYPE_PART_TIME = "partTime";
private static final String TIME_ZONE_OFFSET = "UTC+08:00";
private static final String TIME_ZONE_ID = "Asia/Shanghai";
private static final String CREATE_BY = "system";
private static final String CIRCULATION_STATUS = "archives";
private static final Integer STAFF_STATUS = 10;
核心表结构
员工表(staff_member)
id
:员工ID(雪花算法)staff_name
:员工姓名staff_code
:工号wechat_source_id
:企微用户IDtenant_code
:租户代码source_sys_code
:来源系统代码
工作信息表(staff_work_info)
id
:记录IDstaff_id
:员工IDposition
:职位employee_status
:员工状态source_org_id
:来源组织IDsource_dept_id
:来源部门ID
任职记录表(staff_work_history)
id
:记录IDstaff_id
:员工IDhistory_type
:记录类型(employment/partTime)work_status
:工作状态position
:职位source_org_id
:来源组织IDsource_dept_id
:来源部门ID
性能优化策略
- 分批处理:逐个用户处理,避免大事务
- 异常隔离:单个失败不影响整体
- 批量更新:最后统一执行批量操作
- 索引优化:基于工号和企微ID的查询优化
异常处理
- 数据验证:工号为空时跳过处理
- 容错机制:记录错误日志但继续处理
- 事务回滚:单个用户处理失败时回滚该用户的操作
- 日志记录:详细记录处理过程和异常信息
监控指标
- 导入成功数量:
importCount
- 处理总数:企微用户总数
- 失败数量:通过日志统计
- 处理时间:方法执行时间
注意事项
- 数据一致性:确保员工、工作信息、任职记录三表数据一致
- 部门处理:正确处理主部门和兼职部门的关系
- 企微ID更新:避免重复或错误的企微ID关联
- 时区处理:统一使用Asia/Shanghai时区
- 租户隔离:确保数据按租户正确隔离
相关接口
WechatUserImportService.importWechatUsersToHrs()
:主入口方法WechatUserImportService.executeBatchUpdates()
:批量更新方法