企微用戶導入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()
:批量更新方法