臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于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)

工作岗位 0820 需求系统分析设计(精简版)

1. 需求目标

本次只处理外包人员与工作岗位的关联关系,HRMS 关心的岗位业务字段只有:

字段含义
workPositionName工作岗位名称,仅用于查询展示,不在人员岗位关系中保存;通过岗位 RPC 查询
workPositionCode工作岗位编码
positionType岗位类型码值字符串,取自 position_type_cd;接口实际传值为 "1""2",不是中文名称

实现范围:

  1. 保存一个人员关联的多个工作岗位。
  2. 改造现有人员新增、修改、查询接口,一次性保存或返回账号的全部岗位。
  3. 校验同一人员岗位编码不重复,且有且仅有一个主岗位。
  4. 批量导入人员未维护岗位时,在入场提交阶段拦截。
  5. 岗位集合发生变化时,将变更后的岗位编码、岗位类型以 JSON 形式写入一条现有人员任职记录。
  6. 对外 RPC 查询结果增加岗位集合。
  7. 新增两个岗位查询 OpenAPI,分别封装机构侧岗位分页查询和岗位详情查询 RPC,供前端使用。

岗位下拉搜索由前端调用 HRMS 新增岗位分页 OpenAPI;岗位权限弹窗、角色清单仍由前端直接调用权限服务,HRMS 不提供权限查询接口、不处理权限查询方式。

2. 现状

当前人员表 outsourced_staff 只有一个 work_position_code,人员详情和对外 RPC DTO 也只能返回一个岗位,不能满足一个人员关联多个岗位。

现有主要接口:

类型接口/方法现状
HTTPcreate-staff新增人员,只支持单岗位字段
HTTPupdate-staff修改人员,只支持单岗位字段
HTTPquery-staff-detail查询人员详情,只返回单岗位
HTTP岗位查询 OpenAPI当前无岗位查询接口
RPCOutsourcedStaffFacade 的人员详情、列表、分页查询方法返回 OutStaffDetailDTO,只含单岗位
RPCqueryStaffMovementList返回 OutStaffMovementDTO,只含单岗位
MQTP_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF / TG_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFFOutStaffDetailDTO 只发送单个岗位编码和名称
数据outsourced_staff_movement已有任职记录表,可继续复用

3. 数据设计

3.1 人员岗位关联表

建议表名:outsourced_staff_work_position

字段类型建议必填说明
idvarchar主键
staff_idvarchar外包人员 ID
work_position_codevarchar工作岗位编码
position_typevarchar岗位类型,仅允许 1-主岗位2-兼职岗位
通用审计字段按现有规范创建人、修改人、创建时间、修改时间、租户、有效标识

索引:

  • 唯一索引:(staff_id, work_position_code),防止同一人员重复关联相同岗位。

DDL:

CREATE TABLE `outsourced_staff_work_position` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `staff_id` varchar(64) NOT NULL COMMENT '外包人员ID',
  `work_position_code` varchar(64) NOT NULL COMMENT '工作岗位编码',
  `position_type` varchar(20) NOT NULL COMMENT '岗位类型(position_type_cd):1主岗位,2兼职岗位',
  `gmt_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `creator` varchar(32) DEFAULT 'system' COMMENT '创建者',
  `modifier` varchar(32) DEFAULT 'system' COMMENT '修改者',
  `tenant_code` varchar(32) DEFAULT 'cic' COMMENT '租户',
  `is_valid` tinyint(2) DEFAULT '1' COMMENT '是否有效',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_staff_work_position` (`staff_id`, `work_position_code`) BLOCK_SIZE 16384 GLOBAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.0' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 COMMENT = '外包人员工作岗位关联表';

“主岗位有且仅有一个”由人员新增、修改保存时的业务校验保证。

3.2 现有人员表字段处理

删除 outsourced_staff.work_position_codeoutsourced_staff.standard_position_code。人员的岗位编码和岗位类型统一从 outsourced_staff_work_position 查询;岗位名称通过岗位 RPC 补充。

上线前先将 outsourced_staff.work_position_code 中已有的主岗位数据迁移到 outsourced_staff_work_position,再执行删字段 DDL;standard_position_code 不迁移。所有基于这两个字段的 Entity、Mapper、查询、导出和赋值逻辑同步删除或改为查询岗位关联表。

DDL:

-- 1. 删除 work_position_code 对应索引
ALTER TABLE outsourced_staff
DROP INDEX idx_work_position_code;
 
-- 2. 删除 standard_position_code 对应索引
ALTER TABLE outsourced_staff
DROP INDEX idx_standard_position_code;
 
-- 3. 删除两个字段
ALTER TABLE outsourced_staff
DROP COLUMN work_position_code,
DROP COLUMN standard_position_code;

3.3 任职记录

复用现有 outsourced_staff_movement.work_position_code,不新增独立的 position_typework_position_change_type 字段,并删除不再使用的 standard_position_code。岗位集合发生变化时只新增一条任职记录,work_position_code 以 JSON 保存变更后的完整岗位编码、岗位类型。

JSON 示例:

[
  {
    "workPositionCode": "PositionA",
    "positionType": "2"
  },
  {
    "workPositionCode": "PositionB",
    "positionType": "1"
  }
]

变化仍由后端在处理 update-staff 时感知:更新岗位关联表前,查询数据库旧岗位集合并与请求的新岗位集合比较。只要岗位编码集合或任一岗位的 positionType 发生变化,就写一条任职记录;完全相同或仅列表顺序变化时不写。

任职记录不保存岗位名称、变更前快照和独立的操作类型,只保存本次修改后的岗位编码及岗位类型。

历史任职记录中的 work_position_code 仍可能是原单岗位编码;本次改造后新增的岗位变更记录使用岗位对象 JSON 数组,查询调用方需兼容两种格式。

DDL:

ALTER TABLE `outsourced_staff_movement`
  MODIFY COLUMN `work_position_code` text DEFAULT NULL COMMENT '工作岗位变更后快照(JSON,含岗位编码及类型)',
  DROP COLUMN `standard_position_code`;

4. HTTP 与前端交互

岗位行的新增、编辑、删除、取消只修改前端页面数据;人员最终保存时,前端一次性提交完整 workPositions。岗位名称只用于展示,新增和修改请求不提交 workPositionName

4.1 新增人员

Description: 新增外包人员并保存其完整工作岗位集合;岗位集合至少包含一个岗位,且必须有且仅有一个主岗位。

OpenAPI: POST /platform/api/aboss/hrms/staff/create-staff

Body-parameters

新增字段:

ParameterTypeDescriptionRequiredSince
workPositionsArray<StaffWorkPositionCmd>完整工作岗位集合true-
workPositions[].workPositionCodestring工作岗位编码;同一人员不可重复true-
workPositions[].positionTypestring岗位类型码:1 主岗位,2 兼职岗位true-

删除字段:

ParameterDescription
workPositionCode原单岗位字段,从 HTTP 请求删除
standardPositionCode原标准岗位字段,从 HTTP 请求删除

不接收字段:workPositions[].workPositionName,仅用于查询展示。

Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/staff/create-staff' \
  --data '{
    "staffName": "张三",
    "branchOrgCode": "330100000000",
    "workPositions": [
      {
        "workPositionCode": "Position22310007000020230609391",
        "positionType": "1"
      },
      {
        "workPositionCode": "Position22310007000020230609392",
        "positionType": "2"
      }
    ]
  }'
Response-parameters
ParameterTypeDescription
databoolean是否保存成功
Response-example
{
  "data": true
}

返回类型:ResultModel<Boolean>。批量导入不提交岗位,岗位由导入后维护;首次入场完成前不发送人员变更 MQ。

4.2 修改人员

Description: 修改外包人员信息并以完整岗位集合覆盖原岗位关系。

OpenAPI: POST /platform/api/aboss/hrms/staff/update-staff

Body-parameters

本次只展示岗位字段改动,人员其他请求字段沿用现有接口。

新增字段:

ParameterTypeDescriptionRequiredSince
workPositionsArray<StaffWorkPositionCmd>修改后的完整岗位集合,不是增量列表true-
workPositions[].workPositionCodestring工作岗位编码;同一人员不可重复true-
workPositions[].positionTypestring岗位类型码:1 主岗位,2 兼职岗位true-

删除字段:

ParameterDescription
workPositionCode原单岗位字段,从 HTTP 请求删除
standardPositionCode原标准岗位字段,从 HTTP 请求删除

不接收字段:workPositions[].workPositionName,仅用于查询展示。

Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/staff/update-staff' \
  --data '{
    "staffId": "10000001",
    "workPositions": [
      {
        "workPositionCode": "Position22310007000020230609391",
        "positionType": "2"
      },
      {
        "workPositionCode": "Position22310007000020230609392",
        "positionType": "1"
      }
    ]
  }'
Response-parameters
ParameterTypeDescription
databoolean是否修改成功
Response-example
{
  "data": true
}

返回类型:ResultModel<Boolean>。岗位编码或岗位类型发生变化时写入一条任职记录;仅调整顺序或重复提交相同集合时不新增记录。

4.3 查询人员详情

Description: 查询人员详情并返回完整岗位集合,供前端编辑页面回填。

OpenAPI: POST /platform/api/aboss/hrms/staff/query-staff-detail

Body-parameters
ParameterTypeDescriptionRequiredSince
staffIdstring外包人员 IDtrue-
Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/staff/query-staff-detail' \
  --data '{
    "staffId": "10000001"
  }'
Response-parameters

新增字段:

ParameterTypeDescription
workPositionsArray<StaffWorkPositionDTO>人员全部岗位;无岗位返回 []
workPositions[].workPositionNamestring工作岗位名称,查询时由岗位 RPC 补充
workPositions[].workPositionCodestring工作岗位编码
workPositions[].positionTypestring岗位类型码:1 主岗位,2 兼职岗位

删除字段:

ParameterTypeDescription
workPositionCodestring原单岗位字段,HTTP 响应删除
workPositionNamestring原单岗位字段,HTTP 响应删除
standardPositionCodestring原标准岗位字段,HTTP 响应删除
standardPositionNamestring原标准岗位字段,HTTP 响应删除
Response-example
{
  "data": {
    "staffId": "10000001",
    "workPositions": [
      {
        "workPositionName": "车物理赔管理岗",
        "workPositionCode": "Position22310007000020230609391",
        "positionType": "1"
      },
      {
        "workPositionName": "车险案件理赔岗",
        "workPositionCode": "Position22310007000020230609392",
        "positionType": "2"
      }
    ]
  }
}

返回类型:ResultModel<QueryStaffDetailDTO>。响应不再返回顶层单岗位字段,岗位信息统一从 workPositions 读取。

4.4 查询人员异动列表

Description: 分页查询人员任职记录,并返回每条记录对应的岗位快照。

OpenAPI: POST /platform/api/aboss/hrms/staff/query-staff-movement-page

Body-parameters
ParameterTypeDescriptionRequiredSince
currentinteger当前页码true-
pageSizeinteger每页条数true-
其他现有查询条件-沿用现有接口--
Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/staff/query-staff-movement-page' \
  --data '{
    "current": 1,
    "pageSize": 10,
    "staffId": "10000001"
  }'
Response-parameters

新增字段:

ParameterTypeDescription
workPositionsArray<StaffWorkPositionDTO>任职记录对应的岗位快照;无岗位返回 []
workPositions[].workPositionNamestring工作岗位名称,查询时由岗位 RPC 补充
workPositions[].workPositionCodestring任职记录中的岗位编码
workPositions[].positionTypestring岗位类型码;历史数据缺失时返回 null

删除字段:

ParameterTypeDescription
workPositionCodestring原单岗位字段,HTTP 响应删除
workPositionNamestring原单岗位字段,HTTP 响应删除
standardPositionCodestring原标准岗位字段,HTTP 响应删除
standardPositionNamestring原标准岗位字段,HTTP 响应删除
Response-example
{
  "data": {
    "list": [
      {
        "workPositions": [
          {
            "workPositionName": "车物理赔管理岗",
            "workPositionCode": "Position22310007000020230609391",
            "positionType": "1"
          }
        ]
      }
    ]
  }
}

返回类型:ResultModel<PageResult<QueryStaffDetailDTO>>。历史单岗位编码和新岗位快照 JSON 均转换为 workPositions

4.5 删除人员

Description: 删除外包人员及其岗位关联关系,不新增独立的岗位删除接口。

OpenAPI: POST /platform/api/aboss/hrms/staff/delete-staff

Body-parameters
ParameterTypeDescriptionRequiredSince
staffIdstring外包人员 IDtrue-
Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/staff/delete-staff' \
  --data '{
    "staffId": "10000001"
  }'
Response-parameters
ParameterTypeDescription
databoolean是否删除成功
Response-example
{
  "data": true
}

返回类型:ResultModel<Boolean>

4.6 岗位查询 OpenAPI

岗位查询属于前端 HTTP 接口,两个 OpenAPI 放在本章统一说明;其下游 RPC 方法见第 7 章。

4.6.1 分页获取指定所属组织的工作岗位

Description: 按指定所属组织分页查询工作岗位,供前端岗位下拉搜索使用。

OpenAPI: POST /platform/api/aboss/hrms/position/openapi/query-work-position-page

Body-parameters
ParameterTypeDescriptionRequiredSince
currentinteger当前页码,从 1 开始true-
pageSizeinteger每页条数,最大 100true-
branchOrgCodestring指定所属组织编码true-
keywordstring工作岗位模糊查询关键字,可匹配工作岗位编码或工作岗位名称false-
Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/position/openapi/query-work-position-page' \
  --data '{
    "current": 1,
    "pageSize": 10,
    "branchOrgCode": "330100000000",
    "keyword": "理赔"
  }'

查询规则:前端先确定组织机构,再发起岗位查询;keyword 为空时沿用现有岗位查询逻辑,不为空时按工作岗位编码或工作岗位名称模糊匹配。组织机构未确定时不发起岗位查询。

Response-parameters
ParameterTypeDescription
currentinteger当前页码
pageSizeinteger每页条数
totalinteger岗位总数
workPositionCodestring工作岗位编码
workPositionNamestring工作岗位名称
Response-example
{
  "data": {
    "current": 1,
    "pageSize": 10,
    "total": 2,
    "list": [
      {
        "workPositionCode": "Position22310007000020230609391",
        "workPositionName": "车物理赔管理岗"
      },
      {
        "workPositionCode": "Position22310007000020230609392",
        "workPositionName": "车险案件理赔岗"
      }
    ]
  }
}

返回类型:ResultModel<PageResult<WorkPositionDTO>>

4.6.2 根据工作岗位编码获取详情

Description: 根据单个工作岗位编码查询岗位详情。一个工作岗位可以关联多个职能,一个职能对应一个用户组;返回岗位关联的职能及 ACL 用户组信息,供前端岗位权限弹窗展示。

OpenAPI: POST /platform/api/aboss/hrms/position/openapi/query-work-position-info-by-codes

Body-parameters
ParameterTypeDescriptionRequiredSince
workPositionCodestring单个工作岗位编码true-
Request-example
curl -X POST \
  -H 'Content-Type: application/json; charset=utf-8' \
  -i '/platform/api/aboss/hrms/position/openapi/query-work-position-info-by-codes' \
  --data '{
    "workPositionCode": "Position22310007000020230609391"
  }'
Response-parameters
ParameterTypeDescription
workFunctionInfoResDTOListList<WorkFunctionInfoResDTO>当前岗位关联的职能列表,一个岗位可对应多个职能
workFunctionInfoResDTOList[].workFunctionNameString职能名称
workFunctionInfoResDTOList[].workFunctionCodeString职能编码
workFunctionInfoResDTOList[].userDefineRoleGroupNameString用户组名称,来源于 ACL,前端支持点击后查询角色清单
workFunctionInfoResDTOList[].userDefineRoleGroupCodeString用户组编码,来源于 ACL
Response-example
{
  "data": {
    "workFunctionInfoResDTOList": [
      {
        "workFunctionCode": "Function001",
        "workFunctionName": "理赔处理",
        "userDefineRoleGroupCode": "RoleGroup001",
        "userDefineRoleGroupName": "车物理赔用户组"
      },
      {
        "workFunctionCode": "Function002",
        "workFunctionName": "案件审核",
        "userDefineRoleGroupCode": "RoleGroup002",
        "userDefineRoleGroupName": "案件审核用户组"
      }
    ]
  }
}

返回类型:ResultModel<WorkPositionInfoDTO>data 为单个岗位详情对象,不返回数组。无职能时 workFunctionInfoResDTOList 返回空数组。用户组信息通过 ACL 接口 ResultModelSupport<List<WorkFunctionRoleGroupResDTO>> getUserDefineRoleGroupByWorkFunctionCodes(List<String> var1) 按职能编码批量查询后组装,var1 为工作职能编码列表。

4.7 岗位类型码表

岗位类型沿用码表 position_type_cd,前端展示“主岗位”“兼职岗位”,请求、响应、数据库和 MQ 均传码值字符串:"1" 表示主岗位,"2" 表示兼职岗位。HRMS 新增、修改人员时校验岗位类型,并要求岗位集合有且仅有一个主岗位。

5. 对外 RPC 改造

5.1 新增公共 DTO

facade 模块新增 StaffWorkPositionDTO

public class StaffWorkPositionDTO implements Serializable {
    private String workPositionName;
    private String workPositionCode;
    private String positionType;
}

5.2 人员及任职记录查询 DTO 增加字段

OutStaffDetailDTO 增加:

private List<StaffWorkPositionDTO> workPositions;

该集合对外返回时同样包含岗位名称、岗位编码和岗位类型;岗位名称不是数据库存储字段,而是在查询组装 DTO 时补充。

OutStaffMovementDTO 增加:

private List<StaffWorkPositionDTO> workPositions;

查询任职记录时,后端解析数据库 work_position_code 中的 JSON,并组装为 workPositions。每个岗位包含 workPositionNameworkPositionCodepositionType;岗位名称通过第 7 章的岗位 RPC 批量补充。

workPositionCodeworkPositionName 单值字段继续保留但不再赋值,并通过 @Deprecated@deprecated Javadoc 明确标记为废弃字段;调用方统一读取 workPositions。历史任职记录若仍为单岗位编码,则转换为只有一项的 workPositions,其中 positionType 无历史数据时返回 null

OutStaffDetailDTOOutStaffMovementDTO 中原单岗位字段统一增加废弃标记:

/**
 * @deprecated 已改为多岗位,请使用 workPositions
 */
@Deprecated
private String workPositionCode;
 
/**
 * @deprecated 已改为多岗位,请使用 workPositions
 */
@Deprecated
private String workPositionName;

两个 DTO 中原 standardPositionCode 同样保留兼容但不再赋值,并标记为废弃:

/**
 * @deprecated 标准岗位编码已废弃,请使用 workPositions
 */
@Deprecated
private String standardPositionCode;

@Deprecated 只用于通知调用方迁移,字段本次不删除,避免已依赖旧版 facade 的调用方出现反序列化或编译兼容问题。

影响的现有 RPC 方法:

方法改造
queryStaffDetail返回人员岗位集合
queryStaffList每个人员返回岗位集合
queryPageStaffList每个人员返回岗位集合
queryPageStaff每个人员返回岗位集合
queryStaffListByOrgCode每个人员返回岗位集合
queryStaffMovementList每条任职记录返回岗位集合 workPositions

不新增 RPC 方法。OutStaffDetailDTOOutStaffMovementDTOworkPositionCodeworkPositionNamestandardPositionCode 标记 @Deprecated 并保留,但不再赋值;调用方统一使用 workPositions 获取岗位信息。

5.3 对外 RPC 返回示例

以下使用 JSON 表示 RPC 返回 DTO 中与本次改造有关的字段;实际返回类型仍为现有 Java DTO。

queryStaffDetail 返回示例;queryStaffListqueryPageStaffListqueryPageStaffqueryStaffListByOrgCode 中的每个人员对象结构相同:

{
  "staffId": "10000001",
  "accountId": "zhangsan",
  "workPositionCode": null,
  "workPositionName": null,
  "standardPositionCode": null,
  "workPositions": [
    {
      "workPositionCode": "Position22310007000020230609391",
      "workPositionName": "车辆理赔管理岗",
      "positionType": "1"
    },
    {
      "workPositionCode": "Position22310007000020230609392",
      "workPositionName": "查勘支持岗",
      "positionType": "2"
    }
  ]
}

queryStaffMovementList 中每条任职记录返回示例:

{
  "staffId": "10000001",
  "accountId": "zhangsan",
  "workPositionCode": null,
  "workPositionName": null,
  "standardPositionCode": null,
  "workPositions": [
    {
      "workPositionCode": "Position22310007000020230609391",
      "workPositionName": "车辆理赔管理岗",
      "positionType": "2"
    },
    {
      "workPositionCode": "Position22310007000020230609392",
      "workPositionName": "查勘支持岗",
      "positionType": "1"
    }
  ]
}

示例中的 positionType 返回码值:"1" 表示主岗位,"2" 表示兼职岗位。三个废弃字段仅为调用方兼容而保留,不再赋值;若 RPC 序列化配置忽略 null,传输结果中可能不出现这些字段。

6. MQ 消息改造

沿用现有 Topic、Tag 和发送入口,不新增生产者:

  • Topic:TP_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF
  • Tag:TG_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF

6.1 发送时机

本次发送时机唯一改动:人员首次入场完成前,修改人员不再发送 MQ。其他发送入口和判断保持现状。

场景改造前改造后是否为本次改动
新增人员不发送不发送
首次入场前修改,状态为 -1-3-2修改成功后发送只保存数据库,不发送
首次入场审批成功或入场重试成功发送发送最新人员及岗位完整快照
已入场及后续离场状态修改人员修改成功即发送修改成功即发送,人员或岗位没有变化也发送
离场审批成功、符合现有条件的批量保存发送发送

后端在人员变更 MQ 的统一发送入口根据 staffStatus 判断:命中 -1-3-2 时直接结束,不组装、不发送消息;首次入场成功后再发送当时最新的人员和岗位完整快照。

6.2 岗位字段改造

改造类型字段说明
废弃保留顶层 workPositionCode增加 @Deprecated@deprecated Javadoc,不再赋值
废弃保留顶层 workPositionName增加 @Deprecated@deprecated Javadoc,不再赋值
废弃保留顶层 standardPositionCode增加 @Deprecated@deprecated Javadoc,不再赋值
新增workPositions岗位集合;无岗位时为 []
新增workPositions[].workPositionCode工作岗位编码
新增workPositions[].positionType岗位类型 code 字符串:"1" 主岗位、"2" 兼职岗位

岗位字段示例:

{
  "workPositions": [
    {
      "workPositionCode": "Position22310007000020230609391",
      "positionType": "1"
    },
    {
      "workPositionCode": "Position22310007000020230609392",
      "positionType": "2"
    }
  ]
}

岗位关系保存完成后再发送消息,现有发送失败和重试机制保持不变。

7. 岗位 RPC 调用方案

岗位名称、岗位职能及用户组信息由外部服务维护,HRMS 不保存岗位名称、职能或用户组数据,仅负责 RPC 封装和字段组装。

RPC 方法请求参数返回内容用途
PositionRpcFacade#getWorkPositionListByBranchOrgCodebranchOrgCodecurrentpageSize岗位分页数据,包含 workPositionCodeworkPositionName为 4.6.1 岗位分页 OpenAPI 提供数据
PositionRpcFacade#getWorkPositionInfoByCodesList<String> workPositionCodes岗位详情及 workFunctionInfoResDTOList为 4.6.2 岗位详情 OpenAPI 提供职能数据
ACL RPC(类名待补充)getUserDefineRoleGroupByWorkFunctionCodes(List<String> var1)ResultModelSupport<List<WorkFunctionRoleGroupResDTO>>,包含 workFunctionCodeuserDefineRoleGroupCodeuserDefineRoleGroupNamevar1 为工作职能编码列表;批量查询用户组信息,补充前端展示字段

7.1 HRMS 内部封装规则

  1. 4.6.1 仅调用 getWorkPositionListByBranchOrgCode,不在 HRMS 查询岗位数据库。
  2. 4.6.2 接收单个 workPositionCode,内部封装为 List<String> 后调用 getWorkPositionInfoByCodes
  3. 一个岗位可返回多个职能;HRMS 汇总职能编码后调用 ACL 的 getUserDefineRoleGroupByWorkFunctionCodes 批量查询,每个职能对应一个用户组,组装 userDefineRoleGroupCodeuserDefineRoleGroupName
  4. RPC 空结果按前端接口约定返回空分页或空集合;RPC 异常沿用现有集成异常处理,不新增本地缓存和同步补偿。

人员详情、列表、分页及任职记录查询仍按现有逻辑汇总岗位编码后批量调用岗位 RPC;MQ 不需要岗位名称,因此发送 MQ 时不调用岗位详情 RPC。