当前位置: 首页 > news >正文

企微用户部门同步HRS系统

企微用户导入HR系统流程说明

概述

本文档详细说明了WechatUserImportServiceImpl.importWechatUsersToHrs()方法的业务流程和实现逻辑。该方法负责将企业微信用户数据同步导入到HR管理系统中,包括员工信息、工作信息和任职记录的创建与更新。

主要功能

  • 数据同步:将企微用户数据同步到HR系统
  • 员工管理:创建新员工或更新现有员工信息
  • 组织架构:处理员工的部门归属和任职关系
  • 数据完整性:确保相关表数据的一致性和完整性

详细流程

1. 初始化阶段

// 查询所有生效的企微用户
List<WechatWorkUserEntity> wechatUserList = getActiveWechatUsers();
  • 查询企微用户表中deleted = '0'的所有用户
  • 如果没有数据,直接返回0
  • 记录找到的用户数量

2. 用户处理循环

对每个企微用户执行以下处理流程:

2.1 数据验证
  • 工号验证:检查staffCode是否为空
  • 用户信息提取:获取useridpositionname等基本信息
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:企微用户ID
  • circulationStatus:流转状态(archives)
  • status:员工状态(10)
4.2 部门信息处理

获取用户的部门列表并根据主部门设置处理:

有主部门情况

  • 主部门创建任职记录(employment
  • 其他部门创建兼职记录(partTime

无主部门情况

  • 第一个部门创建任职记录
  • 其他部门创建兼职记录

5. 工作信息和任职记录创建

5.1 工作信息表(staff_work_info)
// 检查是否已存在
String sourceId = userid + "-" + deptId;
// 存在则更新,不存在则创建

关键字段:

  • staffId:员工ID
  • position:职位
  • 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:企微用户ID
  • tenant_code:租户代码
  • source_sys_code:来源系统代码

工作信息表(staff_work_info)

  • id:记录ID
  • staff_id:员工ID
  • position:职位
  • employee_status:员工状态
  • source_org_id:来源组织ID
  • source_dept_id:来源部门ID

任职记录表(staff_work_history)

  • id:记录ID
  • staff_id:员工ID
  • history_type:记录类型(employment/partTime)
  • work_status:工作状态
  • position:职位
  • source_org_id:来源组织ID
  • source_dept_id:来源部门ID

性能优化策略

  1. 分批处理:逐个用户处理,避免大事务
  2. 异常隔离:单个失败不影响整体
  3. 批量更新:最后统一执行批量操作
  4. 索引优化:基于工号和企微ID的查询优化

异常处理

  • 数据验证:工号为空时跳过处理
  • 容错机制:记录错误日志但继续处理
  • 事务回滚:单个用户处理失败时回滚该用户的操作
  • 日志记录:详细记录处理过程和异常信息

监控指标

  • 导入成功数量importCount
  • 处理总数:企微用户总数
  • 失败数量:通过日志统计
  • 处理时间:方法执行时间

注意事项

  1. 数据一致性:确保员工、工作信息、任职记录三表数据一致
  2. 部门处理:正确处理主部门和兼职部门的关系
  3. 企微ID更新:避免重复或错误的企微ID关联
  4. 时区处理:统一使用Asia/Shanghai时区
  5. 租户隔离:确保数据按租户正确隔离

相关接口

  • WechatUserImportService.importWechatUsersToHrs():主入口方法
  • WechatUserImportService.executeBatchUpdates():批量更新方法
http://www.dtcms.com/a/332644.html

相关文章:

  • 电脑上练打字用什么软件最好:10款打字软件评测
  • 滑窗|贪心
  • Sonatype Nexus Repository Manager docker版本安装
  • [优选算法专题二滑动窗口——无重复字符的最长子串]
  • Linux应用层开发--线程
  • react性能优化之useRef和useState
  • Nginx性能优化与安全配置:打造高性能Web服务器
  • Unity:PlayerPrefs笔记
  • 标准电子邮件地址格式(RFC 5322 里的 mailbox 语法)
  • ABAP : 内表/工作区转JSON
  • Prometheus 监控 Kubernetes Cluster 最新极简教程
  • FreeRTOS多核支持
  • 从根本上解决MAC权限问题(关闭sip)
  • 汽车后雾灯色度难达标?OAS 软件精准解决破瓶颈
  • 图论Day3学习心得
  • Chrome插件开发实战:从架构到发布全流程
  • Docker Compose部署Clickhouse最新版
  • 【软件设计模式】工厂方法与抽象工厂
  • 关于截屏时实现游戏暂停以及本地和上线不同步问题
  • pycharm2025导入anaconda创建的各个AI环境
  • C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏
  • 医院网络安全重保方案
  • 用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
  • 从电影分类到鸢尾花识别:KNN 算法实战指南
  • @[TOC](计算机是如何⼯作的) JavaEE==网站开发
  • MySQL 关键字总结,并结合 SQL 类型(DDL / DML / DQL / DCL / TCL) 说明每类关键字的作用、使用场景和示例
  • 华为实验综合小练习
  • Android RxJava变换操作符详解
  • MuMu模拟器Pro Mac 安卓手机平板模拟器(Mac中文)
  • 9.对象介绍