工作岗位 0820 需求系统分析设计(精简版)
1. 需求目标
本次只处理外包人员与工作岗位的关联关系,HRMS 关心的岗位业务字段只有:
| 字段 | 含义 |
|---|---|
workPositionName | 工作岗位名称,仅用于查询展示,不在人员岗位关系中保存;通过岗位 RPC 查询 |
workPositionCode | 工作岗位编码 |
positionType | 岗位类型码值字符串,取自 position_type_cd;接口实际传值为 "1" 或 "2",不是中文名称 |
实现范围:
- 保存一个人员关联的多个工作岗位。
- 改造现有人员新增、修改、查询接口,一次性保存或返回账号的全部岗位。
- 校验同一人员岗位编码不重复,且有且仅有一个主岗位。
- 批量导入人员未维护岗位时,在入场提交阶段拦截。
- 岗位集合发生变化时,将变更后的岗位编码、岗位类型以 JSON 形式写入一条现有人员任职记录。
- 对外 RPC 查询结果增加岗位集合。
- 新增两个岗位查询 OpenAPI,分别封装机构侧岗位分页查询和岗位详情查询 RPC,供前端使用。
岗位下拉搜索由前端调用 HRMS 新增岗位分页 OpenAPI;岗位权限弹窗、角色清单仍由前端直接调用权限服务,HRMS 不提供权限查询接口、不处理权限查询方式。
2. 现状
当前人员表 outsourced_staff 只有一个 work_position_code,人员详情和对外 RPC DTO 也只能返回一个岗位,不能满足一个人员关联多个岗位。
现有主要接口:
| 类型 | 接口/方法 | 现状 |
|---|---|---|
| HTTP | create-staff | 新增人员,只支持单岗位字段 |
| HTTP | update-staff | 修改人员,只支持单岗位字段 |
| HTTP | query-staff-detail | 查询人员详情,只返回单岗位 |
| HTTP | 岗位查询 OpenAPI | 当前无岗位查询接口 |
| RPC | OutsourcedStaffFacade 的人员详情、列表、分页查询方法 | 返回 OutStaffDetailDTO,只含单岗位 |
| RPC | queryStaffMovementList | 返回 OutStaffMovementDTO,只含单岗位 |
| MQ | TP_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF / TG_CIC_MIDABOSS_HRMS_OUTSOURCED_STAFF | OutStaffDetailDTO 只发送单个岗位编码和名称 |
| 数据 | outsourced_staff_movement | 已有任职记录表,可继续复用 |
3. 数据设计
3.1 人员岗位关联表
建议表名:outsourced_staff_work_position。
| 字段 | 类型建议 | 必填 | 说明 |
|---|---|---|---|
id | varchar | 是 | 主键 |
staff_id | varchar | 是 | 外包人员 ID |
work_position_code | varchar | 是 | 工作岗位编码 |
position_type | varchar | 是 | 岗位类型,仅允许 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_code、outsourced_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_type、work_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
新增字段:
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
workPositions | Array<StaffWorkPositionCmd> | 完整工作岗位集合 | true | - |
workPositions[].workPositionCode | string | 工作岗位编码;同一人员不可重复 | true | - |
workPositions[].positionType | string | 岗位类型码:1 主岗位,2 兼职岗位 | true | - |
删除字段:
| Parameter | Description |
|---|---|
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
| Parameter | Type | Description |
|---|---|---|
data | boolean | 是否保存成功 |
Response-example
{
"data": true
}返回类型:ResultModel<Boolean>。批量导入不提交岗位,岗位由导入后维护;首次入场完成前不发送人员变更 MQ。
4.2 修改人员
Description: 修改外包人员信息并以完整岗位集合覆盖原岗位关系。
OpenAPI: POST /platform/api/aboss/hrms/staff/update-staff
Body-parameters
本次只展示岗位字段改动,人员其他请求字段沿用现有接口。
新增字段:
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
workPositions | Array<StaffWorkPositionCmd> | 修改后的完整岗位集合,不是增量列表 | true | - |
workPositions[].workPositionCode | string | 工作岗位编码;同一人员不可重复 | true | - |
workPositions[].positionType | string | 岗位类型码:1 主岗位,2 兼职岗位 | true | - |
删除字段:
| Parameter | Description |
|---|---|
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
| Parameter | Type | Description |
|---|---|---|
data | boolean | 是否修改成功 |
Response-example
{
"data": true
}返回类型:ResultModel<Boolean>。岗位编码或岗位类型发生变化时写入一条任职记录;仅调整顺序或重复提交相同集合时不新增记录。
4.3 查询人员详情
Description: 查询人员详情并返回完整岗位集合,供前端编辑页面回填。
OpenAPI: POST /platform/api/aboss/hrms/staff/query-staff-detail
Body-parameters
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
staffId | string | 外包人员 ID | true | - |
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
新增字段:
| Parameter | Type | Description |
|---|---|---|
workPositions | Array<StaffWorkPositionDTO> | 人员全部岗位;无岗位返回 [] |
workPositions[].workPositionName | string | 工作岗位名称,查询时由岗位 RPC 补充 |
workPositions[].workPositionCode | string | 工作岗位编码 |
workPositions[].positionType | string | 岗位类型码:1 主岗位,2 兼职岗位 |
删除字段:
| Parameter | Type | Description |
|---|---|---|
workPositionCode | string | 原单岗位字段,HTTP 响应删除 |
workPositionName | string | 原单岗位字段,HTTP 响应删除 |
standardPositionCode | string | 原标准岗位字段,HTTP 响应删除 |
standardPositionName | string | 原标准岗位字段,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
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
current | integer | 当前页码 | true | - |
pageSize | integer | 每页条数 | 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
新增字段:
| Parameter | Type | Description |
|---|---|---|
workPositions | Array<StaffWorkPositionDTO> | 任职记录对应的岗位快照;无岗位返回 [] |
workPositions[].workPositionName | string | 工作岗位名称,查询时由岗位 RPC 补充 |
workPositions[].workPositionCode | string | 任职记录中的岗位编码 |
workPositions[].positionType | string | 岗位类型码;历史数据缺失时返回 null |
删除字段:
| Parameter | Type | Description |
|---|---|---|
workPositionCode | string | 原单岗位字段,HTTP 响应删除 |
workPositionName | string | 原单岗位字段,HTTP 响应删除 |
standardPositionCode | string | 原标准岗位字段,HTTP 响应删除 |
standardPositionName | string | 原标准岗位字段,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
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
staffId | string | 外包人员 ID | true | - |
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
| Parameter | Type | Description |
|---|---|---|
data | boolean | 是否删除成功 |
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
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
current | integer | 当前页码,从 1 开始 | true | - |
pageSize | integer | 每页条数,最大 100 | true | - |
branchOrgCode | string | 指定所属组织编码 | true | - |
keyword | string | 工作岗位模糊查询关键字,可匹配工作岗位编码或工作岗位名称 | 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
| Parameter | Type | Description |
|---|---|---|
current | integer | 当前页码 |
pageSize | integer | 每页条数 |
total | integer | 岗位总数 |
workPositionCode | string | 工作岗位编码 |
workPositionName | string | 工作岗位名称 |
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
| Parameter | Type | Description | Required | Since |
|---|---|---|---|---|
workPositionCode | string | 单个工作岗位编码 | 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
| Parameter | Type | Description |
|---|---|---|
workFunctionInfoResDTOList | List<WorkFunctionInfoResDTO> | 当前岗位关联的职能列表,一个岗位可对应多个职能 |
workFunctionInfoResDTOList[].workFunctionName | String | 职能名称 |
workFunctionInfoResDTOList[].workFunctionCode | String | 职能编码 |
workFunctionInfoResDTOList[].userDefineRoleGroupName | String | 用户组名称,来源于 ACL,前端支持点击后查询角色清单 |
workFunctionInfoResDTOList[].userDefineRoleGroupCode | String | 用户组编码,来源于 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。每个岗位包含 workPositionName、workPositionCode、positionType;岗位名称通过第 7 章的岗位 RPC 批量补充。
原 workPositionCode、workPositionName 单值字段继续保留但不再赋值,并通过 @Deprecated 及 @deprecated Javadoc 明确标记为废弃字段;调用方统一读取 workPositions。历史任职记录若仍为单岗位编码,则转换为只有一项的 workPositions,其中 positionType 无历史数据时返回 null。
OutStaffDetailDTO、OutStaffMovementDTO 中原单岗位字段统一增加废弃标记:
/**
* @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 方法。OutStaffDetailDTO、OutStaffMovementDTO 原 workPositionCode、workPositionName、standardPositionCode 标记 @Deprecated 并保留,但不再赋值;调用方统一使用 workPositions 获取岗位信息。
5.3 对外 RPC 返回示例
以下使用 JSON 表示 RPC 返回 DTO 中与本次改造有关的字段;实际返回类型仍为现有 Java DTO。
queryStaffDetail 返回示例;queryStaffList、queryPageStaffList、queryPageStaff、queryStaffListByOrgCode 中的每个人员对象结构相同:
{
"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#getWorkPositionListByBranchOrgCode | branchOrgCode、current、pageSize | 岗位分页数据,包含 workPositionCode、workPositionName | 为 4.6.1 岗位分页 OpenAPI 提供数据 |
PositionRpcFacade#getWorkPositionInfoByCodes | List<String> workPositionCodes | 岗位详情及 workFunctionInfoResDTOList | 为 4.6.2 岗位详情 OpenAPI 提供职能数据 |
ACL RPC(类名待补充) | getUserDefineRoleGroupByWorkFunctionCodes(List<String> var1) | ResultModelSupport<List<WorkFunctionRoleGroupResDTO>>,包含 workFunctionCode、userDefineRoleGroupCode、userDefineRoleGroupName | var1 为工作职能编码列表;批量查询用户组信息,补充前端展示字段 |
7.1 HRMS 内部封装规则
4.6.1仅调用getWorkPositionListByBranchOrgCode,不在 HRMS 查询岗位数据库。4.6.2接收单个workPositionCode,内部封装为List<String>后调用getWorkPositionInfoByCodes。- 一个岗位可返回多个职能;HRMS 汇总职能编码后调用 ACL 的
getUserDefineRoleGroupByWorkFunctionCodes批量查询,每个职能对应一个用户组,组装userDefineRoleGroupCode、userDefineRoleGroupName。 - RPC 空结果按前端接口约定返回空分页或空集合;RPC 异常沿用现有集成异常处理,不新增本地缓存和同步补偿。
人员详情、列表、分页及任职记录查询仍按现有逻辑汇总岗位编码后批量调用岗位 RPC;MQ 不需要岗位名称,因此发送 MQ 时不调用岗位详情 RPC。