diff --git a/changes/n03-skill-cloud/data/source-manifest.md b/changes/n03-skill-cloud/data/source-manifest.md
new file mode 100644
index 0000000..12b68d9
--- /dev/null
+++ b/changes/n03-skill-cloud/data/source-manifest.md
@@ -0,0 +1,77 @@
+# N03 行业技能词云来源与覆盖清单
+
+## 1. 固定来源
+
+| 来源 | 固定版本 | 用途 | 许可/复用条件 | 官方地址与归属 |
+| --- | --- | --- | --- | --- |
+| ESCO | ESCO dataset v1.2.1(Last update 10/12/2025,发布页记录 Release v5.7.0) | 提供行业/职位映射所需的职业—技能—技能分类主关系、稳定来源 ID 和层级结构 | 依据 Commission Decision 2011/833/EU,可免费下载、使用、复制和复用。文档和产品界面须保留官方署名语句:`This service uses the ESCO classification of the European Commission.` | 数据集下载页:https://esco.ec.europa.eu/en/use-esco/download
复用条件说明:https://esco.ec.europa.eu/en/about-esco/faq |
+| O*NET | O*NET 31.0 Database | 为 ESCO 未收录的具体技术提供 `software_skills` 补充来源,并通过职业/工作活动 Importance 提供首版词云热度 `heat` | License 为 CC BY 4.0,归属与许可说明见 https://creativecommons.org/licenses/by/4.0/ | 官方数据库页:https://www.onetcenter.org/database.html |
+
+运行时不得访问 ESCO、O*NET 或任何在线词库服务。所有首版数据必须随 Flyway 迁移进入本地数据库,并保留来源版本与归属信息。
+
+## 2. 首版覆盖边界
+
+首版只覆盖互联网、金融、教育三类行业及下列 10 个已列代表性职位。该矩阵定义导入上限和最小覆盖范围,不要求在全量上游数据中导入未列出的职位。
+
+| 行业 | 代表性职位 | 首批技能分类范围 |
+| --- | --- | --- |
+| 互联网 | 前端开发工程师 | 编程语言、Web 基础、前端框架、工程化工具、浏览器与调试、测试、版本控制与协作 |
+| 互联网 | 后端开发工程师 | 编程语言、后端框架与平台、数据库、缓存与消息、云/DevOps、测试、工程化工具、安全 |
+| 互联网 | 测试工程师 | 编程语言、测试设计、自动化测试框架、接口与数据库测试、性能测试、CI/CD 与工程化工具 |
+| 互联网 | DevOps 工程师 | 编程语言与脚本、云平台、容器与编排、CI/CD、配置管理与 IaC、可观测性、安全、数据库 |
+| 金融 | 金融数据分析师 | 编程语言、数据分析与可视化、数据库与数据仓库、统计与建模、金融计算框架/平台、金融领域知识、工程化工具 |
+| 金融 | 风控建模工程师 | 编程语言、统计与建模、风险模型、建模框架/平台、数据处理与数据库、模型验证、部署与工程化工具 |
+| 金融 | 量化开发工程师 | 编程语言、量化建模框架/平台、市场与金融数据、数据库、低延迟与高性能工程、测试、云/DevOps |
+| 教育 | 教育产品经理 | 教育领域知识、产品分析方法、需求与流程、数据分析、教育平台与工具、协作与工程化工具 |
+| 教育 | 教学设计师 | 教学设计、课程与学习平台、数字化内容工具、评估设计、学习数据分析、无障碍与规范 |
+| 教育 | 教育数据分析师 | 编程语言、数据分析与可视化、数据库与 SQL、统计与建模、教育领域知识、报表与工程化工具 |
+计数说明:任务给出的逐项职位清单为互联网 4 个、金融 3 个、教育 3 个,共 10 个。验收文字中的“11 个职位”与该枚举不一致;本清单严格覆盖逐项列出的 10 个职位,不自行新增未批准职位。
+
+矩阵中的分类是每个职位首批应覆盖的能力域;T3 只导入这些分类下已确定稳定来源 ID、标准技能和中文标准名的技能,不在此文档中展开具体 `INSERT` 行。
+
+## 3. 导入规则
+
+1. **职责分工**:T2 只建立七张词库表、外键、唯一约束和查询索引;T3 只导入上述三类行业、10 个已列代表性职位及其关联技能分类、技能、别名和 O*NET Importance。
+2. **代表性子集与混合来源**:不导入 ESCO/O*NET 全量数据;ESCO 是职位、通用技能和分类主表;ESCO 无可靠节点的具体技术使用 O*NET `software_skills` 补充;不把平台自由文本岗位或行业直接当作标准词库节点。
+3. **来源 ID 不变**:ESCO/O*NET 来源 ID 原样保存在稳定来源字段中;项目不得重编号、覆盖或伪造上游 ID。
+4. **中文标准名必填**:每个入选技能必须有非空 `name_zh` 中文标准名;中文名称由项目维护,但不替代或修改上游来源 ID。
+5. **热度来源**:每条非空 Importance 必须保存 O*NET SOC、Element ID 和代理标记;技能无法映射 O*NET Importance 时必须保留,写入 `importance=null`;查询时映射为 `heat=null`,并排在有热度技能之后。
+6. **项目映射责任**:项目维护中文名称、别名、技能分类和行业/职位映射,不修改开源来源 ID。行业/职位映射、细粒度分类和跨源技能对应关系均作为项目适配层记录。
+7. **别名归一化**:生成 `normalized_alias` 时依次执行 Unicode NFKC、首尾空白移除、大小写折叠、连字符转空格、连续空白折叠为单空格、句点移除;`+` 和 `#` 必须保留,不能删除或替换。
+8. **来源可追溯**:来源清单写入 `skill_source_versions`,至少记录来源名称、固定版本、许可、归属 URL 和导入时间;O*NET 补充技术的 `source_code` 使用真实 `SOC|Workplace Example|Element ID` 组合,职位技能关系记录 O*NET SOC、Element ID、代理标记及关联的来源版本。
+9. **迁移不可改写**:T2/T3 计划使用 `V35__skill_cloud_taxonomy.sql` 和 `V36__skill_cloud_seed.sql`。执行前若编号已被占用,必须回退规划并刷新编号;后续词库更新只能新增 Flyway 迁移,不得改写 V1–V34 或任何已执行迁移。
+10. **运行时离线**:接口运行时不得调用外部词库、AI、课程平台或同步服务;排名只读取本地 Flyway 数据。
+
+## 4. 来源版本、许可与归属 URL
+
+| 数据落点 | 来源名称 | 版本字段固定值 | 许可字段固定值 | 归属 URL |
+| --- | --- | --- | --- | --- |
+| 职业、技能、技能分类及关系 | ESCO | `1.2.1 (Release v5.7.0, Last update 10/12/2025)` | `Commission Decision 2011/833/EU` | https://esco.ec.europa.eu/en/use-esco/download |
+| 职位技能 Importance | O*NET | `31.0 Database` | `CC BY 4.0` | https://www.onetcenter.org/database.html |
+
+ESCO 产品署名必须使用:`This service uses the ESCO classification of the European Commission.`
+
+## 5. 映射责任边界
+
+| 事项 | 上游来源责任 | 项目责任 |
+| --- | --- | --- |
+| ESCO 职业、技能、分类层级和来源 ID | 固定且可追溯 | 原样保存,不修改 ID |
+| O*NET Importance 数值 | 固定且可追溯 | 原样保存;无映射时写 `null`,不造权重 |
+| 中文名称和别名 | 不保证完整中文覆盖 | 补齐中文标准名、别名及归一化值 |
+| 细粒度技能分类 | 不保证符合本项目展示粒度 | 在职位下维护分类和展示名称 |
+| 行业/职位映射 | 不保证覆盖三类项目行业和中文职位名 | 维护行业—职位—分类—技能映射 |
+| 跨源技能与重要性关联 | 不提供项目所需的稳定本地关系 | 维护 ESCO 技能到 O*NET `software_skills` 的补充映射,以及每条 Importance 的 SOC/Element ID/代理标记 |
+
+## 6. 验收检查项
+
+- AC-1:`changes/n03-skill-cloud/data/source-manifest.md` 与 `docs/skill-taxonomy-sources.md` 均存在且非空,来源版本、许可、归属 URL、覆盖矩阵和导入规则一致。
+- AC-2:文档明确覆盖互联网、金融、教育三类行业及全部 10 个已列代表性职位,并为每个职位给出首批技能分类范围。
+- AC-3:文档明确固定 ESCO dataset v1.2.1(Last update 10/12/2025,发布页记录 Release v5.7.0)和 O*NET 31.0 Database。
+- AC-4:文档明确 ESCO 依据 Commission Decision 2011/833/EU 可免费下载、使用、复制和复用,并原样保留指定署名语句。
+- AC-5:文档明确 O*NET License 为 CC BY 4.0,并记录官方数据库页与许可 URL。
+- AC-6:文档明确项目维护中文名称、别名、技能分类和行业/职位映射,不修改开源来源 ID。
+- AC-7:文档明确 T2 建结构、T3 导数据,只导入代表性职位和关联技能;技能中文标准名必填。
+- AC-8:文档明确 O*NET 补充技术、每条 Importance 的 SOC/Element ID/代理标记,以及无映射时保留技能并写入 `importance=null`、查询侧映射为 `heat=null`。
+- AC-9:文档明确别名归一化遵循 NFKC、首尾空白、大小写、连字符、连续空白、句点规则,且保留 `+`、`#`。
+- AC-10:文档明确后续词库更新只能新增 Flyway 迁移,不得改写 V1–V34 或已执行迁移。
+- AC-11:来源、覆盖、导入与责任边界中不得出现未决占位或延期确认语句。
diff --git a/docs/backend-development-roadmap.md b/docs/backend-development-roadmap.md
index 379ae69..c4129ba 100644
--- a/docs/backend-development-roadmap.md
+++ b/docs/backend-development-roadmap.md
@@ -6,6 +6,7 @@
| 范围 | 2026-09-08核对结果 | 下一动作 |
|---|---|---|
+| N03/N04/N05 模块集成(2026-10-08 增补) | 隔离集成版本全量 `mvn clean verify` 3224/3224,原仓库转入复验 227/227,F/E/S 均为 0;真实 MySQL 独立功能 9/9、迁移及运行时接口集合 2/2;N05 并发幂等阻断已修复;OpenAPI 196/239 | 待独立提交,随后安排部署和前后端联调;薪资政策数据发布前仍需来源复核。下方历史规划原文保留,不作为当前模块进度依据 |
| 核心招聘与账户能力 | 已有代码与历史验收记录;本轮未重跑验收 | 按清单C01–C08做一期集成回归 |
| V39–V42 | 已核对提交55e3975、2698d06、5cc2c86、96b3113;不再标为待Git检查点 | 保留回归,不重复开发企业回复/发现/邀约 |
| V43 | 独立代码复验、真实 MySQL/Docker 验收及 Git 检查点已完成(cf39737) | N01 已关闭版本内小样本补集泄露;30/300/3000 查询预算通过,EXPLAIN 扩容风险保留观察 |
diff --git a/docs/frontend-integration.md b/docs/frontend-integration.md
index 7e92da7..be172c1 100644
--- a/docs/frontend-integration.md
+++ b/docs/frontend-integration.md
@@ -160,8 +160,8 @@ POST /api/v1/auth/logout header: Authorization: Bearer (
| 401 | 401(安全过滤器) | 未登录 / 无 token |
| 403 | 2002, 8004, 8303, 8402 | 无角色权限 / 越权(含企业归属不匹配) |
| 400 | 1001, 3002-3006, 8404-8408, 8505, 9105 | 参数错误 / 非法请求体 / 资源未命中默认映射 |
-| 404 | 4001, 5001, 6001, 7001, 8002, 9102, 9104, 8305, 8501 | 资源不存在 |
-| 409 | 5003, 7003, 8001, 8003, 8301-8302, 8304, 8502-8504, 9101, 9103 | 重复 / 非法状态流转 |
+| 404 | 4001, 5001, 6001, 7001, 8002, 9102, 9104, 8305, 8501, 10501, 10601, 10603 | 资源不存在 |
+| 409 | 5003, 7003, 8001, 8003, 8301-8302, 8304, 8502-8504, 9101, 9103, 10502-10506, 10604-10605 | 重复 / 非法状态流转 / 版本或幂等冲突 |
| 500 | 1002, 9001 | 服务器内部错误 |
**前端策略**:优先判断 HTTP 状态码,再读取 `body.code` 显示业务信息。
diff --git a/docs/onboarding-api.md b/docs/onboarding-api.md
new file mode 100644
index 0000000..cf98af0
--- /dev/null
+++ b/docs/onboarding-api.md
@@ -0,0 +1,434 @@
+# 入职清单与公司知识介绍 API(N04)
+
+> 状态:后端实现完成,待真实 MySQL 8.4 / Docker 黑盒验收。
+>
+> 数据库迁移:`V50__onboarding_checklist_and_company_knowledge.sql`、`V51__onboarding_standard_checklist_seed.sql`。
+
+## 1. Base URL 与认证
+
+本地 Base URL:
+
+```text
+http://127.0.0.1:8080/api/v1
+```
+
+所有 `/onboarding/**` 接口都要求登录,并携带:
+
+```http
+Authorization: Bearer
+Content-Type: application/json
+X-Request-Id:
+```
+
+细粒度角色和所有权在 Service 层校验。除 401 外,接口统一返回 `ApiResponse`:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {},
+ "requestId": "req-...",
+ "timestamp": "2026-09-17T01:30:00Z"
+}
+```
+
+## 2. 接口与权限总览
+
+| # | Method | Path | 角色 | 说明 |
+|---|---|---|---|---|
+| 1 | GET | `/onboarding/companies/{companyId}/checklist` | STUDENT | 读取有效清单、完成状态和完成率 |
+| 2 | PUT | `/onboarding/companies/{companyId}/checklist/items/{itemId}/completion` | STUDENT | 设置本人完成或未完成 |
+| 3 | GET | `/onboarding/companies/{companyId}/knowledge` | STUDENT | 读取企业资料、知识内容和公开评价摘要 |
+| 4 | GET | `/onboarding/company/checklist-items` | COMPANY | 查询本企业活动与软删除自定义项 |
+| 5 | POST | `/onboarding/company/checklist-items` | COMPANY | 创建本企业自定义项 |
+| 6 | PUT | `/onboarding/company/checklist-items/{itemId}` | COMPANY | 按版本更新本企业条目 |
+| 7 | DELETE | `/onboarding/company/checklist-items/{itemId}?version={version}` | COMPANY | 按版本软删除本企业条目 |
+| 8 | GET | `/onboarding/company/knowledge` | COMPANY | 查询本企业知识配置 |
+| 9 | PUT | `/onboarding/company/knowledge` | COMPANY | 创建或更新本企业知识配置 |
+
+权限规则:
+
+- STUDENT 接口只允许拥有 STUDENT 角色的账号访问。
+- COMPANY 接口只允许拥有 COMPANY 角色且 `companies.verified=true` 的账号访问;未认证企业统一返回 `403/5004`,在读取或写入本企业清单、知识内容前拒绝。
+- COMPANY 接口不接受 `companyId`;服务端从 JWT 用户解析其所属企业,避免跨企业写入。
+- ADMIN 没有 onboarding 专属管理接口;调用 STUDENT/COMPANY 接口时按非目标角色返回 `403/2002`。
+- 学生访问企业清单或知识不要求先有 Offer 或投递记录,但目标企业必须存在。
+- 企业条目不存在或属于其他企业时统一返回 `404/10501`,不泄露其他企业数据。
+
+## 3. 入职清单语义
+
+### 3.1 通用项与自定义项合并
+
+有效清单由以下两部分组成:
+
+1. 所有活动通用项 `source=STANDARD`;V51 固定写入 12 条。
+2. 当前企业所有活动自定义项 `source=COMPANY`。
+
+合并结果按 `sortOrder ASC, id ASC` 稳定排序。企业没有活动自定义项时,`customized=false`,仍返回全部通用项。企业存在活动自定义项时,`customized=true`,返回通用项与企业项。
+
+`category` 固定为:
+
+```text
+DOCUMENT | ADMIN | EQUIPMENT | TRAINING | LOGISTICS | OTHER
+证件材料 | 行政手续 | 办公设备 | 培训学习 | 到岗安排 | 其他
+```
+
+### 3.2 学生读取有效清单
+
+```http
+GET /api/v1/onboarding/companies/10/checklist
+Authorization: Bearer
+```
+
+响应:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "companyId": 10,
+ "companyName": "示例科技",
+ "customized": true,
+ "totalItems": 13,
+ "completedItems": 1,
+ "completionRate": 7.7,
+ "items": [
+ {
+ "itemId": 101,
+ "source": "STANDARD",
+ "itemKey": "standard-id-card",
+ "title": "准备身份证件",
+ "description": "准备身份证原件或有效身份证明,用于入职登记。",
+ "category": "DOCUMENT",
+ "required": true,
+ "sortOrder": 100,
+ "active": true,
+ "completed": true,
+ "completedAt": "2026-09-17T09:00:00",
+ "progressVersion": 1
+ },
+ {
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": true,
+ "completed": false,
+ "completedAt": null,
+ "progressVersion": 0
+ }
+ ]
+ },
+ "requestId": "req-onboarding-checklist",
+ "timestamp": "2026-09-17T01:30:00Z"
+}
+```
+
+`completionRate = round(completedItems * 100 / totalItems, 1)`;总数为 0 时返回 `0.0`。完成状态只属于当前 STUDENT。
+
+### 3.3 更新完成状态
+
+请求使用绝对状态,而不是切换:
+
+```http
+PUT /api/v1/onboarding/companies/10/checklist/items/501/completion
+Authorization: Bearer
+
+{"completed": true, "version": 0}
+```
+
+响应:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "itemId": 501,
+ "completed": true,
+ "completedAt": "2026-09-17T01:31:00Z",
+ "progressVersion": 1,
+ "totalItems": 13,
+ "completedItems": 2,
+ "completionRate": 15.4
+ },
+ "requestId": "req-onboarding-progress",
+ "timestamp": "2026-09-17T01:31:00Z"
+}
+```
+
+版本规则:
+
+- 首次保存某条目时可省略 `version` 或传 `0`。
+- 已完成状态变化时必须传当前 `progressVersion`;过期返回 `409/10505`。
+- 重复提交相同 `completed` 值保持幂等,不新增记录、不递增版本。
+- 首次提交 `completed=false` 不创建记录。
+- `completed=false` 会清除 `completedAt`。
+- 一名学生与一个清单项最多一条进度记录。
+
+### 3.4 企业创建自定义项
+
+```http
+POST /api/v1/onboarding/company/checklist-items
+Authorization: Bearer
+
+{
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "sortOrder": 1000,
+ "required": false,
+ "idempotencyKey": "company-10-access-card-20260917"
+}
+```
+
+响应 `data`:
+
+```json
+{
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": true,
+ "version": 0
+}
+```
+
+约束:
+
+- `title`:必填,最多 120 字符。
+- `description`:可选,最多 1000 字符。
+- `category`:必填,仅允许固定枚举。
+- `sortOrder`:可选,默认 `1000`,范围 `0..9999`。
+- `required`:可选,默认 `false`。
+- `idempotencyKey`:可选,最多 64 字符;服务端会 trim,空串按未提供处理。
+- 活动自定义项上限为 50 条;达到上限返回 `409/10503`。
+
+幂等重试:
+
+- 同一企业、同一 `idempotencyKey`、同标题/说明/分类/排序/必填值:返回首次创建的条目。
+- 同一企业、同一 key、请求语义不同:返回 `409/10504`。
+- 不同企业可使用相同 key,互不冲突。
+- 未传 key 时,每次请求创建新条目。
+
+### 3.5 企业查询、更新与软删除
+
+查询本企业全部条目:
+
+```http
+GET /api/v1/onboarding/company/checklist-items
+Authorization: Bearer
+```
+
+响应包含活动与软删除条目,不返回通用项和其他企业项。更新请求:
+
+```http
+PUT /api/v1/onboarding/company/checklist-items/501
+Authorization: Bearer
+
+{
+ "title": "领取门禁卡并激活",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "sortOrder": 900,
+ "required": true,
+ "active": true,
+ "version": 0
+}
+```
+
+更新使用 `version` 乐观锁,成功递增版本;过期返回 `409/10502`。软删除:
+
+```http
+DELETE /api/v1/onboarding/company/checklist-items/501?version=1
+Authorization: Bearer
+```
+
+首次删除必须使用当前版本,系统只将 `active=false`,不物理删除。重复删除已非活动条目保持幂等成功;接口仍要求携带 `version` 查询参数。
+
+## 4. 公司知识介绍语义
+
+### 4.1 学生读取与回退
+
+```http
+GET /api/v1/onboarding/companies/10/knowledge
+Authorization: Bearer
+```
+
+响应:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "company": {
+ "id": 10,
+ "name": "示例科技",
+ "logoUrl": "https://cdn.example.com/company-10.png",
+ "description": "面向企业提供数据基础设施产品。",
+ "industry": "互联网",
+ "website": "https://example.com",
+ "address": "杭州市余杭区",
+ "verified": true
+ },
+ "knowledgeState": "CONFIGURED",
+ "knowledge": {
+ "culture": "以用户价值为中心,保持透明和长期主义。",
+ "workPolicies": "弹性上班;每周一、三线下办公。",
+ "onboardingGuide": "报到当天携带身份证件,联系行政同事完成入职登记。",
+ "updatedAt": "2026-09-17T01:33:00Z"
+ },
+ "reviewSummary": {
+ "state": "SUFFICIENT",
+ "totalReviews": 4,
+ "averageRating": 4.5,
+ "ratingDistribution": {
+ "rating1": 0,
+ "rating2": 0,
+ "rating3": 1,
+ "rating4": 1,
+ "rating5": 2
+ },
+ "topTags": ["发展空间", "同事友好"],
+ "dimensionSummary": {
+ "AUTHENTICITY": {"averageScore": 4.5, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "BENEFITS": {"averageScore": 4.3, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "SALARY_TRANSPARENCY": {"averageScore": 4.0, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "JD_CLARITY": {"averageScore": 4.6, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "GROWTH": {"averageScore": 4.4, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "TEAM_ATMOSPHERE": {"averageScore": 4.7, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "PROMOTION": {"averageScore": 4.1, "sampleCount": 4, "dataState": "SUFFICIENT"},
+ "WORK_LIFE_BALANCE": {"averageScore": 4.0, "sampleCount": 4, "dataState": "SUFFICIENT"}
+ }
+ }
+ },
+ "requestId": "req-company-overview",
+ "timestamp": "2026-09-17T01:34:00Z"
+}
+```
+
+回退与状态:
+
+- 企业无知识记录:仍返回企业基础资料,`knowledgeState=BASIC_ONLY`,`knowledge` 省略。
+- 企业有知识记录:`knowledgeState=CONFIGURED`,返回非空知识字段和 `updatedAt`;学生公开读取响应不返回知识配置版本。
+- 企业不存在:`404/5001`。
+- 响应白名单不包含 `ownerUserId`、用户 ID、手机号、邮箱、评价哈希或审核原因。
+
+评价摘要只聚合企业全部岗位中 `PUBLISHED` 且审核状态为 `AUTO_APPROVED/APPROVED` 的评价:
+
+| `reviewSummary.state` | 条件 | 返回内容 |
+|---|---|---|
+| `EMPTY` | 0 条 | `state`、`totalReviews=0` |
+| `INSUFFICIENT` | 1–2 条 | `state`、真实 `totalReviews`;不返回均值、分布或维度汇总 |
+| `SUFFICIENT` | 至少 3 条 | 平均评分、评分分布、热门标签、八维汇总 |
+
+热门标签最多 10 个;八个维度分别返回 `sampleCount` 和 `dataState`。维度的 `dataState` 使用同一 3 条阈值。
+
+### 4.2 企业查询知识配置
+
+```http
+GET /api/v1/onboarding/company/knowledge
+Authorization: Bearer
+```
+
+未配置时:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "configured": false,
+ "version": 0
+ },
+ "requestId": "req-company-knowledge",
+ "timestamp": "2026-09-17T01:33:00Z"
+}
+```
+
+已配置时返回 `configured=true`、非空内容、`updatedAt` 和当前 `version`。空字段按 `@JsonInclude(NON_NULL)` 省略。
+
+### 4.3 企业创建或更新知识配置
+
+```http
+PUT /api/v1/onboarding/company/knowledge
+Authorization: Bearer
+
+{
+ "culture": "以用户价值为中心,保持透明和长期主义。",
+ "workPolicies": "弹性上班;每周一、三线下办公。",
+ "onboardingGuide": "报到当天携带身份证件,联系行政同事完成入职登记。",
+ "version": 1
+}
+```
+
+规则:
+
+- 至少一个内容字段必须非空。
+- `culture` 最多 2000 字符,`workPolicies` 和 `onboardingGuide` 各最多 4000 字符。
+- 字段按纯文本处理,会 trim;包含 HTML 标签时返回 `400/1001`。
+- 首次创建可以省略 `version`,创建后版本为 `0`。
+- 更新已有记录必须提交当前版本;版本过期返回 `409/10506`。
+- 已有内容与提交内容相同且未传版本时按幂等读取处理;内容不同但未传版本返回 `400/1001`。
+
+## 5. 错误码
+
+| HTTP | code | 含义 | 前端处理 |
+|---|---:|---|---|
+| 400 | 1001 | 参数、枚举、长度、HTML、缺少必填字段 | 展示字段错误,不自动重试 |
+| 401 | 401 | 未登录或 Token 无效 | 清理登录态并重新登录 |
+| 403 | 2002 | 角色不匹配、无所属企业或无权限 | 不重试,切换到正确角色 |
+| 404 | 5001 | 企业不存在或 COMPANY 无绑定企业 | 检查 `companyId` 或企业绑定状态 |
+| 404 | 10501 | 清单项不存在、跨企业或不属于有效清单 | 刷新清单后重新选择条目 |
+| 409 | 10502 | 企业清单项版本过期 | 重新 `GET /company/checklist-items`,使用新版本重试 |
+| 409 | 10503 | 活动自定义项达到 50 条上限 | 禁用新增,提示先软删除或复用现有项 |
+| 409 | 10504 | 幂等键已用于不同请求体 | 更换幂等键,或确认原请求后读取原条目 |
+| 409 | 10505 | 学生完成状态版本过期 | 重新读取有效清单并使用新 `progressVersion` |
+| 409 | 10506 | 公司知识版本过期 | 重新读取企业知识配置并使用新 `version` |
+
+401 由安全过滤器返回裸 JSON,没有统一 `ApiResponse.requestId`:
+
+```json
+{"code": 401, "message": "not authenticated", "timestamp": ""}
+```
+
+其他错误示例:
+
+```json
+{
+ "code": 10504,
+ "message": "idempotency key conflict: request body differs",
+ "data": null,
+ "requestId": "req-10504",
+ "timestamp": "2026-09-17T01:30:00Z"
+}
+```
+
+## 6. 前端推荐流程
+
+学生端:
+
+1. 登录后调用 `GET /onboarding/companies/{companyId}/checklist`。
+2. 使用响应的 `itemId` 和 `progressVersion` 调用完成状态接口。
+3. 收到 `10505` 时重新读取清单,避免覆盖其他设备的新状态。
+4. 调用 `GET /onboarding/companies/{companyId}/knowledge` 展示企业介绍与评价摘要。
+5. 当 `reviewSummary.state=EMPTY/INSUFFICIENT` 时,不展示平均值、分布和维度均值。
+
+企业端:
+
+1. 登录后调用 `GET /onboarding/company/checklist-items` 获取当前版本。
+2. 新增时生成稳定 `idempotencyKey` 并保存到重试请求中。
+3. 更新或删除前使用最新 `version`,冲突后重新拉取列表。
+4. 调用 `GET /onboarding/company/knowledge` 获取配置版本,再使用 `PUT` 保存。
+5. 收到 `10503` 时停止自动新增;收到 `10504` 时不要复用旧请求体。
diff --git a/docs/openapi-rc.json b/docs/openapi-rc.json
index f141cc0..c807a3f 100644
--- a/docs/openapi-rc.json
+++ b/docs/openapi-rc.json
@@ -186,21 +186,50 @@
{
"name": "企业人才邀约",
"description": "企业人才邀约接口"
+ },
+ {
+ "name": "公司知识介绍"
+ },
+ {
+ "name": "入职清单"
+ },
+ {
+ "name": "薪资计算器"
+ },
+ {
+ "name": "行业技能词云"
}
],
"paths": {
"/auth/identity/select": {
"post": {
- "tags": ["认证"],
+ "tags": [
+ "认证"
+ ],
"summary": "首次选择账号身份",
"description": "统一账号一次性选择 STUDENT 或 COMPANY;COMPANY 必须提交 company 资料且注册开关开启。首次成功撤销全部旧会话并返回新凭证;同身份重复请求只返回状态,不重复颁发凭证。",
"operationId": "selectIdentity",
"requestBody": {
- "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IdentitySelectionRequest"}}},
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/IdentitySelectionRequest"
+ }
+ }
+ },
"required": true
},
"responses": {
- "200": {"description": "OK", "content": {"*/*": {"schema": {"$ref": "#/components/schemas/ApiResponseIdentitySelectionResponse"}}}}
+ "200": {
+ "description": "OK",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/ApiResponseIdentitySelectionResponse"
+ }
+ }
+ }
+ }
}
}
},
@@ -9495,856 +9524,4111 @@
}
}
}
- }
- },
- "components": {
- "schemas": {
- "IdentitySelectionRequest": {
- "type": "object",
- "required": ["identity"],
- "properties": {
- "identity": {"type": "string", "enum": ["STUDENT", "COMPANY"]},
- "company": {"$ref": "#/components/schemas/CompanyDetails"}
- }
- },
- "IdentitySelectionResponse": {
- "type": "object",
- "properties": {
- "userId": {"type": "integer", "format": "int64"},
- "role": {"type": "string"},
- "identitySelectionRequired": {"type": "boolean"},
- "companyId": {"type": "integer", "format": "int64"},
- "onboardingStatus": {"type": "string"},
- "accessToken": {"type": "string"},
- "refreshToken": {"type": "string"},
- "expiresIn": {"type": "integer", "format": "int64"},
- "reauthenticationRequired": {"type": "boolean"}
- }
- },
- "ApiResponseIdentitySelectionResponse": {
- "type": "object",
- "properties": {
- "code": {"type": "integer", "format": "int32"},
- "message": {"type": "string"},
- "data": {"$ref": "#/components/schemas/IdentitySelectionResponse"},
- "requestId": {"type": "string"},
- "timestamp": {"type": "string", "format": "date-time"}
- }
- },
- "TaxonomyResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "string"
+ },
+ "/onboarding/companies/{companyId}/knowledge": {
+ "get": {
+ "tags": [
+ "公司知识介绍"
+ ],
+ "summary": "读取公司知识介绍",
+ "description": "STUDENT 读取企业基础资料、企业维护内容和公开评价摘要;企业未配置知识时回退基础资料,公开评价少于 3 条时不返回均值。",
+ "operationId": "getCompanyKnowledgeOverview",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "companyId",
+ "in": "path",
+ "required": true,
+ "description": "企业 ID",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "查询成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseCompanyKnowledgeOverviewResponse"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "company": {
+ "id": 10,
+ "name": "示例科技",
+ "logoUrl": "https://cdn.example.com/company-10.png",
+ "description": "面向企业提供数据基础设施产品。",
+ "industry": "互联网",
+ "website": "https://example.com",
+ "address": "杭州市余杭区",
+ "verified": true
+ },
+ "knowledgeState": "CONFIGURED",
+ "knowledge": {
+ "culture": "以用户价值为中心,保持透明和长期主义。",
+ "workPolicies": "弹性上班;每周一、三线下办公。",
+ "onboardingGuide": "报到当天携带身份证件,联系行政同事完成入职登记。",
+ "updatedAt": "2026-09-17T01:33:00Z"
+ },
+ "reviewSummary": {
+ "state": "SUFFICIENT",
+ "totalReviews": 4,
+ "averageRating": 4.5,
+ "ratingDistribution": {
+ "rating1": 0,
+ "rating2": 0,
+ "rating3": 1,
+ "rating4": 1,
+ "rating5": 2
+ },
+ "topTags": [
+ "发展空间",
+ "同事友好"
+ ],
+ "dimensionSummary": {
+ "AUTHENTICITY": {
+ "averageScore": 4.5,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "BENEFITS": {
+ "averageScore": 4.3,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "SALARY_TRANSPARENCY": {
+ "averageScore": 4.0,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "JD_CLARITY": {
+ "averageScore": 4.6,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "GROWTH": {
+ "averageScore": 4.4,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "TEAM_ATMOSPHERE": {
+ "averageScore": 4.7,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "PROMOTION": {
+ "averageScore": 4.1,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ },
+ "WORK_LIFE_BALANCE": {
+ "averageScore": 4.0,
+ "sampleCount": 4,
+ "dataState": "SUFFICIENT"
+ }
+ }
+ }
+ },
+ "requestId": "req-company-overview",
+ "timestamp": "2026-09-17T01:34:00Z"
+ }
+ }
+ }
},
- "parentCode": {
- "type": "string"
+ "400": {
+ "description": "companyId 不是正整数",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
},
- "type": {
- "type": "string"
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
},
- "displayName": {
- "type": "string"
+ "403": {
+ "description": "仅 STUDENT 角色可访问",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "企业不存在",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 5001,
+ "message": "company not found",
+ "data": null,
+ "requestId": "req-5001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
}
}
- },
- "RecommendationFeedbackRequest": {
- "type": "object",
- "required": [
- "feedbackType",
- "idempotencyKey",
- "expectedVersion"
+ }
+ },
+ "/salary-calculator/cities/{cityCode}": {
+ "get": {
+ "tags": [
+ "薪资计算器"
],
- "properties": {
- "feedbackType": {
- "type": "string"
+ "summary": "查询城市默认参数",
+ "operationId": "getSalaryCity",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "cityCode",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseSalaryCityDetailResponse"
+ }
+ }
+ }
},
- "reasonType": {
- "type": "string"
+ "401": {
+ "description": "未认证"
},
- "idempotencyKey": {
- "type": "string"
+ "403": {
+ "description": "非 STUDENT"
},
- "expectedVersion": {
- "type": "integer",
- "format": "int64"
+ "404": {
+ "description": "城市不存在或停用"
}
}
- },
- "RecommendationProfileRequest": {
- "type": "object",
- "required": [
- "industryCode",
- "jobFamilyCode",
- "enabled",
- "expectedVersion"
+ }
+ },
+ "/salary-calculator/cities": {
+ "get": {
+ "tags": [
+ "薪资计算器"
],
- "properties": {
- "industryCode": {
- "type": "string"
+ "summary": "查询启用城市列表",
+ "operationId": "listSalaryCities",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseListSalaryCitySummaryResponse"
+ }
+ }
+ }
},
- "jobFamilyCode": {
- "type": "string"
+ "401": {
+ "description": "未认证"
},
- "riasecWeights": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
+ "403": {
+ "description": "非 STUDENT"
+ }
+ }
+ }
+ },
+ "/salary-calculator/calculations/{id}": {
+ "get": {
+ "tags": [
+ "薪资计算器"
+ ],
+ "summary": "查询本人薪资历史详情",
+ "operationId": "getSalaryCalculation",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
}
- },
- "abilityExpectations": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseSalaryHistoryDetailResponse"
+ }
+ }
}
},
- "enabled": {
- "type": "boolean"
+ "401": {
+ "description": "未认证"
},
- "expectedVersion": {
- "type": "integer",
- "format": "int64"
+ "403": {
+ "description": "非 STUDENT"
+ },
+ "404": {
+ "description": "历史不存在或无权访问"
}
}
},
- "RecommendationDecisionRequest": {
- "type": "object",
- "required": [
- "decision",
- "expectedVersion"
+ "delete": {
+ "tags": [
+ "薪资计算器"
],
- "properties": {
- "decision": {
+ "summary": "删除本人薪资历史",
+ "operationId": "deleteSalaryCalculation",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseVoid"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未认证"
+ },
+ "403": {
+ "description": "非 STUDENT"
+ },
+ "404": {
+ "description": "历史不存在或无权访问"
+ }
+ }
+ }
+ },
+ "/onboarding/company/checklist-items/{itemId}": {
+ "put": {
+ "tags": [
+ "入职清单"
+ ],
+ "summary": "更新本企业自定义清单项",
+ "description": "使用当前 version 更新本企业条目;版本过期返回 10502,不静默覆盖。",
+ "operationId": "updateCompanyChecklistItem",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "itemId",
+ "in": "path",
+ "required": true,
+ "description": "企业自定义清单项 ID",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqCompanyChecklistItemUpdateRequest"
+ },
+ "example": {
+ "title": "领取门禁卡并激活",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "sortOrder": 900,
+ "required": true,
+ "active": true,
+ "version": 0
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "更新成功并递增 version",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseCompanyChecklistItemView"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": true,
+ "version": 0
+ },
+ "requestId": "req-onboarding-company-item",
+ "timestamp": "2026-09-17T01:32:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "参数或请求体验证失败",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 COMPANY 角色可访问 COMPANY_NOT_VERIFIED: business code 5004; companies.verified must be true.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "条目不存在、已不属于该企业,或不属于该企业的有效清单",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10501,
+ "message": "onboarding checklist item not found",
+ "data": null,
+ "requestId": "req-10501",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "请求 version 已过期",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10502,
+ "message": "onboarding checklist item was modified concurrently",
+ "data": null,
+ "requestId": "req-10502",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "入职清单"
+ ],
+ "summary": "软删除本企业自定义清单项",
+ "description": "使用当前 version 将 active 置为 false;重复删除保持幂等成功。",
+ "operationId": "deleteCompanyChecklistItem",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "itemId",
+ "in": "path",
+ "required": true,
+ "description": "企业自定义清单项 ID",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1
+ }
+ },
+ {
+ "name": "version",
+ "in": "query",
+ "required": true,
+ "description": "客户端最后读取到的条目版本",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 0
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "软删除成功;重复删除返回当前非活动条目",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseCompanyChecklistItemView"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": false,
+ "version": 1
+ },
+ "requestId": "req-onboarding-company-item",
+ "timestamp": "2026-09-17T01:32:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "缺少 version 或参数类型不正确",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 COMPANY 角色可访问 COMPANY_NOT_VERIFIED: business code 5004; companies.verified must be true.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "条目不存在、已不属于该企业,或不属于该企业的有效清单",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10501,
+ "message": "onboarding checklist item not found",
+ "data": null,
+ "requestId": "req-10501",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "请求 version 已过期",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10502,
+ "message": "onboarding checklist item was modified concurrently",
+ "data": null,
+ "requestId": "req-10502",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/skills/match": {
+ "get": {
+ "tags": [
+ "行业技能词云"
+ ],
+ "summary": "查询个人技能匹配度",
+ "description": "使用 JWT 对应学生的 skills_json,与当前筛选结果 TOP10 比对;matchScore=round(matchedCount*100/min(10,total))。仅 STUDENT 可访问。",
+ "operationId": "getSkillMatch",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "industryId",
+ "in": "query",
+ "required": true,
+ "description": "行业 ID,必填正整数",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 1
+ }
+ },
+ {
+ "name": "occupationId",
+ "in": "query",
+ "required": true,
+ "description": "职位 ID,必填正整数;必须属于该行业",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 2
+ }
+ },
+ {
+ "name": "categoryId",
+ "in": "query",
+ "required": false,
+ "description": "技能分类 ID,可选正整数;省略时使用该职位下全部技能",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 101
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功返回个人技能匹配结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseSkillMatchResponse"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "matchScore": 50,
+ "matchedCount": 1,
+ "totalCount": 2,
+ "matchedSkills": [
+ {
+ "rank": 1,
+ "skillId": 26,
+ "skillCode": "REACT",
+ "nameZh": "React",
+ "nameEn": "React",
+ "sourceType": "O*NET",
+ "sourceCode": "15-1254.00|React|2.E.7.h",
+ "categoryId": 103,
+ "categoryName": "前端框架",
+ "heat": 4.38,
+ "heatSourceCode": "15-1254.00",
+ "heatElementId": "2.E.7.h",
+ "heatProxy": true
+ }
+ ],
+ "missingSkills": [
+ {
+ "rank": 2,
+ "skillId": 31,
+ "skillCode": "DOCKER",
+ "nameZh": "Docker",
+ "nameEn": "Docker",
+ "sourceType": "O*NET",
+ "sourceCode": "15-1299.08|Docker|2.E.7.h",
+ "categoryId": 105,
+ "categoryName": "工程化工具",
+ "heat": 4.12,
+ "heatSourceCode": "15-1299.08",
+ "heatElementId": "2.E.7.h",
+ "heatProxy": true
+ }
+ ]
+ },
+ "requestId": "req-match",
+ "timestamp": "2026-09-15T10:01:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "筛选参数缺失、非正整数或节点关系非法",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-15T10:03:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "已登录但不是 STUDENT 角色",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-15T10:03:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/skills/learning-path": {
+ "get": {
+ "tags": [
+ "行业技能词云"
+ ],
+ "summary": "生成个人学习路径",
+ "description": "只针对个人 TOP10 中未命中的技能,沿用热度顺序返回连续 priority 和确定性通用建议;不调用 AI,不返回课程链接、时长或进度。仅 STUDENT 可访问。",
+ "operationId": "getLearningPath",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "industryId",
+ "in": "query",
+ "required": true,
+ "description": "行业 ID,必填正整数",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 1
+ }
+ },
+ {
+ "name": "occupationId",
+ "in": "query",
+ "required": true,
+ "description": "职位 ID,必填正整数;必须属于该行业",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 2
+ }
+ },
+ {
+ "name": "categoryId",
+ "in": "query",
+ "required": false,
+ "description": "技能分类 ID,可选正整数;省略时使用该职位下全部技能",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 101
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功返回缺失技能的学习路径;没有缺口时列表为空",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseSkillLearningPathResponse"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "total": 1,
+ "items": [
+ {
+ "priority": 1,
+ "skillId": 26,
+ "skillName": "React",
+ "categoryId": 103,
+ "categoryName": "前端框架",
+ "suggestion": "先理解 React 的核心概念与生命周期,再通过一个小型项目练习集成。"
+ }
+ ]
+ },
+ "requestId": "req-learning-path",
+ "timestamp": "2026-09-15T10:02:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "筛选参数缺失、非正整数或节点关系非法",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-15T10:03:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "已登录但不是 STUDENT 角色",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-15T10:03:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/onboarding/companies/{companyId}/checklist": {
+ "get": {
+ "tags": [
+ "入职清单"
+ ],
+ "summary": "读取有效入职清单",
+ "description": "STUDENT 读取通用活动项与当前企业活动自定义项的合并清单;无企业自定义项时回退通用清单。",
+ "operationId": "getEffectiveChecklist",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "companyId",
+ "in": "path",
+ "required": true,
+ "description": "企业 ID",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "查询成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseEffectiveChecklistResponse"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "companyId": 10,
+ "companyName": "示例科技",
+ "customized": true,
+ "totalItems": 13,
+ "completedItems": 1,
+ "completionRate": 7.7,
+ "items": [
+ {
+ "itemId": 101,
+ "source": "STANDARD",
+ "itemKey": "standard-id-card",
+ "title": "准备身份证件",
+ "description": "准备身份证原件或有效身份证明,用于入职登记。",
+ "category": "DOCUMENT",
+ "required": true,
+ "sortOrder": 100,
+ "active": true,
+ "completed": true,
+ "completedAt": "2026-09-17T09:00:00",
+ "progressVersion": 1
+ },
+ {
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": true,
+ "completed": false,
+ "completedAt": null,
+ "progressVersion": 0
+ }
+ ]
+ },
+ "requestId": "req-onboarding-checklist",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "companyId 不是正整数",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 STUDENT 角色可访问",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "企业不存在",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 5001,
+ "message": "company not found",
+ "data": null,
+ "requestId": "req-5001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/onboarding/company/knowledge": {
+ "get": {
+ "tags": [
+ "公司知识介绍"
+ ],
+ "summary": "读取本企业知识配置",
+ "description": "返回当前 COMPANY 所属企业的知识配置;尚未配置时 configured=false、version=0。",
+ "operationId": "getCompanyKnowledge",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": "查询成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseCompanyKnowledgeView"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "configured": true,
+ "culture": "以用户价值为中心,保持透明和长期主义。",
+ "workPolicies": "弹性上班;每周一、三线下办公。",
+ "onboardingGuide": "报到当天携带身份证件,联系行政同事完成入职登记。",
+ "updatedAt": "2026-09-17T01:33:00Z",
+ "version": 2
+ },
+ "requestId": "req-company-knowledge",
+ "timestamp": "2026-09-17T01:33:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 COMPANY 角色可访问 COMPANY_NOT_VERIFIED: business code 5004; companies.verified must be true.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "当前账号没有所属企业",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 5001,
+ "message": "company not found",
+ "data": null,
+ "requestId": "req-5001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "公司知识介绍"
+ ],
+ "summary": "创建或更新本企业知识配置",
+ "description": "首次创建可省略 version;已有配置必须提交当前 version。字段按纯文本保存且禁止 HTML 标签。",
+ "operationId": "upsertCompanyKnowledge",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqCompanyKnowledgeUpdateRequest"
+ },
+ "example": {
+ "culture": "以用户价值为中心,保持透明和长期主义。",
+ "workPolicies": "弹性上班;每周一、三线下办公。",
+ "onboardingGuide": "报到当天携带身份证件,联系行政同事完成入职登记。",
+ "version": 1
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "创建或更新成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseCompanyKnowledgeView"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "configured": true,
+ "culture": "以用户价值为中心,保持透明和长期主义。",
+ "workPolicies": "弹性上班;每周一、三线下办公。",
+ "onboardingGuide": "报到当天携带身份证件,联系行政同事完成入职登记。",
+ "updatedAt": "2026-09-17T01:33:00Z",
+ "version": 2
+ },
+ "requestId": "req-company-knowledge",
+ "timestamp": "2026-09-17T01:33:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "内容为空、超长、包含 HTML 标签,或已有配置缺少 version",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 COMPANY 角色可访问 COMPANY_NOT_VERIFIED: business code 5004; companies.verified must be true.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "当前账号没有所属企业",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 5001,
+ "message": "company not found",
+ "data": null,
+ "requestId": "req-5001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "知识配置版本已过期",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10506,
+ "message": "company knowledge was modified concurrently",
+ "data": null,
+ "requestId": "req-10506",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/salary-calculator/calculations": {
+ "post": {
+ "tags": [
+ "薪资计算器"
+ ],
+ "summary": "计算并保存到手工资",
+ "operationId": "calculateSalary",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqSalaryCalculationRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseSalaryCalculationResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "参数非法"
+ },
+ "401": {
+ "description": "未认证"
+ },
+ "403": {
+ "description": "非 STUDENT"
+ },
+ "404": {
+ "description": "城市不存在或停用"
+ },
+ "409": {
+ "description": "幂等或政策版本冲突"
+ }
+ }
+ },
+ "get": {
+ "tags": [
+ "薪资计算器"
+ ],
+ "summary": "查询本人薪资历史",
+ "operationId": "listSalaryCalculations",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "page",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "default": 0
+ }
+ },
+ {
+ "name": "size",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "default": 20,
+ "maximum": 100
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponsePageResponseSalaryHistorySummaryResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "分页参数非法"
+ },
+ "401": {
+ "description": "未认证"
+ },
+ "403": {
+ "description": "非 STUDENT"
+ }
+ }
+ }
+ },
+ "/onboarding/company/checklist-items": {
+ "get": {
+ "tags": [
+ "入职清单"
+ ],
+ "summary": "查询本企业自定义清单项",
+ "description": "返回当前 COMPANY 所属企业的活动与软删除自定义项,不包含通用项和其他企业项。",
+ "operationId": "listCompanyChecklistItems",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": "查询成功;无自定义项时返回空数组",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseListCompanyChecklistItemView"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": [
+ {
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": true,
+ "version": 0
+ }
+ ],
+ "requestId": "req-onboarding-company-items",
+ "timestamp": "2026-09-17T01:32:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 COMPANY 角色可访问 COMPANY_NOT_VERIFIED: business code 5004; companies.verified must be true.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "当前账号没有所属企业",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 5001,
+ "message": "company not found",
+ "data": null,
+ "requestId": "req-5001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "入职清单"
+ ],
+ "summary": "创建本企业自定义清单项",
+ "description": "为当前 COMPANY 所属企业创建自定义项;idempotencyKey 用于网络重试,活动项累计不超过 50 条。",
+ "operationId": "createCompanyChecklistItem",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqCompanyChecklistItemCreateRequest"
+ },
+ "example": {
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "sortOrder": 1000,
+ "required": false,
+ "idempotencyKey": "company-10-access-card-20260917"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "创建成功;相同幂等请求返回首次创建的条目",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseCompanyChecklistItemView"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "itemId": 501,
+ "source": "COMPANY",
+ "itemKey": "company-10-8f1c",
+ "title": "领取门禁卡",
+ "description": "到行政前台领取门禁卡并完成权限激活。",
+ "category": "ADMIN",
+ "required": false,
+ "sortOrder": 1000,
+ "active": true,
+ "version": 0
+ },
+ "requestId": "req-onboarding-company-item",
+ "timestamp": "2026-09-17T01:32:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "标题、分类、排序、必填标记或幂等键不符合约束",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 COMPANY 角色可访问 COMPANY_NOT_VERIFIED: business code 5004; companies.verified must be true.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "当前账号没有所属企业",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 5001,
+ "message": "company not found",
+ "data": null,
+ "requestId": "req-5001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "活动自定义项已达到 50 条;或 10504 幂等键已用于不同请求体",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10503,
+ "message": "onboarding checklist item limit exceeded",
+ "data": null,
+ "requestId": "req-10503",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/skills/word-cloud": {
+ "get": {
+ "tags": [
+ "行业技能词云"
+ ],
+ "summary": "查询行业技能词云",
+ "description": "返回筛选范围内的全部技能,按 heat DESC, nameZh ASC, skillId ASC 排序,heat=null 最后;前端取前十条作为 TOP10。仅 STUDENT 可访问。",
+ "operationId": "getWordCloud",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "industryId",
+ "in": "query",
+ "required": true,
+ "description": "行业 ID,必填正整数",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 1
+ }
+ },
+ {
+ "name": "occupationId",
+ "in": "query",
+ "required": true,
+ "description": "职位 ID,必填正整数;必须属于该行业",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 2
+ }
+ },
+ {
+ "name": "categoryId",
+ "in": "query",
+ "required": false,
+ "description": "技能分类 ID,可选正整数;省略时返回该职位下全部分类",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1,
+ "example": 101
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "成功返回筛选范围内的完整技能列表",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseSkillCloudResponse"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "industry": {
+ "id": 1,
+ "code": "INTERNET",
+ "name": "互联网"
+ },
+ "occupation": {
+ "id": 1,
+ "code": "FRONTEND_DEVELOPER",
+ "name": "前端开发工程师"
+ },
+ "category": null,
+ "total": 1,
+ "items": [
+ {
+ "rank": 1,
+ "skillId": 26,
+ "skillCode": "REACT",
+ "nameZh": "React",
+ "nameEn": "React",
+ "sourceType": "O*NET",
+ "sourceCode": "15-1254.00|React|2.E.7.h",
+ "categoryId": 103,
+ "categoryName": "前端框架",
+ "heat": 4.38,
+ "heatSourceCode": "15-1254.00",
+ "heatElementId": "2.E.7.h",
+ "heatProxy": true
+ }
+ ]
+ },
+ "requestId": "req-word-cloud",
+ "timestamp": "2026-09-15T10:00:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "筛选参数缺失、非正整数或节点关系非法",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-15T10:03:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "已登录但不是 STUDENT 角色",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-15T10:03:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/onboarding/companies/{companyId}/checklist/items/{itemId}/completion": {
+ "put": {
+ "tags": [
+ "入职清单"
+ ],
+ "summary": "更新清单条目完成状态",
+ "description": "STUDENT 使用绝对 completed 状态更新本人进度;已有进度变化时必须提交当前 version,首次创建只接受 version=0 或空。",
+ "operationId": "updateCompletion",
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "companyId",
+ "in": "path",
+ "required": true,
+ "description": "企业 ID",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1
+ }
+ },
+ {
+ "name": "itemId",
+ "in": "path",
+ "required": true,
+ "description": "有效清单条目 ID",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 1
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqProgressUpdateRequest"
+ },
+ "example": {
+ "completed": true,
+ "version": 0
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "更新成功;重复提交相同状态返回幂等结果",
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponseProgressUpdateResponse"
+ },
+ "example": {
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "itemId": 501,
+ "completed": true,
+ "completedAt": "2026-09-17T01:31:00Z",
+ "progressVersion": 1,
+ "totalItems": 13,
+ "completedItems": 2,
+ "completionRate": 15.4
+ },
+ "requestId": "req-onboarding-progress",
+ "timestamp": "2026-09-17T01:31:00Z"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "completed 缺失或 version 为负数",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-1001",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "未登录或令牌无效,由全局 Security 入口返回裸 JSON",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqUnauthorizedResponse"
+ },
+ "example": {
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "仅 STUDENT 角色可访问",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-2002",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "条目不存在、已不属于该企业,或不属于该企业的有效清单",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10501,
+ "message": "onboarding checklist item not found",
+ "data": null,
+ "requestId": "req-10501",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "进度版本已过期",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LxqApiResponse"
+ },
+ "example": {
+ "code": 10505,
+ "message": "onboarding progress was modified concurrently",
+ "data": null,
+ "requestId": "req-10505",
+ "timestamp": "2026-09-17T01:30:00Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "IdentitySelectionRequest": {
+ "type": "object",
+ "required": [
+ "identity"
+ ],
+ "properties": {
+ "identity": {
+ "type": "string",
+ "enum": [
+ "STUDENT",
+ "COMPANY"
+ ]
+ },
+ "company": {
+ "$ref": "#/components/schemas/CompanyDetails"
+ }
+ }
+ },
+ "IdentitySelectionResponse": {
+ "type": "object",
+ "properties": {
+ "userId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "role": {
+ "type": "string"
+ },
+ "identitySelectionRequired": {
+ "type": "boolean"
+ },
+ "companyId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "onboardingStatus": {
+ "type": "string"
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "refreshToken": {
+ "type": "string"
+ },
+ "expiresIn": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "reauthenticationRequired": {
+ "type": "boolean"
+ }
+ }
+ },
+ "ApiResponseIdentitySelectionResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/IdentitySelectionResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "TaxonomyResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "parentCode": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "displayName": {
+ "type": "string"
+ }
+ }
+ },
+ "RecommendationFeedbackRequest": {
+ "type": "object",
+ "required": [
+ "feedbackType",
+ "idempotencyKey",
+ "expectedVersion"
+ ],
+ "properties": {
+ "feedbackType": {
+ "type": "string"
+ },
+ "reasonType": {
+ "type": "string"
+ },
+ "idempotencyKey": {
+ "type": "string"
+ },
+ "expectedVersion": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "RecommendationProfileRequest": {
+ "type": "object",
+ "required": [
+ "industryCode",
+ "jobFamilyCode",
+ "enabled",
+ "expectedVersion"
+ ],
+ "properties": {
+ "industryCode": {
+ "type": "string"
+ },
+ "jobFamilyCode": {
+ "type": "string"
+ },
+ "riasecWeights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "abilityExpectations": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "expectedVersion": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "RecommendationDecisionRequest": {
+ "type": "object",
+ "required": [
+ "decision",
+ "expectedVersion"
+ ],
+ "properties": {
+ "decision": {
+ "type": "string",
+ "enum": [
+ "APPROVE",
+ "REJECT"
+ ]
+ },
+ "reasonCode": {
+ "type": "string"
+ },
+ "expectedVersion": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "RecommendationProfileResponse": {
+ "type": "object",
+ "properties": {
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "industryCode": {
+ "type": "string"
+ },
+ "jobFamilyCode": {
+ "type": "string"
+ },
+ "riasecWeights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "abilityExpectations": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "reviewStatus": {
+ "type": "string"
+ },
+ "reviewReason": {
+ "type": "string"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "RecommendationFeedbackResponse": {
+ "type": "object",
+ "properties": {
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "feedbackType": {
+ "type": "string"
+ },
+ "reasonType": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "JobRecommendationItem": {
+ "type": "object",
+ "properties": {
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "title": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "employmentType": {
+ "type": "string"
+ },
+ "salaryMin": {
+ "type": "integer"
+ },
+ "salaryMax": {
+ "type": "integer"
+ },
+ "mode": {
+ "type": "string",
+ "enum": [
+ "PERSONALIZED",
+ "FALLBACK"
+ ]
+ },
+ "score": {
+ "type": "number"
+ },
+ "reasons": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "ApiResponseListTaxonomyResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TaxonomyResponse"
+ }
+ }
+ }
+ },
+ "ApiResponseRecommendationFeedbackResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/RecommendationFeedbackResponse"
+ }
+ }
+ },
+ "ApiResponseRecommendationProfileResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/RecommendationProfileResponse"
+ }
+ }
+ },
+ "ApiResponsePageJobRecommendationItem": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/JobRecommendationItem"
+ }
+ },
+ "total": {
+ "type": "integer"
+ },
+ "page": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "integer"
+ },
+ "totalPages": {
+ "type": "integer"
+ }
+ }
+ }
+ }
+ },
+ "ApiResponsePageRecommendationProfileResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RecommendationProfileResponse"
+ }
+ },
+ "total": {
+ "type": "integer"
+ },
+ "page": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "integer"
+ },
+ "totalPages": {
+ "type": "integer"
+ }
+ }
+ }
+ }
+ },
+ "CompanyReviewJobResponse": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "title": {
+ "type": "string"
+ }
+ }
+ },
+ "CompanyReviewReplyResponse": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "content": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "rejectionReason": {
+ "type": "string",
+ "nullable": true
+ }
+ }
+ },
+ "CompanyReviewItemResponse": {
+ "type": "object",
+ "properties": {
+ "reviewId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "job": {
+ "$ref": "#/components/schemas/CompanyReviewJobResponse"
+ },
+ "rating": {
+ "type": "integer"
+ },
+ "content": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dimensionScores": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "reviewStatus": {
+ "type": "string"
+ },
+ "reviewCreatedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "reply": {
+ "$ref": "#/components/schemas/CompanyReviewReplyResponse"
+ }
+ }
+ },
+ "CompanyReviewDetailResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CompanyReviewItemResponse"
+ }
+ ]
+ },
+ "ReviewReplyPageResponse": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CompanyReviewItemResponse"
+ }
+ },
+ "total": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "integer"
+ },
+ "totalPages": {
+ "type": "integer"
+ }
+ }
+ },
+ "CreateCompanyReviewReplyRequest": {
+ "type": "object",
+ "required": [
+ "content",
+ "idempotencyKey"
+ ],
+ "properties": {
+ "content": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ },
+ "idempotencyKey": {
+ "type": "string",
+ "format": "uuid",
+ "maxLength": 64
+ }
+ }
+ },
+ "UpdateCompanyReviewReplyRequest": {
+ "type": "object",
+ "required": [
+ "content",
+ "expectedVersion"
+ ],
+ "properties": {
+ "content": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ },
+ "expectedVersion": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 0
+ }
+ }
+ },
+ "ReviewReplyDecisionRequest": {
+ "type": "object",
+ "required": [
+ "decision"
+ ],
+ "properties": {
+ "decision": {
+ "type": "string",
+ "enum": [
+ "APPROVE",
+ "REJECT"
+ ]
+ },
+ "reason": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "AdminReviewReplyResponse": {
+ "type": "object",
+ "properties": {
+ "replyId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "reviewId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "jobTitle": {
+ "type": "string"
+ },
+ "companyId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "companyName": {
+ "type": "string"
+ },
+ "rating": {
+ "type": "integer"
+ },
+ "reviewContent": {
+ "type": "string"
+ },
+ "reviewModerationStatus": {
+ "type": "string"
+ },
+ "replyContent": {
+ "type": "string"
+ },
+ "replyStatus": {
+ "type": "string"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "riskScore": {
+ "type": "number"
+ },
+ "riskLevel": {
+ "type": "string"
+ },
+ "reasonCodes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "AdminReviewReplyPageResponse": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AdminReviewReplyResponse"
+ }
+ },
+ "total": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "integer"
+ },
+ "totalPages": {
+ "type": "integer"
+ }
+ }
+ },
+ "ApiResponseReviewReplyPageResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/ReviewReplyPageResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCompanyReviewDetailResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CompanyReviewDetailResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCompanyReviewReplyResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CompanyReviewReplyResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAdminReviewReplyPageResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/AdminReviewReplyPageResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAdminReviewReplyResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/AdminReviewReplyResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "AccountDeletionResponse": {
+ "type": "object",
+ "properties": {
+ "userId": {
+ "type": "integer",
+ "format": "int64",
+ "example": 2
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "NONE",
+ "PENDING",
+ "COMPLETED"
+ ],
+ "example": "PENDING",
+ "description": "注销状态:NONE/PENDING/COMPLETED"
+ },
+ "requestedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "effectiveAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "cancelledAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "completedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64",
+ "example": 0
+ }
+ }
+ },
+ "AdminDashboardOverviewResponse": {
+ "type": "object",
+ "properties": {
+ "totalCompanies": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "totalJobs": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "totalCandidates": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "avgCandidateScore": {
+ "type": "number"
+ },
+ "topCompanies": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CompanyScoreItem"
+ }
+ }
+ }
+ },
+ "ApiResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {},
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "CareerProgressResponse": {
+ "type": "object",
+ "properties": {
+ "todo": {
+ "$ref": "#/components/schemas/ProgressTodoSummary"
+ },
+ "applications": {
+ "$ref": "#/components/schemas/PaginatedApplications"
+ },
+ "generatedAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ProgressTodoSummary": {
+ "type": "object",
+ "properties": {
+ "pendingInterviewResponseCount": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "upcomingConfirmedInterviewCount": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "pendingOfferResponseCount": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "unreadNotificationCount": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "unreadReportDecisionCount": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "PaginatedApplications": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CareerProgressItem"
+ }
+ },
+ "total": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "size": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "totalPages": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "CareerProgressItem": {
+ "type": "object",
+ "properties": {
+ "applicationId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "applicationStatus": {
+ "type": "string"
+ },
+ "appliedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "job": {
+ "$ref": "#/components/schemas/JobSummary"
+ },
+ "nextInterview": {
+ "$ref": "#/components/schemas/InterviewSummary"
+ },
+ "latestSubmittedInterviewScore": {
+ "$ref": "#/components/schemas/ScoreSummary"
+ },
+ "offer": {
+ "$ref": "#/components/schemas/OfferSummary"
+ },
+ "competition": {
+ "$ref": "#/components/schemas/CompetitionSummary"
+ }
+ }
+ },
+ "JobSummary": {
+ "type": "object",
+ "properties": {
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "title": {
+ "type": "string"
+ },
+ "companyName": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "employmentType": {
+ "type": "string"
+ },
+ "jobStatus": {
+ "type": "string"
+ }
+ }
+ },
+ "InterviewSummary": {
+ "type": "object",
+ "properties": {
+ "interviewId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "roundNo": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "title": {
+ "type": "string"
+ },
+ "interviewType": {
+ "type": "string"
+ },
+ "startAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "endAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "status": {
+ "type": "string"
+ }
+ }
+ },
+ "ScoreSummary": {
+ "type": "object",
+ "properties": {
+ "interviewId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "overallScore": {
+ "type": "number"
+ },
+ "recommendation": {
+ "type": "string"
+ },
+ "submittedAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "OfferSummary": {
+ "type": "object",
+ "properties": {
+ "offerId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "status": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "expireAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "onboardingDate": {
+ "type": "string",
+ "format": "date"
+ }
+ }
+ },
+ "CompetitionSummary": {
+ "type": "object",
+ "properties": {
+ "eligible": {
+ "type": "boolean"
+ },
+ "rank": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "cohortSize": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "overallScore": {
+ "type": "number"
+ },
+ "percentile": {
+ "type": "number"
+ },
+ "status": {
+ "type": "string"
+ },
+ "mySnapshotPeriod": {
+ "type": "string"
+ },
+ "rulesVersion": {
+ "type": "string"
+ }
+ }
+ },
+ "ApiResponseCareerProgressResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32",
+ "example": 200
+ },
+ "message": {
+ "type": "string",
+ "example": "ok"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CareerProgressResponse"
+ },
+ "requestId": {
+ "type": "string",
+ "example": "req-1"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAccountDeletionResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32",
+ "example": 200
+ },
+ "message": {
+ "type": "string",
+ "example": "ok"
+ },
+ "data": {
+ "$ref": "#/components/schemas/AccountDeletionResponse"
+ },
+ "requestId": {
+ "type": "string",
+ "example": "req-1"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAdminDashboardOverviewResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/AdminDashboardOverviewResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "enum": [
- "APPROVE",
- "REJECT"
- ]
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAppealResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/AppealResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateDetailView": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateDetailView"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateFeedbackResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateFeedbackResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateListResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateListResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidatePercentileResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidatePercentileResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateRankingDetailResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateRankingDetailResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateRankingListResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateRankingListResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateScoreCardResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateScoreCardResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateScoreTrendResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateScoreTrendResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateScoringOverviewResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateScoringOverviewResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCandidateScoringTrendResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CandidateScoringTrendResponse"
},
- "reasonCode": {
+ "requestId": {
"type": "string"
},
- "expectedVersion": {
- "type": "integer",
- "format": "int64"
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "RecommendationProfileResponse": {
+ "ApiResponseCompanyCandidateScoringResponse": {
"type": "object",
"properties": {
- "jobId": {
+ "code": {
"type": "integer",
- "format": "int64"
- },
- "industryCode": {
- "type": "string"
+ "format": "int32"
},
- "jobFamilyCode": {
+ "message": {
"type": "string"
},
- "riasecWeights": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "data": {
+ "$ref": "#/components/schemas/CompanyCandidateScoringResponse"
},
- "abilityExpectations": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "requestId": {
+ "type": "string"
},
- "enabled": {
- "type": "boolean"
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseCompanyPublicView": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "reviewStatus": {
+ "message": {
"type": "string"
},
- "reviewReason": {
- "type": "string"
+ "data": {
+ "$ref": "#/components/schemas/CompanyPublicView"
},
- "version": {
- "type": "integer",
- "format": "int64"
+ "requestId": {
+ "type": "string"
},
- "updatedAt": {
+ "timestamp": {
"type": "string",
"format": "date-time"
}
}
},
- "RecommendationFeedbackResponse": {
+ "ApiResponseDashboardOverviewResponse": {
"type": "object",
"properties": {
- "jobId": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "feedbackType": {
+ "message": {
"type": "string"
},
- "reasonType": {
- "type": "string"
+ "data": {
+ "$ref": "#/components/schemas/DashboardOverviewResponse"
},
- "status": {
+ "requestId": {
"type": "string"
},
- "version": {
- "type": "integer",
- "format": "int64"
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "JobRecommendationItem": {
+ "ApiResponseDimensionScoreDetailResponse": {
"type": "object",
"properties": {
- "jobId": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "title": {
+ "message": {
"type": "string"
},
- "city": {
- "type": "string"
+ "data": {
+ "$ref": "#/components/schemas/DimensionScoreDetailResponse"
},
- "employmentType": {
+ "requestId": {
"type": "string"
},
- "salaryMin": {
- "type": "integer"
- },
- "salaryMax": {
- "type": "integer"
- },
- "mode": {
+ "timestamp": {
"type": "string",
- "enum": [
- "PERSONALIZED",
- "FALLBACK"
- ]
- },
- "score": {
- "type": "number"
- },
- "reasons": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "format": "date-time"
}
}
},
- "ApiResponseListTaxonomyResponse": {
+ "ApiResponseJobRankingItem": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/TaxonomyResponse"
- }
+ "$ref": "#/components/schemas/JobRankingItem"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "ApiResponseRecommendationFeedbackResponse": {
+ "ApiResponseJobRankingListResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/RecommendationFeedbackResponse"
+ "$ref": "#/components/schemas/JobRankingListResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "ApiResponseRecommendationProfileResponse": {
+ "ApiResponseListAppealHistoryItem": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/RecommendationProfileResponse"
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AppealHistoryItem"
+ }
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "ApiResponsePageJobRecommendationItem": {
+ "ApiResponseListMapStringObject": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "type": "object",
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/JobRecommendationItem"
- }
- },
- "total": {
- "type": "integer"
- },
- "page": {
- "type": "integer"
- },
- "size": {
- "type": "integer"
- },
- "totalPages": {
- "type": "integer"
- }
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": {}
}
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "ApiResponsePageRecommendationProfileResponse": {
+ "ApiResponseListSnapshotHistoryItem": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "type": "object",
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RecommendationProfileResponse"
- }
- },
- "total": {
- "type": "integer"
- },
- "page": {
- "type": "integer"
- },
- "size": {
- "type": "integer"
- },
- "totalPages": {
- "type": "integer"
- }
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SnapshotHistoryItem"
}
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "CompanyReviewJobResponse": {
+ "ApiResponseListWeightTemplateResponse": {
"type": "object",
"properties": {
- "id": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "title": {
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/WeightTemplateResponse"
+ }
+ },
+ "requestId": {
"type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "CompanyReviewReplyResponse": {
+ "ApiResponseMapStringObject": {
"type": "object",
"properties": {
- "id": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "content": {
+ "message": {
"type": "string"
},
- "status": {
- "type": "string"
+ "data": {
+ "type": "object",
+ "additionalProperties": {}
},
- "version": {
- "type": "integer",
- "format": "int64"
+ "requestId": {
+ "type": "string"
},
- "updatedAt": {
+ "timestamp": {
"type": "string",
"format": "date-time"
- },
- "rejectionReason": {
- "type": "string",
- "nullable": true
}
}
},
- "CompanyReviewItemResponse": {
+ "ApiResponseMapStringString": {
"type": "object",
"properties": {
- "reviewId": {
+ "code": {
"type": "integer",
- "format": "int64"
- },
- "job": {
- "$ref": "#/components/schemas/CompanyReviewJobResponse"
- },
- "rating": {
- "type": "integer"
+ "format": "int32"
},
- "content": {
+ "message": {
"type": "string"
},
- "tags": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "dimensionScores": {
+ "data": {
"type": "object",
"additionalProperties": {
- "type": "integer"
+ "type": "string"
}
},
- "reviewStatus": {
+ "requestId": {
"type": "string"
},
- "reviewCreatedAt": {
+ "timestamp": {
"type": "string",
"format": "date-time"
- },
- "reply": {
- "$ref": "#/components/schemas/CompanyReviewReplyResponse"
}
}
},
- "CompanyReviewDetailResponse": {
- "allOf": [
- {
- "$ref": "#/components/schemas/CompanyReviewItemResponse"
- }
- ]
- },
- "ReviewReplyPageResponse": {
+ "ApiResponsePersonalizedScoreResponse": {
"type": "object",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CompanyReviewItemResponse"
- }
- },
- "total": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "page": {
- "type": "integer"
+ "message": {
+ "type": "string"
},
- "size": {
- "type": "integer"
+ "data": {
+ "$ref": "#/components/schemas/PersonalizedScoreResponse"
},
- "totalPages": {
- "type": "integer"
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "CreateCompanyReviewReplyRequest": {
+ "ApiResponsePrivacySettingsResponse": {
"type": "object",
- "required": [
- "content",
- "idempotencyKey"
- ],
"properties": {
- "content": {
+ "code": {
+ "type": "integer",
+ "format": "int32",
+ "example": 200
+ },
+ "message": {
"type": "string",
- "minLength": 1,
- "maxLength": 500
+ "example": "ok"
},
- "idempotencyKey": {
+ "data": {
+ "$ref": "#/components/schemas/PrivacySettingsResponse"
+ },
+ "requestId": {
"type": "string",
- "format": "uuid",
- "maxLength": 64
+ "example": "req-1"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "UpdateCompanyReviewReplyRequest": {
+ "ApiResponseReviewWeightResponse": {
"type": "object",
- "required": [
- "content",
- "expectedVersion"
- ],
"properties": {
- "content": {
- "type": "string",
- "minLength": 1,
- "maxLength": 500
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "expectedVersion": {
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/ReviewWeightResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseScoreTrendResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
"type": "integer",
- "format": "int64",
- "minimum": 0
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/ScoreTrendResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "ReviewReplyDecisionRequest": {
+ "AppealDecisionRequest": {
"type": "object",
- "required": [
- "decision"
- ],
"properties": {
"decision": {
"type": "string",
- "enum": [
- "APPROVE",
- "REJECT"
- ]
+ "minLength": 1
},
"reason": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
}
- }
+ },
+ "required": [
+ "decision"
+ ]
},
- "AdminReviewReplyResponse": {
+ "AppealHistoryItem": {
"type": "object",
"properties": {
- "replyId": {
+ "id": {
"type": "integer",
"format": "int64"
},
- "reviewId": {
- "type": "integer",
- "format": "int64"
+ "fromStatus": {
+ "type": "string"
},
- "jobId": {
+ "toStatus": {
+ "type": "string"
+ },
+ "actorUserId": {
"type": "integer",
"format": "int64"
},
- "jobTitle": {
+ "actorRole": {
"type": "string"
},
- "companyId": {
+ "reason": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "AppealResponse": {
+ "type": "object",
+ "properties": {
+ "appealId": {
"type": "integer",
"format": "int64"
},
- "companyName": {
+ "candidateId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "dimension": {
"type": "string"
},
- "rating": {
- "type": "integer"
+ "period": {
+ "type": "string"
},
- "reviewContent": {
+ "status": {
"type": "string"
},
- "reviewModerationStatus": {
+ "reason": {
"type": "string"
},
- "replyContent": {
+ "decision": {
"type": "string"
},
- "replyStatus": {
+ "decisionReason": {
"type": "string"
},
- "version": {
+ "reviewerId": {
"type": "integer",
"format": "int64"
},
- "riskScore": {
- "type": "number"
+ "reviewedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "riskLevel": {
- "type": "string"
+ "rollbackAt": {
+ "type": "string",
+ "format": "date-time"
},
- "reasonCodes": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "scoreAtAppeal": {
+ "type": "number"
+ },
+ "snapshotVersionAtAppeal": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "rulesVersion": {
+ "type": "string"
},
"createdAt": {
"type": "string",
"format": "date-time"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "AdminReviewReplyPageResponse": {
+ "ApplicationCreateRequest": {
"type": "object",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AdminReviewReplyResponse"
- }
- },
- "total": {
+ "jobId": {
"type": "integer",
"format": "int64"
- },
- "page": {
- "type": "integer"
- },
- "size": {
- "type": "integer"
- },
- "totalPages": {
- "type": "integer"
}
- }
+ },
+ "required": [
+ "jobId"
+ ]
},
- "ApiResponseReviewReplyPageResponse": {
+ "ApplicationStatusRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/ReviewReplyPageResponse"
- },
- "requestId": {
- "type": "string"
- },
- "timestamp": {
+ "status": {
"type": "string",
- "format": "date-time"
+ "minLength": 1,
+ "pattern": "^(VIEWED|INTERVIEW|REJECTED|HIRED)$"
}
- }
+ },
+ "required": [
+ "status"
+ ]
},
- "ApiResponseCompanyReviewDetailResponse": {
+ "CandidateDetailView": {
"type": "object",
"properties": {
- "code": {
- "type": "integer"
- },
- "message": {
- "type": "string"
+ "applicationId": {
+ "type": "integer",
+ "format": "int64"
},
- "data": {
- "$ref": "#/components/schemas/CompanyReviewDetailResponse"
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
},
- "requestId": {
+ "jobTitle": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "ApiResponseCompanyReviewReplyResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer"
+ "jobCity": {
+ "type": "string"
},
- "message": {
+ "jobEmploymentType": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CompanyReviewReplyResponse"
+ "status": {
+ "type": "string"
},
- "requestId": {
+ "coverLetter": {
"type": "string"
},
- "timestamp": {
+ "createdAt": {
"type": "string",
"format": "date-time"
- }
- }
- },
- "ApiResponseAdminReviewReplyPageResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer"
},
- "message": {
- "type": "string"
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "data": {
- "$ref": "#/components/schemas/AdminReviewReplyPageResponse"
+ "candidateName": {
+ "type": "string"
},
- "requestId": {
+ "candidateAvatarUrl": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "ApiResponseAdminReviewReplyResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer"
+ "candidateBio": {
+ "type": "string"
},
- "message": {
+ "candidateLocation": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/AdminReviewReplyResponse"
+ "candidateSchool": {
+ "type": "string"
},
- "requestId": {
+ "candidateEducation": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "candidateGraduationYear": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "candidateSkills": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
}
},
- "AccountDeletionResponse": {
+ "CandidateFeedbackRequest": {
"type": "object",
"properties": {
- "userId": {
+ "rating": {
"type": "integer",
- "format": "int64",
- "example": 2
- },
- "status": {
- "type": "string",
- "enum": [
- "NONE",
- "PENDING",
- "COMPLETED"
- ],
- "example": "PENDING",
- "description": "注销状态:NONE/PENDING/COMPLETED"
- },
- "requestedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "effectiveAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "cancelledAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
+ "format": "int32",
+ "maximum": 5,
+ "minimum": 1
},
- "completedAt": {
+ "content": {
"type": "string",
- "format": "date-time",
- "nullable": true
+ "maxLength": 1000,
+ "minLength": 0
},
- "version": {
- "type": "integer",
- "format": "int64",
- "example": 0
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 50,
+ "minLength": 1
+ },
+ "maxItems": 10,
+ "minItems": 0
}
- }
+ },
+ "required": [
+ "content",
+ "rating"
+ ]
},
- "AdminDashboardOverviewResponse": {
+ "CandidateFeedbackResponse": {
"type": "object",
+ "description": "脱敏后的候选人反馈",
"properties": {
- "totalCompanies": {
+ "id": {
"type": "integer",
- "format": "int32"
+ "format": "int64",
+ "description": "反馈 ID",
+ "example": 1
},
- "totalJobs": {
+ "applicationId": {
"type": "integer",
- "format": "int32"
+ "format": "int64",
+ "description": "投递 ID",
+ "example": 31
},
- "totalCandidates": {
+ "rating": {
"type": "integer",
- "format": "int32"
+ "format": "int32",
+ "description": "评分,范围 1-5",
+ "example": 5
},
- "avgCandidateScore": {
- "type": "number"
+ "content": {
+ "type": "string",
+ "description": "反馈内容",
+ "example": "沟通良好"
},
- "topCompanies": {
+ "tags": {
"type": "array",
+ "description": "反馈标签",
"items": {
- "$ref": "#/components/schemas/CompanyScoreItem"
+ "type": "string"
}
- }
- }
- },
- "ApiResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {},
- "requestId": {
- "type": "string"
},
- "timestamp": {
+ "createdAt": {
"type": "string",
- "format": "date-time"
+ "format": "date-time",
+ "description": "创建时间",
+ "example": "2026-08-25T10:00:00"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time",
+ "description": "更新时间",
+ "example": "2026-08-25T10:00:00"
}
}
},
- "CareerProgressResponse": {
+ "CandidateFeedbackSummary": {
"type": "object",
"properties": {
- "todo": {
- "$ref": "#/components/schemas/ProgressTodoSummary"
+ "totalCount": {
+ "type": "integer",
+ "format": "int32"
},
- "applications": {
- "$ref": "#/components/schemas/PaginatedApplications"
+ "averageRating": {
+ "type": "number"
},
- "generatedAt": {
- "type": "string",
- "format": "date-time"
+ "ratingDistribution": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TagCount"
+ }
}
}
},
- "ProgressTodoSummary": {
+ "CandidateItemView": {
"type": "object",
"properties": {
- "pendingInterviewResponseCount": {
+ "applicationId": {
"type": "integer",
"format": "int64"
},
- "upcomingConfirmedInterviewCount": {
+ "jobId": {
"type": "integer",
"format": "int64"
},
- "pendingOfferResponseCount": {
- "type": "integer",
- "format": "int64"
+ "jobTitle": {
+ "type": "string"
},
- "unreadNotificationCount": {
- "type": "integer",
- "format": "int64"
+ "status": {
+ "type": "string"
},
- "unreadReportDecisionCount": {
+ "candidateName": {
+ "type": "string"
+ },
+ "candidateSchool": {
+ "type": "string"
+ },
+ "candidateEducation": {
+ "type": "string"
+ },
+ "candidateGraduationYear": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
+ },
+ "candidateAvatarUrl": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "PaginatedApplications": {
+ "CandidateListResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/CareerProgressItem"
+ "$ref": "#/components/schemas/CandidateItemView"
}
},
"total": {
@@ -10365,3050 +13649,3167 @@
}
}
},
- "CareerProgressItem": {
+ "CandidateMatchSignals": {
"type": "object",
"properties": {
- "applicationId": {
- "type": "integer",
- "format": "int64"
- },
- "applicationStatus": {
- "type": "string"
- },
- "appliedAt": {
- "type": "string",
- "format": "date-time"
- },
- "updatedAt": {
- "type": "string",
- "format": "date-time"
- },
- "job": {
- "$ref": "#/components/schemas/JobSummary"
- },
- "nextInterview": {
- "$ref": "#/components/schemas/InterviewSummary"
- },
- "latestSubmittedInterviewScore": {
- "$ref": "#/components/schemas/ScoreSummary"
- },
- "offer": {
- "$ref": "#/components/schemas/OfferSummary"
+ "candidateInterestScore": {
+ "$ref": "#/components/schemas/MatchSignal"
},
- "competition": {
- "$ref": "#/components/schemas/CompetitionSummary"
+ "hrSuitabilityScore": {
+ "$ref": "#/components/schemas/MatchSignal"
}
}
},
- "JobSummary": {
+ "CandidatePercentileResponse": {
"type": "object",
"properties": {
- "jobId": {
+ "candidateId": {
"type": "integer",
"format": "int64"
},
- "title": {
+ "status": {
"type": "string"
},
- "companyName": {
+ "scoreType": {
"type": "string"
},
- "city": {
- "type": "string"
+ "score": {
+ "type": "number"
},
- "employmentType": {
- "type": "string"
+ "percentile": {
+ "type": "number"
},
- "jobStatus": {
- "type": "string"
- }
- }
- },
- "InterviewSummary": {
- "type": "object",
- "properties": {
- "interviewId": {
+ "cohortSize": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "roundNo": {
+ "sampleCount": {
"type": "integer",
"format": "int32"
},
- "title": {
- "type": "string"
- },
- "interviewType": {
- "type": "string"
- },
- "startAt": {
- "type": "string",
- "format": "date-time"
- },
- "endAt": {
- "type": "string",
- "format": "date-time"
- },
- "status": {
- "type": "string"
+ "minimumSampleCount": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "ScoreSummary": {
+ "CandidateRankingDetailResponse": {
"type": "object",
"properties": {
- "interviewId": {
+ "applicationId": {
"type": "integer",
"format": "int64"
},
- "overallScore": {
- "type": "number"
- },
- "recommendation": {
- "type": "string"
- },
- "submittedAt": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "OfferSummary": {
- "type": "object",
- "properties": {
- "offerId": {
+ "jobId": {
"type": "integer",
"format": "int64"
},
- "status": {
+ "candidateName": {
"type": "string"
},
- "title": {
+ "candidateSchool": {
"type": "string"
},
- "expireAt": {
- "type": "string",
- "format": "date-time"
- },
- "onboardingDate": {
- "type": "string",
- "format": "date"
- }
- }
- },
- "CompetitionSummary": {
- "type": "object",
- "properties": {
- "eligible": {
- "type": "boolean"
- },
- "rank": {
- "type": "integer",
- "format": "int32"
- },
- "cohortSize": {
- "type": "integer",
- "format": "int32"
- },
"overallScore": {
"type": "number"
},
"percentile": {
"type": "number"
},
- "status": {
- "type": "string"
- },
- "mySnapshotPeriod": {
- "type": "string"
+ "cohortSize": {
+ "type": "integer",
+ "format": "int32"
},
- "rulesVersion": {
- "type": "string"
+ "dimensionScores": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DimensionScoreItem"
+ }
}
}
},
- "ApiResponseCareerProgressResponse": {
+ "CandidateRankingItem": {
"type": "object",
"properties": {
- "code": {
+ "applicationId": {
"type": "integer",
- "format": "int32",
- "example": 200
+ "format": "int64"
},
- "message": {
- "type": "string",
- "example": "ok"
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
},
- "data": {
- "$ref": "#/components/schemas/CareerProgressResponse"
+ "candidateName": {
+ "type": "string"
},
- "requestId": {
- "type": "string",
- "example": "req-1"
+ "candidateSchool": {
+ "type": "string"
+ },
+ "overallScore": {
+ "type": "number"
+ },
+ "percentile": {
+ "type": "number"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "sampleCount": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "ApiResponseAccountDeletionResponse": {
+ "CandidateRankingListResponse": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32",
- "example": 200
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CandidateRankingItem"
+ }
},
- "message": {
- "type": "string",
- "example": "ok"
+ "total": {
+ "type": "integer",
+ "format": "int64"
},
- "data": {
- "$ref": "#/components/schemas/AccountDeletionResponse"
+ "page": {
+ "type": "integer",
+ "format": "int32"
},
- "requestId": {
- "type": "string",
- "example": "req-1"
+ "size": {
+ "type": "integer",
+ "format": "int32"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "totalPages": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "ApiResponseAdminDashboardOverviewResponse": {
+ "CandidateScoreCardResponse": {
"type": "object",
"properties": {
- "code": {
+ "candidateId": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "message": {
+ "status": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/AdminDashboardOverviewResponse"
+ "overallScore": {
+ "type": "number"
},
- "requestId": {
- "type": "string"
+ "sampleCount": {
+ "type": "integer",
+ "format": "int32"
},
- "timestamp": {
+ "feedbackSummary": {
+ "$ref": "#/components/schemas/CandidateFeedbackSummary"
+ },
+ "matchSignals": {
+ "$ref": "#/components/schemas/CandidateMatchSignals"
+ },
+ "unsupportedDimensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "generatedAt": {
"type": "string",
"format": "date-time"
}
}
},
- "ApiResponseAppealResponse": {
+ "CandidateScoreTrendItem": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "month": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/AppealResponse"
+ "feedbackCount": {
+ "type": "integer",
+ "format": "int32"
},
- "requestId": {
- "type": "string"
+ "averageRating": {
+ "type": "number"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "ratingScore": {
+ "type": "number"
}
}
},
- "ApiResponseCandidateDetailView": {
+ "CandidateScoreTrendResponse": {
"type": "object",
"properties": {
- "code": {
+ "candidateId": {
"type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/CandidateDetailView"
+ "format": "int64"
},
- "requestId": {
- "type": "string"
+ "months": {
+ "type": "integer",
+ "format": "int32"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CandidateScoreTrendItem"
+ }
}
}
},
- "ApiResponseCandidateFeedbackResponse": {
+ "CandidateScoringOverviewResponse": {
"type": "object",
"properties": {
- "code": {
+ "candidateId": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "message": {
+ "status": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CandidateFeedbackResponse"
+ "overallScore": {
+ "type": "number"
},
- "requestId": {
+ "weights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
+ },
+ "dimensions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DimensionItem"
+ }
+ },
+ "rulesVersion": {
"type": "string"
},
- "timestamp": {
+ "generatedAt": {
"type": "string",
"format": "date-time"
+ },
+ "explanationVersion": {
+ "type": "string",
+ "description": "解释契约版本,与评分规则版本独立"
+ },
+ "coverage": {
+ "$ref": "#/components/schemas/CandidateScoringCoverage"
+ },
+ "comparabilityNotice": {
+ "type": "string"
}
}
},
- "ApiResponseCandidateListResponse": {
+ "CandidateScoringTrendResponse": {
"type": "object",
"properties": {
- "code": {
+ "candidateId": {
"type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/CandidateListResponse"
+ "format": "int64"
},
- "requestId": {
- "type": "string"
+ "months": {
+ "type": "integer",
+ "format": "int32"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TrendItem"
+ }
}
}
},
- "ApiResponseCandidatePercentileResponse": {
+ "CompanyCandidateScoringResponse": {
"type": "object",
"properties": {
- "code": {
+ "applicationId": {
"type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
+ "format": "int64"
},
- "data": {
- "$ref": "#/components/schemas/CandidatePercentileResponse"
+ "overallScore": {
+ "type": "number"
},
- "requestId": {
+ "status": {
"type": "string"
},
- "timestamp": {
+ "dimensions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CompanyDimensionItem"
+ }
+ },
+ "generatedAt": {
"type": "string",
"format": "date-time"
+ },
+ "rulesVersion": {
+ "type": "string"
}
}
},
- "ApiResponseCandidateRankingDetailResponse": {
+ "CompanyCreateRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
+ "name": {
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 0
},
- "message": {
+ "logoUrl": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CandidateRankingDetailResponse"
+ "description": {
+ "type": "string"
},
- "requestId": {
+ "industry": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "website": {
+ "type": "string"
+ },
+ "address": {
+ "type": "string"
}
- }
+ },
+ "required": [
+ "name"
+ ]
},
- "ApiResponseCandidateRankingListResponse": {
+ "CompanyDimensionItem": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "dimension": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CandidateRankingListResponse"
+ "score": {
+ "type": "number"
},
- "requestId": {
+ "status": {
"type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
}
}
},
- "ApiResponseCandidateScoreCardResponse": {
+ "CompanyMatchRuleRequest": {
"type": "object",
"properties": {
- "code": {
+ "requiredCandidateScore": {
"type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/CandidateScoreCardResponse"
- },
- "requestId": {
- "type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "format": "int32",
+ "maximum": 100,
+ "minimum": 0
}
- }
+ },
+ "required": [
+ "requiredCandidateScore"
+ ]
},
- "ApiResponseCandidateScoreTrendResponse": {
+ "CompanyPublicView": {
"type": "object",
"properties": {
- "code": {
+ "id": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "message": {
+ "name": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CandidateScoreTrendResponse"
+ "logoUrl": {
+ "type": "string"
},
- "requestId": {
+ "description": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "industry": {
+ "type": "string"
+ },
+ "verified": {
+ "type": "boolean"
}
}
},
- "ApiResponseCandidateScoringOverviewResponse": {
+ "CompanyScoreItem": {
"type": "object",
"properties": {
- "code": {
+ "companyId": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "message": {
+ "companyName": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CandidateScoringOverviewResponse"
- },
- "requestId": {
- "type": "string"
+ "avgCandidateScore": {
+ "type": "number"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "jobCount": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "ApiResponseCandidateScoringTrendResponse": {
+ "CompanyUpdateRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
+ "name": {
+ "type": "string",
+ "maxLength": 120,
+ "minLength": 0
},
- "message": {
+ "logoUrl": {
+ "type": "string",
+ "maxLength": 500,
+ "minLength": 0
+ },
+ "description": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/CandidateScoringTrendResponse"
+ "industry": {
+ "type": "string",
+ "maxLength": 80,
+ "minLength": 0
},
- "requestId": {
- "type": "string"
+ "website": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 0
},
- "timestamp": {
+ "address": {
"type": "string",
- "format": "date-time"
+ "maxLength": 255,
+ "minLength": 0
}
- }
+ },
+ "required": [
+ "name"
+ ]
},
- "ApiResponseCompanyCandidateScoringResponse": {
+ "CounterOfferCreateRequest": {
"type": "object",
"properties": {
- "code": {
+ "proposedSalaryMin": {
"type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
+ "format": "int32",
+ "minimum": 0
},
- "data": {
- "$ref": "#/components/schemas/CompanyCandidateScoringResponse"
+ "proposedSalaryMax": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "requestId": {
- "type": "string"
+ "proposedOnboardingDate": {
+ "type": "string",
+ "format": "date"
},
- "timestamp": {
+ "reason": {
"type": "string",
- "format": "date-time"
+ "maxLength": 2000,
+ "minLength": 0
}
}
},
- "ApiResponseCompanyPublicView": {
+ "CreateAppealRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
+ "dimension": {
+ "type": "string",
+ "minLength": 1
},
- "data": {
- "$ref": "#/components/schemas/CompanyPublicView"
+ "period": {
+ "type": "string",
+ "minLength": 1
},
- "requestId": {
+ "reason": {
"type": "string"
},
- "timestamp": {
+ "idempotencyKey": {
"type": "string",
- "format": "date-time"
+ "maxLength": 64,
+ "minLength": 0
}
- }
+ },
+ "required": [
+ "dimension",
+ "period"
+ ]
},
- "ApiResponseDashboardOverviewResponse": {
+ "CreateConversationRequest": {
"type": "object",
"properties": {
- "code": {
+ "participantUserId": {
"type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/DashboardOverviewResponse"
- },
- "requestId": {
- "type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "format": "int64"
}
- }
+ },
+ "required": [
+ "participantUserId"
+ ]
},
- "ApiResponseDimensionScoreDetailResponse": {
+ "DashboardOverviewResponse": {
"type": "object",
"properties": {
- "code": {
+ "companyId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "totalJobs": {
"type": "integer",
"format": "int32"
},
- "message": {
- "type": "string"
+ "publishedJobs": {
+ "type": "integer",
+ "format": "int32"
},
- "data": {
- "$ref": "#/components/schemas/DimensionScoreDetailResponse"
+ "avgJobScore": {
+ "type": "number"
},
- "requestId": {
- "type": "string"
+ "totalCandidates": {
+ "type": "integer",
+ "format": "int32"
},
- "timestamp": {
+ "avgCandidateScore": {
+ "type": "number"
+ },
+ "scoreDistribution": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ "updatedAt": {
"type": "string",
"format": "date-time"
}
}
},
- "ApiResponseJobRankingItem": {
+ "DataSourceItem": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/JobRankingItem"
- },
- "requestId": {
+ "source": {
"type": "string"
},
- "timestamp": {
+ "time": {
"type": "string",
"format": "date-time"
+ },
+ "note": {
+ "type": "string"
}
}
},
- "ApiResponseJobRankingListResponse": {
+ "DimensionItem": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "dimension": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/JobRankingListResponse"
+ "score": {
+ "type": "number"
},
- "requestId": {
+ "status": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "weight": {
+ "type": "number"
+ },
+ "summary": {
+ "type": "string"
}
}
},
- "ApiResponseListAppealHistoryItem": {
+ "DimensionScoreDetailResponse": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
+ "dimension": {
+ "type": "string"
},
- "message": {
+ "score": {
+ "type": "number"
+ },
+ "status": {
"type": "string"
},
- "data": {
+ "subScores": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/AppealHistoryItem"
+ "$ref": "#/components/schemas/SubScore"
}
},
- "requestId": {
- "type": "string"
+ "reasons": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "timestamp": {
+ "dataSources": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DataSourceItem"
+ }
+ },
+ "updatedAt": {
"type": "string",
"format": "date-time"
- }
- }
- },
- "ApiResponseListMapStringObject": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer",
- "format": "int32"
},
- "message": {
+ "rulesVersion": {
"type": "string"
},
- "data": {
+ "displayName": {
+ "type": "string"
+ },
+ "whatItMeasures": {
+ "type": "string"
+ },
+ "interpretation": {
+ "type": "string"
+ },
+ "limitations": {
"type": "array",
"items": {
- "type": "object",
- "additionalProperties": {}
+ "type": "string"
}
},
- "requestId": {
- "type": "string"
- },
- "timestamp": {
+ "evidenceLevel": {
"type": "string",
- "format": "date-time"
- }
- }
- },
- "ApiResponseListSnapshotHistoryItem": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer",
- "format": "int32"
+ "enum": [
+ "DIRECT_RULE",
+ "SELF_REPORTED",
+ "BEHAVIOR_PROXY",
+ "UNVALIDATED_PROXY"
+ ]
},
- "message": {
- "type": "string"
+ "ruleContributions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CandidateScoringRuleContribution"
+ }
},
- "data": {
+ "improvementActions": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SnapshotHistoryItem"
+ "type": "string"
}
},
- "requestId": {
+ "explanationVersion": {
"type": "string"
},
- "timestamp": {
+ "validity": {
+ "$ref": "#/components/schemas/CandidateScoringValidity"
+ },
+ "calculatedAt": {
"type": "string",
"format": "date-time"
}
}
},
- "ApiResponseListWeightTemplateResponse": {
+ "DimensionScoreItem": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "dimension": {
"type": "string"
},
- "data": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/WeightTemplateResponse"
- }
+ "score": {
+ "type": "number"
},
- "requestId": {
+ "status": {
"type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
}
}
},
- "ApiResponseMapStringObject": {
+ "InterviewCancelRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "type": "object",
- "additionalProperties": {}
- },
- "requestId": {
+ "reason": {
"type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
}
}
},
- "ApiResponseMapStringString": {
+ "InterviewCreateRequest": {
"type": "object",
"properties": {
- "code": {
+ "roundNo": {
"type": "integer",
"format": "int32"
},
- "message": {
- "type": "string"
+ "title": {
+ "type": "string",
+ "maxLength": 200,
+ "minLength": 0
},
- "data": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
+ "interviewType": {
+ "type": "string",
+ "minLength": 1
},
- "requestId": {
- "type": "string"
+ "startAt": {
+ "type": "string",
+ "format": "date-time"
},
- "timestamp": {
+ "endAt": {
"type": "string",
"format": "date-time"
- }
- }
- },
- "ApiResponsePersonalizedScoreResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer",
- "format": "int32"
},
- "message": {
+ "timezone": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/PersonalizedScoreResponse"
+ "meetingUrl": {
+ "type": "string"
},
- "requestId": {
+ "address": {
"type": "string"
},
- "timestamp": {
+ "interviewerName": {
"type": "string",
- "format": "date-time"
+ "maxLength": 100,
+ "minLength": 0
+ },
+ "notes": {
+ "type": "string"
}
- }
+ },
+ "required": [
+ "endAt",
+ "interviewType",
+ "startAt",
+ "title"
+ ]
},
- "ApiResponsePrivacySettingsResponse": {
+ "InterviewRespondRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32",
- "example": 200
- },
- "message": {
- "type": "string",
- "example": "ok"
- },
- "data": {
- "$ref": "#/components/schemas/PrivacySettingsResponse"
- },
- "requestId": {
+ "action": {
"type": "string",
- "example": "req-1"
+ "minLength": 1
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "reason": {
+ "type": "string"
}
- }
+ },
+ "required": [
+ "action"
+ ]
},
- "ApiResponseReviewWeightResponse": {
+ "InterviewUpdateRequest": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "title": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/ReviewWeightResponse"
- },
- "requestId": {
- "type": "string"
+ "startAt": {
+ "type": "string",
+ "format": "date-time"
},
- "timestamp": {
+ "endAt": {
"type": "string",
"format": "date-time"
- }
- }
- },
- "ApiResponseScoreTrendResponse": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer",
- "format": "int32"
},
- "message": {
+ "timezone": {
+ "type": "string"
+ },
+ "meetingUrl": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/ScoreTrendResponse"
+ "address": {
+ "type": "string"
},
- "requestId": {
+ "interviewerName": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "notes": {
+ "type": "string"
+ },
+ "timeRangeValid": {
+ "type": "boolean"
}
}
},
- "AppealDecisionRequest": {
+ "JobCreateRequest": {
"type": "object",
"properties": {
- "decision": {
+ "title": {
+ "type": "string",
+ "maxLength": 120,
+ "minLength": 0
+ },
+ "description": {
"type": "string",
"minLength": 1
},
- "reason": {
+ "requirements": {
"type": "string"
+ },
+ "city": {
+ "type": "string",
+ "maxLength": 80,
+ "minLength": 0
+ },
+ "employmentType": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 0
+ },
+ "salaryMin": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "salaryMax": {
+ "type": "integer",
+ "format": "int32"
}
},
"required": [
- "decision"
+ "city",
+ "description",
+ "employmentType",
+ "title"
]
},
- "AppealHistoryItem": {
+ "JobRankingItem": {
"type": "object",
"properties": {
- "id": {
+ "jobId": {
"type": "integer",
"format": "int64"
},
- "fromStatus": {
+ "title": {
"type": "string"
},
- "toStatus": {
+ "city": {
"type": "string"
},
- "actorUserId": {
+ "employmentType": {
+ "type": "string"
+ },
+ "avgRating": {
+ "type": "number"
+ },
+ "reviewCount": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "actorRole": {
- "type": "string"
+ "rank": {
+ "type": "integer",
+ "format": "int32"
},
- "reason": {
- "type": "string"
+ "cohortSize": {
+ "type": "integer",
+ "format": "int32"
},
- "createdAt": {
- "type": "string",
- "format": "date-time"
+ "dimensionAverages": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
}
}
},
- "AppealResponse": {
+ "JobRankingListResponse": {
"type": "object",
"properties": {
- "appealId": {
- "type": "integer",
- "format": "int64"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/JobRankingItem"
+ }
},
- "candidateId": {
+ "total": {
"type": "integer",
"format": "int64"
},
- "dimension": {
- "type": "string"
- },
- "period": {
- "type": "string"
+ "page": {
+ "type": "integer",
+ "format": "int32"
},
- "status": {
- "type": "string"
+ "size": {
+ "type": "integer",
+ "format": "int32"
},
- "reason": {
- "type": "string"
+ "totalPages": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "JobReviewCreateRequest": {
+ "type": "object",
+ "properties": {
+ "rating": {
+ "type": "integer",
+ "format": "int32",
+ "maximum": 5,
+ "minimum": 1
},
- "decision": {
- "type": "string"
+ "content": {
+ "type": "string",
+ "maxLength": 1000,
+ "minLength": 0
},
- "decisionReason": {
- "type": "string"
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 50,
+ "minLength": 1
+ },
+ "maxItems": 10,
+ "minItems": 0
},
- "reviewerId": {
+ "dimensionScores": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "required": [
+ "content",
+ "rating"
+ ]
+ },
+ "JobReviewUpdateRequest": {
+ "type": "object",
+ "properties": {
+ "rating": {
"type": "integer",
- "format": "int64"
+ "format": "int32",
+ "maximum": 5,
+ "minimum": 1
},
- "reviewedAt": {
+ "content": {
"type": "string",
- "format": "date-time"
+ "maxLength": 1000,
+ "minLength": 1
},
- "rollbackAt": {
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 50,
+ "minLength": 1
+ },
+ "maxItems": 10,
+ "minItems": 0
+ },
+ "status": {
"type": "string",
- "format": "date-time"
+ "pattern": "^(PUBLISHED|HIDDEN)$"
},
- "scoreAtAppeal": {
- "type": "number"
+ "dimensionScores": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ },
+ "JobStatusRequest": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^(PUBLISHED|CLOSED)$"
+ }
+ },
+ "required": [
+ "status"
+ ]
+ },
+ "JobUpdateRequest": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string",
+ "maxLength": 120,
+ "minLength": 0
},
- "snapshotVersionAtAppeal": {
- "type": "integer",
- "format": "int64"
+ "description": {
+ "type": "string"
},
- "rulesVersion": {
+ "requirements": {
"type": "string"
},
- "createdAt": {
+ "city": {
"type": "string",
- "format": "date-time"
+ "maxLength": 80,
+ "minLength": 0
},
- "updatedAt": {
+ "employmentType": {
"type": "string",
- "format": "date-time"
+ "maxLength": 30,
+ "minLength": 0
+ },
+ "salaryMin": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "salaryMax": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "ApplicationCreateRequest": {
+ "LoginRequest": {
"type": "object",
"properties": {
- "jobId": {
- "type": "integer",
- "format": "int64"
+ "phone": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "[0-9]{11}"
+ },
+ "code": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "[0-9]{6}"
+ },
+ "purpose": {
+ "type": "string"
}
},
"required": [
- "jobId"
+ "code",
+ "phone"
]
},
- "ApplicationStatusRequest": {
+ "MatchSignal": {
"type": "object",
"properties": {
- "status": {
- "type": "string",
- "minLength": 1,
- "pattern": "^(VIEWED|INTERVIEW|REJECTED|HIRED)$"
+ "average": {
+ "type": "number"
+ },
+ "sampleCount": {
+ "type": "integer",
+ "format": "int32"
}
- },
- "required": [
- "status"
- ]
+ }
},
- "CandidateDetailView": {
+ "OfferCreateRequest": {
"type": "object",
"properties": {
"applicationId": {
"type": "integer",
"format": "int64"
},
- "jobId": {
- "type": "integer",
- "format": "int64"
- },
- "jobTitle": {
- "type": "string"
+ "title": {
+ "type": "string",
+ "maxLength": 120,
+ "minLength": 0
},
- "jobCity": {
- "type": "string"
+ "salaryMin": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "jobEmploymentType": {
- "type": "string"
+ "salaryMax": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "status": {
- "type": "string"
+ "salaryCurrency": {
+ "type": "string",
+ "maxLength": 10,
+ "minLength": 0
},
- "coverLetter": {
- "type": "string"
+ "salaryPeriod": {
+ "type": "string",
+ "pattern": "^(MONTH|YEAR|HOUR)$"
},
- "createdAt": {
+ "workCity": {
"type": "string",
- "format": "date-time"
+ "maxLength": 80,
+ "minLength": 0
},
- "updatedAt": {
+ "employmentType": {
"type": "string",
- "format": "date-time"
+ "pattern": "^(FULL_TIME|PART_TIME|INTERN|INTERNSHIP)$"
},
- "candidateName": {
- "type": "string"
+ "probationMonths": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "candidateAvatarUrl": {
- "type": "string"
+ "benefits": {
+ "type": "string",
+ "maxLength": 2000,
+ "minLength": 0
},
- "candidateBio": {
- "type": "string"
+ "description": {
+ "type": "string",
+ "maxLength": 5000,
+ "minLength": 0
},
- "candidateLocation": {
- "type": "string"
+ "expireAt": {
+ "type": "string",
+ "format": "date-time"
},
- "candidateSchool": {
- "type": "string"
+ "onboardingDate": {
+ "type": "string",
+ "format": "date"
},
- "candidateEducation": {
- "type": "string"
+ "baseSalary": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "candidateGraduationYear": {
+ "housingAllowance": {
"type": "integer",
- "format": "int32"
+ "format": "int32",
+ "minimum": 0
},
- "candidateSkills": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "CandidateFeedbackRequest": {
- "type": "object",
- "properties": {
- "rating": {
+ "annualBonusMonths": {
"type": "integer",
"format": "int32",
- "maximum": 5,
- "minimum": 1
+ "minimum": 0
},
- "content": {
+ "otherAllowances": {
"type": "string",
"maxLength": 1000,
"minLength": 0
+ }
+ },
+ "required": [
+ "applicationId",
+ "description",
+ "expireAt",
+ "title",
+ "workCity"
+ ]
+ },
+ "OfferStatusRequest": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^(SENT|NEGOTIATING|ACCEPTED|REJECTED|EXPIRED|WITHDRAWN)$"
},
- "tags": {
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 50,
- "minLength": 1
- },
- "maxItems": 10,
- "minItems": 0
+ "reason": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 0
}
},
"required": [
- "content",
- "rating"
+ "status"
]
},
- "CandidateFeedbackResponse": {
+ "OfferUpdateRequest": {
"type": "object",
- "description": "脱敏后的候选人反馈",
"properties": {
- "id": {
+ "title": {
+ "type": "string",
+ "maxLength": 120,
+ "minLength": 0
+ },
+ "salaryMin": {
"type": "integer",
- "format": "int64",
- "description": "反馈 ID",
- "example": 1
+ "format": "int32",
+ "minimum": 0
},
- "applicationId": {
+ "salaryMax": {
"type": "integer",
- "format": "int64",
- "description": "投递 ID",
- "example": 31
+ "format": "int32",
+ "minimum": 0
},
- "rating": {
+ "salaryCurrency": {
+ "type": "string",
+ "maxLength": 10,
+ "minLength": 0
+ },
+ "salaryPeriod": {
+ "type": "string",
+ "pattern": "^(MONTH|YEAR|HOUR)$"
+ },
+ "workCity": {
+ "type": "string",
+ "maxLength": 80,
+ "minLength": 0
+ },
+ "employmentType": {
+ "type": "string",
+ "pattern": "^(FULL_TIME|PART_TIME|INTERN|INTERNSHIP)$"
+ },
+ "probationMonths": {
"type": "integer",
"format": "int32",
- "description": "评分,范围 1-5",
- "example": 5
+ "minimum": 0
},
- "content": {
+ "benefits": {
"type": "string",
- "description": "反馈内容",
- "example": "沟通良好"
+ "maxLength": 2000,
+ "minLength": 0
},
- "tags": {
- "type": "array",
- "description": "反馈标签",
- "items": {
- "type": "string"
- }
+ "description": {
+ "type": "string",
+ "maxLength": 5000,
+ "minLength": 0
},
- "createdAt": {
+ "expireAt": {
"type": "string",
- "format": "date-time",
- "description": "创建时间",
- "example": "2026-08-25T10:00:00"
+ "format": "date-time"
},
- "updatedAt": {
+ "onboardingDate": {
"type": "string",
- "format": "date-time",
- "description": "更新时间",
- "example": "2026-08-25T10:00:00"
+ "format": "date"
+ },
+ "baseSalary": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
+ },
+ "housingAllowance": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
+ },
+ "annualBonusMonths": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
+ },
+ "otherAllowances": {
+ "type": "string",
+ "maxLength": 1000,
+ "minLength": 0
}
}
},
- "CandidateFeedbackSummary": {
+ "PersonalizedScoreResponse": {
"type": "object",
"properties": {
- "totalCount": {
+ "jobId": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "averageRating": {
+ "score": {
"type": "number"
},
- "ratingDistribution": {
+ "status": {
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "templateCode": {
+ "type": "string"
+ },
+ "configuredWeights": {
"type": "object",
"additionalProperties": {
- "type": "integer",
- "format": "int32"
+ "type": "number"
}
},
- "tags": {
+ "effectiveWeights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
+ },
+ "dimensionScores": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
+ },
+ "coveredWeight": {
+ "type": "number"
+ },
+ "missingDimensions": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/TagCount"
+ "type": "string"
}
}
}
},
- "CandidateItemView": {
+ "PrivacySettingsResponse": {
"type": "object",
"properties": {
- "applicationId": {
+ "id": {
"type": "integer",
- "format": "int64"
+ "format": "int64",
+ "example": 1,
+ "nullable": true
},
- "jobId": {
+ "studentUserId": {
"type": "integer",
- "format": "int64"
- },
- "jobTitle": {
- "type": "string"
- },
- "status": {
- "type": "string"
- },
- "candidateName": {
- "type": "string"
+ "format": "int64",
+ "example": 2
},
- "candidateSchool": {
- "type": "string"
+ "resumeVisibility": {
+ "$ref": "#/components/schemas/ResumeVisibility",
+ "description": "简历可见性(PRIVATE/APPLIED_COMPANIES/VERIFIED_COMPANIES)",
+ "example": "APPLIED_COMPANIES"
},
- "candidateEducation": {
- "type": "string"
+ "contactVisible": {
+ "type": "boolean",
+ "example": true
},
- "candidateGraduationYear": {
+ "version": {
"type": "integer",
- "format": "int32"
- },
- "candidateAvatarUrl": {
- "type": "string"
+ "format": "int64",
+ "example": 0
},
"createdAt": {
"type": "string",
- "format": "date-time"
+ "format": "date-time",
+ "nullable": true
},
"updatedAt": {
"type": "string",
- "format": "date-time"
+ "format": "date-time",
+ "nullable": true
}
}
},
- "CandidateListResponse": {
+ "PrivacySettingsUpdateRequest": {
"type": "object",
+ "required": [
+ "resumeVisibility",
+ "contactVisible"
+ ],
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CandidateItemView"
- }
- },
- "total": {
- "type": "integer",
- "format": "int64"
- },
- "page": {
- "type": "integer",
- "format": "int32"
+ "resumeVisibility": {
+ "$ref": "#/components/schemas/ResumeVisibility",
+ "description": "简历可见性(必填)",
+ "example": "APPLIED_COMPANIES"
},
- "size": {
- "type": "integer",
- "format": "int32"
+ "contactVisible": {
+ "type": "boolean",
+ "description": "联系方式是否对企业可见(必填)",
+ "example": true
},
- "totalPages": {
+ "version": {
"type": "integer",
- "format": "int32"
+ "format": "int64",
+ "description": "乐观锁版本号(可选)",
+ "example": 0
}
}
},
- "CandidateMatchSignals": {
+ "ResumeVisibility": {
+ "type": "string",
+ "enum": [
+ "PRIVATE",
+ "APPLIED_COMPANIES",
+ "VERIFIED_COMPANIES"
+ ],
+ "description": "简历可见性:PRIVATE 私有;APPLIED_COMPANIES 仅对企业有效投递可见;VERIFIED_COMPANIES 仅对认证企业可见",
+ "example": "PRIVATE"
+ },
+ "ReviewDecisionRequest": {
"type": "object",
"properties": {
- "candidateInterestScore": {
- "$ref": "#/components/schemas/MatchSignal"
+ "decision": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^(APPROVED|REJECTED)$"
},
- "hrSuitabilityScore": {
- "$ref": "#/components/schemas/MatchSignal"
+ "reason": {
+ "type": "string",
+ "maxLength": 500,
+ "minLength": 0
}
- }
+ },
+ "required": [
+ "decision"
+ ]
},
- "CandidatePercentileResponse": {
+ "ReviewWeightResponse": {
"type": "object",
"properties": {
- "candidateId": {
- "type": "integer",
- "format": "int64"
- },
- "status": {
+ "source": {
"type": "string"
},
- "scoreType": {
+ "templateCode": {
"type": "string"
},
- "score": {
- "type": "number"
- },
- "percentile": {
- "type": "number"
- },
- "cohortSize": {
- "type": "integer",
- "format": "int32"
- },
- "sampleCount": {
- "type": "integer",
- "format": "int32"
+ "configuredWeights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
},
- "minimumSampleCount": {
- "type": "integer",
- "format": "int32"
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "CandidateRankingDetailResponse": {
+ "SaveWeightRequest": {
"type": "object",
"properties": {
- "applicationId": {
- "type": "integer",
- "format": "int64"
- },
- "jobId": {
- "type": "integer",
- "format": "int64"
- },
- "candidateName": {
- "type": "string"
- },
- "candidateSchool": {
+ "templateCode": {
"type": "string"
},
- "overallScore": {
- "type": "number"
- },
- "percentile": {
- "type": "number"
- },
- "cohortSize": {
- "type": "integer",
- "format": "int32"
- },
- "dimensionScores": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/DimensionScoreItem"
+ "weights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
}
}
}
},
- "CandidateRankingItem": {
+ "ScoreRequest": {
"type": "object",
"properties": {
- "applicationId": {
- "type": "integer",
- "format": "int64"
- },
- "jobId": {
- "type": "integer",
- "format": "int64"
- },
- "candidateName": {
- "type": "string"
- },
- "candidateSchool": {
- "type": "string"
- },
- "overallScore": {
- "type": "number"
- },
- "percentile": {
- "type": "number"
- },
- "sampleCount": {
+ "score": {
"type": "integer",
- "format": "int32"
+ "format": "int32",
+ "maximum": 100,
+ "minimum": 0
}
- }
+ },
+ "required": [
+ "score"
+ ]
},
- "CandidateRankingListResponse": {
+ "ScoreTrendResponse": {
"type": "object",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CandidateRankingItem"
- }
- },
- "total": {
+ "companyId": {
"type": "integer",
"format": "int64"
},
- "page": {
+ "months": {
"type": "integer",
"format": "int32"
},
- "size": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TrendItem"
+ }
+ }
+ }
+ },
+ "SendMessageRequest": {
+ "type": "object",
+ "properties": {
+ "conversationId": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "totalPages": {
- "type": "integer",
- "format": "int32"
+ "content": {
+ "type": "string",
+ "maxLength": 2000,
+ "minLength": 0
}
- }
+ },
+ "required": [
+ "content",
+ "conversationId"
+ ]
},
- "CandidateScoreCardResponse": {
+ "SnapshotHistoryItem": {
"type": "object",
"properties": {
- "candidateId": {
+ "id": {
"type": "integer",
"format": "int64"
},
- "status": {
+ "appealId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "action": {
"type": "string"
},
- "overallScore": {
+ "dimension": {
+ "type": "string"
+ },
+ "period": {
+ "type": "string"
+ },
+ "beforeScore": {
"type": "number"
},
- "sampleCount": {
+ "afterScore": {
+ "type": "number"
+ },
+ "beforeVersion": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "feedbackSummary": {
- "$ref": "#/components/schemas/CandidateFeedbackSummary"
+ "afterVersion": {
+ "type": "integer",
+ "format": "int64"
},
- "matchSignals": {
- "$ref": "#/components/schemas/CandidateMatchSignals"
+ "beforeRulesVersion": {
+ "type": "string"
},
- "unsupportedDimensions": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "afterRulesVersion": {
+ "type": "string"
},
- "generatedAt": {
+ "createdAt": {
"type": "string",
"format": "date-time"
}
}
},
- "CandidateScoreTrendItem": {
+ "StudentMatchRuleRequest": {
"type": "object",
"properties": {
- "month": {
- "type": "string"
- },
- "feedbackCount": {
+ "requiredHrScore": {
"type": "integer",
- "format": "int32"
- },
- "averageRating": {
- "type": "number"
- },
- "ratingScore": {
- "type": "number"
+ "format": "int32",
+ "maximum": 100,
+ "minimum": 0
}
- }
+ },
+ "required": [
+ "requiredHrScore"
+ ]
},
- "CandidateScoreTrendResponse": {
+ "StudentPreferenceRequest": {
"type": "object",
"properties": {
- "candidateId": {
+ "expectedSalaryMin": {
"type": "integer",
- "format": "int64"
+ "format": "int32",
+ "minimum": 0
},
- "months": {
+ "expectedSalaryMax": {
"type": "integer",
- "format": "int32"
+ "format": "int32",
+ "minimum": 0
},
- "items": {
+ "preferredCities": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/CandidateScoreTrendItem"
- }
- }
- }
- },
- "CandidateScoringOverviewResponse": {
- "type": "object",
- "properties": {
- "candidateId": {
- "type": "integer",
- "format": "int64"
- },
- "status": {
- "type": "string"
- },
- "overallScore": {
- "type": "number"
- },
- "weights": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 1
+ },
+ "maxItems": 20,
+ "minItems": 0
},
- "dimensions": {
+ "employmentTypes": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/DimensionItem"
- }
- },
- "rulesVersion": {
- "type": "string"
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 1
+ },
+ "maxItems": 20,
+ "minItems": 0
},
- "generatedAt": {
- "type": "string",
- "format": "date-time"
+ "preferredIndustries": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 1
+ },
+ "maxItems": 20,
+ "minItems": 0
},
- "explanationVersion": {
- "type": "string",
- "description": "解释契约版本,与评分规则版本独立"
+ "preferredJobTypes": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 1
+ },
+ "maxItems": 20,
+ "minItems": 0
},
- "coverage": {
- "$ref": "#/components/schemas/CandidateScoringCoverage"
+ "remoteAllowed": {
+ "type": "boolean"
},
- "comparabilityNotice": {
- "type": "string"
+ "salaryRangeValid": {
+ "type": "boolean"
}
}
},
- "CandidateScoringTrendResponse": {
+ "StudentProfileUpdateRequest": {
"type": "object",
"properties": {
- "candidateId": {
- "type": "integer",
- "format": "int64"
+ "realName": {
+ "type": "string",
+ "maxLength": 50,
+ "minLength": 0
},
- "months": {
+ "bio": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 0
+ },
+ "education": {
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 0
+ },
+ "school": {
+ "type": "string",
+ "maxLength": 150,
+ "minLength": 0
+ },
+ "graduationYear": {
"type": "integer",
"format": "int32"
},
- "items": {
+ "resumeUrl": {
+ "type": "string",
+ "maxLength": 500,
+ "minLength": 0
+ },
+ "skills": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/TrendItem"
+ "type": "string"
}
}
}
},
- "CompanyCandidateScoringResponse": {
+ "SubScore": {
"type": "object",
"properties": {
- "applicationId": {
- "type": "integer",
- "format": "int64"
- },
- "overallScore": {
- "type": "number"
- },
- "status": {
+ "name": {
"type": "string"
},
- "dimensions": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CompanyDimensionItem"
- }
+ "score": {
+ "type": "number"
},
- "generatedAt": {
- "type": "string",
- "format": "date-time"
+ "weight": {
+ "type": "number"
},
- "rulesVersion": {
+ "description": {
+ "type": "string"
+ }
+ }
+ },
+ "TagCount": {
+ "type": "object",
+ "properties": {
+ "name": {
"type": "string"
+ },
+ "count": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "CompanyCreateRequest": {
+ "TrendItem": {
"type": "object",
"properties": {
- "name": {
- "type": "string",
- "maxLength": 100,
- "minLength": 0
- },
- "logoUrl": {
- "type": "string"
- },
- "description": {
+ "period": {
"type": "string"
},
- "industry": {
- "type": "string"
+ "overallScore": {
+ "type": "number"
},
- "website": {
+ "rulesVersion": {
"type": "string"
},
- "address": {
- "type": "string"
+ "dimensions": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
}
- },
- "required": [
- "name"
- ]
+ }
},
- "CompanyDimensionItem": {
+ "VerificationDecisionRequest": {
"type": "object",
"properties": {
- "dimension": {
- "type": "string"
- },
- "score": {
- "type": "number"
+ "decision": {
+ "type": "string",
+ "minLength": 1
},
- "status": {
+ "reason": {
"type": "string"
}
- }
+ },
+ "required": [
+ "decision"
+ ]
},
- "CompanyMatchRuleRequest": {
+ "VerificationSubmitRequest": {
"type": "object",
"properties": {
- "requiredCandidateScore": {
- "type": "integer",
- "format": "int32",
- "maximum": 100,
- "minimum": 0
+ "materialsJson": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "requiredCandidateScore"
+ "materialsJson"
]
},
- "CompanyPublicView": {
+ "WeightTemplateResponse": {
"type": "object",
"properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "name": {
+ "code": {
"type": "string"
},
- "logoUrl": {
+ "name": {
"type": "string"
},
"description": {
"type": "string"
},
- "industry": {
- "type": "string"
- },
- "verified": {
- "type": "boolean"
+ "weights": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "number"
+ }
}
}
},
- "CompanyScoreItem": {
+ "InterviewScoreSaveRequest": {
"type": "object",
"properties": {
- "companyId": {
+ "technicalScore": {
"type": "integer",
- "format": "int64"
+ "minimum": 1,
+ "maximum": 5,
+ "nullable": true
},
- "companyName": {
- "type": "string"
+ "communicationScore": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 5,
+ "nullable": true
},
- "avgCandidateScore": {
- "type": "number"
+ "problemSolvingScore": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 5,
+ "nullable": true
},
- "jobCount": {
+ "roleFitScore": {
"type": "integer",
- "format": "int32"
+ "minimum": 1,
+ "maximum": 5,
+ "nullable": true
+ },
+ "professionalismScore": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 5,
+ "nullable": true
+ },
+ "recommendation": {
+ "type": "string",
+ "enum": [
+ "STRONG_HIRE",
+ "HIRE",
+ "NEUTRAL",
+ "NO_HIRE"
+ ],
+ "nullable": true,
+ "description": "企业手动选择,不根据 overallScore 自动推导"
+ },
+ "comment": {
+ "type": "string",
+ "nullable": true
}
- }
+ },
+ "description": "评分草稿保存请求;overallScore 由服务端计算,客户端不得传入"
},
- "CompanyUpdateRequest": {
+ "InterviewScoreResponse": {
"type": "object",
"properties": {
- "name": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "interviewId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "applicationId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "status": {
"type": "string",
- "maxLength": 120,
- "minLength": 0
+ "enum": [
+ "DRAFT",
+ "SUBMITTED"
+ ]
},
- "logoUrl": {
+ "technicalScore": {
+ "type": "integer",
+ "nullable": true
+ },
+ "communicationScore": {
+ "type": "integer",
+ "nullable": true
+ },
+ "problemSolvingScore": {
+ "type": "integer",
+ "nullable": true
+ },
+ "roleFitScore": {
+ "type": "integer",
+ "nullable": true
+ },
+ "professionalismScore": {
+ "type": "integer",
+ "nullable": true
+ },
+ "overallScore": {
+ "type": "number",
+ "format": "decimal",
+ "nullable": true,
+ "description": "由服务端 BigDecimal 计算:(t+c+ps+rf+p)/5,保留两位小数 HALF_UP"
+ },
+ "recommendation": {
"type": "string",
- "maxLength": 500,
- "minLength": 0
+ "enum": [
+ "STRONG_HIRE",
+ "HIRE",
+ "NEUTRAL",
+ "NO_HIRE"
+ ],
+ "nullable": true
},
- "description": {
- "type": "string"
+ "comment": {
+ "type": "string",
+ "nullable": true
},
- "industry": {
+ "submittedAt": {
"type": "string",
- "maxLength": 80,
- "minLength": 0
+ "format": "date-time",
+ "nullable": true
},
- "website": {
+ "version": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "createdAt": {
"type": "string",
- "maxLength": 255,
- "minLength": 0
+ "format": "date-time"
},
- "address": {
+ "updatedAt": {
"type": "string",
- "maxLength": 255,
- "minLength": 0
+ "format": "date-time"
}
},
- "required": [
- "name"
- ]
+ "description": "面试评分响应(脱敏:不返回 companyUserId/studentUserId/evaluatorUserId/手机号/邮箱)"
},
- "CounterOfferCreateRequest": {
+ "ApiResponseInterviewScoreResponse": {
"type": "object",
"properties": {
- "proposedSalaryMin": {
+ "code": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int32"
},
- "proposedSalaryMax": {
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/InterviewScoreResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "InterviewScoreHistoryItem": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "scoreId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "interviewId": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int64"
},
- "proposedOnboardingDate": {
+ "fromStatus": {
"type": "string",
- "format": "date"
+ "enum": [
+ "DRAFT",
+ "SUBMITTED"
+ ],
+ "nullable": true
},
- "reason": {
- "type": "string",
- "maxLength": 2000,
- "minLength": 0
- }
- }
- },
- "CreateAppealRequest": {
- "type": "object",
- "properties": {
- "dimension": {
+ "toStatus": {
"type": "string",
- "minLength": 1
+ "enum": [
+ "DRAFT",
+ "SUBMITTED"
+ ]
},
- "period": {
+ "actorRole": {
"type": "string",
- "minLength": 1
+ "example": "COMPANY"
},
- "reason": {
- "type": "string"
+ "snapshot": {
+ "type": "object",
+ "additionalProperties": {}
},
- "idempotencyKey": {
+ "createdAt": {
"type": "string",
- "maxLength": 64,
- "minLength": 0
+ "format": "date-time"
}
},
- "required": [
- "dimension",
- "period"
- ]
+ "description": "评分历史条目(脱敏:不返回 actorUserId/手机号/邮箱)"
},
- "CreateConversationRequest": {
+ "ApiResponseListInterviewScoreHistoryItem": {
"type": "object",
"properties": {
- "participantUserId": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/InterviewScoreHistoryItem"
+ }
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
- },
- "required": [
- "participantUserId"
- ]
+ }
},
- "DashboardOverviewResponse": {
+ "CreateReportRequest": {
"type": "object",
"properties": {
- "companyId": {
- "type": "integer",
- "format": "int64"
+ "targetType": {
+ "type": "string",
+ "enum": [
+ "USER",
+ "MESSAGE"
+ ],
+ "description": "举报目标类型;USER 必填 targetUserId,MESSAGE 必填 messageId"
},
- "totalJobs": {
+ "targetUserId": {
"type": "integer",
- "format": "int32"
+ "format": "int64",
+ "description": "targetType=USER 时必填"
},
- "publishedJobs": {
+ "messageId": {
"type": "integer",
- "format": "int32"
- },
- "avgJobScore": {
- "type": "number"
+ "format": "int64",
+ "description": "targetType=MESSAGE 时必填"
},
- "totalCandidates": {
- "type": "integer",
- "format": "int32"
+ "category": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "举报分类,如 HARASSMENT"
},
- "avgCandidateScore": {
- "type": "number"
+ "reason": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 1000
},
- "scoreDistribution": {
- "type": "object",
- "additionalProperties": {
- "type": "integer",
- "format": "int32"
- }
+ "evidenceUrls": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "description": "最多 5 个,仅 http/https,最多 500 字符"
},
- "updatedAt": {
+ "idempotencyKey": {
"type": "string",
- "format": "date-time"
+ "maxLength": 64,
+ "description": "幂等键(可选)"
}
}
},
- "DataSourceItem": {
+ "ReportDecisionRequest": {
"type": "object",
"properties": {
- "source": {
- "type": "string"
- },
- "time": {
+ "decision": {
"type": "string",
- "format": "date-time"
+ "enum": [
+ "RESOLVED",
+ "REJECTED"
+ ]
},
"note": {
- "type": "string"
+ "type": "string",
+ "maxLength": 1000,
+ "description": "REJECTED 必填"
}
}
},
- "DimensionItem": {
+ "ReportResponse": {
"type": "object",
"properties": {
- "dimension": {
- "type": "string"
- },
- "score": {
- "type": "number"
+ "id": {
+ "type": "integer",
+ "format": "int64"
},
- "status": {
- "type": "string"
+ "targetType": {
+ "type": "string",
+ "enum": [
+ "USER",
+ "MESSAGE"
+ ]
},
- "weight": {
- "type": "number"
+ "targetUserId": {
+ "type": "integer",
+ "format": "int64"
},
- "summary": {
- "type": "string"
- }
- }
- },
- "DimensionScoreDetailResponse": {
- "type": "object",
- "properties": {
- "dimension": {
- "type": "string"
+ "messageId": {
+ "type": "integer",
+ "format": "int64"
},
- "score": {
- "type": "number"
+ "reportedUserId": {
+ "type": "integer",
+ "format": "int64"
},
- "status": {
+ "category": {
"type": "string"
},
- "subScores": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SubScore"
- }
+ "reason": {
+ "type": "string"
},
- "reasons": {
+ "evidenceUrls": {
"type": "array",
"items": {
"type": "string"
}
},
- "dataSources": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/DataSourceItem"
- }
- },
- "updatedAt": {
+ "status": {
"type": "string",
- "format": "date-time"
+ "enum": [
+ "PENDING",
+ "RESOLVED",
+ "REJECTED"
+ ]
},
- "rulesVersion": {
- "type": "string"
+ "decision": {
+ "type": "string",
+ "enum": [
+ "RESOLVED",
+ "REJECTED"
+ ]
},
- "displayName": {
+ "decisionNote": {
"type": "string"
},
- "whatItMeasures": {
- "type": "string"
+ "decidedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "interpretation": {
- "type": "string"
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
},
- "limitations": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "evidenceLevel": {
+ "messagePreview": {
"type": "string",
- "enum": [
- "DIRECT_RULE",
- "SELF_REPORTED",
- "BEHAVIOR_PROXY",
- "UNVALIDATED_PROXY"
- ]
+ "description": "MESSAGE 举报的脱敏消息预览,不返回会话其他敏感内容"
},
- "ruleContributions": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CandidateScoringRuleContribution"
- }
+ "reportedUser": {
+ "$ref": "#/components/schemas/ReportResponseReportedUser"
},
- "improvementActions": {
+ "history": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/ReportResponseDecisionHistoryItem"
}
+ }
+ }
+ },
+ "ReportResponseReportedUser": {
+ "type": "object",
+ "properties": {
+ "userId": {
+ "type": "integer",
+ "format": "int64"
},
- "explanationVersion": {
+ "nickname": {
"type": "string"
},
- "validity": {
- "$ref": "#/components/schemas/CandidateScoringValidity"
- },
- "calculatedAt": {
- "type": "string",
- "format": "date-time"
+ "role": {
+ "type": "string"
}
}
},
- "DimensionScoreItem": {
+ "ReportResponseDecisionHistoryItem": {
"type": "object",
"properties": {
- "dimension": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "fromStatus": {
"type": "string"
},
- "score": {
- "type": "number"
+ "toStatus": {
+ "type": "string"
},
- "status": {
+ "actorUserId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "actorRole": {
+ "type": "string"
+ },
+ "note": {
"type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "InterviewCancelRequest": {
+ "BlockRelationResponse": {
"type": "object",
"properties": {
- "reason": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "blockedUserId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "nickname": {
"type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "InterviewCreateRequest": {
+ "ApiResponseReportResponse": {
"type": "object",
"properties": {
- "roundNo": {
+ "code": {
"type": "integer",
"format": "int32"
},
- "title": {
- "type": "string",
- "maxLength": 200,
- "minLength": 0
+ "message": {
+ "type": "string"
},
- "interviewType": {
- "type": "string",
- "minLength": 1
+ "data": {
+ "$ref": "#/components/schemas/ReportResponse"
},
- "startAt": {
- "type": "string",
- "format": "date-time"
+ "requestId": {
+ "type": "string"
},
- "endAt": {
+ "timestamp": {
"type": "string",
"format": "date-time"
+ }
+ }
+ },
+ "ApiResponsePageResponseReportResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "timezone": {
+ "message": {
"type": "string"
},
- "meetingUrl": {
- "type": "string"
+ "data": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ReportResponse"
+ }
+ },
+ "totalElements": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "size": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
},
- "address": {
+ "requestId": {
"type": "string"
},
- "interviewerName": {
+ "timestamp": {
"type": "string",
- "maxLength": 100,
- "minLength": 0
- },
- "notes": {
- "type": "string"
+ "format": "date-time"
}
- },
- "required": [
- "endAt",
- "interviewType",
- "startAt",
- "title"
- ]
+ }
},
- "InterviewRespondRequest": {
+ "ApiResponseBlockRelationResponse": {
"type": "object",
"properties": {
- "action": {
- "type": "string",
- "minLength": 1
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "reason": {
- "type": "string"
- }
- },
- "required": [
- "action"
- ]
- },
- "InterviewUpdateRequest": {
- "type": "object",
- "properties": {
- "title": {
+ "message": {
"type": "string"
},
- "startAt": {
- "type": "string",
- "format": "date-time"
+ "data": {
+ "$ref": "#/components/schemas/BlockRelationResponse"
},
- "endAt": {
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
"format": "date-time"
+ }
+ }
+ },
+ "ApiResponsePageResponseBlockRelationResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "timezone": {
+ "message": {
"type": "string"
},
- "meetingUrl": {
- "type": "string"
+ "data": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BlockRelationResponse"
+ }
+ },
+ "totalElements": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "size": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
},
- "address": {
+ "requestId": {
"type": "string"
},
- "interviewerName": {
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "CreateAbilityAttemptRequest": {
+ "type": "object",
+ "required": [
+ "typeCode"
+ ],
+ "properties": {
+ "typeCode": {
"type": "string"
},
- "notes": {
- "type": "string"
+ "idempotencyKey": {
+ "type": "string",
+ "maxLength": 64
+ }
+ }
+ },
+ "SaveAbilityAnswersRequest": {
+ "type": "object",
+ "required": [
+ "answers"
+ ],
+ "properties": {
+ "answers": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityAnswerItem"
+ }
+ }
+ }
+ },
+ "AbilityAnswerItem": {
+ "type": "object",
+ "required": [
+ "attemptQuestionId",
+ "selectedOptionId"
+ ],
+ "properties": {
+ "attemptQuestionId": {
+ "type": "integer",
+ "format": "int64"
},
- "timeRangeValid": {
- "type": "boolean"
+ "selectedOptionId": {
+ "type": "string",
+ "maxLength": 4
}
}
},
- "JobCreateRequest": {
+ "AbilityTypeResponse": {
"type": "object",
"properties": {
- "title": {
- "type": "string",
- "maxLength": 120,
- "minLength": 0
+ "typeCode": {
+ "type": "string"
},
- "description": {
- "type": "string",
- "minLength": 1
+ "displayName": {
+ "type": "string"
},
- "requirements": {
+ "description": {
"type": "string"
},
- "city": {
- "type": "string",
- "maxLength": 80,
- "minLength": 0
+ "questionCount": {
+ "type": "integer",
+ "format": "int32"
},
- "employmentType": {
- "type": "string",
- "maxLength": 30,
- "minLength": 0
+ "attemptQuestionCount": {
+ "type": "integer",
+ "format": "int32"
},
- "salaryMin": {
+ "timeLimitMinutes": {
"type": "integer",
"format": "int32"
},
- "salaryMax": {
+ "resultValidDays": {
"type": "integer",
"format": "int32"
+ },
+ "status": {
+ "type": "string"
}
- },
- "required": [
- "city",
- "description",
- "employmentType",
- "title"
- ]
+ }
},
- "JobRankingItem": {
+ "AbilityAttemptResponse": {
"type": "object",
"properties": {
- "jobId": {
+ "attemptId": {
"type": "integer",
"format": "int64"
},
- "title": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "employmentType": {
+ "status": {
"type": "string"
},
- "avgRating": {
- "type": "number"
- },
- "reviewCount": {
+ "answeredCount": {
"type": "integer",
"format": "int32"
},
- "rank": {
+ "totalQuestions": {
"type": "integer",
"format": "int32"
},
- "cohortSize": {
+ "completionRate": {
+ "type": "number"
+ },
+ "startedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "expiresAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "remainingSeconds": {
"type": "integer",
- "format": "int32"
+ "format": "int64",
+ "nullable": true
},
- "dimensionAverages": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
+ "questions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityAttemptQuestionView"
}
}
}
},
- "JobRankingListResponse": {
+ "AbilityAttemptQuestionView": {
"type": "object",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/JobRankingItem"
- }
- },
- "total": {
+ "attemptQuestionId": {
"type": "integer",
"format": "int64"
},
- "page": {
+ "position": {
"type": "integer",
"format": "int32"
},
- "size": {
- "type": "integer",
- "format": "int32"
+ "itemType": {
+ "type": "string"
},
- "totalPages": {
- "type": "integer",
- "format": "int32"
+ "stem": {
+ "type": "string"
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityOptionView"
+ }
+ },
+ "selectedOptionId": {
+ "type": "string"
}
}
},
- "JobReviewCreateRequest": {
+ "AbilityOptionView": {
"type": "object",
"properties": {
- "rating": {
+ "optionId": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ }
+ },
+ "AbilityResultResponse": {
+ "type": "object",
+ "properties": {
+ "attemptId": {
"type": "integer",
- "format": "int32",
- "maximum": 5,
- "minimum": 1
+ "format": "int64"
},
- "content": {
+ "typeCode": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "validityStatus": {
+ "type": "string"
+ },
+ "validUntil": {
"type": "string",
- "maxLength": 1000,
- "minLength": 0
+ "format": "date-time",
+ "nullable": true
},
- "tags": {
+ "dimensionScores": {
"type": "array",
"items": {
- "type": "string",
- "maxLength": 50,
- "minLength": 1
- },
- "maxItems": 10,
- "minItems": 0
+ "$ref": "#/components/schemas/AbilityDimensionScore"
+ }
},
- "dimensionScores": {
- "type": "object",
- "additionalProperties": {
- "type": "integer",
- "format": "int32"
+ "overallScore": {
+ "type": "number"
+ },
+ "weaknesses": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityWeakness"
}
- }
- },
- "required": [
- "content",
- "rating"
- ]
- },
- "JobReviewUpdateRequest": {
- "type": "object",
- "properties": {
- "rating": {
+ },
+ "improvementAreas": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityImprovementArea"
+ }
+ },
+ "radar": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityRadarEntry"
+ }
+ },
+ "answeredCount": {
"type": "integer",
- "format": "int32",
- "maximum": 5,
- "minimum": 1
+ "format": "int32"
},
- "content": {
- "type": "string",
- "maxLength": 1000,
- "minLength": 1
+ "completionRate": {
+ "type": "number"
},
- "tags": {
+ "questionFeedback": {
"type": "array",
"items": {
- "type": "string",
- "maxLength": 50,
- "minLength": 1
- },
- "maxItems": 10,
- "minItems": 0
+ "$ref": "#/components/schemas/AbilityQuestionFeedback"
+ }
},
- "status": {
+ "questionSetVersion": {
+ "type": "string"
+ },
+ "rulesVersion": {
+ "type": "string"
+ },
+ "generatedAt": {
"type": "string",
- "pattern": "^(PUBLISHED|HIDDEN)$"
+ "format": "date-time"
},
- "dimensionScores": {
- "type": "object",
- "additionalProperties": {
- "type": "integer",
- "format": "int32"
- }
+ "disclaimer": {
+ "type": "string"
}
}
},
- "JobStatusRequest": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string",
- "minLength": 1,
- "pattern": "^(PUBLISHED|CLOSED)$"
- }
- },
- "required": [
- "status"
- ]
- },
- "JobUpdateRequest": {
+ "AbilityDimensionScore": {
"type": "object",
"properties": {
- "title": {
- "type": "string",
- "maxLength": 120,
- "minLength": 0
- },
- "description": {
- "type": "string"
- },
- "requirements": {
+ "code": {
"type": "string"
},
- "city": {
- "type": "string",
- "maxLength": 80,
- "minLength": 0
- },
- "employmentType": {
- "type": "string",
- "maxLength": 30,
- "minLength": 0
+ "score": {
+ "type": "number"
},
- "salaryMin": {
+ "answeredCount": {
"type": "integer",
"format": "int32"
+ }
+ }
+ },
+ "AbilityWeakness": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "string"
},
- "salaryMax": {
- "type": "integer",
- "format": "int32"
+ "score": {
+ "type": "number"
}
}
},
- "LoginRequest": {
+ "AbilityImprovementArea": {
"type": "object",
"properties": {
- "phone": {
- "type": "string",
- "minLength": 1,
- "pattern": "[0-9]{11}"
+ "dimension": {
+ "type": "string"
},
- "code": {
- "type": "string",
- "minLength": 1,
- "pattern": "[0-9]{6}"
+ "currentScore": {
+ "type": "number"
},
- "purpose": {
+ "summary": {
"type": "string"
+ },
+ "actions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
- },
- "required": [
- "code",
- "phone"
- ]
+ }
},
- "MatchSignal": {
+ "AbilityRadarEntry": {
"type": "object",
"properties": {
- "average": {
- "type": "number"
+ "code": {
+ "type": "string"
},
- "sampleCount": {
- "type": "integer",
- "format": "int32"
+ "value": {
+ "type": "number"
}
}
},
- "OfferCreateRequest": {
+ "AbilityQuestionFeedback": {
"type": "object",
"properties": {
- "applicationId": {
+ "attemptQuestionId": {
"type": "integer",
"format": "int64"
},
- "title": {
- "type": "string",
- "maxLength": 120,
- "minLength": 0
- },
- "salaryMin": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "salaryMax": {
+ "position": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int32"
},
- "salaryCurrency": {
- "type": "string",
- "maxLength": 10,
- "minLength": 0
+ "stem": {
+ "type": "string"
},
- "salaryPeriod": {
- "type": "string",
- "pattern": "^(MONTH|YEAR|HOUR)$"
+ "selectedOptionId": {
+ "type": "string"
},
- "workCity": {
- "type": "string",
- "maxLength": 80,
- "minLength": 0
+ "awardedScore": {
+ "type": "integer",
+ "format": "int32"
},
- "employmentType": {
- "type": "string",
- "pattern": "^(FULL_TIME|PART_TIME|INTERN|INTERNSHIP)$"
+ "maxScore": {
+ "type": "integer",
+ "format": "int32"
},
- "probationMonths": {
+ "explanation": {
+ "type": "string"
+ }
+ }
+ },
+ "AbilityHistoryItem": {
+ "type": "object",
+ "properties": {
+ "attemptId": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int64"
},
- "benefits": {
- "type": "string",
- "maxLength": 2000,
- "minLength": 0
+ "typeCode": {
+ "type": "string"
},
- "description": {
- "type": "string",
- "maxLength": 5000,
- "minLength": 0
+ "status": {
+ "type": "string"
},
- "expireAt": {
- "type": "string",
- "format": "date-time"
+ "validityStatus": {
+ "type": "string"
},
- "onboardingDate": {
- "type": "string",
- "format": "date"
+ "overallScore": {
+ "type": "number"
},
- "baseSalary": {
+ "answeredCount": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int32"
},
- "housingAllowance": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
+ "completionRate": {
+ "type": "number"
},
- "annualBonusMonths": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
+ "startedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
},
- "otherAllowances": {
+ "expiresAt": {
"type": "string",
- "maxLength": 1000,
- "minLength": 0
- }
- },
- "required": [
- "applicationId",
- "description",
- "expireAt",
- "title",
- "workCity"
- ]
- },
- "OfferStatusRequest": {
- "type": "object",
- "properties": {
- "status": {
+ "format": "date-time",
+ "nullable": true
+ },
+ "completedAt": {
"type": "string",
- "minLength": 1,
- "pattern": "^(SENT|NEGOTIATING|ACCEPTED|REJECTED|EXPIRED|WITHDRAWN)$"
+ "format": "date-time",
+ "nullable": true
},
- "reason": {
+ "validUntil": {
"type": "string",
- "maxLength": 255,
- "minLength": 0
+ "format": "date-time",
+ "nullable": true
}
- },
- "required": [
- "status"
- ]
+ }
},
- "OfferUpdateRequest": {
+ "ApiResponseAbilityTypeResponse": {
"type": "object",
"properties": {
- "title": {
- "type": "string",
- "maxLength": 120,
- "minLength": 0
- },
- "salaryMin": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "salaryMax": {
+ "code": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int32"
},
- "salaryCurrency": {
- "type": "string",
- "maxLength": 10,
- "minLength": 0
+ "message": {
+ "type": "string"
},
- "salaryPeriod": {
- "type": "string",
- "pattern": "^(MONTH|YEAR|HOUR)$"
+ "data": {
+ "$ref": "#/components/schemas/AbilityTypeResponse"
},
- "workCity": {
- "type": "string",
- "maxLength": 80,
- "minLength": 0
+ "requestId": {
+ "type": "string"
},
- "employmentType": {
+ "timestamp": {
"type": "string",
- "pattern": "^(FULL_TIME|PART_TIME|INTERN|INTERNSHIP)$"
- },
- "probationMonths": {
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAbilityAttemptResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int32"
},
- "benefits": {
- "type": "string",
- "maxLength": 2000,
- "minLength": 0
+ "message": {
+ "type": "string"
},
- "description": {
- "type": "string",
- "maxLength": 5000,
- "minLength": 0
+ "data": {
+ "$ref": "#/components/schemas/AbilityAttemptResponse"
},
- "expireAt": {
- "type": "string",
- "format": "date-time"
+ "requestId": {
+ "type": "string"
},
- "onboardingDate": {
+ "timestamp": {
"type": "string",
- "format": "date"
- },
- "baseSalary": {
+ "format": "date-time"
+ }
+ }
+ },
+ "ApiResponseAbilityResultResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
"type": "integer",
- "format": "int32",
- "minimum": 0
+ "format": "int32"
},
- "housingAllowance": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
+ "message": {
+ "type": "string"
},
- "annualBonusMonths": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
+ "data": {
+ "$ref": "#/components/schemas/AbilityResultResponse"
},
- "otherAllowances": {
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "maxLength": 1000,
- "minLength": 0
+ "format": "date-time"
}
}
},
- "PersonalizedScoreResponse": {
+ "ApiResponsePageResponseAbilityHistoryItem": {
"type": "object",
"properties": {
- "jobId": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "score": {
- "type": "number"
+ "message": {
+ "type": "string"
},
- "status": {
+ "data": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AbilityHistoryItem"
+ }
+ },
+ "totalElements": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "size": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "requestId": {
"type": "string"
},
- "source": {
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "RiskRuleResponse": {
+ "type": "object",
+ "properties": {
+ "ruleCode": {
"type": "string"
},
- "templateCode": {
+ "sourceAction": {
"type": "string"
},
- "configuredWeights": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
+ "thresholdCount": {
+ "type": "integer",
+ "format": "int32"
},
- "effectiveWeights": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
+ "windowMinutes": {
+ "type": "integer",
+ "format": "int32"
},
- "dimensionScores": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
+ "severity": {
+ "type": "string"
},
- "coveredWeight": {
- "type": "number"
+ "enabled": {
+ "type": "boolean"
},
- "missingDimensions": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "version": {
+ "type": "integer",
+ "format": "int64"
}
}
},
- "PrivacySettingsResponse": {
+ "RiskEventResponse": {
"type": "object",
"properties": {
- "id": {
+ "eventId": {
"type": "integer",
- "format": "int64",
- "example": 1,
- "nullable": true
+ "format": "int64"
},
- "studentUserId": {
- "type": "integer",
- "format": "int64",
- "example": 2
+ "ruleCode": {
+ "type": "string"
},
- "resumeVisibility": {
- "$ref": "#/components/schemas/ResumeVisibility",
- "description": "简历可见性(PRIVATE/APPLIED_COMPANIES/VERIFIED_COMPANIES)",
- "example": "APPLIED_COMPANIES"
+ "sourceAction": {
+ "type": "string"
},
- "contactVisible": {
- "type": "boolean",
- "example": true
+ "severity": {
+ "type": "string"
},
- "version": {
+ "status": {
+ "type": "string"
+ },
+ "occurrenceCount": {
"type": "integer",
- "format": "int64",
- "example": 0
+ "format": "int32"
},
- "createdAt": {
+ "windowStartedAt": {
"type": "string",
- "format": "date-time",
- "nullable": true
+ "format": "date-time"
},
- "updatedAt": {
+ "windowEndedAt": {
"type": "string",
- "format": "date-time",
- "nullable": true
+ "format": "date-time"
+ },
+ "detectedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
}
}
},
- "PrivacySettingsUpdateRequest": {
+ "RiskSeverityCount": {
"type": "object",
- "required": [
- "resumeVisibility",
- "contactVisible"
- ],
"properties": {
- "resumeVisibility": {
- "$ref": "#/components/schemas/ResumeVisibility",
- "description": "简历可见性(必填)",
- "example": "APPLIED_COMPANIES"
- },
- "contactVisible": {
- "type": "boolean",
- "description": "联系方式是否对企业可见(必填)",
- "example": true
+ "severity": {
+ "type": "string"
},
- "version": {
+ "count": {
"type": "integer",
- "format": "int64",
- "description": "乐观锁版本号(可选)",
- "example": 0
+ "format": "int64"
}
}
},
- "ResumeVisibility": {
- "type": "string",
- "enum": [
- "PRIVATE",
- "APPLIED_COMPANIES",
- "VERIFIED_COMPANIES"
- ],
- "description": "简历可见性:PRIVATE 私有;APPLIED_COMPANIES 仅对企业有效投递可见;VERIFIED_COMPANIES 仅对认证企业可见",
- "example": "PRIVATE"
+ "RiskRuleCount": {
+ "type": "object",
+ "properties": {
+ "ruleCode": {
+ "type": "string"
+ },
+ "count": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
},
- "ReviewDecisionRequest": {
+ "RiskOverviewResponse": {
"type": "object",
"properties": {
- "decision": {
- "type": "string",
- "minLength": 1,
- "pattern": "^(APPROVED|REJECTED)$"
+ "openCount": {
+ "type": "integer",
+ "format": "int64"
},
- "reason": {
+ "bySeverity": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RiskSeverityCount"
+ }
+ },
+ "byRule": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RiskRuleCount"
+ }
+ },
+ "lastDetectedAt": {
"type": "string",
- "maxLength": 500,
- "minLength": 0
+ "format": "date-time",
+ "nullable": true
}
- },
- "required": [
- "decision"
- ]
+ }
},
- "ReviewWeightResponse": {
+ "RiskTrendPoint": {
"type": "object",
"properties": {
- "source": {
- "type": "string"
- },
- "templateCode": {
- "type": "string"
- },
- "configuredWeights": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
- },
- "updatedAt": {
+ "time": {
"type": "string",
"format": "date-time"
+ },
+ "count": {
+ "type": "integer",
+ "format": "int64"
}
}
},
- "SaveWeightRequest": {
+ "RiskTrendResponse": {
"type": "object",
"properties": {
- "templateCode": {
+ "bucket": {
"type": "string"
},
- "weights": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RiskTrendPoint"
}
}
}
},
- "ScoreRequest": {
+ "RiskDistributionRow": {
"type": "object",
"properties": {
- "score": {
+ "ruleCode": {
+ "type": "string"
+ },
+ "severity": {
+ "type": "string"
+ },
+ "count": {
"type": "integer",
- "format": "int32",
- "maximum": 100,
- "minimum": 0
+ "format": "int64"
}
- },
- "required": [
- "score"
- ]
+ }
},
- "ScoreTrendResponse": {
+ "RiskDistributionResponse": {
"type": "object",
"properties": {
- "companyId": {
- "type": "integer",
- "format": "int64"
- },
- "months": {
- "type": "integer",
- "format": "int32"
- },
"items": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/TrendItem"
+ "$ref": "#/components/schemas/RiskDistributionRow"
}
}
}
},
- "SendMessageRequest": {
+ "RiskRuleUpdateRequest": {
"type": "object",
"properties": {
- "conversationId": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "thresholdCount": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "content": {
- "type": "string",
- "maxLength": 2000,
- "minLength": 0
+ "windowMinutes": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "severity": {
+ "type": "string"
+ },
+ "expectedVersion": {
+ "type": "integer",
+ "format": "int64"
}
},
"required": [
- "content",
- "conversationId"
+ "enabled",
+ "thresholdCount",
+ "windowMinutes",
+ "severity",
+ "expectedVersion"
]
},
- "SnapshotHistoryItem": {
+ "RiskEventActionRequest": {
"type": "object",
"properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "appealId": {
- "type": "integer",
- "format": "int64"
- },
"action": {
"type": "string"
},
- "dimension": {
- "type": "string"
- },
- "period": {
+ "reasonCode": {
"type": "string"
},
- "beforeScore": {
- "type": "number"
- },
- "afterScore": {
- "type": "number"
- },
- "beforeVersion": {
- "type": "integer",
- "format": "int64"
- },
- "afterVersion": {
+ "expectedVersion": {
"type": "integer",
"format": "int64"
- },
- "beforeRulesVersion": {
- "type": "string"
- },
- "afterRulesVersion": {
- "type": "string"
- },
- "createdAt": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "StudentMatchRuleRequest": {
- "type": "object",
- "properties": {
- "requiredHrScore": {
- "type": "integer",
- "format": "int32",
- "maximum": 100,
- "minimum": 0
}
},
"required": [
- "requiredHrScore"
+ "action",
+ "reasonCode",
+ "expectedVersion"
]
},
- "StudentPreferenceRequest": {
+ "ApiResponseRiskOverviewResponse": {
"type": "object",
"properties": {
- "expectedSalaryMin": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "expectedSalaryMax": {
+ "code": {
"type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "preferredCities": {
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 100,
- "minLength": 1
- },
- "maxItems": 20,
- "minItems": 0
- },
- "employmentTypes": {
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 100,
- "minLength": 1
- },
- "maxItems": 20,
- "minItems": 0
- },
- "preferredIndustries": {
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 100,
- "minLength": 1
- },
- "maxItems": 20,
- "minItems": 0
- },
- "preferredJobTypes": {
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 100,
- "minLength": 1
- },
- "maxItems": 20,
- "minItems": 0
- },
- "remoteAllowed": {
- "type": "boolean"
- },
- "salaryRangeValid": {
- "type": "boolean"
- }
- }
- },
- "StudentProfileUpdateRequest": {
- "type": "object",
- "properties": {
- "realName": {
- "type": "string",
- "maxLength": 50,
- "minLength": 0
+ "format": "int32"
},
- "bio": {
+ "message": {
"type": "string"
},
- "location": {
- "type": "string",
- "maxLength": 100,
- "minLength": 0
- },
- "education": {
- "type": "string",
- "maxLength": 100,
- "minLength": 0
- },
- "school": {
- "type": "string",
- "maxLength": 150,
- "minLength": 0
+ "data": {
+ "$ref": "#/components/schemas/RiskOverviewResponse"
},
- "graduationYear": {
- "type": "integer",
- "format": "int32"
+ "requestId": {
+ "type": "string"
},
- "resumeUrl": {
+ "timestamp": {
"type": "string",
- "maxLength": 500,
- "minLength": 0
- },
- "skills": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "format": "date-time"
}
}
},
- "SubScore": {
+ "ApiResponseRiskTrendResponse": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "score": {
- "type": "number"
+ "message": {
+ "type": "string"
},
- "weight": {
- "type": "number"
+ "data": {
+ "$ref": "#/components/schemas/RiskTrendResponse"
},
- "description": {
+ "requestId": {
"type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "TagCount": {
+ "ApiResponseRiskDistributionResponse": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
- "count": {
+ "code": {
"type": "integer",
"format": "int32"
- }
- }
- },
- "TrendItem": {
- "type": "object",
- "properties": {
- "period": {
+ },
+ "message": {
"type": "string"
},
- "overallScore": {
- "type": "number"
+ "data": {
+ "$ref": "#/components/schemas/RiskDistributionResponse"
},
- "rulesVersion": {
+ "requestId": {
"type": "string"
},
- "dimensions": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "VerificationDecisionRequest": {
+ "ApiResponsePageResponseRiskEventResponse": {
"type": "object",
"properties": {
- "decision": {
- "type": "string",
- "minLength": 1
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "reason": {
+ "message": {
"type": "string"
- }
- },
- "required": [
- "decision"
- ]
- },
- "VerificationSubmitRequest": {
- "type": "object",
- "properties": {
- "materialsJson": {
+ },
+ "data": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RiskEventResponse"
+ }
+ },
+ "totalElements": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "page": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "size": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "minLength": 1
+ "format": "date-time"
}
- },
- "required": [
- "materialsJson"
- ]
+ }
},
- "WeightTemplateResponse": {
+ "ApiResponseListRiskRuleResponse": {
"type": "object",
"properties": {
"code": {
- "type": "string"
+ "type": "integer",
+ "format": "int32"
},
- "name": {
+ "message": {
"type": "string"
},
- "description": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RiskRuleResponse"
+ }
+ },
+ "requestId": {
"type": "string"
},
- "weights": {
- "type": "object",
- "additionalProperties": {
- "type": "number"
- }
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "InterviewScoreSaveRequest": {
+ "ApiResponseRiskRuleResponse": {
"type": "object",
"properties": {
- "technicalScore": {
- "type": "integer",
- "minimum": 1,
- "maximum": 5,
- "nullable": true
- },
- "communicationScore": {
- "type": "integer",
- "minimum": 1,
- "maximum": 5,
- "nullable": true
- },
- "problemSolvingScore": {
+ "code": {
"type": "integer",
- "minimum": 1,
- "maximum": 5,
- "nullable": true
+ "format": "int32"
},
- "roleFitScore": {
- "type": "integer",
- "minimum": 1,
- "maximum": 5,
- "nullable": true
+ "message": {
+ "type": "string"
},
- "professionalismScore": {
- "type": "integer",
- "minimum": 1,
- "maximum": 5,
- "nullable": true
+ "data": {
+ "$ref": "#/components/schemas/RiskRuleResponse"
},
- "recommendation": {
- "type": "string",
- "enum": [
- "STRONG_HIRE",
- "HIRE",
- "NEUTRAL",
- "NO_HIRE"
- ],
- "nullable": true,
- "description": "企业手动选择,不根据 overallScore 自动推导"
+ "requestId": {
+ "type": "string"
},
- "comment": {
+ "timestamp": {
"type": "string",
- "nullable": true
+ "format": "date-time"
}
- },
- "description": "评分草稿保存请求;overallScore 由服务端计算,客户端不得传入"
+ }
},
- "InterviewScoreResponse": {
+ "ApiResponseRiskEventResponse": {
"type": "object",
"properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "interviewId": {
- "type": "integer",
- "format": "int64"
- },
- "applicationId": {
- "type": "integer",
- "format": "int64"
- },
- "status": {
- "type": "string",
- "enum": [
- "DRAFT",
- "SUBMITTED"
- ]
- },
- "technicalScore": {
- "type": "integer",
- "nullable": true
- },
- "communicationScore": {
- "type": "integer",
- "nullable": true
- },
- "problemSolvingScore": {
- "type": "integer",
- "nullable": true
- },
- "roleFitScore": {
- "type": "integer",
- "nullable": true
- },
- "professionalismScore": {
+ "code": {
"type": "integer",
- "nullable": true
+ "format": "int32"
},
- "overallScore": {
- "type": "number",
- "format": "decimal",
- "nullable": true,
- "description": "由服务端 BigDecimal 计算:(t+c+ps+rf+p)/5,保留两位小数 HALF_UP"
+ "message": {
+ "type": "string"
},
- "recommendation": {
- "type": "string",
- "enum": [
- "STRONG_HIRE",
- "HIRE",
- "NEUTRAL",
- "NO_HIRE"
- ],
- "nullable": true
+ "data": {
+ "$ref": "#/components/schemas/RiskEventResponse"
},
- "comment": {
- "type": "string",
- "nullable": true
+ "requestId": {
+ "type": "string"
},
- "submittedAt": {
+ "timestamp": {
"type": "string",
- "format": "date-time",
- "nullable": true
+ "format": "date-time"
+ }
+ }
+ },
+ "TalentDiscoveryPreferenceResponse": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
},
"version": {
"type": "integer",
@@ -13422,77 +16823,134 @@
"type": "string",
"format": "date-time"
}
- },
- "description": "面试评分响应(脱敏:不返回 companyUserId/studentUserId/evaluatorUserId/手机号/邮箱)"
+ }
},
- "ApiResponseInterviewScoreResponse": {
+ "TalentDiscoveryPreferenceUpdateRequest": {
"type": "object",
+ "required": [
+ "enabled"
+ ],
"properties": {
- "code": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "expectedVersion": {
"type": "integer",
- "format": "int32"
+ "format": "int64",
+ "minimum": 0
+ }
+ }
+ },
+ "TalentDiscoveryCandidateResponse": {
+ "type": "object",
+ "properties": {
+ "candidateKey": {
+ "type": "string"
},
- "message": {
+ "candidateLabel": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/InterviewScoreResponse"
+ "city": {
+ "type": "string"
},
- "requestId": {
+ "education": {
"type": "string"
},
- "timestamp": {
+ "graduationYear": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "skills": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "fitBand": {
"type": "string",
- "format": "date-time"
+ "enum": [
+ "HIGH",
+ "MEDIUM",
+ "BASIC"
+ ]
+ },
+ "summary": {
+ "type": "string"
+ },
+ "signalsAvailable": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "PREFERENCE",
+ "RIASEC",
+ "ABILITY"
+ ]
+ }
}
}
},
- "InterviewScoreHistoryItem": {
+ "TalentDiscoveryPageResponse": {
"type": "object",
"properties": {
- "id": {
+ "mode": {
+ "type": "string",
+ "enum": [
+ "PERSONALIZED",
+ "UNAVAILABLE",
+ "NO_ELIGIBLE_CANDIDATE"
+ ]
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TalentDiscoveryCandidateResponse"
+ }
+ },
+ "total": {
"type": "integer",
"format": "int64"
},
- "scoreId": {
+ "page": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "interviewId": {
+ "size": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "fromStatus": {
- "type": "string",
- "enum": [
- "DRAFT",
- "SUBMITTED"
- ],
- "nullable": true
+ "totalPages": {
+ "type": "integer",
+ "format": "int32"
},
- "toStatus": {
- "type": "string",
- "enum": [
- "DRAFT",
- "SUBMITTED"
- ]
+ "message": {
+ "type": "string"
+ }
+ }
+ },
+ "ApiResponseTalentDiscoveryPreferenceResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "actorRole": {
- "type": "string",
- "example": "COMPANY"
+ "message": {
+ "type": "string"
},
- "snapshot": {
- "type": "object",
- "additionalProperties": {}
+ "data": {
+ "$ref": "#/components/schemas/TalentDiscoveryPreferenceResponse"
},
- "createdAt": {
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
"format": "date-time"
}
- },
- "description": "评分历史条目(脱敏:不返回 actorUserId/手机号/邮箱)"
+ }
},
- "ApiResponseListInterviewScoreHistoryItem": {
+ "ApiResponseTalentDiscoveryPageResponse": {
"type": "object",
"properties": {
"code": {
@@ -13503,10 +16961,7 @@
"type": "string"
},
"data": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/InterviewScoreHistoryItem"
- }
+ "$ref": "#/components/schemas/TalentDiscoveryPageResponse"
},
"requestId": {
"type": "string"
@@ -13517,228 +16972,221 @@
}
}
},
- "CreateReportRequest": {
+ "CreateTalentInvitationRequest": {
"type": "object",
+ "required": [
+ "candidateKey",
+ "message",
+ "idempotencyKey"
+ ],
"properties": {
- "targetType": {
- "type": "string",
- "enum": [
- "USER",
- "MESSAGE"
- ],
- "description": "举报目标类型;USER 必填 targetUserId,MESSAGE 必填 messageId"
- },
- "targetUserId": {
- "type": "integer",
- "format": "int64",
- "description": "targetType=USER 时必填"
- },
- "messageId": {
- "type": "integer",
- "format": "int64",
- "description": "targetType=MESSAGE 时必填"
- },
- "category": {
+ "candidateKey": {
"type": "string",
- "maxLength": 40,
- "description": "举报分类,如 HARASSMENT"
+ "maxLength": 128
},
- "reason": {
+ "message": {
"type": "string",
"minLength": 1,
- "maxLength": 1000
- },
- "evidenceUrls": {
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 500
- },
- "description": "最多 5 个,仅 http/https,最多 500 字符"
+ "maxLength": 300
},
"idempotencyKey": {
"type": "string",
- "maxLength": 64,
- "description": "幂等键(可选)"
+ "format": "uuid",
+ "maxLength": 64
}
}
},
- "ReportDecisionRequest": {
+ "TalentInvitationDecisionRequest": {
"type": "object",
+ "required": [
+ "decision",
+ "expectedVersion"
+ ],
"properties": {
"decision": {
"type": "string",
"enum": [
- "RESOLVED",
- "REJECTED"
+ "ACCEPT",
+ "REJECT"
]
},
- "note": {
- "type": "string",
- "maxLength": 1000,
- "description": "REJECTED 必填"
+ "expectedVersion": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 0
}
}
},
- "ReportResponse": {
+ "CompanyTalentInvitationResponse": {
"type": "object",
"properties": {
- "id": {
+ "invitationId": {
"type": "integer",
"format": "int64"
},
- "targetType": {
+ "jobId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "jobTitle": {
+ "type": "string"
+ },
+ "candidateLabel": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "status": {
"type": "string",
"enum": [
- "USER",
- "MESSAGE"
+ "PENDING",
+ "ACCEPTED",
+ "REJECTED",
+ "EXPIRED"
]
},
- "targetUserId": {
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "expiresAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "decidedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "conversationId": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "StudentTalentInvitationResponse": {
+ "type": "object",
+ "properties": {
+ "invitationId": {
"type": "integer",
"format": "int64"
},
- "messageId": {
+ "companyId": {
"type": "integer",
"format": "int64"
},
- "reportedUserId": {
+ "companyName": {
+ "type": "string"
+ },
+ "jobId": {
"type": "integer",
"format": "int64"
},
- "category": {
+ "jobTitle": {
"type": "string"
},
- "reason": {
+ "jobCity": {
"type": "string"
},
- "evidenceUrls": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "message": {
+ "type": "string"
},
"status": {
"type": "string",
"enum": [
"PENDING",
- "RESOLVED",
- "REJECTED"
- ]
- },
- "decision": {
- "type": "string",
- "enum": [
- "RESOLVED",
- "REJECTED"
+ "ACCEPTED",
+ "REJECTED",
+ "EXPIRED"
]
},
- "decisionNote": {
- "type": "string"
- },
- "decidedAt": {
- "type": "string",
- "format": "date-time"
+ "version": {
+ "type": "integer",
+ "format": "int64"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
- "updatedAt": {
+ "expiresAt": {
"type": "string",
"format": "date-time"
},
- "messagePreview": {
+ "decidedAt": {
"type": "string",
- "description": "MESSAGE 举报的脱敏消息预览,不返回会话其他敏感内容"
- },
- "reportedUser": {
- "$ref": "#/components/schemas/ReportResponseReportedUser"
+ "format": "date-time"
},
- "history": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ReportResponseDecisionHistoryItem"
- }
- }
- }
- },
- "ReportResponseReportedUser": {
- "type": "object",
- "properties": {
- "userId": {
+ "conversationId": {
"type": "integer",
"format": "int64"
- },
- "nickname": {
- "type": "string"
- },
- "role": {
- "type": "string"
}
}
},
- "ReportResponseDecisionHistoryItem": {
+ "TalentInvitationPageResponseCompanyTalentInvitationResponse": {
"type": "object",
"properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "fromStatus": {
- "type": "string"
- },
- "toStatus": {
- "type": "string"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CompanyTalentInvitationResponse"
+ }
},
- "actorUserId": {
+ "total": {
"type": "integer",
"format": "int64"
},
- "actorRole": {
- "type": "string"
+ "page": {
+ "type": "integer",
+ "format": "int32"
},
- "note": {
- "type": "string"
+ "size": {
+ "type": "integer",
+ "format": "int32"
},
- "createdAt": {
- "type": "string",
- "format": "date-time"
+ "totalPages": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "BlockRelationResponse": {
+ "TalentInvitationPageResponseStudentTalentInvitationResponse": {
"type": "object",
"properties": {
- "id": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/StudentTalentInvitationResponse"
+ }
+ },
+ "total": {
"type": "integer",
"format": "int64"
},
- "blockedUserId": {
+ "page": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "nickname": {
- "type": "string"
+ "size": {
+ "type": "integer",
+ "format": "int32"
},
- "createdAt": {
- "type": "string",
- "format": "date-time"
+ "totalPages": {
+ "type": "integer",
+ "format": "int32"
}
}
},
- "ApiResponseReportResponse": {
+ "ApiResponseCompanyTalentInvitationResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer",
- "format": "int32"
+ "type": "integer"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/ReportResponse"
+ "$ref": "#/components/schemas/CompanyTalentInvitationResponse"
},
"requestId": {
"type": "string"
@@ -13749,38 +17197,17 @@
}
}
},
- "ApiResponsePageResponseReportResponse": {
+ "ApiResponseStudentTalentInvitationResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer",
- "format": "int32"
+ "type": "integer"
},
"message": {
"type": "string"
},
"data": {
- "type": "object",
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ReportResponse"
- }
- },
- "totalElements": {
- "type": "integer",
- "format": "int64"
- },
- "page": {
- "type": "integer",
- "format": "int32"
- },
- "size": {
- "type": "integer",
- "format": "int32"
- }
- }
+ "$ref": "#/components/schemas/StudentTalentInvitationResponse"
},
"requestId": {
"type": "string"
@@ -13791,18 +17218,17 @@
}
}
},
- "ApiResponseBlockRelationResponse": {
+ "ApiResponseCompanyTalentInvitationPageResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer",
- "format": "int32"
+ "type": "integer"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/BlockRelationResponse"
+ "$ref": "#/components/schemas/TalentInvitationPageResponseCompanyTalentInvitationResponse"
},
"requestId": {
"type": "string"
@@ -13813,38 +17239,17 @@
}
}
},
- "ApiResponsePageResponseBlockRelationResponse": {
+ "ApiResponseStudentTalentInvitationPageResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer",
- "format": "int32"
+ "type": "integer"
},
"message": {
"type": "string"
},
"data": {
- "type": "object",
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/BlockRelationResponse"
- }
- },
- "totalElements": {
- "type": "integer",
- "format": "int64"
- },
- "page": {
- "type": "integer",
- "format": "int32"
- },
- "size": {
- "type": "integer",
- "format": "int32"
- }
- }
+ "$ref": "#/components/schemas/TalentInvitationPageResponseStudentTalentInvitationResponse"
},
"requestId": {
"type": "string"
@@ -13855,733 +17260,738 @@
}
}
},
- "CreateAbilityAttemptRequest": {
+ "FairnessResponseDistribution": {
"type": "object",
- "required": [
- "typeCode"
- ],
"properties": {
- "typeCode": {
- "type": "string"
+ "sampleSize": {
+ "type": "integer"
},
- "idempotencyKey": {
- "type": "string",
- "maxLength": 64
- }
- }
- },
- "SaveAbilityAnswersRequest": {
- "type": "object",
- "required": [
- "answers"
- ],
- "properties": {
- "answers": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityAnswerItem"
- }
- }
- }
- },
- "AbilityAnswerItem": {
- "type": "object",
- "required": [
- "attemptQuestionId",
- "selectedOptionId"
- ],
- "properties": {
- "attemptQuestionId": {
- "type": "integer",
- "format": "int64"
+ "mean": {
+ "type": "number"
+ },
+ "median": {
+ "type": "number"
+ },
+ "p10": {
+ "type": "number"
+ },
+ "p25": {
+ "type": "number"
+ },
+ "p75": {
+ "type": "number"
+ },
+ "p90": {
+ "type": "number"
+ },
+ "min": {
+ "type": "number"
+ },
+ "max": {
+ "type": "number"
},
- "selectedOptionId": {
- "type": "string",
- "maxLength": 4
+ "standardDeviation": {
+ "type": "number"
+ },
+ "buckets": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "concentrationRate": {
+ "type": "number"
+ },
+ "riskLevel": {
+ "type": "string"
+ },
+ "availability": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
}
}
},
- "AbilityTypeResponse": {
+ "FairnessResponseDimensionMetric": {
"type": "object",
"properties": {
- "typeCode": {
+ "dimension": {
"type": "string"
},
- "displayName": {
- "type": "string"
+ "populationSize": {
+ "type": "integer"
},
- "description": {
+ "rowCount": {
+ "type": "integer"
+ },
+ "missingRowCount": {
+ "type": "integer"
+ },
+ "validSampleSize": {
+ "type": "integer"
+ },
+ "confidence": {
"type": "string"
},
- "questionCount": {
- "type": "integer",
- "format": "int32"
+ "missingRowRate": {
+ "type": "number"
},
- "attemptQuestionCount": {
- "type": "integer",
- "format": "int32"
+ "nullScoreRate": {
+ "type": "number"
},
- "timeLimitMinutes": {
- "type": "integer",
- "format": "int32"
+ "validCoverage": {
+ "type": "number"
},
- "resultValidDays": {
- "type": "integer",
- "format": "int32"
+ "statusCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
},
- "status": {
+ "versionCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "inconsistentRecordCount": {
+ "type": "integer"
+ },
+ "unknownStatusCount": {
+ "type": "integer"
+ },
+ "outOfRangeScoreCount": {
+ "type": "integer"
+ },
+ "unknownRulesVersionCount": {
+ "type": "integer"
+ },
+ "distribution": {
+ "$ref": "#/components/schemas/FairnessResponseDistribution"
+ },
+ "distributionsByRulesVersion": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FairnessResponseDistribution"
+ }
+ },
+ "availability": {
+ "type": "string"
+ },
+ "reason": {
"type": "string"
}
}
},
- "AbilityAttemptResponse": {
+ "FairnessResponseOverview": {
"type": "object",
"properties": {
- "attemptId": {
- "type": "integer",
- "format": "int64"
+ "basis": {
+ "type": "string"
},
- "status": {
+ "scope": {
"type": "string"
},
- "answeredCount": {
- "type": "integer",
- "format": "int32"
+ "period": {
+ "type": "string"
},
- "totalQuestions": {
- "type": "integer",
- "format": "int32"
+ "capturedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "completionRate": {
+ "populationSize": {
+ "type": "integer"
+ },
+ "computableSnapshotRatio": {
"type": "number"
},
- "startedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
+ "confidence": {
+ "type": "string"
},
- "expiresAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
+ "riskLevel": {
+ "type": "string"
},
- "remainingSeconds": {
- "type": "integer",
- "format": "int64",
- "nullable": true
+ "versionCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
},
- "questions": {
+ "mixedVersionCount": {
+ "type": "integer"
+ },
+ "unknownVersionCount": {
+ "type": "integer"
+ },
+ "distribution": {
+ "$ref": "#/components/schemas/FairnessResponseDistribution"
+ },
+ "distributionsByRulesVersion": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FairnessResponseDistribution"
+ }
+ },
+ "coherentVersionSubset": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/AbilityAttemptQuestionView"
+ "type": "string"
}
+ },
+ "availability": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
}
}
},
- "AbilityAttemptQuestionView": {
+ "FairnessResponseDimensions": {
"type": "object",
"properties": {
- "attemptQuestionId": {
- "type": "integer",
- "format": "int64"
- },
- "position": {
- "type": "integer",
- "format": "int32"
+ "basis": {
+ "type": "string"
},
- "itemType": {
+ "scope": {
"type": "string"
},
- "stem": {
+ "period": {
"type": "string"
},
- "options": {
+ "capturedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "dimensions": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/AbilityOptionView"
+ "$ref": "#/components/schemas/FairnessResponseDimensionMetric"
}
},
- "selectedOptionId": {
+ "availability": {
+ "type": "string"
+ },
+ "reason": {
"type": "string"
}
}
},
- "AbilityOptionView": {
+ "FairnessResponseUnavailable": {
"type": "object",
"properties": {
- "optionId": {
- "type": "string"
+ "availability": {
+ "type": "string",
+ "enum": [
+ "UNAVAILABLE"
+ ]
},
- "text": {
+ "reason": {
"type": "string"
+ },
+ "capturedAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "AbilityResultResponse": {
+ "FairnessResponseAppeals": {
"type": "object",
"properties": {
- "attemptId": {
+ "basis": {
+ "type": "string"
+ },
+ "from": {
+ "type": "string",
+ "format": "date"
+ },
+ "to": {
+ "type": "string",
+ "format": "date"
+ },
+ "capturedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "appealCount": {
"type": "integer",
- "format": "int64"
+ "description": "申诉事件数;与按独立候选人数统计的其他字段区分"
},
- "typeCode": {
- "type": "string"
+ "sampleSize": {
+ "type": "integer"
},
- "status": {
- "type": "string"
+ "statusCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "statusEventCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "statusCandidateCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
},
- "validityStatus": {
+ "confidence": {
"type": "string"
},
- "validUntil": {
- "type": "string",
- "format": "date-time",
- "nullable": true
+ "approvedEverCount": {
+ "type": "integer"
},
- "dimensionScores": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityDimensionScore"
- }
+ "approvalRate": {
+ "type": "number"
},
- "overallScore": {
+ "rollbackExecutionRate": {
"type": "number"
},
- "weaknesses": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityWeakness"
- }
+ "duplicateAppealCount": {
+ "type": "integer"
},
- "improvementAreas": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityImprovementArea"
- }
+ "duplicateAppealRate": {
+ "type": "number"
},
- "radar": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityRadarEntry"
- }
+ "comparableRollbackCount": {
+ "type": "integer",
+ "description": "可比 ROLLBACK 历史行数;仅唯一历史且分数/规则版本合法的申诉"
},
- "answeredCount": {
+ "comparableRollbackCandidateCount": {
"type": "integer",
- "format": "int32"
+ "description": "可比回滚历史对应的独立候选人数;同一候选人的多份合法申诉只计一人"
},
- "completionRate": {
+ "changedCount": {
+ "type": "integer"
+ },
+ "changedCandidateCount": {
+ "type": "integer"
+ },
+ "actualScoreChangeRate": {
"type": "number"
},
- "questionFeedback": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityQuestionFeedback"
+ "meanDelta": {
+ "type": "number"
+ },
+ "meanAbsoluteDelta": {
+ "type": "number"
+ },
+ "duplicateRollbackHistoryCount": {
+ "type": "integer"
+ },
+ "invalidScoreRollbackCount": {
+ "type": "integer"
+ },
+ "ruleVersionChangedRollbackCount": {
+ "type": "integer"
+ },
+ "reasonCounts": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
}
},
- "questionSetVersion": {
+ "availability": {
"type": "string"
},
- "rulesVersion": {
+ "reason": {
"type": "string"
},
- "generatedAt": {
- "type": "string",
- "format": "date-time"
+ "exposureAppealRateAvailability": {
+ "type": "string"
},
- "disclaimer": {
+ "exposureAppealRateReason": {
"type": "string"
}
}
},
- "AbilityDimensionScore": {
+ "ApiResponseFairnessResponseOverview": {
"type": "object",
"properties": {
"code": {
+ "type": "integer"
+ },
+ "message": {
"type": "string"
},
- "score": {
- "type": "number"
+ "data": {
+ "$ref": "#/components/schemas/FairnessResponseOverview"
},
- "answeredCount": {
- "type": "integer",
- "format": "int32"
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "AbilityWeakness": {
+ "ApiResponseFairnessResponseDimensions": {
"type": "object",
"properties": {
"code": {
+ "type": "integer"
+ },
+ "message": {
"type": "string"
},
- "score": {
- "type": "number"
+ "data": {
+ "$ref": "#/components/schemas/FairnessResponseDimensions"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "AbilityImprovementArea": {
+ "ApiResponseFairnessResponseUnavailable": {
"type": "object",
"properties": {
- "dimension": {
+ "code": {
+ "type": "integer"
+ },
+ "message": {
"type": "string"
},
- "currentScore": {
- "type": "number"
+ "data": {
+ "$ref": "#/components/schemas/FairnessResponseUnavailable"
},
- "summary": {
+ "requestId": {
"type": "string"
},
- "actions": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "AbilityRadarEntry": {
+ "ApiResponseFairnessResponseAppeals": {
"type": "object",
"properties": {
"code": {
+ "type": "integer"
+ },
+ "message": {
"type": "string"
},
- "value": {
- "type": "number"
+ "data": {
+ "$ref": "#/components/schemas/FairnessResponseAppeals"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "AbilityQuestionFeedback": {
+ "CandidateScoringCoverage": {
"type": "object",
"properties": {
- "attemptQuestionId": {
- "type": "integer",
- "format": "int64"
- },
- "position": {
+ "computableDimensions": {
"type": "integer",
"format": "int32"
},
- "stem": {
- "type": "string"
- },
- "selectedOptionId": {
- "type": "string"
- },
- "awardedScore": {
+ "totalDimensions": {
"type": "integer",
"format": "int32"
},
- "maxScore": {
- "type": "integer",
- "format": "int32"
+ "includedDimensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "explanation": {
- "type": "string"
+ "excludedDimensions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CandidateScoringExcludedDimension"
+ }
}
}
},
- "AbilityHistoryItem": {
+ "CandidateScoringExcludedDimension": {
"type": "object",
"properties": {
- "attemptId": {
- "type": "integer",
- "format": "int64"
- },
- "typeCode": {
+ "dimension": {
"type": "string"
},
"status": {
"type": "string"
},
- "validityStatus": {
+ "reason": {
"type": "string"
- },
- "overallScore": {
- "type": "number"
- },
- "answeredCount": {
- "type": "integer",
- "format": "int32"
- },
- "completionRate": {
- "type": "number"
- },
- "startedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "expiresAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "completedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "validUntil": {
- "type": "string",
- "format": "date-time",
- "nullable": true
}
}
},
- "ApiResponseAbilityTypeResponse": {
+ "CandidateScoringRuleContribution": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "ruleCode": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/AbilityTypeResponse"
+ "outcome": {
+ "type": "string",
+ "enum": [
+ "APPLIED",
+ "NOT_APPLIED",
+ "MISSING",
+ "EXPIRED",
+ "UNAVAILABLE"
+ ]
+ },
+ "contribution": {
+ "type": "number",
+ "nullable": true
+ },
+ "maxContribution": {
+ "type": "number",
+ "nullable": true
+ },
+ "label": {
+ "type": "string"
},
- "requestId": {
+ "observation": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "explanation": {
+ "type": "string"
}
}
},
- "ApiResponseAbilityAttemptResponse": {
+ "CandidateScoringValidity": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/AbilityAttemptResponse"
- },
- "requestId": {
- "type": "string"
+ "completedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "timestamp": {
+ "validUntil": {
"type": "string",
"format": "date-time"
+ },
+ "expired": {
+ "type": "boolean"
}
}
},
- "ApiResponseAbilityResultResponse": {
+ "StudentProfileResponse": {
"type": "object",
"properties": {
- "code": {
+ "id": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "message": {
+ "userId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "realName": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/AbilityResultResponse"
+ "bio": {
+ "type": "string"
},
- "requestId": {
+ "location": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "ApiResponsePageResponseAbilityHistoryItem": {
- "type": "object",
- "properties": {
- "code": {
+ "education": {
+ "type": "string"
+ },
+ "school": {
+ "type": "string"
+ },
+ "graduationYear": {
"type": "integer",
"format": "int32"
},
- "message": {
+ "resumeUrl": {
"type": "string"
},
- "data": {
- "type": "object",
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AbilityHistoryItem"
- }
- },
- "totalElements": {
- "type": "integer",
- "format": "int64"
- },
- "page": {
- "type": "integer",
- "format": "int32"
- },
- "size": {
- "type": "integer",
- "format": "int32"
- }
- }
- },
- "requestId": {
+ "skills": {
"type": "string"
},
- "timestamp": {
+ "createdAt": {
"type": "string",
"format": "date-time"
}
}
},
- "RiskRuleResponse": {
+ "CreateDataExportRequest": {
"type": "object",
"properties": {
- "ruleCode": {
- "type": "string"
- },
- "sourceAction": {
- "type": "string"
- },
- "thresholdCount": {
- "type": "integer",
- "format": "int32"
- },
- "windowMinutes": {
- "type": "integer",
- "format": "int32"
- },
- "severity": {
+ "format": {
"type": "string"
},
- "enabled": {
- "type": "boolean"
- },
- "version": {
- "type": "integer",
- "format": "int64"
+ "idempotencyKey": {
+ "type": "string",
+ "maxLength": 64
}
}
},
- "RiskEventResponse": {
+ "DataExportTaskResponse": {
"type": "object",
"properties": {
- "eventId": {
+ "taskId": {
"type": "integer",
"format": "int64"
},
- "ruleCode": {
- "type": "string"
- },
- "sourceAction": {
- "type": "string"
- },
- "severity": {
+ "status": {
"type": "string"
},
- "status": {
+ "format": {
"type": "string"
},
- "occurrenceCount": {
- "type": "integer",
- "format": "int32"
+ "requestedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "windowStartedAt": {
+ "startedAt": {
"type": "string",
"format": "date-time"
},
- "windowEndedAt": {
+ "completedAt": {
"type": "string",
"format": "date-time"
},
- "detectedAt": {
+ "expiresAt": {
"type": "string",
"format": "date-time"
},
- "version": {
+ "sizeBytes": {
"type": "integer",
"format": "int64"
+ },
+ "downloadAvailable": {
+ "type": "boolean"
+ },
+ "errorCode": {
+ "type": "string"
}
}
},
- "RiskSeverityCount": {
+ "ApiResponseStudentProfileResponse": {
"type": "object",
"properties": {
- "severity": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
"type": "string"
},
- "count": {
- "type": "integer",
- "format": "int64"
- }
- }
- },
- "RiskRuleCount": {
- "type": "object",
- "properties": {
- "ruleCode": {
+ "data": {
+ "$ref": "#/components/schemas/StudentProfileResponse"
+ },
+ "requestId": {
"type": "string"
},
- "count": {
- "type": "integer",
- "format": "int64"
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "RiskOverviewResponse": {
+ "ApiResponseDataExportTaskResponse": {
"type": "object",
"properties": {
- "openCount": {
+ "code": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "bySeverity": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RiskSeverityCount"
- }
+ "message": {
+ "type": "string"
},
- "byRule": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RiskRuleCount"
- }
+ "data": {
+ "$ref": "#/components/schemas/DataExportTaskResponse"
},
- "lastDetectedAt": {
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "format": "date-time",
- "nullable": true
+ "format": "date-time"
}
}
},
- "RiskTrendPoint": {
+ "MessageResponse": {
"type": "object",
+ "description": "脱敏消息响应;TALENT_INVITATION 使用 senderScope 而非 senderUserId",
"properties": {
- "time": {
- "type": "string",
- "format": "date-time"
+ "id": {
+ "type": "integer",
+ "format": "int64"
},
- "count": {
+ "conversationId": {
"type": "integer",
"format": "int64"
- }
- }
- },
- "RiskTrendResponse": {
- "type": "object",
- "properties": {
- "bucket": {
+ },
+ "senderUserId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "senderScope": {
"type": "string"
},
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RiskTrendPoint"
- }
- }
- }
- },
- "RiskDistributionRow": {
- "type": "object",
- "properties": {
- "ruleCode": {
+ "content": {
"type": "string"
},
- "severity": {
- "type": "string"
+ "status": {
+ "type": "string",
+ "enum": [
+ "SENT",
+ "RECALLED"
+ ]
+ },
+ "recalledAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
},
- "count": {
- "type": "integer",
- "format": "int64"
+ "isRead": {
+ "type": "boolean"
}
}
},
- "RiskDistributionResponse": {
+ "MessagePageResponse": {
"type": "object",
+ "description": "脱敏消息分页响应",
"properties": {
"items": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/RiskDistributionRow"
+ "$ref": "#/components/schemas/MessageResponse"
}
- }
- }
- },
- "RiskRuleUpdateRequest": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
},
- "thresholdCount": {
+ "total": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "windowMinutes": {
+ "page": {
"type": "integer",
"format": "int32"
},
- "severity": {
- "type": "string"
- },
- "expectedVersion": {
+ "size": {
"type": "integer",
- "format": "int64"
- }
- },
- "required": [
- "enabled",
- "thresholdCount",
- "windowMinutes",
- "severity",
- "expectedVersion"
- ]
- },
- "RiskEventActionRequest": {
- "type": "object",
- "properties": {
- "action": {
- "type": "string"
- },
- "reasonCode": {
- "type": "string"
+ "format": "int32"
},
- "expectedVersion": {
- "type": "integer",
- "format": "int64"
- }
- },
- "required": [
- "action",
- "reasonCode",
- "expectedVersion"
- ]
- },
- "ApiResponseRiskOverviewResponse": {
- "type": "object",
- "properties": {
- "code": {
+ "totalPages": {
"type": "integer",
"format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/RiskOverviewResponse"
- },
- "requestId": {
- "type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
}
}
},
- "ApiResponseRiskTrendResponse": {
+ "ApiResponseMessagePageResponse": {
"type": "object",
"properties": {
"code": {
@@ -14592,7 +18002,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/RiskTrendResponse"
+ "$ref": "#/components/schemas/MessagePageResponse"
},
"requestId": {
"type": "string"
@@ -14603,7 +18013,7 @@
}
}
},
- "ApiResponseRiskDistributionResponse": {
+ "ApiResponseMessageResponse": {
"type": "object",
"properties": {
"code": {
@@ -14614,7 +18024,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/RiskDistributionResponse"
+ "$ref": "#/components/schemas/MessageResponse"
},
"requestId": {
"type": "string"
@@ -14625,7 +18035,7 @@
}
}
},
- "ApiResponsePageResponseRiskEventResponse": {
+ "ApiResponsePageResponseDataExportTaskResponse": {
"type": "object",
"properties": {
"code": {
@@ -14641,7 +18051,7 @@
"items": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/RiskEventResponse"
+ "$ref": "#/components/schemas/DataExportTaskResponse"
}
},
"totalElements": {
@@ -14667,199 +18077,135 @@
}
}
},
- "ApiResponseListRiskRuleResponse": {
+ "RefreshTokenRequest": {
"type": "object",
+ "required": [
+ "refreshToken"
+ ],
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- },
- "data": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RiskRuleResponse"
- }
- },
- "requestId": {
- "type": "string"
- },
- "timestamp": {
+ "refreshToken": {
"type": "string",
- "format": "date-time"
+ "minLength": 1,
+ "maxLength": 4096
}
}
},
- "ApiResponseRiskRuleResponse": {
+ "TokenPairResponse": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
+ "accessToken": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/RiskRuleResponse"
- },
- "requestId": {
+ "refreshToken": {
"type": "string"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "expiresIn": {
+ "type": "integer",
+ "format": "int64"
}
}
},
- "ApiResponseRiskEventResponse": {
+ "ApiResponseTokenPairResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer",
- "format": "int32"
+ "type": "integer"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/RiskEventResponse"
- },
- "requestId": {
- "type": "string"
- },
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "$ref": "#/components/schemas/TokenPairResponse"
}
}
},
- "TalentDiscoveryPreferenceResponse": {
+ "PasswordSetRequest": {
"type": "object",
"properties": {
- "enabled": {
- "type": "boolean"
- },
- "version": {
- "type": "integer",
- "format": "int64"
- },
- "createdAt": {
+ "smsCode": {
"type": "string",
- "format": "date-time"
+ "minLength": 1
},
- "updatedAt": {
+ "newPassword": {
"type": "string",
- "format": "date-time"
+ "minLength": 1
}
- }
+ },
+ "required": [
+ "newPassword",
+ "smsCode"
+ ]
},
- "TalentDiscoveryPreferenceUpdateRequest": {
+ "PasswordResetRequest": {
"type": "object",
- "required": [
- "enabled"
- ],
"properties": {
- "enabled": {
- "type": "boolean"
+ "phone": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "[0-9]{11}"
},
- "expectedVersion": {
- "type": "integer",
- "format": "int64",
- "minimum": 0
+ "smsCode": {
+ "type": "string",
+ "minLength": 1
+ },
+ "newPassword": {
+ "type": "string",
+ "minLength": 1
}
- }
+ },
+ "required": [
+ "newPassword",
+ "phone",
+ "smsCode"
+ ]
},
- "TalentDiscoveryCandidateResponse": {
+ "PasswordLoginRequest": {
"type": "object",
"properties": {
- "candidateKey": {
- "type": "string"
- },
- "candidateLabel": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "education": {
- "type": "string"
- },
- "graduationYear": {
- "type": "integer",
- "format": "int32"
- },
- "skills": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "fitBand": {
+ "phone": {
"type": "string",
- "enum": [
- "HIGH",
- "MEDIUM",
- "BASIC"
- ]
- },
- "summary": {
- "type": "string"
+ "minLength": 1,
+ "pattern": "[0-9]{11}"
},
- "signalsAvailable": {
- "type": "array",
- "items": {
- "type": "string",
- "enum": [
- "PREFERENCE",
- "RIASEC",
- "ABILITY"
- ]
- }
+ "password": {
+ "type": "string",
+ "minLength": 1
}
- }
+ },
+ "required": [
+ "password",
+ "phone"
+ ]
},
- "TalentDiscoveryPageResponse": {
+ "PasswordChangeRequest": {
"type": "object",
"properties": {
- "mode": {
+ "currentPassword": {
"type": "string",
- "enum": [
- "PERSONALIZED",
- "UNAVAILABLE",
- "NO_ELIGIBLE_CANDIDATE"
- ]
- },
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/TalentDiscoveryCandidateResponse"
- }
- },
- "total": {
- "type": "integer",
- "format": "int64"
- },
- "page": {
- "type": "integer",
- "format": "int32"
- },
- "size": {
- "type": "integer",
- "format": "int32"
+ "minLength": 1
},
- "totalPages": {
- "type": "integer",
- "format": "int32"
+ "newPassword": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "currentPassword",
+ "newPassword"
+ ]
+ },
+ "PasswordOperationResponse": {
+ "type": "object",
+ "properties": {
+ "passwordConfigured": {
+ "type": "boolean"
},
- "message": {
- "type": "string"
+ "reauthenticationRequired": {
+ "type": "boolean"
}
}
},
- "ApiResponseTalentDiscoveryPreferenceResponse": {
+ "ApiResponsePasswordOperationResponse": {
"type": "object",
"properties": {
"code": {
@@ -14870,7 +18216,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/TalentDiscoveryPreferenceResponse"
+ "$ref": "#/components/schemas/PasswordOperationResponse"
},
"requestId": {
"type": "string"
@@ -14881,233 +18227,254 @@
}
}
},
- "ApiResponseTalentDiscoveryPageResponse": {
+ "CompanyDetails": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
+ "name": {
+ "type": "string",
+ "maxLength": 100,
+ "minLength": 0
},
- "message": {
+ "logoUrl": {
+ "type": "string",
+ "maxLength": 500,
+ "minLength": 0
+ },
+ "description": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/TalentDiscoveryPageResponse"
+ "industry": {
+ "type": "string",
+ "maxLength": 80,
+ "minLength": 0
},
- "requestId": {
- "type": "string"
+ "website": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 0
},
- "timestamp": {
+ "address": {
"type": "string",
- "format": "date-time"
+ "maxLength": 255,
+ "minLength": 0
}
- }
+ },
+ "required": [
+ "name"
+ ]
},
- "CreateTalentInvitationRequest": {
+ "CompanyRegistrationRequest": {
"type": "object",
- "required": [
- "candidateKey",
- "message",
- "idempotencyKey"
- ],
"properties": {
- "candidateKey": {
+ "phone": {
"type": "string",
- "maxLength": 128
+ "minLength": 1,
+ "pattern": "[0-9]{11}"
},
- "message": {
+ "code": {
"type": "string",
"minLength": 1,
- "maxLength": 300
+ "pattern": "[0-9]{6}"
},
- "idempotencyKey": {
+ "password": {
"type": "string",
- "format": "uuid",
- "maxLength": 64
+ "maxLength": 64,
+ "minLength": 12
+ },
+ "company": {
+ "$ref": "#/components/schemas/CompanyDetails"
}
- }
+ },
+ "required": [
+ "code",
+ "company",
+ "password",
+ "phone"
+ ]
},
- "TalentInvitationDecisionRequest": {
+ "ApiResponseCompanyRegistrationResponse": {
"type": "object",
- "required": [
- "decision",
- "expectedVersion"
- ],
"properties": {
- "decision": {
- "type": "string",
- "enum": [
- "ACCEPT",
- "REJECT"
- ]
- },
- "expectedVersion": {
+ "code": {
"type": "integer",
- "format": "int64",
- "minimum": 0
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/CompanyRegistrationResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "CompanyTalentInvitationResponse": {
+ "CompanyRegistrationResponse": {
"type": "object",
"properties": {
- "invitationId": {
+ "userId": {
"type": "integer",
"format": "int64"
},
- "jobId": {
+ "companyId": {
"type": "integer",
"format": "int64"
},
- "jobTitle": {
+ "role": {
"type": "string"
},
- "candidateLabel": {
+ "onboardingStatus": {
+ "type": "string"
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "refreshToken": {
"type": "string"
},
+ "expiresIn": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "ApiResponseCompanyOnboardingResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
"message": {
"type": "string"
},
- "status": {
- "type": "string",
- "enum": [
- "PENDING",
- "ACCEPTED",
- "REJECTED",
- "EXPIRED"
- ]
+ "data": {
+ "$ref": "#/components/schemas/CompanyOnboardingResponse"
},
- "createdAt": {
- "type": "string",
- "format": "date-time"
+ "requestId": {
+ "type": "string"
},
- "expiresAt": {
+ "timestamp": {
"type": "string",
"format": "date-time"
+ }
+ }
+ },
+ "CompanyOnboardingResponse": {
+ "type": "object",
+ "properties": {
+ "company": {
+ "$ref": "#/components/schemas/CompanySummary"
},
- "decidedAt": {
- "type": "string",
- "format": "date-time"
+ "onboardingStatus": {
+ "type": "string"
},
- "conversationId": {
- "type": "integer",
- "format": "int64"
+ "latestVerification": {
+ "$ref": "#/components/schemas/VerificationSummary"
+ },
+ "missingFields": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "allowedActions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
}
},
- "StudentTalentInvitationResponse": {
+ "CompanySummary": {
"type": "object",
"properties": {
- "invitationId": {
- "type": "integer",
- "format": "int64"
- },
- "companyId": {
+ "id": {
"type": "integer",
"format": "int64"
},
- "companyName": {
+ "name": {
"type": "string"
},
- "jobId": {
- "type": "integer",
- "format": "int64"
+ "logoUrl": {
+ "type": "string"
},
- "jobTitle": {
+ "description": {
"type": "string"
},
- "jobCity": {
+ "industry": {
"type": "string"
},
- "message": {
+ "website": {
"type": "string"
},
- "status": {
- "type": "string",
- "enum": [
- "PENDING",
- "ACCEPTED",
- "REJECTED",
- "EXPIRED"
- ]
+ "address": {
+ "type": "string"
},
- "version": {
+ "verified": {
+ "type": "boolean"
+ }
+ }
+ },
+ "VerificationSummary": {
+ "type": "object",
+ "properties": {
+ "id": {
"type": "integer",
"format": "int64"
},
- "createdAt": {
- "type": "string",
- "format": "date-time"
+ "status": {
+ "type": "string"
},
- "expiresAt": {
+ "submittedAt": {
"type": "string",
"format": "date-time"
},
"decidedAt": {
"type": "string",
"format": "date-time"
- },
- "conversationId": {
- "type": "integer",
- "format": "int64"
}
}
},
- "TalentInvitationPageResponseCompanyTalentInvitationResponse": {
+ "LxqSkillCloudNode": {
"type": "object",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CompanyTalentInvitationResponse"
- }
- },
- "total": {
+ "id": {
"type": "integer",
"format": "int64"
},
- "page": {
- "type": "integer",
- "format": "int32"
- },
- "size": {
- "type": "integer",
- "format": "int32"
+ "code": {
+ "type": "string"
},
- "totalPages": {
- "type": "integer",
- "format": "int32"
+ "name": {
+ "type": "string"
}
}
},
- "TalentInvitationPageResponseStudentTalentInvitationResponse": {
+ "LxqApiResponseVoid": {
"type": "object",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/StudentTalentInvitationResponse"
- }
- },
- "total": {
- "type": "integer",
- "format": "int64"
+ "code": {
+ "type": "integer"
},
- "page": {
- "type": "integer",
- "format": "int32"
+ "message": {
+ "type": "string"
},
- "size": {
- "type": "integer",
- "format": "int32"
+ "requestId": {
+ "type": "string"
},
- "totalPages": {
- "type": "integer",
- "format": "int32"
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "ApiResponseCompanyTalentInvitationResponse": {
+ "LxqApiResponseSalaryCityDetailResponse": {
"type": "object",
"properties": {
"code": {
@@ -15117,7 +18484,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/CompanyTalentInvitationResponse"
+ "$ref": "#/components/schemas/LxqSalaryCityDetailResponse"
},
"requestId": {
"type": "string"
@@ -15128,17 +18495,18 @@
}
}
},
- "ApiResponseStudentTalentInvitationResponse": {
+ "LxqApiResponseCompanyKnowledgeOverviewResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/StudentTalentInvitationResponse"
+ "$ref": "#/components/schemas/LxqCompanyKnowledgeOverviewResponse"
},
"requestId": {
"type": "string"
@@ -15149,7 +18517,54 @@
}
}
},
- "ApiResponseCompanyTalentInvitationPageResponse": {
+ "LxqCompanyKnowledgeUpdateRequest": {
+ "type": "object",
+ "properties": {
+ "culture": {
+ "type": "string",
+ "maxLength": 2000,
+ "minLength": 0
+ },
+ "workPolicies": {
+ "type": "string",
+ "maxLength": 4000,
+ "minLength": 0
+ },
+ "onboardingGuide": {
+ "type": "string",
+ "maxLength": 4000,
+ "minLength": 0
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 0
+ }
+ }
+ },
+ "LxqKnowledgeView": {
+ "type": "object",
+ "properties": {
+ "culture": {
+ "type": "string"
+ },
+ "workPolicies": {
+ "type": "string"
+ },
+ "onboardingGuide": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "LxqApiResponseListSalaryCitySummaryResponse": {
"type": "object",
"properties": {
"code": {
@@ -15159,7 +18574,10 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/TalentInvitationPageResponseCompanyTalentInvitationResponse"
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqSalaryCitySummaryResponse"
+ }
},
"requestId": {
"type": "string"
@@ -15170,7 +18588,7 @@
}
}
},
- "ApiResponseStudentTalentInvitationPageResponse": {
+ "LxqApiResponseSalaryHistoryDetailResponse": {
"type": "object",
"properties": {
"code": {
@@ -15180,7 +18598,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/TalentInvitationPageResponseStudentTalentInvitationResponse"
+ "$ref": "#/components/schemas/LxqSalaryHistoryDetailResponse"
},
"requestId": {
"type": "string"
@@ -15191,428 +18609,393 @@
}
}
},
- "FairnessResponseDistribution": {
+ "LxqSkillLearningPathResponse": {
"type": "object",
"properties": {
- "sampleSize": {
- "type": "integer"
- },
- "mean": {
- "type": "number"
- },
- "median": {
- "type": "number"
- },
- "p10": {
- "type": "number"
- },
- "p25": {
- "type": "number"
- },
- "p75": {
- "type": "number"
- },
- "p90": {
- "type": "number"
- },
- "min": {
- "type": "number"
- },
- "max": {
- "type": "number"
- },
- "standardDeviation": {
- "type": "number"
+ "total": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "buckets": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqSkillLearningPathItem"
}
- },
- "concentrationRate": {
- "type": "number"
- },
- "riskLevel": {
- "type": "string"
- },
- "availability": {
- "type": "string"
- },
- "reason": {
- "type": "string"
}
}
},
- "FairnessResponseDimensionMetric": {
+ "LxqCompanyChecklistItemView": {
"type": "object",
"properties": {
- "dimension": {
- "type": "string"
- },
- "populationSize": {
- "type": "integer"
- },
- "rowCount": {
- "type": "integer"
- },
- "missingRowCount": {
- "type": "integer"
- },
- "validSampleSize": {
- "type": "integer"
+ "itemId": {
+ "type": "integer",
+ "format": "int64"
},
- "confidence": {
+ "source": {
"type": "string"
},
- "missingRowRate": {
- "type": "number"
- },
- "nullScoreRate": {
- "type": "number"
- },
- "validCoverage": {
- "type": "number"
- },
- "statusCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
- },
- "versionCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
- },
- "inconsistentRecordCount": {
- "type": "integer"
+ "itemKey": {
+ "type": "string"
},
- "unknownStatusCount": {
- "type": "integer"
+ "title": {
+ "type": "string"
},
- "outOfRangeScoreCount": {
- "type": "integer"
+ "description": {
+ "type": "string"
},
- "unknownRulesVersionCount": {
- "type": "integer"
+ "category": {
+ "type": "string"
},
- "distribution": {
- "$ref": "#/components/schemas/FairnessResponseDistribution"
+ "required": {
+ "type": "boolean"
},
- "distributionsByRulesVersion": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/components/schemas/FairnessResponseDistribution"
- }
+ "sortOrder": {
+ "type": "integer",
+ "format": "int32"
},
- "availability": {
- "type": "string"
+ "active": {
+ "type": "boolean"
},
- "reason": {
- "type": "string"
+ "version": {
+ "type": "integer",
+ "format": "int64"
}
}
},
- "FairnessResponseOverview": {
+ "LxqCompanyChecklistItemCreateRequest": {
"type": "object",
"properties": {
- "basis": {
- "type": "string"
- },
- "scope": {
- "type": "string"
- },
- "period": {
- "type": "string"
- },
- "capturedAt": {
+ "title": {
"type": "string",
- "format": "date-time"
- },
- "populationSize": {
- "type": "integer"
+ "maxLength": 120,
+ "minLength": 0
},
- "computableSnapshotRatio": {
- "type": "number"
+ "description": {
+ "type": "string",
+ "maxLength": 1000,
+ "minLength": 0
},
- "confidence": {
- "type": "string"
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "DOCUMENT|ADMIN|EQUIPMENT|TRAINING|LOGISTICS|OTHER"
},
- "riskLevel": {
- "type": "string"
+ "sortOrder": {
+ "type": "integer",
+ "format": "int32",
+ "default": 1000,
+ "maximum": 9999,
+ "minimum": 0
},
- "versionCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "required": {
+ "type": "boolean",
+ "default": false
},
- "mixedVersionCount": {
- "type": "integer"
+ "idempotencyKey": {
+ "type": "string",
+ "maxLength": 64,
+ "minLength": 0
+ }
+ },
+ "required": [
+ "category",
+ "title"
+ ]
+ },
+ "LxqSkillMatchResponse": {
+ "type": "object",
+ "properties": {
+ "matchScore": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0,
+ "maximum": 100,
+ "description": "round(matchedCount*100/min(10,total));total=0 时为 0。"
},
- "unknownVersionCount": {
- "type": "integer"
+ "matchedCount": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
},
- "distribution": {
- "$ref": "#/components/schemas/FairnessResponseDistribution"
+ "totalCount": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0,
+ "description": "实际匹配集合大小 min(10,total)。"
},
- "distributionsByRulesVersion": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/components/schemas/FairnessResponseDistribution"
+ "matchedSkills": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqSkillCloudItem"
}
},
- "coherentVersionSubset": {
+ "missingSkills": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/LxqSkillCloudItem"
}
- },
- "availability": {
- "type": "string"
- },
- "reason": {
- "type": "string"
}
}
},
- "FairnessResponseDimensions": {
+ "LxqSalaryCitySummaryResponse": {
"type": "object",
"properties": {
- "basis": {
+ "cityCode": {
"type": "string"
},
- "scope": {
+ "provinceCode": {
"type": "string"
},
- "period": {
+ "provinceName": {
"type": "string"
},
- "capturedAt": {
- "type": "string",
- "format": "date-time"
- },
- "dimensions": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/FairnessResponseDimensionMetric"
- }
- },
- "availability": {
+ "cityName": {
"type": "string"
},
- "reason": {
+ "policyVersion": {
"type": "string"
+ },
+ "policyEffectiveDate": {
+ "type": "string",
+ "format": "date"
+ },
+ "dataLevel": {
+ "$ref": "#/components/schemas/LxqSalaryDataLevel"
}
}
},
- "FairnessResponseUnavailable": {
+ "LxqSkillCloudResponse": {
"type": "object",
"properties": {
- "availability": {
- "type": "string",
- "enum": [
- "UNAVAILABLE"
- ]
+ "industry": {
+ "$ref": "#/components/schemas/LxqSkillCloudNode"
},
- "reason": {
- "type": "string"
+ "occupation": {
+ "$ref": "#/components/schemas/LxqSkillCloudNode"
},
- "capturedAt": {
- "type": "string",
- "format": "date-time"
+ "category": {
+ "$ref": "#/components/schemas/LxqSkillCloudNode",
+ "nullable": true
+ },
+ "total": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 0
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqSkillCloudItem"
+ }
}
}
},
- "FairnessResponseAppeals": {
+ "LxqSalaryCalculationRequest": {
"type": "object",
+ "required": [
+ "cityCode",
+ "grossMonthlySalary",
+ "expectedPolicyVersion"
+ ],
"properties": {
- "basis": {
+ "cityCode": {
"type": "string"
},
- "from": {
- "type": "string",
- "format": "date"
+ "grossMonthlySalary": {
+ "type": "number"
},
- "to": {
- "type": "string",
- "format": "date"
+ "monthIndex": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 12
},
- "capturedAt": {
+ "specialAdditionalDeduction": {
+ "type": "number"
+ },
+ "expectedPolicyVersion": {
+ "type": "string"
+ },
+ "idempotencyKey": {
"type": "string",
- "format": "date-time"
+ "maxLength": 64
},
- "appealCount": {
- "type": "integer",
- "description": "申诉事件数;与按独立候选人数统计的其他字段区分"
+ "overrides": {
+ "$ref": "#/components/schemas/LxqSalaryCalculationOverrideRequest"
+ }
+ }
+ },
+ "LxqSalaryCalculationResult": {
+ "type": "object",
+ "properties": {
+ "cityCode": {
+ "type": "string"
},
- "sampleSize": {
- "type": "integer"
+ "cityName": {
+ "type": "string"
},
- "statusCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "dataLevel": {
+ "$ref": "#/components/schemas/LxqSalaryDataLevel"
},
- "statusEventCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "policyVersion": {
+ "type": "string"
},
- "statusCandidateCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "policyEffectiveDate": {
+ "type": "string",
+ "format": "date"
},
- "confidence": {
+ "taxRulesVersion": {
"type": "string"
},
- "approvedEverCount": {
+ "estimate": {
+ "type": "boolean"
+ },
+ "monthIndex": {
"type": "integer"
},
- "approvalRate": {
+ "grossMonthlySalary": {
"type": "number"
},
- "rollbackExecutionRate": {
+ "specialAdditionalDeduction": {
"type": "number"
},
- "duplicateAppealCount": {
- "type": "integer"
+ "socialSecurityBase": {
+ "type": "number"
},
- "duplicateAppealRate": {
+ "housingFundBase": {
"type": "number"
},
- "comparableRollbackCount": {
- "type": "integer",
- "description": "可比 ROLLBACK 历史行数;仅唯一历史且分数/规则版本合法的申诉"
+ "pensionRate": {
+ "type": "number"
},
- "comparableRollbackCandidateCount": {
- "type": "integer",
- "description": "可比回滚历史对应的独立候选人数;同一候选人的多份合法申诉只计一人"
+ "medicalRate": {
+ "type": "number"
},
- "changedCount": {
- "type": "integer"
+ "unemploymentRate": {
+ "type": "number"
},
- "changedCandidateCount": {
- "type": "integer"
+ "housingFundRate": {
+ "type": "number"
},
- "actualScoreChangeRate": {
+ "seriousIllnessMonthlyFee": {
"type": "number"
},
- "meanDelta": {
+ "pension": {
"type": "number"
},
- "meanAbsoluteDelta": {
+ "medical": {
"type": "number"
},
- "duplicateRollbackHistoryCount": {
- "type": "integer"
+ "unemployment": {
+ "type": "number"
},
- "invalidScoreRollbackCount": {
- "type": "integer"
+ "housingFund": {
+ "type": "number"
},
- "ruleVersionChangedRollbackCount": {
- "type": "integer"
+ "cumulativeGrossIncome": {
+ "type": "number"
},
- "reasonCounts": {
- "type": "object",
- "additionalProperties": {
- "type": "integer"
- }
+ "cumulativeSocialInsurance": {
+ "type": "number"
},
- "availability": {
- "type": "string"
+ "cumulativeHousingFund": {
+ "type": "number"
},
- "reason": {
- "type": "string"
+ "cumulativeSeriousIllness": {
+ "type": "number"
},
- "exposureAppealRateAvailability": {
- "type": "string"
+ "cumulativeBasicDeduction": {
+ "type": "number"
},
- "exposureAppealRateReason": {
- "type": "string"
- }
- }
- },
- "ApiResponseFairnessResponseOverview": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer"
+ "cumulativeSpecialAdditionalDeduction": {
+ "type": "number"
},
- "message": {
- "type": "string"
+ "cumulativeTaxableIncome": {
+ "type": "number"
},
- "data": {
- "$ref": "#/components/schemas/FairnessResponseOverview"
+ "cumulativeTaxDue": {
+ "type": "number"
},
- "requestId": {
- "type": "string"
+ "previouslyWithheldTax": {
+ "type": "number"
+ },
+ "currentMonthTax": {
+ "type": "number"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "netSalary": {
+ "type": "number"
}
}
},
- "ApiResponseFairnessResponseDimensions": {
+ "LxqSalaryCityDetailResponse": {
"type": "object",
"properties": {
- "code": {
- "type": "integer"
+ "cityCode": {
+ "type": "string"
},
- "message": {
+ "provinceCode": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/FairnessResponseDimensions"
+ "provinceName": {
+ "type": "string"
},
- "requestId": {
+ "cityName": {
"type": "string"
},
- "timestamp": {
+ "policyVersion": {
+ "type": "string"
+ },
+ "policyEffectiveDate": {
"type": "string",
- "format": "date-time"
- }
- }
- },
- "ApiResponseFairnessResponseUnavailable": {
- "type": "object",
- "properties": {
- "code": {
- "type": "integer"
+ "format": "date"
},
- "message": {
+ "dataLevel": {
+ "$ref": "#/components/schemas/LxqSalaryDataLevel"
+ },
+ "dataSource": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/FairnessResponseUnavailable"
+ "socialSecurityBaseMin": {
+ "type": "number"
},
- "requestId": {
- "type": "string"
+ "socialSecurityBaseMax": {
+ "type": "number"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
+ "housingFundBaseMin": {
+ "type": "number"
+ },
+ "housingFundBaseMax": {
+ "type": "number"
+ },
+ "pensionRate": {
+ "type": "number"
+ },
+ "medicalRate": {
+ "type": "number"
+ },
+ "unemploymentRate": {
+ "type": "number"
+ },
+ "housingFundRate": {
+ "type": "number"
+ },
+ "seriousIllnessMonthlyFee": {
+ "type": "number"
}
}
},
- "ApiResponseFairnessResponseAppeals": {
+ "LxqApiResponseCompanyKnowledgeView": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/FairnessResponseAppeals"
+ "$ref": "#/components/schemas/LxqCompanyKnowledgeView"
},
"requestId": {
"type": "string"
@@ -15623,306 +19006,273 @@
}
}
},
- "CandidateScoringCoverage": {
+ "LxqCompanyView": {
"type": "object",
"properties": {
- "computableDimensions": {
+ "id": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "totalDimensions": {
- "type": "integer",
- "format": "int32"
+ "name": {
+ "type": "string"
},
- "includedDimensions": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "logoUrl": {
+ "type": "string"
},
- "excludedDimensions": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CandidateScoringExcludedDimension"
- }
- }
- }
- },
- "CandidateScoringExcludedDimension": {
- "type": "object",
- "properties": {
- "dimension": {
+ "description": {
"type": "string"
},
- "status": {
+ "industry": {
"type": "string"
},
- "reason": {
+ "website": {
+ "type": "string"
+ },
+ "address": {
"type": "string"
+ },
+ "verified": {
+ "type": "boolean"
}
}
},
- "CandidateScoringRuleContribution": {
+ "LxqDimensionSummaryView": {
"type": "object",
"properties": {
- "ruleCode": {
- "type": "string"
- },
- "outcome": {
- "type": "string",
- "enum": [
- "APPLIED",
- "NOT_APPLIED",
- "MISSING",
- "EXPIRED",
- "UNAVAILABLE"
- ]
- },
- "contribution": {
- "type": "number",
- "nullable": true
- },
- "maxContribution": {
+ "averageScore": {
"type": "number",
- "nullable": true
+ "format": "double"
},
- "label": {
- "type": "string"
- },
- "observation": {
- "type": "string"
+ "sampleCount": {
+ "type": "integer",
+ "format": "int64"
},
- "explanation": {
+ "dataState": {
"type": "string"
}
}
},
- "CandidateScoringValidity": {
+ "LxqPageResponseSalaryHistorySummaryResponse": {
"type": "object",
"properties": {
- "completedAt": {
- "type": "string",
- "format": "date-time"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqSalaryHistorySummaryResponse"
+ }
},
- "validUntil": {
- "type": "string",
- "format": "date-time"
+ "total": {
+ "type": "integer",
+ "format": "int64"
},
- "expired": {
- "type": "boolean"
+ "page": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "integer"
+ },
+ "totalPages": {
+ "type": "integer"
}
}
},
- "StudentProfileResponse": {
+ "LxqProgressUpdateResponse": {
"type": "object",
"properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "userId": {
+ "itemId": {
"type": "integer",
"format": "int64"
},
- "realName": {
- "type": "string"
- },
- "bio": {
- "type": "string"
- },
- "location": {
- "type": "string"
+ "completed": {
+ "type": "boolean"
},
- "education": {
- "type": "string"
+ "completedAt": {
+ "type": "string",
+ "format": "date-time"
},
- "school": {
- "type": "string"
+ "progressVersion": {
+ "type": "integer",
+ "format": "int64"
},
- "graduationYear": {
+ "totalItems": {
"type": "integer",
"format": "int32"
},
- "resumeUrl": {
- "type": "string"
- },
- "skills": {
- "type": "string"
- },
- "createdAt": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "CreateDataExportRequest": {
- "type": "object",
- "properties": {
- "format": {
- "type": "string"
+ "completedItems": {
+ "type": "integer",
+ "format": "int32"
},
- "idempotencyKey": {
- "type": "string",
- "maxLength": 64
+ "completionRate": {
+ "type": "number",
+ "format": "double"
}
}
},
- "DataExportTaskResponse": {
+ "LxqCompanyChecklistItemUpdateRequest": {
"type": "object",
"properties": {
- "taskId": {
- "type": "integer",
- "format": "int64"
- },
- "status": {
- "type": "string"
- },
- "format": {
- "type": "string"
- },
- "requestedAt": {
- "type": "string",
- "format": "date-time"
- },
- "startedAt": {
+ "title": {
"type": "string",
- "format": "date-time"
+ "maxLength": 120,
+ "minLength": 0
},
- "completedAt": {
+ "description": {
"type": "string",
- "format": "date-time"
+ "maxLength": 1000,
+ "minLength": 0
},
- "expiresAt": {
+ "category": {
"type": "string",
- "format": "date-time"
+ "minLength": 1,
+ "pattern": "DOCUMENT|ADMIN|EQUIPMENT|TRAINING|LOGISTICS|OTHER"
},
- "sizeBytes": {
+ "sortOrder": {
"type": "integer",
- "format": "int64"
+ "format": "int32",
+ "maximum": 9999,
+ "minimum": 0
},
- "downloadAvailable": {
+ "required": {
"type": "boolean"
},
- "errorCode": {
- "type": "string"
+ "active": {
+ "type": "boolean"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64",
+ "minimum": 0
}
- }
+ },
+ "required": [
+ "active",
+ "category",
+ "required",
+ "sortOrder",
+ "title",
+ "version"
+ ]
},
- "ApiResponseStudentProfileResponse": {
+ "LxqCompanyKnowledgeView": {
"type": "object",
"properties": {
- "code": {
- "type": "integer",
- "format": "int32"
+ "configured": {
+ "type": "boolean"
},
- "message": {
+ "culture": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/StudentProfileResponse"
+ "workPolicies": {
+ "type": "string"
},
- "requestId": {
+ "onboardingGuide": {
"type": "string"
},
- "timestamp": {
+ "updatedAt": {
"type": "string",
"format": "date-time"
+ },
+ "version": {
+ "type": "integer",
+ "format": "int64"
}
}
},
- "ApiResponseDataExportTaskResponse": {
+ "LxqUnauthorizedResponse": {
"type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "message",
+ "timestamp"
+ ],
"properties": {
"code": {
"type": "integer",
- "format": "int32"
+ "format": "int32",
+ "enum": [
+ 401
+ ]
},
"message": {
- "type": "string"
- },
- "data": {
- "$ref": "#/components/schemas/DataExportTaskResponse"
- },
- "requestId": {
- "type": "string"
+ "type": "string",
+ "enum": [
+ "not authenticated"
+ ]
},
"timestamp": {
"type": "string",
- "format": "date-time"
+ "enum": [
+ ""
+ ]
}
}
},
- "MessageResponse": {
+ "LxqSalaryHistorySummaryResponse": {
"type": "object",
- "description": "脱敏消息响应;TALENT_INVITATION 使用 senderScope 而非 senderUserId",
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
- "conversationId": {
- "type": "integer",
- "format": "int64"
- },
- "senderUserId": {
- "type": "integer",
- "format": "int64"
- },
- "senderScope": {
+ "cityCode": {
"type": "string"
},
- "content": {
+ "cityName": {
"type": "string"
},
- "status": {
- "type": "string",
- "enum": [
- "SENT",
- "RECALLED"
- ]
+ "dataLevel": {
+ "$ref": "#/components/schemas/LxqSalaryDataLevel"
},
- "recalledAt": {
- "type": "string",
- "format": "date-time"
+ "grossMonthlySalary": {
+ "type": "number"
+ },
+ "netSalary": {
+ "type": "number"
+ },
+ "monthIndex": {
+ "type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
- },
- "isRead": {
- "type": "boolean"
}
}
},
- "MessagePageResponse": {
+ "LxqProgressUpdateRequest": {
"type": "object",
- "description": "脱敏消息分页响应",
"properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/MessageResponse"
- }
+ "completed": {
+ "type": "boolean"
},
- "total": {
+ "version": {
"type": "integer",
- "format": "int64"
+ "format": "int64",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "completed"
+ ]
+ },
+ "LxqCompanyKnowledgeOverviewResponse": {
+ "type": "object",
+ "properties": {
+ "company": {
+ "$ref": "#/components/schemas/LxqCompanyView"
},
- "page": {
- "type": "integer",
- "format": "int32"
+ "knowledgeState": {
+ "type": "string"
},
- "size": {
- "type": "integer",
- "format": "int32"
+ "knowledge": {
+ "$ref": "#/components/schemas/LxqKnowledgeView"
},
- "totalPages": {
- "type": "integer",
- "format": "int32"
+ "reviewSummary": {
+ "$ref": "#/components/schemas/LxqReviewSummaryView"
}
}
},
- "ApiResponseMessagePageResponse": {
+ "LxqApiResponseEffectiveChecklistResponse": {
"type": "object",
"properties": {
"code": {
@@ -15933,7 +19283,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/MessagePageResponse"
+ "$ref": "#/components/schemas/LxqEffectiveChecklistResponse"
},
"requestId": {
"type": "string"
@@ -15944,18 +19294,17 @@
}
}
},
- "ApiResponseMessageResponse": {
+ "LxqApiResponseSalaryCalculationResponse": {
"type": "object",
"properties": {
"code": {
- "type": "integer",
- "format": "int32"
+ "type": "integer"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/MessageResponse"
+ "$ref": "#/components/schemas/LxqSalaryCalculationResponse"
},
"requestId": {
"type": "string"
@@ -15966,177 +19315,180 @@
}
}
},
- "ApiResponsePageResponseDataExportTaskResponse": {
+ "LxqEffectiveChecklistResponse": {
"type": "object",
"properties": {
- "code": {
+ "companyId": {
"type": "integer",
- "format": "int32"
+ "format": "int64"
},
- "message": {
+ "companyName": {
"type": "string"
},
- "data": {
- "type": "object",
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/DataExportTaskResponse"
- }
- },
- "totalElements": {
- "type": "integer",
- "format": "int64"
- },
- "page": {
- "type": "integer",
- "format": "int32"
- },
- "size": {
- "type": "integer",
- "format": "int32"
- }
- }
+ "customized": {
+ "type": "boolean"
},
- "requestId": {
- "type": "string"
+ "totalItems": {
+ "type": "integer",
+ "format": "int32"
},
- "timestamp": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "RefreshTokenRequest": {
- "type": "object",
- "required": [
- "refreshToken"
- ],
- "properties": {
- "refreshToken": {
- "type": "string",
- "minLength": 1,
- "maxLength": 4096
+ "completedItems": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "completionRate": {
+ "type": "number",
+ "format": "double"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqChecklistItemView"
+ }
}
}
},
- "TokenPairResponse": {
+ "LxqSalaryHistoryDetailResponse": {
"type": "object",
"properties": {
- "accessToken": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "cityCode": {
"type": "string"
},
- "refreshToken": {
+ "cityName": {
"type": "string"
},
- "expiresIn": {
- "type": "integer",
- "format": "int64"
+ "dataLevel": {
+ "$ref": "#/components/schemas/LxqSalaryDataLevel"
+ },
+ "policyVersion": {
+ "type": "string"
+ },
+ "taxRulesVersion": {
+ "type": "string"
+ },
+ "monthIndex": {
+ "type": "integer"
+ },
+ "grossMonthlySalary": {
+ "type": "number"
+ },
+ "netSalary": {
+ "type": "number"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "inputSnapshot": {
+ "type": "object"
+ },
+ "policySnapshot": {
+ "type": "object"
+ },
+ "resultSnapshot": {
+ "type": "object"
}
}
},
- "ApiResponseTokenPairResponse": {
+ "LxqApiResponseListCompanyChecklistItemView": {
"type": "object",
"properties": {
"code": {
- "type": "integer"
+ "type": "integer",
+ "format": "int32"
},
"message": {
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/TokenPairResponse"
- }
- }
- },
- "PasswordSetRequest": {
- "type": "object",
- "properties": {
- "smsCode": {
- "type": "string",
- "minLength": 1
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LxqCompanyChecklistItemView"
+ }
},
- "newPassword": {
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "minLength": 1
+ "format": "date-time"
}
- },
- "required": [
- "newPassword",
- "smsCode"
- ]
+ }
},
- "PasswordResetRequest": {
+ "LxqApiResponsePageResponseSalaryHistorySummaryResponse": {
"type": "object",
"properties": {
- "phone": {
- "type": "string",
- "minLength": 1,
- "pattern": "[0-9]{11}"
+ "code": {
+ "type": "integer"
},
- "smsCode": {
- "type": "string",
- "minLength": 1
+ "message": {
+ "type": "string"
},
- "newPassword": {
- "type": "string",
- "minLength": 1
- }
- },
- "required": [
- "newPassword",
- "phone",
- "smsCode"
- ]
- },
- "PasswordLoginRequest": {
- "type": "object",
- "properties": {
- "phone": {
- "type": "string",
- "minLength": 1,
- "pattern": "[0-9]{11}"
+ "data": {
+ "$ref": "#/components/schemas/LxqPageResponseSalaryHistorySummaryResponse"
},
- "password": {
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "minLength": 1
+ "format": "date-time"
}
- },
- "required": [
- "password",
- "phone"
- ]
+ }
},
- "PasswordChangeRequest": {
+ "LxqApiResponseSkillCloudResponse": {
"type": "object",
"properties": {
- "currentPassword": {
- "type": "string",
- "minLength": 1
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "newPassword": {
+ "message": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/components/schemas/LxqSkillCloudResponse"
+ },
+ "requestId": {
+ "type": "string"
+ },
+ "timestamp": {
"type": "string",
- "minLength": 1
+ "format": "date-time"
}
- },
- "required": [
- "currentPassword",
- "newPassword"
- ]
+ }
},
- "PasswordOperationResponse": {
+ "LxqSalaryCalculationOverrideRequest": {
"type": "object",
"properties": {
- "passwordConfigured": {
- "type": "boolean"
+ "socialSecurityBase": {
+ "type": "number"
},
- "reauthenticationRequired": {
- "type": "boolean"
+ "housingFundBase": {
+ "type": "number"
+ },
+ "pensionRate": {
+ "type": "number"
+ },
+ "medicalRate": {
+ "type": "number"
+ },
+ "unemploymentRate": {
+ "type": "number"
+ },
+ "housingFundRate": {
+ "type": "number"
+ },
+ "seriousIllnessMonthlyFee": {
+ "type": "number"
}
}
},
- "ApiResponsePasswordOperationResponse": {
+ "LxqApiResponse": {
"type": "object",
"properties": {
"code": {
@@ -16146,9 +19498,7 @@
"message": {
"type": "string"
},
- "data": {
- "$ref": "#/components/schemas/PasswordOperationResponse"
- },
+ "data": {},
"requestId": {
"type": "string"
},
@@ -16158,72 +19508,70 @@
}
}
},
- "CompanyDetails": {
+ "LxqSkillCloudItem": {
"type": "object",
"properties": {
- "name": {
- "type": "string",
- "maxLength": 100,
- "minLength": 0
+ "rank": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 1,
+ "description": "当前筛选范围内的稳定排名,从 1 开始。"
},
- "logoUrl": {
- "type": "string",
- "maxLength": 500,
- "minLength": 0
+ "skillId": {
+ "type": "integer",
+ "format": "int64"
},
- "description": {
+ "skillCode": {
"type": "string"
},
- "industry": {
- "type": "string",
- "maxLength": 80,
- "minLength": 0
+ "nameZh": {
+ "type": "string"
},
- "website": {
+ "nameEn": {
"type": "string",
- "maxLength": 255,
- "minLength": 0
+ "nullable": true
},
- "address": {
+ "sourceType": {
"type": "string",
- "maxLength": 255,
- "minLength": 0
- }
- },
- "required": [
- "name"
- ]
- },
- "CompanyRegistrationRequest": {
- "type": "object",
- "properties": {
- "phone": {
+ "enum": [
+ "ESCO",
+ "O*NET"
+ ],
+ "description": "技能身份主来源。"
+ },
+ "sourceCode": {
"type": "string",
- "minLength": 1,
- "pattern": "[0-9]{11}"
+ "description": "ESCO URI 或 O*NET 三元组标识。"
},
- "code": {
+ "categoryId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "categoryName": {
+ "type": "string"
+ },
+ "heat": {
+ "type": "number",
+ "nullable": true,
+ "description": "O*NET Importance;无映射为 null,且排在非空热度之后。"
+ },
+ "heatSourceCode": {
"type": "string",
- "minLength": 1,
- "pattern": "[0-9]{6}"
+ "nullable": true,
+ "description": "热度来源 SOC。"
},
- "password": {
+ "heatElementId": {
"type": "string",
- "maxLength": 64,
- "minLength": 12
+ "nullable": true,
+ "description": "热度来源 O*NET Element ID。"
},
- "company": {
- "$ref": "#/components/schemas/CompanyDetails"
+ "heatProxy": {
+ "type": "boolean",
+ "description": "热度是否为代理映射。"
}
- },
- "required": [
- "code",
- "company",
- "password",
- "phone"
- ]
+ }
},
- "ApiResponseCompanyRegistrationResponse": {
+ "LxqApiResponseCompanyChecklistItemView": {
"type": "object",
"properties": {
"code": {
@@ -16234,7 +19582,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/CompanyRegistrationResponse"
+ "$ref": "#/components/schemas/LxqCompanyChecklistItemView"
},
"requestId": {
"type": "string"
@@ -16245,36 +19593,80 @@
}
}
},
- "CompanyRegistrationResponse": {
+ "LxqSkillLearningPathItem": {
"type": "object",
"properties": {
- "userId": {
+ "priority": {
+ "type": "integer",
+ "format": "int32",
+ "minimum": 1
+ },
+ "skillId": {
"type": "integer",
"format": "int64"
},
- "companyId": {
+ "skillName": {
+ "type": "string"
+ },
+ "categoryId": {
"type": "integer",
"format": "int64"
},
- "role": {
+ "categoryName": {
"type": "string"
},
- "onboardingStatus": {
+ "suggestion": {
+ "type": "string",
+ "description": "按技能分类生成的通用建议,不含课程、AI、链接、时长或进度。"
+ }
+ }
+ },
+ "LxqChecklistItemView": {
+ "type": "object",
+ "properties": {
+ "itemId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "source": {
"type": "string"
},
- "accessToken": {
+ "itemKey": {
"type": "string"
},
- "refreshToken": {
+ "title": {
"type": "string"
},
- "expiresIn": {
+ "description": {
+ "type": "string"
+ },
+ "category": {
+ "type": "string"
+ },
+ "required": {
+ "type": "boolean"
+ },
+ "sortOrder": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "active": {
+ "type": "boolean"
+ },
+ "completed": {
+ "type": "boolean"
+ },
+ "completedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "progressVersion": {
"type": "integer",
"format": "int64"
}
}
},
- "ApiResponseCompanyOnboardingResponse": {
+ "LxqApiResponseProgressUpdateResponse": {
"type": "object",
"properties": {
"code": {
@@ -16285,7 +19677,7 @@
"type": "string"
},
"data": {
- "$ref": "#/components/schemas/CompanyOnboardingResponse"
+ "$ref": "#/components/schemas/LxqProgressUpdateResponse"
},
"requestId": {
"type": "string"
@@ -16296,79 +19688,105 @@
}
}
},
- "CompanyOnboardingResponse": {
+ "LxqApiResponseSkillLearningPathResponse": {
"type": "object",
"properties": {
- "company": {
- "$ref": "#/components/schemas/CompanySummary"
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "onboardingStatus": {
+ "message": {
"type": "string"
},
- "latestVerification": {
- "$ref": "#/components/schemas/VerificationSummary"
+ "data": {
+ "$ref": "#/components/schemas/LxqSkillLearningPathResponse"
},
- "missingFields": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "requestId": {
+ "type": "string"
},
- "allowedActions": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "CompanySummary": {
+ "LxqSalaryCalculationResponse": {
"type": "object",
"properties": {
- "id": {
+ "historyId": {
"type": "integer",
"format": "int64"
},
- "name": {
- "type": "string"
- },
- "logoUrl": {
- "type": "string"
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
},
- "description": {
- "type": "string"
+ "result": {
+ "$ref": "#/components/schemas/LxqSalaryCalculationResult"
+ }
+ }
+ },
+ "LxqSalaryDataLevel": {
+ "type": "string",
+ "enum": [
+ "CITY",
+ "PROVINCE_FALLBACK"
+ ]
+ },
+ "LxqApiResponseSkillMatchResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
},
- "industry": {
+ "message": {
"type": "string"
},
- "website": {
- "type": "string"
+ "data": {
+ "$ref": "#/components/schemas/LxqSkillMatchResponse"
},
- "address": {
+ "requestId": {
"type": "string"
},
- "verified": {
- "type": "boolean"
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "VerificationSummary": {
+ "LxqReviewSummaryView": {
"type": "object",
"properties": {
- "id": {
+ "state": {
+ "type": "string"
+ },
+ "totalReviews": {
"type": "integer",
- "format": "int64"
+ "format": "int32"
},
- "status": {
- "type": "string"
+ "averageRating": {
+ "type": "number",
+ "format": "double"
},
- "submittedAt": {
- "type": "string",
- "format": "date-time"
+ "ratingDistribution": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
},
- "decidedAt": {
- "type": "string",
- "format": "date-time"
+ "topTags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dimensionSummary": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/LxqDimensionSummaryView"
+ }
}
}
}
diff --git a/docs/salary-calculator-api.md b/docs/salary-calculator-api.md
new file mode 100644
index 0000000..3ad6a3f
--- /dev/null
+++ b/docs/salary-calculator-api.md
@@ -0,0 +1,158 @@
+# 薪资计算器 API(N05)
+
+> Base URL:`/api/v1`
+> 认证:`Authorization: Bearer `
+> 角色:当前登录用户必须具备 `STUDENT` 角色。
+
+## 1. 能力边界
+
+- 输入税前月薪,估算个人五险一金、大病固定费和当月个税后的到手工资。
+- 采用居民个人综合所得累计预扣法;`monthIndex` 表示当前工资口径下的累计计税月份数,而不是自然月编号。
+- 支持用户覆盖社保基数、公积金基数和个人比例。
+- 城市政策以地级行政区、直辖市和省直辖县级市为最小单元,不拆分到区县。
+- `dataLevel=CITY` 表示城市级参数;`dataLevel=PROVINCE_FALLBACK` 表示由于公开城市级资料不足而使用省级回退参数,结果精度较低。
+- 所有结果均为估算值,实际以工资单、当地政策和税务申报为准。
+
+## 2. 查询城市列表
+
+`GET /salary-calculator/cities`
+
+返回全部启用城市摘要,按省份编码和城市编码排序。
+
+响应示例:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": [
+ {
+ "cityCode": "110000",
+ "provinceCode": "110000",
+ "provinceName": "北京市",
+ "cityName": "北京市",
+ "policyVersion": "2026-09-20-v1",
+ "policyEffectiveDate": "2026-07-01",
+ "dataLevel": "CITY"
+ }
+ ]
+}
+```
+
+## 3. 查询城市默认参数
+
+`GET /salary-calculator/cities/{cityCode}`
+
+返回城市级或省级回退的当前默认参数。计算请求必须原样携带响应中的 `policyVersion` 作为 `expectedPolicyVersion`。
+
+## 4. 计算并保存
+
+`POST /salary-calculator/calculations`
+
+请求示例:
+
+```json
+{
+ "cityCode": "110000",
+ "grossMonthlySalary": 10000.00,
+ "monthIndex": 1,
+ "specialAdditionalDeduction": 0.00,
+ "expectedPolicyVersion": "2026-09-20-v1",
+ "idempotencyKey": "optional-client-key",
+ "overrides": {
+ "socialSecurityBase": 10000.00,
+ "housingFundBase": 10000.00,
+ "pensionRate": 0.08,
+ "medicalRate": 0.02,
+ "unemploymentRate": 0.005,
+ "housingFundRate": 0.12,
+ "seriousIllnessMonthlyFee": 0.00
+ }
+}
+```
+
+- `cityCode`、`grossMonthlySalary`、`expectedPolicyVersion` 必填。
+- `monthIndex` 默认 1,范围 1–12。
+- `specialAdditionalDeduction` 默认 0。
+- `idempotencyKey` 可选,最长 64 字符;同用户同键同规范化请求返回原历史,同键不同请求返回 `409/10604`。
+- 覆盖基数必须位于对应城市范围内;比例为 0 时允许基数为 0。
+
+成功响应:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "historyId": 123,
+ "createdAt": "2026-09-20T16:00:00",
+ "result": {
+ "cityCode": "110000",
+ "cityName": "北京市",
+ "dataLevel": "CITY",
+ "policyVersion": "2026-09-20-v1",
+ "policyEffectiveDate": "2026-07-01",
+ "taxRulesVersion": "CN_IIT_2019_V1",
+ "estimate": true,
+ "monthIndex": 1,
+ "grossMonthlySalary": 10000.00,
+ "socialSecurityBase": 10000.00,
+ "housingFundBase": 10000.00,
+ "pension": 800.00,
+ "medical": 200.00,
+ "unemployment": 50.00,
+ "housingFund": 1200.00,
+ "currentMonthTax": 82.50,
+ "netSalary": 7667.50
+ }
+ }
+}
+```
+
+## 5. 查询历史
+
+`GET /salary-calculator/calculations?page=0&size=20`
+
+- 仅返回当前用户的记录。
+- 按创建时间倒序、历史 ID 倒序。
+- `size` 最大 100。
+
+`GET /salary-calculator/calculations/{id}`
+
+返回输入、政策、覆盖项和结果三组完整 JSON 快照。访问他人历史统一返回 `404/10603`。
+
+## 6. 删除历史
+
+`DELETE /salary-calculator/calculations/{id}`
+
+物理删除本人历史;成功后再次查询返回 `404/10603`。删除后原幂等键可重新使用。
+
+## 7. 错误码
+
+| HTTP | code | 含义 |
+|---|---|---|
+| 400 | 10602 | 工资、比例、基数或分页参数非法 |
+| 401 | 401 | 未登录或 Token 无效 |
+| 403 | 2002 | 已登录但不是 `STUDENT` |
+| 404 | 10601 | 城市不存在、停用或未配置 |
+| 404 | 10603 | 历史不存在或不属于当前用户 |
+| 409 | 10604 | 幂等键冲突 |
+| 409 | 10605 | 城市政策版本已变化 |
+
+`10605` 响应会在 `data` 中返回最新 `policyVersion` 和 `policyEffectiveDate`,客户端应重新加载城市详情后再试算。
+
+## 8. 计算口径
+
+```text
+社保基数 = 用户覆盖值,否则 min(max(税前月薪, 社保下限), 社保上限)
+公积金基数 = 用户覆盖值,否则 min(max(税前月薪, 公积金下限), 公积金上限)
+
+累计收入 = 税前月薪 × monthIndex
+累计基本减除费用 = 5000 × monthIndex
+累计专项附加扣除 = 月度专项附加扣除 × monthIndex
+累计应纳税所得额 = max(累计收入 - 累计个人社保 - 累计公积金 - 累计大病费
+ - 累计基本减除费用 - 累计专项附加扣除, 0)
+当月个税 = max(累计应纳税额 - 累计已预扣税额, 0)
+到手工资 = max(税前月薪 - 个人养老 - 个人医疗 - 个人失业 - 个人公积金
+ - 大病固定费 - 当月个税, 0)
+```
diff --git a/docs/skill-cloud-api.md b/docs/skill-cloud-api.md
new file mode 100644
index 0000000..476de9d
--- /dev/null
+++ b/docs/skill-cloud-api.md
@@ -0,0 +1,275 @@
+# 行业技能词云、个人匹配度与学习路径 API
+
+> 版本:N03 设计锁定版
+> 状态:已编码实现
+> 适用范围:学生端只读接口。本文描述 `GET /api/v1/skills/word-cloud`、`GET /api/v1/skills/match`、`GET /api/v1/skills/learning-path`。
+> Base URL:`http://127.0.0.1:8080/api/v1`(生产环境替换域名,路径不变)。
+
+## 1. 权限与共同参数
+
+三个接口均:
+
+- 仅允许 `STUDENT` 访问。
+- 必须携带 `Authorization: Bearer `,身份只从 JWT/SecurityContext 获取,不接受 `userId`、`studentId` 等身份注入参数。
+- 成功、`400` 和 `403` 响应使用统一 `ApiResponse`;匿名或无效 JWT 的 `401` 由全局 Security 入口直接返回裸 JSON,不包含 `data` 和 `requestId`。
+- 只读,不写入学习进度、学生资料或词库数据。
+
+查询参数:
+
+| 参数 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `industryId` | long | 是 | 词库行业 ID,必须为正整数,且必须是真实存在的行业。 |
+| `occupationId` | long | 是 | 词库职位 ID,必须为正整数,且必须属于该行业。 |
+| `categoryId` | long | 否 | 技能分类 ID,必须为正整数;省略时使用该职位下全部技能分类。传入时必须属于目标职位。 |
+
+任一必填参数缺失、非正整数,或行业—职位—分类关系非法时返回 `400`。如果未登录返回 `401`,非 STUDENT 用户返回 `403`。
+
+## 2. 通用响应与排序
+
+三个接口的 `data` 都使用 camelCase 字段。词云和 TOP10 使用同一份服务端排序结果:
+
+1. `heat` 从高到低;`heat` 为 `null` 的技能排在所有非空热度之后。
+2. 热度相同时按 `nameZh` 升序。
+3. 其余情况按 `skillId` 升序,保证重复请求顺序稳定。
+4. `rank` 从 1 连续递增。
+
+`heat` 来自 O*NET Importance。无可靠 O*NET Importance 映射的 ESCO 技能仍返回,但 `heat` 为 `null`。TOP10 不在后端单独存储或单独排序;前端直接取词云 `data.items` 的前 `min(10, data.total)` 项。
+
+技能身份来源:
+
+- `sourceType`:`ESCO` 或 `O*NET`,表示技能条目的主来源。
+- `sourceCode`:可追溯来源标识。ESCO 为技能 URI;O*NET 补充技能为 `SOC|Workplace Example|Element ID`。
+- `heatSourceCode`:热度来源 SOC;没有 O*NET 热度时为 `null`。
+- `heatElementId`:O*NET Importance 的来源 Element ID;没有时为 `null`。
+- `heatProxy`:该条热度是否为代理映射。代理值不改变排序规则,但前端可据此展示来源说明。
+
+## 3. 查询词云
+
+```http
+GET /api/v1/skills/word-cloud?industryId=1&occupationId=2&categoryId=101
+Authorization: Bearer
+```
+
+`categoryId` 可省略:
+
+```http
+GET /api/v1/skills/word-cloud?industryId=1&occupationId=2
+```
+
+成功响应为 `ApiResponse`。`SkillCloudResponse` 返回筛选节点、总数和当前范围内的完整技能列表:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "industry": { "id": 1, "code": "INTERNET", "name": "互联网" },
+ "occupation": { "id": 1, "code": "FRONTEND_DEVELOPER", "name": "前端开发工程师" },
+ "category": { "id": 103, "code": "FRONTEND_FRAMEWORK", "name": "前端框架" },
+ "total": 1,
+ "items": [
+ {
+ "rank": 1,
+ "skillId": 26,
+ "skillCode": "REACT",
+ "nameZh": "React",
+ "nameEn": "React",
+ "sourceType": "O*NET",
+ "sourceCode": "15-1254.00|React|2.E.7.h",
+ "categoryId": 103,
+ "categoryName": "前端框架",
+ "heat": 4.38,
+ "heatSourceCode": "15-1254.00",
+ "heatElementId": "2.E.7.h",
+ "heatProxy": true
+ }
+ ]
+ },
+ "requestId": "req-123",
+ "timestamp": "2026-09-15T10:00:00Z"
+}
+```
+
+`category` 在未传 `categoryId` 时为 `null`。合法范围但暂时没有技能时返回成功、`total=0`、`items=[]`。前端根据 `items` 渲染词云,并截取前十条作为 TOP10。
+
+## 4. 查询个人技能匹配度
+
+```http
+GET /api/v1/skills/match?industryId=1&occupationId=2&categoryId=101
+Authorization: Bearer
+```
+
+匹配集合严格取当前筛选结果的 TOP10。系统从当前 JWT 学生的 `student_profiles.skills_json` 读取技能,使用标准技能名、英文名、技能代码和别名归一化匹配。大小为 `total` 的筛选范围使用 `min(10, total)` 作为分母:
+
+```text
+matchScore = round(matchedCount * 100 / min(10, total))
+```
+
+- `total=0` 时 `matchScore=0`,命中列表和缺失列表为空。
+- 范围少于 10 项时按实际技能数计算。
+- 重复技能或指向同一标准技能的多个别名只计一次。
+- 示例:范围 15 条、命中 5 条,`matchScore=33`。
+- 原始 `skills_json`、手机号、邮箱和简历内容不会出现在响应中。
+
+成功响应为 `ApiResponse`:
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "matchScore": 50,
+ "matchedCount": 1,
+ "totalCount": 2,
+ "matchedSkills": [
+ {
+ "rank": 1,
+ "skillId": 26,
+ "skillCode": "REACT",
+ "nameZh": "React",
+ "nameEn": "React",
+ "sourceType": "O*NET",
+ "sourceCode": "15-1254.00|React|2.E.7.h",
+ "categoryId": 103,
+ "categoryName": "前端框架",
+ "heat": 4.38,
+ "heatSourceCode": "15-1254.00",
+ "heatElementId": "2.E.7.h",
+ "heatProxy": true
+ }
+ ],
+ "missingSkills": [
+ {
+ "rank": 2,
+ "skillId": 31,
+ "skillCode": "DOCKER",
+ "nameZh": "Docker",
+ "nameEn": "Docker",
+ "sourceType": "O*NET",
+ "sourceCode": "15-1299.08|Docker|2.E.7.h",
+ "categoryId": 105,
+ "categoryName": "工程化工具",
+ "heat": 4.12,
+ "heatSourceCode": "15-1299.08",
+ "heatElementId": "2.E.7.h",
+ "heatProxy": true
+ }
+ ]
+ },
+ "requestId": "req-456",
+ "timestamp": "2026-09-15T10:01:00Z"
+}
+```
+
+`matchedSkills` 与 `missingSkills` 的并集等于当前 TOP10,两个列表各自保持词云排序;`totalCount` 是实际匹配集合大小。
+
+## 5. 生成学习路径
+
+```http
+GET /api/v1/skills/learning-path?industryId=1&occupationId=2&categoryId=101
+Authorization: Bearer
+```
+
+学习路径只消费个人匹配结果中的 `missingSkills`:
+
+- 只包含当前 TOP10 中未命中的技能,不包含已命中技能或 TOP10 之外的技能。
+- 顺序与 `missingSkills` 完全一致,`priority` 从 1 连续递增。
+- 每项只返回技能 ID、名称、分类、优先级和简化学习建议。
+- 后端不调用 AI、课程平台或外部知识库;不会返回课程链接、讲师、价格、学习时长或完成度。
+- 系统不持久化学习进度或完成状态。
+- 全部命中或合法范围没有技能时返回 `total=0`、`items=[]`。
+
+建议模板按技能分类确定性生成:
+
+| 模板类别 | 建议方向 |
+|---|---|
+| 编程语言 | 基础语法、常见数据结构、至少一个编码练习。 |
+| 框架 | 核心概念与生命周期、小型项目集成实践。 |
+| 工具 | 安装与基础配置、结合工程完成实际操作。 |
+| 通用 | 核心概念和常见应用场景、简短实践巩固。 |
+
+```json
+{
+ "code": 200,
+ "message": "ok",
+ "data": {
+ "total": 1,
+ "items": [
+ {
+ "priority": 1,
+ "skillId": 26,
+ "skillName": "React",
+ "categoryId": 103,
+ "categoryName": "前端框架",
+ "suggestion": "先理解 React 的核心概念与生命周期,再通过一个小型项目练习集成。"
+ }
+ ]
+ },
+ "requestId": "req-789",
+ "timestamp": "2026-09-15T10:02:00Z"
+}
+```
+
+## 6. 错误响应示例
+
+`400` 和 `403` 使用统一 `ApiResponse`;`401` 由全局 Security 入口返回裸 JSON。以下示例与运行时契约一致。
+
+```json
+{
+ "code": 1001,
+ "message": "bad request",
+ "data": null,
+ "requestId": "req-400",
+ "timestamp": "2026-09-15T10:03:00Z"
+}
+```
+
+| HTTP | 场景 | 典型 `code` |
+|---|---|---|
+| `400` | `industryId`/`occupationId` 缺失、非正整数,或节点关系非法 | `1001` |
+| `401` | 未携带有效 JWT 或令牌无效/过期 | `401` |
+| `403` | 已登录但不是 STUDENT | `2002` |
+
+示例 401:
+
+```json
+{
+ "code": 401,
+ "message": "not authenticated",
+ "timestamp": ""
+}
+```
+
+`401` 响应不包含 `data` 和 `requestId`。
+
+示例 403:
+
+```json
+{
+ "code": 2002,
+ "message": "forbidden",
+ "data": null,
+ "requestId": "req-403",
+ "timestamp": "2026-09-15T10:05:00Z"
+}
+```
+
+## 7. 字段参考
+
+### SkillCloudNode
+
+`id`、`code`、`name`。`category` 节点在未指定分类时为 `null`。
+
+### SkillCloudItem
+
+`rank`、`skillId`、`skillCode`、`nameZh`、`nameEn`、`sourceType`、`sourceCode`、`categoryId`、`categoryName`、`heat`、`heatSourceCode`、`heatElementId`、`heatProxy`。
+
+### SkillMatchResponse
+
+`matchScore`、`matchedCount`、`totalCount`、`matchedSkills`、`missingSkills`。
+
+### SkillLearningPathItem / SkillLearningPathResponse
+
+`SkillLearningPathItem`:`priority`、`skillId`、`skillName`、`categoryId`、`categoryName`、`suggestion`。
+
+`SkillLearningPathResponse`:`total`、`items`。
diff --git a/docs/skill-taxonomy-sources.md b/docs/skill-taxonomy-sources.md
new file mode 100644
index 0000000..09c30f2
--- /dev/null
+++ b/docs/skill-taxonomy-sources.md
@@ -0,0 +1,79 @@
+# 行业技能词库来源与覆盖说明
+
+本说明是仓库面向实现和评审的技能词库来源基线,内容与 `changes/n03-skill-cloud/data/source-manifest.md` 保持同一事实集合。
+
+## 1. 固定来源
+
+| 来源 | 固定版本 | 用途 | 许可/复用条件 | 官方地址与归属 |
+| --- | --- | --- | --- | --- |
+| ESCO | ESCO dataset v1.2.1(Last update 10/12/2025,发布页记录 Release v5.7.0) | 提供行业/职位映射所需的职业—技能—技能分类主关系、稳定来源 ID 和层级结构 | 依据 Commission Decision 2011/833/EU,可免费下载、使用、复制和复用。文档和产品界面须保留官方署名语句:`This service uses the ESCO classification of the European Commission.` | 数据集下载页:https://esco.ec.europa.eu/en/use-esco/download
复用条件说明:https://esco.ec.europa.eu/en/about-esco/faq |
+| O*NET | O*NET 31.0 Database | 为 ESCO 未收录的具体技术提供 `software_skills` 补充来源,并通过职业/工作活动 Importance 提供首版词云热度 `heat` | License 为 CC BY 4.0,归属与许可说明见 https://creativecommons.org/licenses/by/4.0/ | 官方数据库页:https://www.onetcenter.org/database.html |
+
+运行时不得访问 ESCO、O*NET 或任何在线词库服务。所有首版数据必须随 Flyway 迁移进入本地数据库,并保留来源版本与归属信息。
+
+## 2. 首版覆盖边界
+
+首版只覆盖互联网、金融、教育三类行业及下列 10 个已列代表性职位。该矩阵定义导入上限和最小覆盖范围,不要求在全量上游数据中导入未列出的职位。
+
+| 行业 | 代表性职位 | 首批技能分类范围 |
+| --- | --- | --- |
+| 互联网 | 前端开发工程师 | 编程语言、Web 基础、前端框架、工程化工具、浏览器与调试、测试、版本控制与协作 |
+| 互联网 | 后端开发工程师 | 编程语言、后端框架与平台、数据库、缓存与消息、云/DevOps、测试、工程化工具、安全 |
+| 互联网 | 测试工程师 | 编程语言、测试设计、自动化测试框架、接口与数据库测试、性能测试、CI/CD 与工程化工具 |
+| 互联网 | DevOps 工程师 | 编程语言与脚本、云平台、容器与编排、CI/CD、配置管理与 IaC、可观测性、安全、数据库 |
+| 金融 | 金融数据分析师 | 编程语言、数据分析与可视化、数据库与数据仓库、统计与建模、金融计算框架/平台、金融领域知识、工程化工具 |
+| 金融 | 风控建模工程师 | 编程语言、统计与建模、风险模型、建模框架/平台、数据处理与数据库、模型验证、部署与工程化工具 |
+| 金融 | 量化开发工程师 | 编程语言、量化建模框架/平台、市场与金融数据、数据库、低延迟与高性能工程、测试、云/DevOps |
+| 教育 | 教育产品经理 | 教育领域知识、产品分析方法、需求与流程、数据分析、教育平台与工具、协作与工程化工具 |
+| 教育 | 教学设计师 | 教学设计、课程与学习平台、数字化内容工具、评估设计、学习数据分析、无障碍与规范 |
+| 教育 | 教育数据分析师 | 编程语言、数据分析与可视化、数据库与 SQL、统计与建模、教育领域知识、报表与工程化工具 |
+计数说明:任务给出的逐项职位清单为互联网 4 个、金融 3 个、教育 3 个,共 10 个。验收文字中的“11 个职位”与该枚举不一致;本清单严格覆盖逐项列出的 10 个职位,不自行新增未批准职位。
+
+矩阵中的分类是每个职位首批应覆盖的能力域;T3 只导入这些分类下已确定稳定来源 ID、标准技能和中文标准名的技能,不在此文档中展开具体 `INSERT` 行。
+
+## 3. 导入规则
+
+1. **职责分工**:T2 只建立七张词库表、外键、唯一约束和查询索引;T3 只导入上述三类行业、10 个已列代表性职位及其关联技能分类、技能、别名和 O*NET Importance。
+2. **代表性子集与混合来源**:不导入 ESCO/O*NET 全量数据;ESCO 是职位、通用技能和分类主表;ESCO 无可靠节点的具体技术使用 O*NET `software_skills` 补充;不把平台自由文本岗位或行业直接当作标准词库节点。
+3. **来源 ID 不变**:ESCO/O*NET 来源 ID 原样保存在稳定来源字段中;项目不得重编号、覆盖或伪造上游 ID。
+4. **中文标准名必填**:每个入选技能必须有非空 `name_zh` 中文标准名;中文名称由项目维护,但不替代或修改上游来源 ID。
+5. **热度来源**:每条非空 Importance 必须保存 O*NET SOC、Element ID 和代理标记;技能无法映射 O*NET Importance 时必须保留,写入 `importance=null`;查询时映射为 `heat=null`,并排在有热度技能之后。
+6. **项目映射责任**:项目维护中文名称、别名、技能分类和行业/职位映射,不修改开源来源 ID。行业/职位映射、细粒度分类和跨源技能对应关系均作为项目适配层记录。
+7. **别名归一化**:生成 `normalized_alias` 时依次执行 Unicode NFKC、首尾空白移除、大小写折叠、连字符转空格、连续空白折叠为单空格、句点移除;`+` 和 `#` 必须保留,不能删除或替换。
+8. **来源可追溯**:来源清单写入 `skill_source_versions`,至少记录来源名称、固定版本、许可、归属 URL 和导入时间;O*NET 补充技术的 `source_code` 使用真实 `SOC|Workplace Example|Element ID` 组合,职位技能关系记录 O*NET SOC、Element ID、代理标记及关联的来源版本。
+9. **迁移不可改写**:T2/T3 计划使用 `V47__skill_cloud_taxonomy.sql` 和 `V48__skill_cloud_seed.sql`。执行前若编号已被占用,必须回退规划并刷新编号;后续词库更新只能新增 Flyway 迁移,不得改写 V1–V34 或任何已执行迁移。
+10. **运行时离线**:接口运行时不得调用外部词库、AI、课程平台或同步服务;排名只读取本地 Flyway 数据。
+
+## 4. 来源版本、许可与归属 URL
+
+| 数据落点 | 来源名称 | 版本字段固定值 | 许可字段固定值 | 归属 URL |
+| --- | --- | --- | --- | --- |
+| 职业、技能、技能分类及关系 | ESCO | `1.2.1 (Release v5.7.0, Last update 10/12/2025)` | `Commission Decision 2011/833/EU` | https://esco.ec.europa.eu/en/use-esco/download |
+| 职位技能 Importance | O*NET | `31.0 Database` | `CC BY 4.0` | https://www.onetcenter.org/database.html |
+
+ESCO 产品署名必须使用:`This service uses the ESCO classification of the European Commission.`
+
+## 5. 映射责任边界
+
+| 事项 | 上游来源责任 | 项目责任 |
+| --- | --- | --- |
+| ESCO 职业、技能、分类层级和来源 ID | 固定且可追溯 | 原样保存,不修改 ID |
+| O*NET Importance 数值 | 固定且可追溯 | 原样保存;无映射时写 `null`,不造权重 |
+| 中文名称和别名 | 不保证完整中文覆盖 | 补齐中文标准名、别名及归一化值 |
+| 细粒度技能分类 | 不保证符合本项目展示粒度 | 在职位下维护分类和展示名称 |
+| 行业/职位映射 | 不保证覆盖三类项目行业和中文职位名 | 维护行业—职位—分类—技能映射 |
+| 跨源技能与重要性关联 | 不提供项目所需的稳定本地关系 | 维护 ESCO 技能到 O*NET `software_skills` 的补充映射,以及每条 Importance 的 SOC/Element ID/代理标记 |
+
+## 6. 验收检查项
+
+- AC-1:`changes/n03-skill-cloud/data/source-manifest.md` 与 `docs/skill-taxonomy-sources.md` 均存在且非空,来源版本、许可、归属 URL、覆盖矩阵和导入规则一致。
+- AC-2:文档明确覆盖互联网、金融、教育三类行业及全部 10 个已列代表性职位,并为每个职位给出首批技能分类范围。
+- AC-3:文档明确固定 ESCO dataset v1.2.1(Last update 10/12/2025,发布页记录 Release v5.7.0)和 O*NET 31.0 Database。
+- AC-4:文档明确 ESCO 依据 Commission Decision 2011/833/EU 可免费下载、使用、复制和复用,并原样保留指定署名语句。
+- AC-5:文档明确 O*NET License 为 CC BY 4.0,并记录官方数据库页与许可 URL。
+- AC-6:文档明确项目维护中文名称、别名、技能分类和行业/职位映射,不修改开源来源 ID。
+- AC-7:文档明确 T2 建结构、T3 导数据,只导入代表性职位和关联技能;技能中文标准名必填。
+- AC-8:文档明确 O*NET 补充技术、每条 Importance 的 SOC/Element ID/代理标记,以及无映射时保留技能并写入 `importance=null`、查询侧映射为 `heat=null`。
+- AC-9:文档明确别名归一化遵循 NFKC、首尾空白、大小写、连字符、连续空白、句点规则,且保留 `+`、`#`。
+- AC-10:文档明确后续词库更新只能新增 Flyway 迁移,不得改写 V1–V34 或已执行迁移。
+- AC-11:来源、覆盖、导入与责任边界中不得出现未决占位或延期确认语句。
diff --git a/docs/verify_openapi.py b/docs/verify_openapi.py
index 1917bbf..23b251b 100644
--- a/docs/verify_openapi.py
+++ b/docs/verify_openapi.py
@@ -6,7 +6,7 @@ p = PROJECT_ROOT / 'docs' / 'openapi-rc.json'
d = json.load(open(p, encoding='utf-8'))
print('paths:', len(d['paths']))
-assert len(d['paths']) == 183, f"Expected 183 paths, got {len(d['paths'])}"
+assert len(d['paths']) == 196, f"Expected 196 paths (183 baseline + 13 module paths), got {len(d['paths'])}"
paths = d['paths']
@@ -706,7 +706,7 @@ print(' S03 company resume download contract validated; candidate DTOs remain r
# 统计 operation 总数并校验 V43 + N07 + S02 + S03 + Phase A 计数 220
operations = sum(len(methods) for methods in d['paths'].values())
print('operations:', operations)
-assert operations == 221, f"Expected 221 operations, got {operations}"
+assert operations == 239, f"Expected 239 operations (221 baseline + 18 module operations), got {operations}"
# 统一账号身份选择:只允许两种业务身份,保持旧登录字段引用。
_select = paths['/auth/identity/select']['post']
@@ -718,6 +718,79 @@ print(" Offer advance endpoints all present")
print(" 26 operations all present")
print(" Account deletion endpoints present (3 operations)")
+schemas = {name.removeprefix('Lxq'): schema for name, schema in
+ d['components']['schemas'].items() if name.startswith('Lxq')}
+onboarding_success_refs = {
+ ('/onboarding/companies/{companyId}/checklist', 'get'): 'ApiResponseEffectiveChecklistResponse',
+ ('/onboarding/companies/{companyId}/checklist/items/{itemId}/completion', 'put'): 'ApiResponseProgressUpdateResponse',
+ ('/onboarding/companies/{companyId}/knowledge', 'get'): 'ApiResponseCompanyKnowledgeOverviewResponse',
+ ('/onboarding/company/checklist-items', 'get'): 'ApiResponseListCompanyChecklistItemView',
+ ('/onboarding/company/checklist-items', 'post'): 'ApiResponseCompanyChecklistItemView',
+ ('/onboarding/company/checklist-items/{itemId}', 'put'): 'ApiResponseCompanyChecklistItemView',
+ ('/onboarding/company/checklist-items/{itemId}', 'delete'): 'ApiResponseCompanyChecklistItemView',
+ ('/onboarding/company/knowledge', 'get'): 'ApiResponseCompanyKnowledgeView',
+ ('/onboarding/company/knowledge', 'put'): 'ApiResponseCompanyKnowledgeView',
+}
+for (path, method), schema_name in onboarding_success_refs.items():
+ response = paths[path][method]['responses']['200']
+ ref = response['content']['*/*']['schema']['$ref']
+ assert ref == f'#/components/schemas/Lxq{schema_name}', f'Wrong success schema for {method.upper()} {path}: {ref}'
+ for status_code in ('401', '403'):
+ assert status_code in paths[path][method]['responses'], f'Missing {status_code} for {method.upper()} {path}'
+ unauthorized = paths[path][method]['responses']['401']
+ assert unauthorized['content']['application/json']['schema']['$ref'] == '#/components/schemas/LxqUnauthorizedResponse'
+ forbidden = paths[path][method]['responses']['403']
+ assert forbidden['content']['application/json']['schema']['$ref'] == '#/components/schemas/LxqApiResponse'
+ assert forbidden['content']['application/json']['example']['code'] == 2002
+
+onboarding_schema_fields = {
+ 'CompanyChecklistItemCreateRequest': {'title', 'description', 'category', 'sortOrder', 'required', 'idempotencyKey'},
+ 'CompanyChecklistItemUpdateRequest': {'title', 'description', 'category', 'sortOrder', 'required', 'active', 'version'},
+ 'CompanyChecklistItemView': {'itemId', 'source', 'itemKey', 'title', 'description', 'category', 'required', 'sortOrder', 'active', 'version'},
+ 'EffectiveChecklistResponse': {'companyId', 'companyName', 'customized', 'totalItems', 'completedItems', 'completionRate', 'items'},
+ 'ChecklistItemView': {'itemId', 'source', 'itemKey', 'title', 'description', 'category', 'required', 'sortOrder', 'active', 'completed', 'completedAt', 'progressVersion'},
+ 'ProgressUpdateRequest': {'completed', 'version'},
+ 'ProgressUpdateResponse': {'itemId', 'completed', 'completedAt', 'progressVersion', 'totalItems', 'completedItems', 'completionRate'},
+ 'CompanyKnowledgeUpdateRequest': {'culture', 'workPolicies', 'onboardingGuide', 'version'},
+ 'CompanyKnowledgeView': {'configured', 'culture', 'workPolicies', 'onboardingGuide', 'updatedAt', 'version'},
+ 'CompanyKnowledgeOverviewResponse': {'company', 'knowledgeState', 'knowledge', 'reviewSummary'},
+ 'CompanyView': {'id', 'name', 'logoUrl', 'description', 'industry', 'website', 'address', 'verified'},
+ 'KnowledgeView': {'culture', 'workPolicies', 'onboardingGuide', 'updatedAt', 'version'},
+ 'ReviewSummaryView': {'state', 'totalReviews', 'averageRating', 'ratingDistribution', 'topTags', 'dimensionSummary'},
+ 'DimensionSummaryView': {'averageScore', 'sampleCount', 'dataState'},
+}
+for schema_name, expected_fields in onboarding_schema_fields.items():
+ schema = schemas.get(schema_name)
+ assert schema is not None, f'Missing onboarding schema: {schema_name}'
+ assert expected_fields <= set(schema.get('properties', {})), (
+ f'Onboarding schema fields missing: {schema_name}'
+ )
+
+create_request = schemas['CompanyChecklistItemCreateRequest']['properties']
+assert create_request['sortOrder'].get('default') == 1000, (
+ 'CompanyChecklistItemCreateRequest.sortOrder default must be 1000'
+)
+assert create_request['required'].get('default') is False, (
+ 'CompanyChecklistItemCreateRequest.required default must be false'
+)
+knowledge_success_example = paths['/onboarding/company/knowledge']['put']['responses']['200']['content']['*/*']['example']
+assert knowledge_success_example['data'].get('version') == 2, (
+ 'PUT /onboarding/company/knowledge 200 example data.version must be 2'
+)
+
+onboarding_error_paths = {
+ 10501: ('/onboarding/company/checklist-items/{itemId}', 'put', '404'),
+ 10502: ('/onboarding/company/checklist-items/{itemId}', 'put', '409'),
+ 10503: ('/onboarding/company/checklist-items', 'post', '409'),
+ 10504: ('/onboarding/company/checklist-items', 'post', '409'),
+ 10505: ('/onboarding/companies/{companyId}/checklist/items/{itemId}/completion', 'put', '409'),
+ 10506: ('/onboarding/company/knowledge', 'put', '409'),
+}
+for error_code, (path, method, status_code) in onboarding_error_paths.items():
+ response_text = json.dumps(paths[path][method]['responses'][status_code], ensure_ascii=False)
+ assert str(error_code) in response_text, f'Missing onboarding error code {error_code} in {method.upper()} {path}'
+print(' N04 onboarding endpoints and schemas present (9 operations / 6 paths)')
+
data = json.dumps(d)
assert '"" : "#/components/schemas/' not in data, "Found empty ref key"
print("No empty ref keys found")
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorCode.java b/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorCode.java
index a6ee177..1e466c6 100644
--- a/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorCode.java
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorCode.java
@@ -244,7 +244,18 @@ public enum ErrorCode {
IDENTITY_SELECTION_REQUIRED(10401, "identity selection is required"),
IDENTITY_SELECTION_CONFLICT(10402, "identity selection conflict"),
- IDENTITY_SELECTION_DEPENDENCY_UNAVAILABLE(10403, "identity selection temporarily unavailable");
+ IDENTITY_SELECTION_DEPENDENCY_UNAVAILABLE(10403, "identity selection temporarily unavailable"),
+ ONBOARDING_CHECKLIST_ITEM_NOT_FOUND(10501, "onboarding checklist item not found"),
+ ONBOARDING_CHECKLIST_ITEM_CONCURRENT_UPDATE(10502, "onboarding checklist item was modified concurrently"),
+ ONBOARDING_ITEM_LIMIT_EXCEEDED(10503, "onboarding checklist item limit exceeded"),
+ ONBOARDING_IDEMPOTENCY_CONFLICT(10504, "idempotency key conflict: request body differs"),
+ ONBOARDING_PROGRESS_CONCURRENT_UPDATE(10505, "onboarding progress was modified concurrently"),
+ ONBOARDING_KNOWLEDGE_CONCURRENT_UPDATE(10506, "company knowledge was modified concurrently"),
+ SALARY_CITY_NOT_FOUND(10601, "salary city not found or disabled"),
+ SALARY_INVALID_PARAMETER(10602, "invalid salary calculation parameter"),
+ SALARY_HISTORY_NOT_FOUND(10603, "salary calculation history not found"),
+ SALARY_IDEMPOTENCY_CONFLICT(10604, "salary idempotency key conflict: request body differs"),
+ SALARY_POLICY_VERSION_CONFLICT(10605, "salary city policy version conflict");
private final int code;
private final String message;
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorHttpStatusRegistry.java b/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorHttpStatusRegistry.java
index 4443e6c..c5d4163 100644
--- a/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorHttpStatusRegistry.java
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/ErrorHttpStatusRegistry.java
@@ -118,6 +118,9 @@ public final class ErrorHttpStatusRegistry {
ErrorCode.MATCH_REQUIRED_FOR_CONVERSATION,
ErrorCode.OFFER_COMPARE_NOT_OWNER)
.put(HttpStatus.NOT_FOUND,
+ ErrorCode.ONBOARDING_CHECKLIST_ITEM_NOT_FOUND,
+ ErrorCode.SALARY_CITY_NOT_FOUND,
+ ErrorCode.SALARY_HISTORY_NOT_FOUND,
ErrorCode.ABILITY_ATTEMPT_NOT_FOUND,
ErrorCode.ABILITY_RESULT_NOT_FOUND,
ErrorCode.ABILITY_TYPE_NOT_FOUND,
@@ -146,6 +149,13 @@ public final class ErrorHttpStatusRegistry {
ErrorCode.USER_NOT_FOUND,
ErrorCode.VERIFICATION_NOT_FOUND)
.put(HttpStatus.CONFLICT,
+ ErrorCode.ONBOARDING_CHECKLIST_ITEM_CONCURRENT_UPDATE,
+ ErrorCode.ONBOARDING_ITEM_LIMIT_EXCEEDED,
+ ErrorCode.ONBOARDING_IDEMPOTENCY_CONFLICT,
+ ErrorCode.ONBOARDING_PROGRESS_CONCURRENT_UPDATE,
+ ErrorCode.ONBOARDING_KNOWLEDGE_CONCURRENT_UPDATE,
+ ErrorCode.SALARY_IDEMPOTENCY_CONFLICT,
+ ErrorCode.SALARY_POLICY_VERSION_CONFLICT,
ErrorCode.PASSWORD_STATE_CONFLICT,
ErrorCode.IDENTITY_SELECTION_CONFLICT,
ErrorCode.ABILITY_ATTEMPT_INVALID_STATE,
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/GlobalExceptionHandler.java b/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/GlobalExceptionHandler.java
index 573fb2e..06b3a10 100644
--- a/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/GlobalExceptionHandler.java
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/common/exception/GlobalExceptionHandler.java
@@ -1,6 +1,7 @@
package com.mydreamjob.common.exception;
import com.mydreamjob.common.api.ApiResponse;
+import com.mydreamjob.salarycalculator.SalaryPolicyVersionConflictException;
import com.mydreamjob.common.logging.RequestIdAccessor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolationException;
@@ -39,6 +40,20 @@ public class GlobalExceptionHandler {
private final RequestIdAccessor requestIdAccessor;
private final ErrorHttpStatusRegistry errorHttpStatusRegistry;
+ public record SalaryPolicyConflictDetails(String latestPolicyVersion,
+ java.time.LocalDate policyEffectiveDate) {}
+
+ @ExceptionHandler(SalaryPolicyVersionConflictException.class)
+ public ResponseEntity> handleSalaryPolicyConflict(
+ SalaryPolicyVersionConflictException ex, HttpServletRequest request) {
+ ErrorCode code = ErrorCode.SALARY_POLICY_VERSION_CONFLICT;
+ ApiResponse body = ApiResponse.error(
+ code.getCode(), code.getMessage(), getRequestId(request));
+ body.setData(new SalaryPolicyConflictDetails(
+ ex.getLatestPolicyVersion(), ex.getLatestPolicyEffectiveDate()));
+ return ResponseEntity.status(errorHttpStatusRegistry.resolve(code.getCode())).body(body);
+ }
+
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity> handleConstraintViolation(
ConstraintViolationException ex, HttpServletRequest request) {
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/deletion/AccountDeletionCompletionWorker.java b/mydreamjob-server/src/main/java/com/mydreamjob/deletion/AccountDeletionCompletionWorker.java
index 3193e1c..805771f 100644
--- a/mydreamjob-server/src/main/java/com/mydreamjob/deletion/AccountDeletionCompletionWorker.java
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/deletion/AccountDeletionCompletionWorker.java
@@ -5,6 +5,7 @@ import com.mydreamjob.auth.AuthSessionService;
import com.mydreamjob.auth.User;
import com.mydreamjob.auth.UserRepository;
import com.mydreamjob.dataexport.PersonalDataExportCleanupService;
+import com.mydreamjob.salarycalculator.SalaryHistoryCleanupService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.orm.ObjectOptimisticLockingFailureException;
@@ -35,6 +36,7 @@ public class AccountDeletionCompletionWorker {
private final AuditService auditService;
private final AccountDeletionPhoneHasher phoneHasher;
private final PersonalDataExportCleanupService dataExportCleanupService;
+ private final SalaryHistoryCleanupService salaryHistoryCleanupService;
private final AuthSessionService authSessionService;
private final Clock clock;
@@ -68,6 +70,7 @@ public class AccountDeletionCompletionWorker {
rec.getUserId(), AuthSessionService.REASON_ACCOUNT_DELETED, capturedNow);
// 注销完成:清理该用户的个人导出文件并作废未完成任务
dataExportCleanupService.purgeForDeletedUser(rec.getUserId());
+ salaryHistoryCleanupService.purgeForDeletedUser(rec.getUserId());
// 完成 + 脱敏审计各写一次
auditService.log(userId, "ACCOUNT_DELETION_COMPLETED", "ACCOUNT_DELETION",
rec.getId(), "account deletion completed; userId=" + userId
@@ -120,4 +123,4 @@ public class AccountDeletionCompletionWorker {
u.setActive(false);
userRepository.saveAndFlush(u);
}
-}
\ No newline at end of file
+}
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledge.java b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledge.java
new file mode 100644
index 0000000..1b98711
--- /dev/null
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledge.java
@@ -0,0 +1,63 @@
+package com.mydreamjob.onboarding;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
+import jakarta.persistence.Version;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(
+ name = "company_knowledge",
+ uniqueConstraints = @UniqueConstraint(
+ name = "uk_company_knowledge_company",
+ columnNames = "company_id"))
+@EntityListeners(AuditingEntityListener.class)
+public class CompanyKnowledge {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "company_id", nullable = false)
+ private Long companyId;
+
+ @Column(length = 2000)
+ private String culture;
+
+ @Column(name = "work_policies", length = 4000)
+ private String workPolicies;
+
+ @Column(name = "onboarding_guide", length = 4000)
+ private String onboardingGuide;
+
+ @Version
+ @Column(nullable = false)
+ @Builder.Default
+ private Long version = 0L;
+
+ @CreatedDate
+ @Column(name = "created_at", nullable = false, updatable = false)
+ private LocalDateTime createdAt;
+
+ @LastModifiedDate
+ @Column(name = "updated_at", nullable = false)
+ private LocalDateTime updatedAt;
+}
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeController.java b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeController.java
new file mode 100644
index 0000000..1e40d95
--- /dev/null
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeController.java
@@ -0,0 +1,74 @@
+package com.mydreamjob.onboarding;
+
+import com.mydreamjob.common.api.ApiResponse;
+import com.mydreamjob.common.exception.BusinessException;
+import com.mydreamjob.common.exception.ErrorCode;
+import com.mydreamjob.onboarding.dto.CompanyKnowledgeOverviewResponse;
+import com.mydreamjob.onboarding.dto.CompanyKnowledgeUpdateRequest;
+import com.mydreamjob.onboarding.dto.CompanyKnowledgeView;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Tag(name = "公司知识介绍", description = "企业维护知识内容,学生读取公司知识聚合")
+@RestController
+@RequestMapping("/onboarding")
+@RequiredArgsConstructor
+public class CompanyKnowledgeController {
+
+ private final CompanyKnowledgeService companyKnowledgeService;
+
+ @Operation(summary = "读取本企业知识配置")
+ @GetMapping("/company/knowledge")
+ public ResponseEntity> getCompanyKnowledge(
+ HttpServletRequest request) {
+ Long userId = resolveUserId();
+ CompanyKnowledgeView data = companyKnowledgeService.getCompanyKnowledge(userId);
+ return ResponseEntity.ok(ApiResponse.ok(data, getRequestId(request)));
+ }
+
+ @Operation(summary = "创建或更新本企业知识配置")
+ @PutMapping("/company/knowledge")
+ public ResponseEntity> upsertCompanyKnowledge(
+ @Valid @RequestBody CompanyKnowledgeUpdateRequest body,
+ HttpServletRequest request) {
+ Long userId = resolveUserId();
+ CompanyKnowledgeView data =
+ companyKnowledgeService.upsertCompanyKnowledge(userId, body);
+ return ResponseEntity.ok(ApiResponse.ok(data, getRequestId(request)));
+ }
+
+ @Operation(summary = "读取公司知识介绍")
+ @GetMapping("/companies/{companyId}/knowledge")
+ public ResponseEntity> getCompanyKnowledgeOverview(
+ @PathVariable Long companyId,
+ HttpServletRequest request) {
+ Long userId = resolveUserId();
+ CompanyKnowledgeOverviewResponse data =
+ companyKnowledgeService.getCompanyKnowledgeOverview(userId, companyId);
+ return ResponseEntity.ok(ApiResponse.ok(data, getRequestId(request)));
+ }
+
+ private Long resolveUserId() {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ if (authentication == null || !authentication.isAuthenticated()) {
+ throw new BusinessException(ErrorCode.UNAUTHORIZED);
+ }
+ return Long.valueOf(authentication.getName());
+ }
+
+ private String getRequestId(HttpServletRequest request) {
+ return request.getHeader("X-Request-Id");
+ }
+}
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeRepository.java b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeRepository.java
new file mode 100644
index 0000000..17bc85f
--- /dev/null
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeRepository.java
@@ -0,0 +1,12 @@
+package com.mydreamjob.onboarding;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface CompanyKnowledgeRepository extends JpaRepository {
+
+ Optional findByCompanyId(Long companyId);
+}
diff --git a/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeService.java b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeService.java
new file mode 100644
index 0000000..78f28de
--- /dev/null
+++ b/mydreamjob-server/src/main/java/com/mydreamjob/onboarding/CompanyKnowledgeService.java
@@ -0,0 +1,412 @@
+package com.mydreamjob.onboarding;
+
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.LockModeType;
+import jakarta.persistence.PersistenceContext;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mydreamjob.auth.User;
+import com.mydreamjob.auth.UserRepository;
+import com.mydreamjob.common.exception.BusinessException;
+import com.mydreamjob.common.exception.ErrorCode;
+import com.mydreamjob.company.Company;
+import com.mydreamjob.company.CompanyRepository;
+import com.mydreamjob.onboarding.dto.CompanyKnowledgeOverviewResponse;
+import com.mydreamjob.onboarding.dto.CompanyKnowledgeUpdateRequest;
+import com.mydreamjob.onboarding.dto.CompanyKnowledgeView;
+import com.mydreamjob.onboarding.dto.ReviewSummaryView;
+import com.mydreamjob.review.JobReviewDimensionScoreRepository;
+import com.mydreamjob.review.JobReviewRepository;
+import com.mydreamjob.review.ReviewDimension;
+import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.orm.ObjectOptimisticLockingFailureException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class CompanyKnowledgeService {
+
+ private static final String CONFIGURED = "CONFIGURED";
+ private static final String BASIC_ONLY = "BASIC_ONLY";
+ private static final String EMPTY = "EMPTY";
+ private static final String INSUFFICIENT = "INSUFFICIENT";
+ private static final String SUFFICIENT = "SUFFICIENT";
+
+ private static final int MINIMUM_PUBLIC_REVIEWS = 3;
+ private static final int MAX_TOP_TAGS = 10;
+ private static final int MAX_CULTURE_LENGTH = 2000;
+ private static final int MAX_WORK_POLICIES_LENGTH = 4000;
+ private static final int MAX_ONBOARDING_GUIDE_LENGTH = 4000;
+ private static final Pattern HTML_TAG_PATTERN =
+ Pattern.compile("<\\s*/?\\s*[A-Za-z!][^>]*>");
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private final UserRepository userRepository;
+ private final CompanyRepository companyRepository;
+ private final CompanyKnowledgeRepository companyKnowledgeRepository;
+ private final JobReviewRepository jobReviewRepository;
+ private final JobReviewDimensionScoreRepository dimensionScoreRepository;
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Transactional(readOnly = true)
+ public CompanyKnowledgeView getCompanyKnowledge(Long userId) {
+ Company company = requireOwnedCompany(userId);
+ return companyKnowledgeRepository.findByCompanyId(company.getId())
+ .map(this::toConfiguredView)
+ .orElseGet(() -> CompanyKnowledgeView.builder()
+ .configured(false)
+ .version(0L)
+ .build());
+ }
+
+ @Transactional
+ public CompanyKnowledgeView upsertCompanyKnowledge(
+ Long userId,
+ CompanyKnowledgeUpdateRequest request) {
+ Company company = requireOwnedCompany(userId);
+ KnowledgeContent content = validateContent(request);
+ lockCompany(company);
+ CompanyKnowledge existing = companyKnowledgeRepository.findByCompanyId(company.getId())
+ .orElse(null);
+
+ if (existing == null) {
+ CompanyKnowledge created = CompanyKnowledge.builder()
+ .companyId(company.getId())
+ .culture(content.culture())
+ .workPolicies(content.workPolicies())
+ .onboardingGuide(content.onboardingGuide())
+ .build();
+ return toConfiguredView(saveKnowledge(created));
+ }
+
+ if (request.getVersion() == null && matchesContent(existing, content)) {
+ return toConfiguredView(existing);
+ }
+ if (request.getVersion() == null) {
+ throw new BusinessException(ErrorCode.BAD_REQUEST);
+ }
+ if (!Objects.equals(request.getVersion(), existing.getVersion())) {
+ throw new BusinessException(ErrorCode.ONBOARDING_KNOWLEDGE_CONCURRENT_UPDATE);
+ }
+
+ existing.setCulture(content.culture());
+ existing.setWorkPolicies(content.workPolicies());
+ existing.setOnboardingGuide(content.onboardingGuide());
+ return toConfiguredView(saveKnowledge(existing));
+ }
+
+ @Transactional(readOnly = true)
+ public CompanyKnowledgeOverviewResponse getCompanyKnowledgeOverview(
+ Long userId,
+ Long companyId) {
+ assertStudentRole(userId);
+ Company company = companyRepository.findById(companyId)
+ .orElseThrow(() -> new BusinessException(ErrorCode.COMPANY_NOT_FOUND));
+ CompanyKnowledge knowledge = companyKnowledgeRepository.findByCompanyId(companyId)
+ .orElse(null);
+
+ return CompanyKnowledgeOverviewResponse.builder()
+ .company(toCompanyView(company))
+ .knowledgeState(knowledge == null ? BASIC_ONLY : CONFIGURED)
+ .knowledge(knowledge == null ? null : toKnowledgeView(knowledge))
+ .reviewSummary(buildReviewSummary(companyId))
+ .build();
+ }
+
+ private CompanyKnowledge saveKnowledge(CompanyKnowledge knowledge) {
+ try {
+ return companyKnowledgeRepository.saveAndFlush(knowledge);
+ } catch (ObjectOptimisticLockingFailureException | DataIntegrityViolationException ex) {
+ throw new BusinessException(
+ ErrorCode.ONBOARDING_KNOWLEDGE_CONCURRENT_UPDATE, ex);
+ }
+ }
+
+ private boolean matchesContent(CompanyKnowledge knowledge, KnowledgeContent content) {
+ return Objects.equals(knowledge.getCulture(), content.culture())
+ && Objects.equals(knowledge.getWorkPolicies(), content.workPolicies())
+ && Objects.equals(knowledge.getOnboardingGuide(), content.onboardingGuide());
+ }
+
+ private void lockCompany(Company company) {
+ if (entityManager == null || company == null || company.getId() == null) {
+ return;
+ }
+ entityManager.lock(company, LockModeType.PESSIMISTIC_WRITE);
+ }
+
+ private KnowledgeContent validateContent(CompanyKnowledgeUpdateRequest request) {
+ if (request == null) {
+ throw new BusinessException(ErrorCode.BAD_REQUEST);
+ }
+ if (request.getVersion() != null && request.getVersion() < 0) {
+ throw new BusinessException(ErrorCode.BAD_REQUEST);
+ }
+
+ String culture = normalizeText(request.getCulture(), MAX_CULTURE_LENGTH);
+ String workPolicies = normalizeText(
+ request.getWorkPolicies(), MAX_WORK_POLICIES_LENGTH);
+ String onboardingGuide = normalizeText(
+ request.getOnboardingGuide(), MAX_ONBOARDING_GUIDE_LENGTH);
+
+ if (culture == null && workPolicies == null && onboardingGuide == null) {
+ throw new BusinessException(ErrorCode.BAD_REQUEST);
+ }
+ return new KnowledgeContent(culture, workPolicies, onboardingGuide);
+ }
+
+ private String normalizeText(String raw, int maxLength) {
+ if (!StringUtils.hasText(raw)) {
+ return null;
+ }
+ String value = raw.trim();
+ if (value.length() > maxLength) {
+ throw new BusinessException(ErrorCode.BAD_REQUEST);
+ }
+ if (HTML_TAG_PATTERN.matcher(value).find()) {
+ throw new BusinessException(ErrorCode.BAD_REQUEST);
+ }
+ return value;
+ }
+
+ private ReviewSummaryView buildReviewSummary(Long companyId) {
+ List