# Company Knowledge ## ADDED Requirements ### Requirement: 学生读取公司知识介绍 系统 SHALL 允许已登录 STUDENT 通过 `GET /onboarding/companies/{companyId}/knowledge` 读取公司知识介绍。响应 MUST 聚合企业基础资料、企业维护的知识内容以及公开评价摘要,并使用白名单 DTO 排除 `ownerUserId` 等内部字段。 #### Scenario: 企业已维护知识内容 - **WHEN** STUDENT 请求存在企业且该企业已有知识内容 - **THEN** 系统返回企业基础资料、文化、工作制度、入职指南和更新时间 - **AND** `knowledgeState` 为 `CONFIGURED` - **AND** 不返回企业 `ownerUserId`、员工用户 ID、评价哈希或审核原因 #### Scenario: 企业未维护知识内容 - **WHEN** STUDENT 请求存在企业且该企业没有知识内容记录 - **THEN** 系统仍返回企业基础资料 - **AND** `knowledgeState` 为 `BASIC_ONLY` - **AND** 知识内容字段为 `null` 或空集合,不返回 404 #### Scenario: 企业不存在 - **WHEN** STUDENT 请求不存在的 `companyId` - **THEN** 系统返回 404 `COMPANY_NOT_FOUND` ### Requirement: 公司知识评价摘要使用公开数据和小样本保护 系统 SHALL 聚合该企业全部岗位中状态为 `PUBLISHED` 且审核状态为 `AUTO_APPROVED` 或 `APPROVED` 的评价。公开评价少于 3 条时 MUST 返回 `INSUFFICIENT` 或 `EMPTY`,且不得返回平均分或维度均值。达到 3 条时 MAY 返回平均评分、评分分布、热门标签和八维均值。 #### Scenario: 无公开评价 - **WHEN** 企业没有任何符合条件的公开评价 - **THEN** `reviewSummary.state` 为 `EMPTY` - **AND** `totalReviews` 为 0 - **AND** `averageRating` 与 `dimensionSummary` 为空 #### Scenario: 公开评价少于 3 条 - **WHEN** 企业只有 1 或 2 条符合条件的公开评价 - **THEN** `reviewSummary.state` 为 `INSUFFICIENT` - **AND** 系统返回真实 `totalReviews` - **AND** 不返回平均分、评分分布或维度均值 #### Scenario: 公开评价达到 3 条 - **WHEN** 企业有至少 3 条符合条件的公开评价 - **THEN** `reviewSummary.state` 为 `SUFFICIENT` - **AND** 系统返回平均评分、评分分布、热门标签和维度汇总 - **AND** 每个维度返回样本数及是否达到小样本阈值 ### Requirement: 企业读取本企业知识配置 系统 SHALL 允许 COMPANY 通过 `GET /onboarding/company/knowledge` 读取本企业知识配置。无记录时 MUST 返回 `configured=false` 和空内容,而不是 404;有记录时 MUST 返回内容和当前版本。 #### Scenario: 尚未配置 - **WHEN** COMPANY 请求本企业知识配置且尚未创建记录 - **THEN** 系统返回 `configured=false` - **AND** 内容字段为空,版本为 `0` #### Scenario: 已配置 - **WHEN** COMPANY 请求本企业已有知识配置 - **THEN** 系统返回文化、工作制度、入职指南、更新时间和当前版本 - **AND** `configured=true` ### Requirement: 企业 Upsert 公司知识内容 系统 SHALL 允许 COMPANY 通过 `PUT /onboarding/company/knowledge` 创建或更新本企业知识内容。字段 MUST 使用纯文本并受长度限制,不允许 HTML 富文本。更新已有记录时 MUST 使用乐观锁版本;版本冲突返回 409 `ONBOARDING_KNOWLEDGE_CONCURRENT_UPDATE`。 #### Scenario: 首次创建 - **WHEN** COMPANY 首次提交合法的知识内容 - **THEN** 系统创建绑定该企业的知识记录 - **AND** 返回 `configured=true` 和版本 `0` #### Scenario: 使用当前版本更新 - **WHEN** COMPANY 使用当前版本提交新的文化、制度或入职指南 - **THEN** 系统更新记录并递增版本 - **AND** 返回最新内容 #### Scenario: 使用过期版本更新 - **WHEN** COMPANY 使用过期版本提交知识内容 - **THEN** 系统返回 409 `ONBOARDING_KNOWLEDGE_CONCURRENT_UPDATE` - **AND** 不覆盖数据库中的新内容 #### Scenario: 非法内容 - **WHEN** 请求字段超出最大长度或包含不受支持的格式 - **THEN** 系统返回 400 `BAD_REQUEST` - **AND** 不写入知识记录 ### Requirement: 公司知识权限与所有权隔离 学生读取接口 MUST 仅允许 STUDENT;企业配置接口 MUST 仅允许 COMPANY 且只操作当前用户拥有的企业。任何跨企业读取配置或修改操作 MUST 被拒绝。 #### Scenario: 企业访问本企业配置 - **WHEN** COMPANY 读取或更新自己的知识记录 - **THEN** 系统允许操作 #### Scenario: 非企业访问企业配置 - **WHEN** STUDENT、ADMIN 或未登录用户访问企业知识配置接口 - **THEN** 系统返回 401 或 403 - **AND** 不读取或修改企业配置 #### Scenario: 不存在的企业 - **WHEN** STUDENT 请求不存在的公司知识 - **THEN** 系统返回 404 `COMPANY_NOT_FOUND` ### Requirement: 不改变既有评价与企业接口语义 本变更 MUST 只读复用既有企业、岗位、评价和维度评分数据,不得修改既有表结构、响应字段或权限语义。 #### Scenario: 既有评价接口回归 - **WHEN** 执行已有评价与企业模块测试 - **THEN** 所有既有测试保持通过 - **AND** OpenAPI 中既有路径的请求与响应语义不变