企微用户导入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.pswp.cn/diannao/95578.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95578.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95578.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别传统SEO!拥抱下一代流量密码:生成式引擎优化(GEO)实战指南

前言&#xff1a;为什么你的“最佳实践”SEO正在失效&#xff1f;你是否发现&#xff0c;即使严格遵循了谷歌自2019年以来的所有“最佳实践”&#xff0c;你的技术博客或产品文档的流量依旧增长乏力&#xff0c;甚至不升反降&#xff1f;你不是一个人。问题在于&#xff0c;游戏…

week1-[一维数组]传送

week1-[一维数组]传送 题目描述 有 nnn 个传送门&#xff0c;从第 iii 个传送门进去后会被传送到第 aia_iai​ 个传送门&#xff0c;进而被传送到第 aaia_{a_i}aai​​ 个传送门&#xff0c;如此一直下去……小 A 想知道从第 kkk 个传送门进去后&#xff0c;能不能回到第 kkk 个…

【18】目心智能——目心智能 嵌入式一面 ,校招,面试问答记录

目心智能——目心智能 嵌入式一面 &#xff0c;校招&#xff0c;面试问答记录 1 简单自我介绍2 你做了这么多算法&#xff0c;为什么不找算法的&#xff1f;3 我们主要还是软件开发&#xff0c;不做结构设计4 模电知识6 CSDN应该附链接在简历上&#xff0c;稍后发给我&#xff…

C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏

快递运费计算器帮一家快递站点开发一个快递运费计算器&#xff0c;快递站点人员只需要输入包裹重量和地点编号即可计算出对应的运费。假设快递费计算规则如下&#xff1a;首重&#xff1a;3公斤 3公斤以内&#xff1a;1.东三省/宁夏/青海/海南&#xff1a;12元&#xff0c;2.新…

网络安全蓝队常用工具全景与实战指南

摘要 在现代信息系统的安全防护中&#xff0c;蓝队承担着防御、检测、响应和持续改进的核心职责。要实现高效、可持续的防御能力&#xff0c;蓝队需要一整套成熟、可靠的工具集来进行威胁情报收集、日志分析、入侵检测、漏洞评估、端点防护、网络流量监控、事件响应与取证等工作…

基于 Flink 的淘宝实时数据管道设计:商品详情流式处理与异构存储

引言在电子商务领域&#xff0c;实时数据处理能力已成为企业核心竞争力的重要组成部分。淘宝作为中国领先的电商平台&#xff0c;每天产生海量的商品数据&#xff0c;这些数据需要被实时处理、分析并分发到各种存储系统中&#xff0c;以支持搜索、推荐、库存管理等关键业务。本…

面试题:【多线程问题,三个线程A,B,C;C线程依赖B线程的结果执行,怎么控制】

在 Java 中&#xff0c;若需要控制线程间的依赖关系&#xff08;如 C 线程依赖 B 线程的结果&#xff09;&#xff0c;可以通过以下几种方式实现&#xff1a; 方案 1&#xff1a;使用 CountDownLatch CountDownLatch 是一个同步工具类&#xff0c;允许一个或多个线程等待其他线…

React useMemo 深度指南:原理、误区、实战与 2025 最佳实践

把“为什么用、怎么用、用错了怎么办”一次讲透&#xff0c;附 React 19 自动优化前瞻。一、useMemo 是什么&#xff1f; 一句话&#xff1a; useMemo 记住&#xff08;缓存&#xff09;昂贵计算结果&#xff0c;只在依赖变化时重新计算。 const memoValue useMemo(() > {…

[ HTML 前端 ] 语法介绍和HBuilderX安装

目录 一. HTML 1.概述 2. 安装前端开发工具 (1)HBuilderX下载 (2)创建html项目和使用 3. HTML基础 1.标签 (1).标签定义: (2).标签结构: (3).标签属性: 2.常用标签: 3.特殊符号: 4.表格(table) (1)基本标签: (2)基本结构: (3)表格属性: 5.表单(form) (1). 表单概述…

Spring Cloud系列—Alibaba Sentinel熔断降级

上篇文章&#xff1a; Spring Cloud系列— Alibaba Sentinel限流https://blog.csdn.net/sniper_fandc/article/details/149944260?fromshareblogdetail&sharetypeblogdetail&sharerId149944260&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link…

Spring Boot 使用 @NotBlank + @Validated 优雅校验参数

在日常开发中&#xff0c;我们常用 if (isBlank(...)) 来判断参数是否为空&#xff0c;但这种方式不仅繁琐&#xff0c;而且容易遗漏。 Spring 生态中推荐使用 JSR-303 校验注解&#xff08;NotBlank、NotNull 等&#xff09;配合 Validated 实现自动校验&#xff0c;大幅减少手…

网络安全(Java语言)简单脚本汇总 (一)

文章目录敏感信息探测脚本源代码思路URL批量存活探测器源代码思路端口扫描器源代码思路 敏感信息探测脚本 源代码/*** description 该脚本通过分析HTTP响应头&#xff0c;来检测可能暴露服务器信息的安全隐患*/import java.io.IOException; import java.net.HttpURLConnection;…

buuctf_NSBlogin_http_upload(极客2019+ACTF2020新生赛)

今天做三1个web 题目&#xff1a;NSB_login用户名有admin&#xff0c;看源码&#xff1a;I like rockyou&#xff01;今天学习到&#xff0c;kali里面有密码爆破的文件叫rockyou.txt&#xff08;/usr/share/wordlists/&#xff09;&#xff08;没kali也可以去https://gitcode.c…

IDEA如何引用brew安装的openjdk

因为 brew 安装的 openjdk@21 目录结构和 IDEA 期望的 JDK 目录不一样。所以默认brew安装的jdk,在IDEA中是无法识别到的。 一、创建软连接 sudo mkdir -p /Library/Java/JavaVirtualMachines sudo ln -sfn /usr/local/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/Java…

【Unity3D】Spine黑线(预乘问题)、贴图边缘裁剪问题

一、黑线问题 Spine正确的导出和Unity导入设置&#xff08;解决黑边/彩条带问题&#xff09;_spine导出的图片有黑边-CSDN博客 采用&#xff08;已解决问题&#xff09; Texture 打包器启用 Premultiply alpha ,禁用Bleed Unity Texture 设置中禁用 sRGB (Color Texture) 和…

嵌入式系统学习Day18(文件编程-系统调用文件IO)

- open#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 功能:打开文件 参数:pathname --- 文件名 flags 必选:O_RDONLYO_WRONLY…

Vue浅学

概述在最近的学习任务中了解了 Vue&#xff0c;并对其产生了浓厚的兴趣&#xff0c;现在分享一下我的学习所得关键字其一statestate 是 Vuex 存储中的“状态对象”&#xff0c;用于存储整个应用的共享数据&#xff08;如用户信息、令牌、权限等&#xff09;&#xff0c;比如&am…

机器翻译:Hugging Face库详解

文章目录一、Hugging Face概述1.1 Hugging Face介绍1.2 核心理念&#xff1a;模型即服务&#xff0c;但以开源形式二、核心架构2.1 Transformers库&#xff1a;模型交互的统一接口2.2 Datasets库&#xff1a;高效的数据处理引擎2.3 Tokenizers库&#xff1a;文本与模型的“翻译…

服务器安装gielab社区版

第一步&#xff1a;安装Gitlab 1,使用的是CentOs镜像(服务器最低配置为4核8g内存才行要不然带不动) 登录目标实例。 2,执行如下命令&#xff0c;安装所需依赖。 1 sudo yum install -y curl policycoreutils-python openssh-server 3,执行如下命令&#xff0c;启动SSH服务…

C#报错:System.NullReferenceException:“未将对象引用设置到对象的实例。”

C#使用自定义的类创建数组时&#xff0c;使用时报错&#xff0c;报错内容如下图&#xff1a;原因&#xff1a;C#中的数组是引用类型。当声明自定义类数组时&#xff0c;数组本身会被创建&#xff0c;但其元素&#xff08;即自定义类的实例&#xff09;默认未被实例化&#xff0…