臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速Obsidian、双向链接与知识图谱
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
中华财险-公司项目
对外接口文档
基础数据码表对外接口(仅支持rpc调用)业务码表对外接口应用主数据对外接口
基础运营查询版本更新日志详情消息中心对外接口站内信对外接口站内信模板配置手册
权限中心权限中心对外接口文档(最新)权限中心对外接口文档前端ACL-CORE FACADE依赖版本
审计中心审计中心对外接口文档audit-center-facade版本
审批中心工作流迁审批流现状工作流迁审批流API能力替换方案老审批流接口文档审批中心接口文档审批中心业务回调FAQ
账号中心内部系统对接单点登录内部系统对接认证中心三方网页应用登录授权账号中心对外接口文档前端账号中心RPC接口文档账户变更对外广播消息文档账户中心对外接口HRMS外部员工变更广播消息文档HRMS外部员工对外接口
组织员工岗位🔥机构映射SDK接口文档员工岗位变更通知说明组织机构管营一体概念与用法组织员工对外广播消息文档组织员工岗位对外接口文档组织员工岗位对外接口文档前端组织员工岗位数据模型组织员工主数据业务场景案例organization-facade版本
hrms(大型人力资源外包管理系统)
项目架构说明HRMS Maven模块与依赖说明
项目说明0.流程中心模块0.组织模块说明1.业务线模块2.计划模块3.项目模块4.协议模块5.供应商模块6.合约域模块7.外包人员模块*核心:外包人员生命周期
项目运维外包人员项目编制差异排查与修复2.HRMS相关问题排查4.修改externalId(externalId和accountId不一致)
需求-系分
1.内部转外包0723外包人员关联历史内部账号系分新增外包人员关联历史账号内容(紧急0723上线)需求
2.工作岗位0820工作岗位0820需求工作岗位0820需求-系分
3.用工模式调整0917内部人员转外包用工系统需求2内部人员转外包用工系统需求-系分
sso(账号中心-单点登录)
项目架构说明aboss-sso项目架构入门AOP统一日志打印链路Maven多模块项目高级知识OAuth2.0
项目说明1.SSO-OAuth2.0与IDaaS登录流程2.外部账号创建流水号并发问题分析
AI
使用说明
第三方插件&技能简介Archify使用与安装指南Ponytail使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.完成可运行聊天接口
GitGit常用命令与Obsidian推送排查
Java
面试题Java基础与集合面试题
AtomicInteger原子计数与并发安全ConcurrentHashMap并发安全与计数Java线程、线程池与Future
python
基础Python基础语法
HTTPXHRMS员工详情接口调用(Python HTTPX)

外包人员关联历史内部账号系分

1. 背景

外包人员新增、修改时,需要根据证件类型和证件号码识别是否存在历史内部账号,并由用户确认是否建立内外部账号关联。关联后,在入场审核通过创建外部账号阶段,需要复用内部账号的照片、非岗位权限和业务数据,并存储内外部账号关联关系,供账号中心和后续查询使用。

本次涉及两个现有接口:

  • POST /platform/api/aboss/hrms/staff/create-staff
  • POST /platform/api/aboss/hrms/staff/update-staff

2. 设计目标

  1. 新增/修改外包人员保存前,按证件类型、证件号码匹配历史内部账号。
  2. 命中内部账号后,返回校验结果给前端展示确认弹窗。
  3. 用户确认关联时,保存外包人员和内部账号关联关系;用户取消关联时,仅保存外包人员。
  4. 修改/详情页只读展示“历史账号信息”模块。
  5. 入场审核通过后创建外部账号时,根据关联关系执行手机号、虚拟号、权限、照片和业务数据同步处理。
  6. 关联处理失败时不吞异常,保留审批单失败原因并支持现有重试链路。

3. 页面规则

3.1 新增页面

  • 页面初始不展示“历史账号信息”模块。
  • 点击保存时先触发历史内部账号校验。
  • 未命中证件匹配时,不展示弹窗,直接保存。
  • 命中证件匹配时,展示校验汇总弹窗。用户点击“确认关联”后保存并关联;点击“取消关联”后保存但不关联;点击右上角关闭时不保存,停留在当前页面。

3.2 修改/详情页面

  • 外包人员曾关联过历史内部账号时,展示“历史账号信息”模块。
  • 模块只读,不允许编辑。
  • 只要外包人员曾关联过历史内部账号,修改页证件号码置灰,不允许修改,避免修改后触发重新关联。
  • 外包人员未关联过历史内部账号时,可以修改证件类型、证件号码;保存时必须先走历史内部账号四项校验。

4. 接口设计

4.1 保存前校验接口

建议新增独立预校验接口,避免 create-staff / update-staff 同时承担“校验弹窗”和“真实保存”两种职责。

  • POST /platform/api/aboss/hrms/staff/check-history-internal-account

4.1.1 前端调用时机

该接口只做校验和弹窗判断,不保存人员信息。

页面调用时机
新增页面用户点击保存时,先调用该接口
修改页面未关联历史账号时,保存前先调用该接口,已关联则不调用
详情页面不调用该接口

4.1.2 请求字段

请求 DTO:CheckHistoryInternalAccountCmd

字段类型必填说明
staffIdString修改场景传入
certificateTypeString证件类型,非身份证同样按类型+号码匹配
certificateNumberString证件号码
branchOrgCodeString外包人员归属机构
pictureString外包人员本次上传的照片文件 ID;为空时后端校验命中的内部账号是否存在照片
operationTypeStringCREATE / UPDATE

新增页面请求示例:

{
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "branchOrgCode": "010100",
  "picture": "外包人员上传的照片文件ID",
  "operationType": "CREATE"
}

修改页面请求示例:

{
  "staffId": "外包人员ID",
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "branchOrgCode": "010100",
  "picture": "外包人员上传的照片文件ID",
  "operationType": "UPDATE"
}

说明:前端未上传照片时,picture 可不传或传空。后端在执行四项历史账号规则前校验照片:未命中内部账号时直接提示上传照片;命中内部账号时检查内部账号 faceId,内外部均无照片时提示上传照片后重新关联。

4.1.3 返回字段

返回 DTO:HistoryInternalAccountCheckDTO

字段类型说明
needPopupBoolean是否需要展示弹窗
canLinkBoolean是否允许确认关联
internalAccountIdString命中的内部账号;用户点击“确认关联”时,保存接口回传该值
ruleResultsList四项规则命中结果
messageString前端弹窗提示语

说明:内部账号姓名、机构、离职日期、已关联外包账号等信息由后端拼入 message,前端不需要单独解析字段。

ruleResults 固定返回四条规则,前端按 hit 展示“已命中/未命中”。

字段类型说明
ruleCodeString规则编码:CERT_MATCHORG_MATCHLINK_STATUSEMP_STATUS
ruleNameString规则名称
hitBoolean是否命中

返回示例:不需要弹窗,前端直接保存。

{
  "needPopup": false,
  "canLink": false,
  "ruleResults": [
    {
      "ruleCode": "CERT_MATCH",
      "ruleName": "外包人员的证件号码与某个内部账号的证件号码一致性",
      "hit": false
    },
    {
      "ruleCode": "ORG_MATCH",
      "ruleName": "外包人员与内部账号归属机构一致性",
      "hit": false
    },
    {
      "ruleCode": "LINK_STATUS",
      "ruleName": "内部账号的关联状态",
      "hit": false
    },
    {
      "ruleCode": "EMP_STATUS",
      "ruleName": "内部账号的在职状态",
      "hit": false
    }
  ]
}

返回示例:只命中校验一,展示确认关联弹窗。

{
  "needPopup": true,
  "canLink": true,
  "internalAccountId": "internal001",
  "message": "当前账号与匹配的内部账号【张三 - internal001】所属机构不一致,确认关联后,仅同步照片,原账号业务数据无法同步。",
  "ruleResults": [
    {
      "ruleCode": "CERT_MATCH",
      "ruleName": "外包人员的证件号码与某个内部账号的证件号码一致性",
      "hit": true
    },
    {
      "ruleCode": "ORG_MATCH",
      "ruleName": "外包人员与内部账号归属机构一致性",
      "hit": false
    },
    {
      "ruleCode": "LINK_STATUS",
      "ruleName": "内部账号的关联状态",
      "hit": false
    },
    {
      "ruleCode": "EMP_STATUS",
      "ruleName": "内部账号的在职状态",
      "hit": false
    }
  ]
}

返回示例:命中校验一和校验二,展示确认关联弹窗。

{
  "needPopup": true,
  "canLink": true,
  "internalAccountId": "internal001",
  "message": "当前账号匹配的内部账号【张三 - internal001】,确认关联后将自动同步以下内容:照片、原内部账号业务数据",
  "ruleResults": [
    {
      "ruleCode": "CERT_MATCH",
      "ruleName": "外包人员的证件号码与某个内部账号的证件号码一致性",
      "hit": true
    },
    {
      "ruleCode": "ORG_MATCH",
      "ruleName": "外包人员与内部账号归属机构一致性",
      "hit": true
    },
    {
      "ruleCode": "LINK_STATUS",
      "ruleName": "内部账号的关联状态",
      "hit": false
    },
    {
      "ruleCode": "EMP_STATUS",
      "ruleName": "内部账号的在职状态",
      "hit": false
    }
  ]
}

返回示例:只提示,不允许保存本次关联。

{
  "needPopup": true,
  "canLink": false,
  "internalAccountId": "internal001",
  "message": "当前匹配内部账号internal001已綁定外部账号【张三-internal001】。\n若该外包人员状态为已离场时,返聘操作优先复用当前外部账号。",
  "ruleResults": [
    {
      "ruleCode": "CERT_MATCH",
      "ruleName": "外包人员的证件号码与某个内部账号的证件号码一致性",
      "hit": true
    },
    {
      "ruleCode": "ORG_MATCH",
      "ruleName": "外包人员与内部账号归属机构一致性",
      "hit": true
    },
    {
      "ruleCode": "LINK_STATUS",
      "ruleName": "内部账号的关联状态",
      "hit": true
    },
    {
      "ruleCode": "EMP_STATUS",
      "ruleName": "内部账号的在职状态",
      "hit": false
    }
  ]
}

返回示例:内部账号已离职,仍允许确认关联。

{
  "needPopup": true,
  "canLink": true,
  "internalAccountId": "internal001",
  "message": "匹配的内部账号【张三 - internal001】已于2026-07-23离职。确认关联后,将自动同步以下内容:照片、原内部账号业务数据",
  "ruleResults": [
    {
      "ruleCode": "CERT_MATCH",
      "ruleName": "外包人员的证件号码与某个内部账号的证件号码一致性",
      "hit": true
    },
    {
      "ruleCode": "ORG_MATCH",
      "ruleName": "外包人员与内部账号归属机构一致性",
      "hit": true
    },
    {
      "ruleCode": "LINK_STATUS",
      "ruleName": "内部账号的关联状态",
      "hit": false
    },
    {
      "ruleCode": "EMP_STATUS",
      "ruleName": "内部账号的在职状态",
      "hit": true
    }
  ]
}

4.1.4 前端处理规则

返回结果前端处理
needPopup = false直接调用保存接口
needPopup = truecanLink = true展示校验结果汇总弹窗,并在确认关联弹窗中展示“确认关联”“取消”按钮
needPopup = truecanLink = false展示校验结果汇总弹窗,并在账号关联提示弹窗中展示“我知道了”按钮,不调用保存接口

说明:needPopup = false 表示未命中历史内部账号,前端直接保存,等同于不关联历史账号;保存接口不传 relatedAccountId

校验结果汇总弹窗展示要求:

  • 弹窗中展示 message
  • 弹窗中展示 ruleResults 四条规则,并按 hit 标识“已命中/未命中”。
  • canLink = true 时,弹窗按钮为“确认关联”“取消”。
  • canLink = false 时,弹窗按钮为“我知道了“。

确认账号关联弹窗按钮:

用户操作前端处理
确认关联调用保存接口,传 relatedAccountId = internalAccountId
取消调用保存接口,不传或置空 relatedAccountId

账号关联提示弹窗按钮:

用户操作前端处理
我知道了关闭弹窗,停留当前页面

4.2 详情接口改造

现有接口保持不变:

  • POST /platform/api/aboss/hrms/staff/query-staff-detail

前端进入修改页或详情页时,继续调用该接口获取人员详情。接口返回值 QueryStaffDetailDTO 新增 relatedAccountId 字段,用于展示“历史账号信息”模块。

4.2.1 前端调用时机

页面调用时机
修改页面进入页面时调用
详情页面进入页面时调用
新增页面不调用详情接口,不展示“历史账号信息”模块

4.2.2 返回字段

QueryStaffDetailDTO 新增字段:

字段类型说明
relatedAccountIdString关联历史账号,对应员工 RPC 返回的 employeeCode;为空表示未关联过历史内部账号

4.2.3 前端展示规则

返回结果前端处理
relatedAccountId 为空不展示“历史账号信息”模块
relatedAccountId 不为空展示“历史账号信息”模块,只读显示关联历史账号

模块展示内容:

字段展示文案
relatedAccountId关联历史账号

返回示例:

{
  "staffId": "外包人员ID",
  "displayName": "张三",
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "staffStatus": "0",
  "relatedAccountId": "internal001"
}

4.3 新增员工接口改造

现有接口保持不变:

  • POST /platform/api/aboss/hrms/staff/create-staff

新增员工仍调用原接口,不新增保存接口。前端点击保存时,先调用 4.1 预校验接口,再根据预校验结果决定是否调用 create-staff

4.3.1 前端页面展示规则

场景前端处理
进入新增页面不展示“历史账号信息”模块
预校验命中历史账号只展示弹窗,不在新增页面常驻展示“历史账号信息”模块
用户确认关联并保存成功后续进入修改/详情页时,通过详情接口展示关联历史账号

4.3.2 前端保存流程

用户点击保存时:

  1. 前端先调用 check-history-internal-account
  2. 如果 needPopup = false,直接调用 create-staff 保存。
  3. 如果 needPopup = truecanLink = true,展示确认账号关联弹窗。
  4. 如果 needPopup = truecanLink = false,展示提示弹窗,不调用 create-staff

流程表:

预校验结果前端处理
needPopup = false直接调用 create-staff
needPopup = truecanLink = true弹窗让用户选择确认关联或取消关联
needPopup = truecanLink = false只提示,不保存

4.3.3 弹窗按钮处理

确认账号关联弹窗:

用户操作前端处理
点击“确认关联”调用 create-staff,传 relatedAccountId
点击“取消关联”调用 create-staff,不传或置空 relatedAccountId
点击右上角关闭不调用 create-staff,停留在当前页面

账号关联提示弹窗:

用户操作前端处理
点击“我知道了”关闭弹窗,停留在当前页面
点击右上角关闭关闭弹窗,停留在当前页面

4.3.4 create-staff 请求字段

CreateStaffCmd 建议新增字段:

字段类型必填说明
relatedAccountIdString用户点击“确认关联”时,传入预校验返回的 internalAccountId;不传表示不关联

确认关联示例:

{
  "displayName": "张三",
  "phone": "13800000000",
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "branchOrgCode": "010100",
  "operatingOrgCode": "010000",
  "agreementNo": "AGR001",
  "projectCode": "PRJ001",
  "businessCategory": "xxx",
  "relatedAccountId": "internal001"
}

取消关联示例:

{
  "displayName": "张三",
  "phone": "13800000000",
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "branchOrgCode": "010100",
  "operatingOrgCode": "010000",
  "agreementNo": "AGR001",
  "projectCode": "PRJ001",
  "businessCategory": "xxx"
}

4.3.5 后端处理规则

  • relatedAccountId 有值时,后端执行确认关联轻量一致性校验;校验通过后保存到 outsourced_staff.related_account_id,并从账号中心查询内部账号照片 fileId 写入 outsourced_staff.picture
  • relatedAccountId 为空时,只保存外包人员,不关联历史账号。
  • 如果前端绕过预校验直接传入 relatedAccountId,后端仍以保存时轻量一致性校验结果为准。

4.4 修改员工接口改造

现有接口保持不变:

  • POST /platform/api/aboss/hrms/staff/update-staff

修改员工仍调用原接口,不新增修改接口。前端只需要在特定场景下,先调用历史账号预校验接口,再根据用户弹窗选择调用 update-staff

4.4.1 前端页面展示规则

进入修改页时,前端根据详情接口返回的 relatedAccountId 判断是否展示“历史账号信息”模块:

场景前端处理
relatedAccountId 为空不展示“历史账号信息”模块
relatedAccountId 不为空展示“历史账号信息”模块,只读显示关联历史账号

证件字段编辑规则:

场景前端处理
已关联历史内部账号证件号码置灰,不允许修改
未关联历史内部账号证件类型、证件号码允许编辑;保存时必须走预校验

4.4.2 前端保存流程

用户点击保存时,前端先判断该外包人员是否已关联历史内部账号。

已关联历史内部账号时,修改页证件号码已置灰,不允许修改;保存时不再触发历史内部账号预校验,直接调用 update-staff 保存其他可编辑信息。

未关联历史内部账号时,证件类型、证件号码允许编辑;点击保存先调用 check-history-internal-account 执行四项校验,再根据预校验结果决定是否调用 update-staff

场景前端处理
已关联历史内部账号证件号码置灰,不允许修改;保存时直接调用 update-staff
未关联历史内部账号点击保存先调用 check-history-internal-account 预校验,按四项校验规则判断

预校验结果处理:

预校验结果前端处理
needPopup = false直接调用 update-staff 保存
needPopup = truecanLink = true展示确认账号关联弹窗
needPopup = truecanLink = false展示账号关联提示弹窗,不调用保存接口

4.4.3 弹窗按钮处理

确认账号关联弹窗:

用户操作前端处理
点击“确认关联”调用 update-staff,传 relatedAccountId
点击“取消”调用 update-staff,不传或置空 relatedAccountId

账号关联提示弹窗:

用户操作前端处理
点击“我知道了”关闭弹窗,停留在当前页面

4.4.4 update-staff 请求字段

UpdateStaffCmd 继承 CreateStaffCmd,因此复用新增字段:

字段类型必填说明
relatedAccountIdString用户点击“确认关联”时,传入预校验返回的 internalAccountId;不传表示不关联

确认关联示例:

{
  "staffId": "外包人员ID",
  "displayName": "张三",
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "branchOrgCode": "xxx",
  "relatedAccountId": "internal001"
}

取消关联示例:

{
  "staffId": "外包人员ID",
  "displayName": "张三",
  "certificateType": "ID_CARD",
  "certificateNumber": "xxx",
  "branchOrgCode": "xxx"
}

4.4.5 后端处理规则

  • 已关联历史内部账号时,不允许修改证件号码;后端需以数据库原值为准校验,防止前端绕过置灰直接提交。
  • 未关联历史内部账号且保存接口传入 relatedAccountId 时,后端执行确认关联轻量一致性校验。
  • 确认关联后,写入或更新关联关系,并从账号中心查询内部账号照片 fileId 写入 outsourced_staff.picture;取消关联后,仅保存人员基础信息。

5. 校验规则

校验顺序固定为:校验一 -> 校验二 -> 校验三 -> 校验四。校验一未命中时终止,不展示弹窗;校验三命中时终止,不再执行校验四,因为内部账号已被关联时不允许本次继续关联。

内部员工基础信息统一通过员工 RPC 查询:

内容
RPC 包名com.aliyun.fsi.insurance.facade.employee.rpc
RPC 类名EmployeeBasicRpcFacade
RPC 方法getEmployeeDetailByCertNumber
RPC 入参EmployeeCertQueryDTO

查询入参建议:

入参字段取值
certType外包人员证件类型;为空时员工 RPC 默认按 111 身份证查询
certNumber外包人员证件号码

说明:该接口直接按证件类型、证件号码查询员工详情,适合作为校验一的数据来源。若入参 certType 为空,员工 RPC 默认按 111 身份证查询;HRMS 传参时建议显式传入外包人员证件类型,兼容非身份证场景。

RPC 返回字段使用说明:

返回字段用途
employeeCode内部员工账号,作为 relatedAccountId / internalAccountId
employeeName内部员工姓名,用于弹窗展示“姓名 - 账号”
certificateType内部员工证件类型,用于校验一
certificateNumber内部员工证件号码,用于校验一
branchOrgCode内部员工归属机构,用于校验二
branchOrgName内部员工归属机构名称,用于弹窗展示或日志
employeeStatus内部员工在职状态,用于校验四
leaveCompanyDate内部员工离职日期,用于校验四和弹窗提示
规则逻辑前置条件结果
校验一调用 EmployeeBasicRpcFacade#getEmployeeDetailByCertNumber,入参传 certTypecertNumber 查询证件一致的内部员工未命中则不弹窗,直接保存
校验二比较外包人员归属机构与 RPC 返回的 branchOrgCode命中校验一不一致仍可确认关联,但只同步照片
校验三使用 RPC 返回的 employeeCode 查询 HRMS 本地是否已有其他有效外包人员占用该关联账号命中校验一、二已关联则只提示,不允许保存本次关联
校验四根据 RPC 返回的 employeeStatusleaveCompanyDate 判断内部员工是否离职命中校验一、二已离职仍可确认关联,但提示离职日期和权限同步限制

说明:校验三的内部员工账号来源于 RPC 返回的 employeeCode,但员工基础 RPC 返回样例中不包含外部账号关联状态。由于历史内部账号关联入口在 HRMS,账号中心关联关系在后续入场创建外部账号时才建立,因此校验三只查询 HRMS 本地表:

  1. 查询 HRMS outsourced_staff.related_account_id = employeeCode 且非当前外包人员的有效记录。
  2. 如存在记录,说明该内部账号已被其他外包人员确认关联,视为校验三命中,不允许本次继续确认关联。
  3. 校验三不查询账号中心;账号中心只在入场创建外部账号时根据 relatedAccountId 建立内外部账号关联。

弹窗场景:

场景命中规则类型后端建议
场景一仅命中校验一确认账号关联允许保存,允许选择关联或不关联;关联后仅同步照片
场景二命中校验一、二确认账号关联允许保存,允许选择关联或不关联;关联后同步非岗位权限、照片和原内部账号业务数据
场景三命中校验一、二、三账号关联提示不允许保存本次关联;提示返聘已关联的外包账号
场景四命中校验一、二、四确认账号关联允许保存,允许选择关联或不关联;若离职日期超过当月月底,不同步非岗位权限

6. 数据设计

6.1 outsourced_staff 新增字段

本期前端只需要展示“关联历史账号”,不需要展示内部账号姓名、机构、证件等扩展信息。为降低开发复杂度,不新增独立关联表,直接在 outsourced_staff 增加字段。

ALTER TABLE `outsourced_staff`
  ADD COLUMN `related_account_id` varchar(64) DEFAULT NULL COMMENT '关联历史内部账号ID' AFTER `account_id`,
  ADD KEY `idx_related_account_id` (`related_account_id`);

字段说明:

字段说明
related_account_id关联历史账号,对应员工 RPC 返回的 employeeCode,也是账号中心 relatedAccountId 使用的内部账号 ID

使用规则:

  • 用户确认关联后,保存 outsourced_staff.related_account_id = internalAccountId
  • 用户取消关联时,related_account_id 置空。
  • 详情页展示历史账号时,直接返回 related_account_id
  • 修改页判断是否已关联历史账号时,直接判断 related_account_id 是否为空。
  • 内部账号是否已被其他外包账号关联,以 HRMS outsourced_staff.related_account_id 是否被其他有效外包人员占用为准。

6.2 查询展示

query-staff-detail 返回的 QueryStaffDetailDTO 建议新增:

字段类型说明
relatedAccountIdString关联历史账号;为空表示未关联

7. 集成设计

7.1 员工基础信息 RPC

历史内部账号校验使用员工基础信息 RPC,不通过账号中心查询内部员工基础信息。

内容
RPC 包名com.aliyun.fsi.insurance.facade.employee.rpc
RPC 类名EmployeeBasicRpcFacade
RPC 方法getEmployeeDetailByCertNumber
RPC 入参EmployeeCertQueryDTO

查询入参建议:

入参字段取值
certType外包人员证件类型;为空时员工 RPC 默认按 111 身份证查询
certNumber外包人员证件号码

说明:员工 RPC 支持按证件类型和证件号码查询详情;HRMS 传参时建议显式传入 certType,避免非身份证场景按默认身份证查询。

返回样例字段映射:

RPC 字段HRMS 使用字段说明
employeeCoderelatedAccountId / internalAccountId关联历史账号
employeeNameinternalDisplayName弹窗展示姓名
certificateTypecertificateType证件类型
certificateNumbercertificateNumber证件号码
branchOrgCodeinternalOrgCode内部员工归属机构
branchOrgNameinternalOrgName内部员工归属机构名称
employeeStatusinternalEmployeeStatus内部员工状态
leaveCompanyDateinternalLeaveDate内部员工离职日期

建议新增 EmployeeIntegration 封装该 RPC,避免领域层直接依赖 RPC Facade:

  • EmployeeIntegration#getEmployeeDetailByCertNumber(EmployeeCertQueryDTO queryDTO)
  • EmployeeIntegration#queryByCertificate(certificateType, certificateNumber):集成层内部调用 getEmployeeDetailByCertNumber

7.2 账号中心

AccountIntegration 当前已有:

  • accountInfoByAccId
  • accountListByAccountIds
  • createExternalAccount
  • updateExternalAccount
  • rehiredExternalAccount
  • invalidExternalAccount

账号中心 AccountRpcFacade 1.3.6-SNAPSHOT 已支持内外部账号关联:

接口/字段用途
ExternalAccountAddCmd.relatedAccountId创建外部账号时传入关联内部账号,账号中心自动建立双向关联
ExternalAccountUpdateCmd.relatedAccountId修改外部账号时传入关联内部账号,账号中心自动建立双向关联
ExternalAccountUpdateCmd.accId修改外部账号优先使用账号 ID,不再优先使用 externalId
ExternalAccountInvalidCmd.accId离职外部账号优先使用账号 ID
ExternalAccountRehiredCmd.accId返聘外部账号优先使用账号 ID
UnbindExternalAccountCmd解除外部账号关联关系,当前无关联时幂等返回

本次账号中心能力使用方式:

场景处理
校验三:内部账号是否已被关联查 HRMS 本地 outsourced_staff.related_account_id 是否已被其他有效外包人员占用;账号中心不参与该校验
入场审核通过创建外部账号调用 createExternalAccount 时传 relatedAccountId = outsourced_staff.related_account_id
确认关联保存照片create-staff / update-staff 确认关联时,查询内部账号照片 fileId,保存到 outsourced_staff.picture;入场创建外部账号时沿用现有 picture -> ExternalAccountAddCmd.faceId 逻辑

7.3 HR 系统推送

建立关联后,内部账号对应组织人员除离职外,不再接收 HR 系统推送的人变更数据。该规则由账号中心 support 的内部账户 MQ 消费逻辑承接:账号中心可通过外部账号 relatedAccountId = 内部账号 ID 判断该内部账号已被外部账号关联;员工状态为在岗/实习时跳过变更处理,离职状态仍正常处理。

8. 保存流程

8.1 新增保存

本节描述的是新增外包人员基础信息保存阶段,即调用 create-staff 写入 outsourced_staff。此阶段不创建外部账号,不调用账号中心建立 relatedAccountId;账号中心关联处理在入场审核通过后执行,见第 9 节。

新增保存分支:

场景前端处理后端处理
未命中校验一不展示确认关联弹窗,直接调用 create-staff保存外包人员基础信息,related_account_id 为空
只命中校验一展示校验结果汇总弹窗;用户可点“确认关联”或“取消”确认关联时保存 related_account_id = internalAccountId;取消时只保存人员基础信息
命中校验一、二展示校验结果汇总弹窗;用户可点“确认关联”或“取消”确认关联时保存 related_account_id = internalAccountId;取消时只保存人员基础信息
命中校验一、二、三展示校验结果汇总弹窗和“我知道了”按钮不调用 create-staff,停留当前页面
命中校验一、二、四展示校验结果汇总弹窗;用户可点“确认关联”或“取消”确认关联时保存 related_account_id = internalAccountId;取消时只保存人员基础信息

create-staff 保存规则:

  • 前端点击“确认关联”时,create-staff 请求携带 relatedAccountId
  • 前端点击“取消”或未命中历史账号时,create-staff 请求不携带 relatedAccountId
  • 后端收到 relatedAccountId 后执行确认关联轻量一致性校验,校验通过后写入 outsourced_staff.related_account_id
  • 后端确认关联时,同步查询内部账号照片 fileId,并写入 outsourced_staff.picture,后续入场创建外部账号时直接使用该 picture 作为 ExternalAccountAddCmd.faceId
  • 后端不在本阶段调用 createExternalAccount,也不在本阶段同步权限、虚拟手机号。

确认关联轻量一致性校验:

  1. 仅在保存接口传入 relatedAccountId 时执行;未传时不执行该校验。
  2. 校验 relatedAccountId 对应内部账号仍存在,且证件类型、证件号码与本次保存的外包人员证件信息一致。
  3. 校验该内部账号仍未被其他外包账号关联:查 HRMS 本地是否存在其他有效外包人员占用该 related_account_id;如存在,本次保存失败。
  4. 查询内部账号照片 fileId;照片为空或查询失败时,本次保存失败。
  5. 轻量一致性校验只做保存兜底,不重新组装弹窗文案,也不返回四项规则明细。

8.2 修改保存

9. 入场审核通过后处理

触发点:OutsourcedStaffApprovalHandler#handleOnboardApplication 中创建或返聘外部账号成功后。

9.1 自动处理逻辑

处理项规则实现
内部账号分配虚拟手机号自动给关联的内部账号分配虚拟手机号;关联账号间手机号不冲突时,可不重新分配机构
权限同步岗位权限不自动同步,本期通过用户单独授权处理;非岗位权限自动同步内部账号权限给外部账号权限
照片同步只要用户确认关联并保存了 related_account_id,新增/修改保存时就查询内部账号照片并写入外包人员 picture;入场创建外部账号时沿用现有 picture -> ExternalAccountAddCmd.faceId 逻辑hrms
关联关系存储存储内部账号和外部账号的关联关系hrms
HR 系统数据推送组织人员不再接收除离职外的 HR 系统人员变更数据账号

照片带入规则:

  1. 新增/修改外包人员时,用户点击“确认关联”并调用保存接口,HRMS 根据 relatedAccountId 查询账号中心内部账号照片 fileId。
  2. 内部账号照片 fileId 查询成功后,保存 outsourced_staff.related_account_id,同时将内部账号照片 fileId 写入 outsourced_staff.picture
  3. 用户点击“取消关联”或未命中历史账号时,不覆盖外包人员 picture,按用户上传照片保存。
  4. 内部账号照片查询失败或照片为空时,本次 create-staff / update-staff 保存失败并提示原因;不降级使用外包人员原照片完成关联保存。
  5. 入场审核通过创建外部账号时,不再临时查询内部账号照片,沿用现有 staffEntity.getPicture() 组装 ExternalAccountAddCmd.faceId

9.2 MQ 消息处理

本需求涉及两类 MQ,职责不同:

MQ发送方/消费方触发时机处理规则
外包人员变更 MQHRMS 发送,现有 OutsourcedStaffChangeHandler 处理发送入场审核通过并创建外部账号成功后,HRMS 更新外包人员状态为已入场后发送沿用现有外包人员变更消息,不新增独立 MQ;消息体为外包人员详情 DTO,用于通知下游外包人员信息变化

HRMS 外包人员变更 MQ 配置:

配置项
TopicTP_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF
TagTG_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF
发送代码OutsourcedStaffChangeHandler#handle
触发位置入场审核通过后,OutsourcedStaffApprovalHandler#handleOnboardApplication 调用 outsourcedStaffChangeHandler.handle(staffEntity)

HRMS 外包人员变更 MQ 消息体新增字段:

字段类型说明来源
relatedAccountIdString关联历史内部账号 IDoutsourced_staff.related_account_id
creatorString外包人员创建人outsourced_staff.creator

说明:外包人员变更 MQ 仍沿用现有 Topic/Tag 和发送链路,只是在消息体 DTO 中补充 relatedAccountIdcreater 两个字段,保证和 HRMS 详情接口字段命名一致。账号中心侧仍使用 relatedAccountId 写入 t_abs_sso_account.related_account_id 并在账号中心查询接口中返回。