chore(release): lock BRD alignment batch 20260715

This commit is contained in:
2026-07-15 15:58:19 +08:00
parent c861977ec0
commit 09492db96a
13 changed files with 282 additions and 118 deletions
@@ -121,7 +121,7 @@ mobile-uni/
截至 2026-07-10,`mobile-uni/` 已是用户、主管、候选人三端的现役页面栈,旧 `mobile/` 仅作 MVP 兜底。三端均以登录身份和真实 API 驱动:员工完成训练、问师傅和成长回读;主管按后端组织范围进行团队、复盘和专项指派;候选人按真实面试/资料状态进入独立线性页面。H5 构建、真实浏览器主链路和接口回读均已完成验证,不使用前端 mock 掩盖业务状态。
正式试点尚未通过:组织同步 dry-run 的 3474 名上游员工中仅 1 名具备可用于移动端身份映射的手机号,另有 8 条疑似乱码;严格门禁在窗口 `2026-07-07..2026-07-10` 只识别到 1 名正式人员且无人完成 10 次训练。下一阶段优先补齐上游正式组织数据并执行联合试点验收,不继续把功能堆回首页或旧单页。
2026-07-15 更新:组织同步和手机号映射门槛已从上游数据问题中恢复,线上 `aihr_org_snapshot` 已覆盖为 3417 名员工,其中 3392 人可手机号映射,25 人手机号仍不可用,疑似乱码为 0。严格试点尚未通过的剩余原因不再是组织同步能力,而是需要在真实试点窗口产生训练、人工校准和 SOP 评审样本;旧窗口 `2026-07-07..2026-07-10` 仍不能作为业务验收证据。下一阶段优先组织 1–2 个项目、至少 20 名员工的联合试点验收,不继续把功能堆回首页或旧单页。
- 第一批用户侧主链路已落地到 `mobile-uni/`: 登录、今日页、问师傅、答案反馈、总结卡、对练页、个人页。
- 本机开发入口已切到 portless: `https://wygj-mobile-uni.localhost/h5/`。
@@ -179,8 +179,8 @@ mobile-uni/
- 员工今日页师傅气泡已移除固定姓名 fallback: 未登录显示“同事”,登录后按手机号尾号提示,不再把 seed 姓名暴露给真实用户。
- 员工今日页“查看全部”和小贴士箭头已接通动作: 分别进入练习页和带问题进入问师傅,不再保留看起来可点但无反馈的入口。
- 员工今日页未登录视图已收敛: 公开 home 的 `primary/review` 不再渲染成私人“今日安排”,改为登录提示;工具区未登录时显示为“常用入口”。
- 员工今日页问答入口文案已收敛: 当前 uni-app 首页只负责进入问师傅页,主按钮改为“问老师傅”,不再用“长按说话”暗示已实现录音交互。
- 员工今日页训练文案已收敛: 首页主任务从“3分钟语音练习”改为“3分钟情景练习”,不再承诺当前 uni-app 尚未提供的语音对练入口。
- 员工今日页问答入口文案已收口:主按钮为“问老师傅”,副文案已改成“文字提问,快速解答”,与当前仅有文字框的问师傅页一致;若后续补语音则复用现有 `services/speech.ts` 与 `/api/ai/asr`。
- 员工训练页当前已支持文字回答、浏览器录音转写和选择音频转写;首页主任务继续使用“3分钟情景练习”,避免把训练方式限制成只支持语音。
- 问师傅页已补登录守卫: 未登录检索会保留当前问题并跳登录,不再直接暴露“认证失败”。
- 移动端认证清理已收敛到共享 `clearAuth()`: 主动退出和 401/403 会同时清掉 token、clientId、手机号和登录回跳,避免旧手机号残留。
- 员工“我”页已补过期登录态反馈: 401/403 清理后会同步刷新当前页面为“未登录/去登录”,不再继续显示旧手机号和退出按钮。
@@ -254,7 +254,7 @@ mobile-uni/
- 主管权限已以后端组织快照为准: 只有在职“主管/项目经理”可访问团队、预警、复盘和指派接口;普通员工真实浏览器验证只显示“无主管权限”及返回员工端/切换账号,不泄露团队指标和表单草稿。
- 主管复盘写入已补事务和幂等: 仅 `待复盘 -> 已复盘` 的首次状态转换创建后续专项;并发重复请求通过行锁读取最终状态,不重复派发。
- 主管端已用真实项目经理账号验证组织范围: 本地正式快照返回 19 名团队成员、1 条待复盘、2 项待训练和 1 条低分预警;团队页、复盘页和指派页均读取真实接口,不补前端 mock。
- 正式组织快照中的不可读问号姓名在用户侧回退为手机号尾号或外部 ID 末尾标识,真实 ID 保持不变;开放组织 dry-run 已确认源接口自身仍返回 8 条疑似乱码,需由上游修复后再同步。
- 正式组织快照中的不可读问号姓名在用户侧回退为手机号尾号或外部 ID 末尾标识,真实 ID 保持不变;2026-07-15 开放组织 dry-run 已确认疑似乱码为 0,线上同步后剩余问题收敛为 25 名员工手机号不可用。
- 候选人端已完成线性页面栈拆分: 原 750 行长页收敛为候选首页、面试任务、补充资料、进度通知和岗前预习 5 个路由;首页只展示真实状态和办理入口,不再原地展开所有表单和结果。
- 候选人流程状态已抽成共享纯函数: 只根据当前候选人的正式面试记录和最新资料状态派生“待面试/待补资料/审核中/已通过”,不读取公开 home seed,不补前端 mock。
- 候选面试页继续复用真实 `/api/recruit/interview/start|answer|finish|records`: 浏览器以当前移动账号验证 `/start` 返回 3 道岗位题,未提交答案和评分,避免产生额外正式面试记录。
@@ -263,10 +263,10 @@ mobile-uni/
- 候选岗前预习页改为自然业务问题检索正式 SOP: 浏览器验证投诉预习返回正式答案、关键要点、注意事项,引用命中 `投诉处理 SOP v1.0`、`生活顾问的一天.mp4` 和正式课件,无前端示例答案。
- 演示预检已跟随页面栈更新: `scripts/demo-check.sh` 改为检查主管复盘详情和候选 4 个子路由,不再在旧主管首页查复盘表单标记;本地数据库连接不可用时非严格模式明确跳过样本、严格模式继续失败。
- 本地连接耗尽已处置: 清理未被 portless 使用的旧后端实例并重启本地 MySQL 后,连接稳定在约 `11/151`,当前 API HTTP 200;`dev.sh stop/restart` 已改为安全终止 portless 进程树,避免旧 Java/Vite 子进程继续占用连接池。
- 试点严格预检已改为正式批次口径: 必须指定起止日期,训练、校准和 SOP 评审只统计该时间窗;人员通过唯一手机号映射到在职组织,排除重复手机号和身份碰撞,完训定义为每人至少 10 次。`2026-07-07..2026-07-10` 实测开发活动身份 50 人、10 次完训 0 人,但正式组织仍为 `org_login=1/3001`、`org_pilot=1/20`、`org_ten_sessions=0/1`,所以严格模式正确失败。开放组织 dry-run 返回 `employees=3474 phone_linked=1 masked_phone=3473 suspect_text=8 synced=0`,且 dry-run 不访问本地表结构或写库,证明手机号和 8 条问号数据来自上游且本轮未覆盖快照。
- 管理端试点 CSV 已与严格预检统一口径: 必须选择起止日期,只导出窗口内唯一匹配正式组织的训练明细,完训按每人至少 10 次,校准必须关联正式试点会话。真实 API 返回正式试点 1 人/1 项目、10 次完训 `0/1`、校准 `0/20`、窗口内 SOP `2/2`,总闸门为 `false`;此前开发会话中的 20 条校准不再计入正式验收。
- 试点严格预检已改为正式批次口径: 必须指定起止日期,训练、校准和 SOP 评审只统计该时间窗;人员通过唯一手机号映射到在职组织,排除重复手机号和身份碰撞,完训定义为每人至少 10 次。2026-07-15 线上组织快照已具备 `employees=3417 phone_linked=3392 masked_phone=25 suspect_text=0`;旧窗口 `2026-07-07..2026-07-10` 仍因无人达到 10 次训练、缺少正式校准样本而失败,所以后续需用新试点窗口重跑,不能沿用开发活动数据。
- 管理端试点 CSV 已与严格预检统一口径: 必须选择起止日期,只导出窗口内唯一匹配正式组织的训练明细,完训按每人至少 10 次,校准必须关联正式试点会话。组织快照覆盖后 CSV 的人员映射能力已具备;下一步需在正式试点窗口产生真实训练、校准和 SOP 评审记录后重新导出,此前开发会话中的 20 条校准不再计入正式验收。
- 发布会正式候选题已重新走查: Q01-Q12 `12/12` 返回有效答案和依据,来源告警 `0`,向量状态 `450/450`;仍有 119 条 SOP 问答待业务评审,不把开发方走查替代业务签字。
- 下一阶段进入三端联合发布门槛: 复跑员工-主管-候选人角色切换、清理本地验证数据、核对正式组织姓名编码并完成 H5 发布前验收;不把本次页面拆分等同一期生产验收完成。
- 下一阶段进入三端联合试点门槛: 复跑员工-主管-候选人角色切换、清理本地验证数据、选择真实项目与员工样本并完成 H5 发布后验收;不把本次页面拆分等同一期生产验收完成。
## 7. 风险
@@ -274,4 +274,4 @@ mobile-uni/
- H5 路由和将来小程序路径不完全一致,页面命名要早期克制。
- 旧 H5 在 Alpha 前仍承担演示兜底,新工程未完成替换前不能下线旧入口。
- 如果后端某些接口仍要求管理端 token,需要后端补移动端认证口径,不能在新前端绕过认证。
- 当前本地组织快照存在部分不可读姓名,前端已做可识别展示兜底,但正式试点前仍需从开放组织同步源修复编码并重跑快照同步。
- 线上组织快照已完成开放组织覆盖同步并消除疑似乱码;剩余 25 名员工手机号不可用属于上游数据质量问题,不阻塞功能发布,但这些人员在修复前无法通过手机号自动映射身份。
+5 -5
View File
@@ -14,8 +14,8 @@
| 案例沉淀 `/knowledge/cases` | `GET /api/knowledge/case/capabilities`、`POST /api/knowledge/case/upload`、`/organize`、`/curate`、`GET /records`、`GET /records/{caseId}`、`POST /records/{caseId}/review`、`GET /records/{caseId}/media` | `/capabilities` 返回服务端判定的案例提交/查看能力,移动端不再向普通员工展示无权提交的素材表单;`/upload` 改为 multipart 真实语音上传并走 ASR,服务端只接受 MP3/WAV/M4A/WebM/OGG/AAC/FLAC,成功后原始音频写入 `sys_oss`,案例记录只保存 `mediaOssId` 供受保护媒体接口读取,不向客户端回传原始 `mediaUrl`;`/organize` 用真实转写调 chat 模型整理案例,未配置模型时按真实 transcript 本地结构化,并从背景外的真实摘要项提取学习点;APP 用户的项目范围从 `aihr_org_snapshot` 登录身份解析,上传、整理、入库、列表和详情均按项目范围校验,未完成正式组织映射时安全拒绝,不接受前端伪造项目范围;员工列表/详情只返回 `已入库` 案例,管理端系统用户保留全局运营视图;移动端和管理端案例详情通过受保护媒体接口回放原始音频,主管/项目负责人可提交脱敏点评;预渲染视频样片仍待正式媒体资产接入 |
| 案例媒体安全 | `GET /api/knowledge/case/records/{caseId}/media` | 案例详情只返回 `mediaOssId`,不返回原始 `sys_oss.url`;媒体下载会重复执行登录、后台角色或 APP 项目范围校验,再由服务端流式读取 OSS。管理端与 `mobile-uni` 通过鉴权 blob/temp 文件播放,关闭详情页时释放本地对象 URL |
| SOP知识库 `/knowledge/sop` | `POST /api/knowledge/search`、`POST /api/knowledge/answer-feedback`、`GET /api/knowledge/position-sop`、`GET /api/aihr/mobile/onboard/tasks`、`POST /api/aihr/mobile/onboard/tasks/{id}/complete`、`GET /api/aihr/mobile/qualification`、`POST /api/knowledge/doc/upload` | 已接入 MySQL Fulltext + Qdrant 混合召回、岗位学习适配摘要、OSS-first 文档上传、txt/md/PDF/Word/Excel/PPT 解析和 embedding 写入,失败回退 seed;搜索返回 `reviewId` 与 `promptVersion`,员工反馈回传并保存该评审批次,SOP 人工评审记录同时保留答案生成提示词版本,管理端可继续复核;员工学习页按当前 APP 身份读取正式岗前/入职任务,员工只能将本人处于“待完成/进行中”的任务确认完成,服务端按组织快照/手机号归属更新 `status/completed_time`,不接受前端身份参数;资格证据无正式数据时明确返回 `NOT_CONFIGURED`,不以 AI 分数代替上岗资格;`position-sop` 仍保留一期生活顾问学习导航语义 |
| 资料处理 `/knowledge/processing` | `GET /api/knowledge/processing/overview`、`POST /api/knowledge/doc/upload-async`、`GET /api/knowledge/doc/upload-items`、`POST /api/knowledge/doc/upload-items/{id}/retry`、`POST /api/knowledge/doc/import-local-task`、`GET /api/knowledge/doc/import-tasks`、`POST /api/knowledge/doc/import-tasks/{id}/cancel` | 已接入解析任务状态聚合;**批量上传走异步队列**:接口只暂存+入队即秒回,后台 worker(并发 2)逐条解析/归类/向量化;ZIP 在 worker 内安全解压后把支持的子文件继续入同一批次队列,页面按批次轮询进度、失败可单文件重试;服务端目录导入、进度轮询和任务取消保留,失败回退 seed |
| 组织人员同步 | `POST /api/aihr/org/sync` | 从开放组织同步系统的 `/api/open/v1/sync/snapshot` 拉取 `company/department/employee` 快照,分页参数使用 `limit`;员工手机号只落 `person_phone` 用于移动端身份映射,不在组织列表响应暴露;岗位识别 `position/job_title/post/job_name/role/title` 等字段。`dryRun` 必须显式传入 `true`(预检)或 `false`(写入),省略或传 `null` 直接拒绝,避免空请求意外写库;默认 `replaceExisting=true`,写入前必须先用 `{"dryRun":true}`;dry-run 不访问本地快照表、不执行 DDL/写库,返回 `phoneLinked/maskedPhone/suspectText/warnings` 且 `syncedCount=0`。非 dry-run 覆盖写入遇到员工被跳过、手机号不完整、脱敏手机号或疑似乱码时默认拒绝,只有确认 dry-run 结果后显式传 `allowPartialReplace=true` 才允许覆盖;重复 `ext_party_id` 始终拒绝写入,因为数据库唯一键会折叠重复身份;`replaceExisting=false` 不触发不完整快照覆盖闸门,但仍拒绝重复身份。2026-07-10 源接口实测 3474 人仅 1 个可用手机号、3473 个脱敏手机号、8 条疑似乱码,因此未执行覆盖同步,正式试点需上游先开放至少 20 名试点人员手机号 |
| 资料处理 `/knowledge/processing` | `GET /api/knowledge/processing/overview`、`POST /api/knowledge/doc/upload-async`、`GET /api/knowledge/doc/upload-items`、`POST /api/knowledge/doc/upload-items/{id}/retry` | 已接入解析任务状态聚合;页面只保留“批量导入”,接口暂存+入队即秒回,后台 worker(并发 2)逐条解析/归类/向量化;ZIP 在 worker 内安全解压后把支持的子文件继续入同一批次队列,页面按批次轮询进度、失败可单文件重试;不提供浏览器目录选择或服务端目录导入入口 |
| 组织人员同步 | `POST /api/aihr/org/sync` | 从开放组织同步系统的 `/api/open/v1/sync/snapshot` 拉取 `company/department/employee` 快照,分页参数使用 `limit`;员工手机号只落 `person_phone` 用于移动端身份映射,不在组织列表响应暴露;岗位识别 `position/job_title/post/job_name/role/title` 等字段。`dryRun` 必须显式传入 `true`(预检)或 `false`(写入),省略或传 `null` 直接拒绝,避免空请求意外写库;默认 `replaceExisting=true`,写入前必须先用 `{"dryRun":true}`;dry-run 不访问本地快照表、不执行 DDL/写库,返回 `phoneLinked/maskedPhone/suspectText/warnings` 且 `syncedCount=0`。非 dry-run 覆盖写入遇到员工被跳过、手机号不完整、脱敏手机号或疑似乱码时默认拒绝,只有确认 dry-run 结果后显式传 `allowPartialReplace=true` 才允许覆盖;重复 `ext_party_id` 始终拒绝写入,因为数据库唯一键会折叠重复身份;`replaceExisting=false` 不触发不完整快照覆盖闸门,但仍拒绝重复身份。2026-07-15 线上已用 `/api/open/v1` 前缀完成配置、dry-run 和覆盖同步:开放平台返回公司 17、部门 963、员工 3417;生产 `aihr_org_snapshot` 为 3417 行,`phoneLinked=3392`、`maskedPhone=25`、`suspectText=0`,在职 2943、离职 474。当前剩余 25 人手机号不可用属于上游数据质量问题;功能发布不再被组织同步能力阻塞 |
| 移动端手机号登录 | `GET /resource/sms/code`、`POST /auth/mobile/sms-login` | 已复用 sms4j 阿里云配置 `config1` 和 RuoYi `sms` 授权策略;短信发送成功后才写 Redis 验证码;手机号不存在时自动注册 `app_user`;`aihr.sms.dev-fixed-code` 非空时不真发短信、验证码固定(dev 默认 `123456`)。prod 默认关闭,试点期只有同时设置 `AIHR_SMS_DEV_FIXED_CODE` 与 `AIHR_SMS_PROD_FIXED_CODE_ENABLED=true` 才启用固定码。 |
| 用户侧三端首页 `mobile-uni` hash 路由;旧 `/h5/user`、`/h5/candidate`、`/h5/supervisor` 兼容重定向 | `GET /api/aihr/mobile/home/{role}` | 未登录请求只返回不读取租户业务统计的公开首屏 seed;已登录移动端请求自动携带 `Authorization/clientid`,才返回员工/主管真实统计;移动端本地 fallback 保演示 |
| 移动端登录后角色识别 | `GET /api/aihr/mobile/me` | 认证后按手机号匹配组织快照;`position_level` 为“主管/项目经理”时进入主管端,否则进入员工端;接口失败回退员工端 |
@@ -68,9 +68,9 @@ SOP 文档上传第三片已经落最小后端边界:
| 混合检索 | `POST /api/knowledge/search` | 先跑中文关键词 `LIKE` 打分和 MySQL Fulltext,再生成 query embedding 走 Qdrant,RRF 融合后交给 `category='rerank'` 模型(如硅基流动 bge-reranker-v2-m3)按语义相关性重排;rerank 未配置或失败保持 RRF 顺序,Qdrant 或外部向量接口不可用时保留关键词/全文检索。命中后若 chat 模型可用,自动生成结构化轻概要写入响应 `answer/keyPoints/cautions`(≤60字直答+3-6要点+0-3注意;temperature=0,15s 超时,硬约束不得编造、答不了明示无依据);概要失败回退片段原文拼接,检索不报错 |
| 检索总结卡 | `POST /api/knowledge/summary-card`(JSON `{queryText, category}`) | 按需生成信息图式总结卡 `{title, steps[], objections[], scripts[], reminders[]}`:复用检索命中片段(最多5条)调 chat 模型,temperature=0、30s 超时;无命中/无 chat 模型/生成失败均抛明确错误供前端重试,不兜假数据。移动端查SOP结果页「生成总结卡」按钮触发,底部弹层展示并可 TTS 朗读 |
| 解析状态聚合 | `GET /api/knowledge/processing/overview` | 聚合 `aihr_knowledge_attach.status`、fragment 数、embedding 数、`sys_oss.ext1.fileSize`,生成资料处理页指标、分类、任务、链路和事件列表 |
| 服务端目录导入 | `POST /api/knowledge/doc/import-local` | JSON `{ directory, category, limit }`;`directory` 只能是 `AIHR_IMPORT_ROOT` / `aihr.import.root` 下的相对目录,默认根目录为 `./.data/import`;逐文件复用上传解析链路,同步执行,保留给小批量/调试 |
| 服务端导入任务 | `POST /api/knowledge/doc/import-local-task`、`GET /api/knowledge/doc/import-tasks`、`POST /api/knowledge/doc/import-tasks/{id}/cancel` | 启动后台目录导入并返回任务;任务写入 `aihr_knowledge_import_task`,页面轮询查看总数、成功数、失败数、当前文件和进度;运行中任务可取消;重试当前按同目录重新启动一轮 |
| 批量异步上传 | `POST /api/knowledge/doc/upload-async`(multipart `file`+`category`+`batchId`)、`GET /api/knowledge/doc/upload-items?batchId=`、`POST /api/knowledge/doc/upload-items/{id}/retry` | 上传只做暂存(`aihr.upload.staging`,默认 `./.data/staging`)+ 写入 `aihr_knowledge_upload_item`(0待处理/1处理中/2完成/3失败)即返回;支持 ZIP ≤500MB,worker 限制最多 1000 个子文件、解压总量 ≤2GB,拒绝嵌套 ZIP/不安全路径并忽略未知格式;支持的子文件写回同一 batch 继续复用解析链路;完成/失败状态 CAS 写入,卡住 30 分钟(视频 120 分钟)由清扫重置,失败暂存文件保留 72h 供重试;同步接口 `POST /api/knowledge/doc/upload` 不支持 ZIP,保留给 SOP 页单文件即时预览 |
| 服务端目录导入(运维) | `POST /api/knowledge/doc/import-local` | JSON `{ directory, category, limit }`;`directory` 只能是 `AIHR_IMPORT_ROOT` / `aihr.import.root` 下的相对目录,默认根目录为 `./.data/import`;逐文件复用上传解析链路,同步执行,仅保留给运维/调试,不在资料处理页暴露 |
| 服务端导入任务(运维) | `POST /api/knowledge/doc/import-local-task`、`GET /api/knowledge/doc/import-tasks`、`POST /api/knowledge/doc/import-tasks/{id}/cancel` | 启动后台目录导入并返回任务;任务写入 `aihr_knowledge_import_task`,调用方可查询总数、成功数、失败数、当前文件和进度,运行中任务可取消;仅保留给运维/调试,不在资料处理页暴露 |
| 批量异步上传 | `POST /api/knowledge/doc/upload-async`(multipart `file`+`category`+`batchId`)、`GET /api/knowledge/doc/upload-items?batchId=`、`POST /api/knowledge/doc/upload-items/{id}/retry` | 上传只做暂存(`aihr.upload.staging`,默认 `./.data/staging`)+ 写入 `aihr_knowledge_upload_item`(0待处理/1处理中/2完成/3失败)即返回;支持 ZIP ≤500MB,worker 限制最多 1000 个子文件、解压总量 ≤2GB,拒绝嵌套 ZIP/不安全路径并忽略未知格式;ZIP 文件名优先按 UTF-8 解码,旧版中文 Windows ZIP 自动回退 GBK,仍无法解压时返回安全提示;同名子文件自动追加编号并以单条批量写入入队,避免目录扁平化覆盖和半批次入队;完成/失败状态 CAS 写入,卡住 30 分钟(视频 120 分钟)由清扫重置,失败暂存文件保留 72h 供重试;同步接口 `POST /api/knowledge/doc/upload` 不支持 ZIP,保留给 SOP 页单文件即时预览 |
| 视频解析 | 走批量异步上传,支持 `.mp4/.mov/.avi/.mkv/.webm/.m4v`,单文件 ≤500MB、时长 ≤60 分钟 | 依赖服务器 ffmpeg/ffprobe;抽音轨按 5 分钟分段调 asr 模型转写(`[mm:ss]` 时间戳),按 30s 间隔(≤40 帧)抽关键帧调 vision 模型提取画面文字(相邻重复画面去重);两类文本合并后走归类/切片/向量化;无 asr 且无 vision 结果时按「待处理」落库不报错;视频同时只加工 1 个 |
模型能力第二片已经落最小后端边界:
+24 -5
View File
@@ -1,5 +1,23 @@
# BRD 功能审查与未完成项记录
## 现阶段总览(2026-07-15)
本节只回答当前 `mobile-uni` 三端交互输入与 BRD 的匹配程度,不替代 L0/L1、生产发布或正式试点验收。按 BRD v1.2 的最终多模态目标评估,当前约为 **60%–70%(部分匹配)**;按总纲阶段一“陪练”执行边界评估,约为 **80%–90%(核心链路基本匹配)**。区间是工程审查判断,不是 BRD 官方验收指标。
| 角色端 | 文字输入 | 语音输入 | 图片/视频输入 | BRD 判断 |
|---|---|---|---|---|
| 员工端 | 对练、每日三题、问师傅和复盘意见支持文字 | 对练与每日三题支持浏览器录音或选择音频后 ASR;案例素材支持音频上传;问师傅仍仅支持文字 | 对练与问师傅均无图片/视频入口 | 满足阶段一语音/文本主链路;未满足 BRD 4.3.3 图像/视频情境输入 |
| 候选人端 | 面试支持文字作答 | 面试支持录音转文字和选择音频 | 补充资料支持 PDF/Word/常见图片,但不是图片面试或多模态评分 | 满足 BRD 4.1 语音/文本作答;资料图片上传属于附加能力,不能冲抵 4.3.3 缺口 |
| 主管端 | 专项指派、复盘建议和后续训练原因支持文字 | 可回听员工训练录音,不支持主管录音输入 | 无图片/视频提交入口 | 符合当前“查看回放→写复盘→派训练”职责;BRD 未要求主管端同时具备三种输入 |
已匹配的输入链路:候选人语音/文本面试(BRD 4.1)、员工语音/文本对练与每日一练(4.3/4.4)、主管文字复盘与录音回听(4.4)、案例音频上传(4.6)。尚未闭合的终态要求:员工图像/视频情境输入和服务录像回放(4.3.3)、四川话/粤语等方言的真实样本与 `<=5s` 响应证据(6.5/L1-C)、员工个人文字/文件/图片/链接收藏与混合问答(4.8,明确属于阶段二)。
本批次已将 `pages/user/today/index.vue` 的“语音提问,快速解答”修正为“文字提问,快速解答”,与 `pages/user/sop/index.vue` 的实际输入能力一致。若后续提供语音问师傅,应直接复用 `mobile-uni/src/services/speech.ts` 和现有 `/api/ai/asr`,不新增移动端专用 ASR 接口。
审查证据来自当前源码与本地渲染控件;本轮未重新执行真实方言 ASR、图片上传、语音响应时延或生产环境端到端测试,因此这些能力继续标记为未验证。图片/视频情境输入已在 `AI陪练二期开发推进计划.md` 中明确为文本场景稳定后的独立评估项;个人知识空间按 `银城员工端APP分阶段实施总纲.md` 留在阶段二,不应拉入当前阶段一主线。
- 2026-07-15 管理端资料处理分页静态发布:已备份生产根目录至 `/opt/wygj/backups/www-20260715134936`,再同步 `frontend/dist/`;根目录同步未使用 `--delete`,因此未覆盖同目录的 `/h5`。线上 `processing-yUVzof10.js` SHA-256 与本地构建一致。真实管理员会话确认任务分页共 97 页、第二页仍展示 10 条,状态筛选后回到第一页;根站、H5 和租户接口均返回 `200`。本轮未发布后端、迁移数据库或写入业务数据。
- 2026-07-15 当前发布与资料导入复核:提交 `eacf1a0a` 已发布到线上,`release-preflight.sh` 通过资源/后端哈希、`16/16` schema、根站/H5/API 健康检查,`wygj-aihr.service` 为 `active`。使用真实管理员认证在生产验证 ZIP 异步资料链路:ZIP 入队后拆为 `2` 条队列记录,`2/2` 完成,生成 `1` 个文档和 `2` 个片段;测试队列、附件、片段和 OSS 对象已清理。当前生产 BRD 证据仍未达标:评分校准 `0` 条,SOP 评审 `0/14`,候选资料 `0` 条;组织快照为在职 `22` 条、`2` 个项目、主管/经理岗位 `7` 条,但手机号映射为 `0`。该结果证明“版本已发布、ZIP 功能可用”,不等于正式试点验收完成。
- 2026-07-15 发布 schema gate 回归:`RELEASE_VERIFY_REMOTE_SCHEMA=true` 的只读预检在保留两份 Figma 文档脏工作区的临时索引下正常运行,根站、租户和员工首页均为 `200`,随后准确拦截线上缺失的 8 张表:`aihr_candidate_employee_link`、`aihr_onboard_task`、`aihr_position_responsibility`、`aihr_practice_rubric`、`aihr_practice_rubric_dimension`、`aihr_practice_scenario`、`aihr_qualification_gate`、`aihr_sop_applicability`;未执行迁移或发布。
@@ -276,7 +294,7 @@
- 2026-07-14 测试租户 HTTP 回归:在本地临时建立 `codex-a`/`codex-b` 两个租户,用同一手机号分别登录并授予各自 `superadmin` 测试角色;两租户分别调用异步上传和目录导入接口。A 查询不到 B 的上传批次/导入任务,B 也查询不到 A;两个目录导入任务均完成 `1/1`。后台 worker 的队列加工、目录导入、任务进度和查询均保持租户隔离。测试产生的租户、用户、角色、知识库行和临时文件已清理为 0。该证据只覆盖本地测试环境,不替代正式组织同步和生产多租户验收。
- 2026-07-14 上传队列上下文收口:`AihrUploadQueueService` 的同步请求租户读取改为 `TenantHelper.getTenantId()`,动态租户上下文优先于登录态,避免重试/嵌套任务回退到错误租户;`AihrUploadQueueServiceTest` 已补对应源码契约断言。AIHR 定向测试与模块编译通过。
- 2026-07-14 发布前检查补齐:新增只读 `scripts/release-preflight.sh`,统一核验当前 commit、管理端/H5/后端产物存在性、入口 JS 和 SHA-256;传入 `RELEASE_REMOTE_URL` 时只做公开根站点与租户列表 HTTP 检查,不执行 SSH、rsync、服务重启或生产写入。`docs/DEV_SETUP.md` 已同步发布证据与回滚留痕要求。
- 2026-07-14 当前状态复核:本地 `ry-vue` 组织快照有 `3001` 条 active 记录,但手机号可映射仅 `1` 条、项目 `41` 个,不能作为正式 1–2 项目试点身份数据;线上根站、`/h5/` 和租户接口均返回 `200`,但线上管理端仍加载 `index-CJZ3Ax3Z.js`,本地现有构建产物为 `index-Cz1rtpOj.js`,且发布预检被两份已有未提交 Figma 文档阻断,因此未把最新本地提交宣称为已发布。
- 2026-07-14 当前状态复核:本地 `ry-vue` 组织快照有 `3001` 条 active 记录,但手机号可映射仅 `1` 条、项目 `41` 个,不能作为正式 1–2 项目试点身份数据;线上根站、`/h5/` 和租户接口均返回 `200`,但线上管理端仍加载 `index-CJZ3Ax3Z.js`,本地现有构建产物为 `index-Cz1rtpOj.js`,且发布预检被两份已有未提交 Figma 文档阻断,因此未把最新本地提交宣称为已发布。该组织身份结论已由 2026-07-15 线上组织同步闭环条目替代。
- 2026-07-14 BRD 公开导航回归:`GET /api/knowledge/position-sop` 明确是一期生活顾问学习导航摘要,不返回个人或项目私有数据;控制器补 `@SaIgnore` 后匿名请求返回 `200`,而同一控制器的 `POST /api/knowledge/search` 仍返回业务 `401`,保持“公开只读导航、登录后查询与反馈”的边界。同步完成跨租户异步上传成功路径回归:codex-a/codex-b 各上传独立文件并加工为 `status=2`,互查批次均为空;临时租户、用户、队列、知识库、OSS 与暂存文件已清理。
- 2026-07-14 BRD G3 仪表盘权限收口:`/api/aihr/dashboard/overview` 返回组织、训练、知识库、案例和候选资料统计,控制器新增显式 `@SaCheckLogin`;匿名请求业务返回 `401`,同时保留服务层按当前租户过滤。后续正式主管可见范围仍需组织快照和项目权限数据支撑。
- 2026-07-14 BRD G3 主管接口权限复核:移动端主管/团队/预警/派题/复盘接口对后台系统用户现在要求 `superadmin` 或 `hr_operator` 角色;APP 用户仍要求组织快照中的主管/项目经理身份。新增源码契约测试与 `demo-check` marker,避免普通后台账号越权读取团队训练数据或创建派题。
@@ -435,14 +453,14 @@
- 2026-07-14 BRD 门禁夹具同步:严格预检已将 SOP 正式样本限定为带 `requester_ext_party_id` 且能命中在职组织身份的提问记录;原 `demo-check-pilot-gates` 临时表仍是旧 6 列,导致 SOP 指标为空并无法真实覆盖新口径。现补齐主体与 `prompt_version` 字段,使用安全员工主体 `E` 验证 `sop_usable=1/1`、待评审数和窗口过滤,未改变业务数据。
- 2026-07-14 BRD 生产迁移回归固化:新增 `scripts/tests/aihr-schema-migrations.test.sh`,在临时 MySQL 库验证 SOP 主体/版本字段和组织入职日期迁移面对旧表、缺前置表时可安全执行且重复执行幂等;不写入开发库业务数据。
- 2026-07-14 BRD 生产迁移回归扩展:同一临时 MySQL 回归测试同时连续执行 `aihr_20260714_practice_evidence_mysql8.sql`,确认 `aihr_practice_audio` 与 `aihr_practice_calibration` 两张证据表可重复创建;不写入开发库业务数据。
- 2026-07-14 BRD 当前开发库审查快照:生活顾问启用场景 `12`、校准记录 `20`、已评审 SOP `2`,但住宅 SOP 文档仅 `3/5`、已入库案例 `2/20`,在职组织快照 `3001` 条中手机号可映射仅 `1` 条;这些数据不能作为正式试点通过,下一步优先补内容负责人确认的核心流程素材和正式组织身份映射,不用烟测记录替代。
- 2026-07-14 BRD 当前开发库审查快照:生活顾问启用场景 `12`、校准记录 `20`、已评审 SOP `2`,但住宅 SOP 文档仅 `3/5`、已入库案例 `2/20`,在职组织快照 `3001` 条中手机号可映射仅 `1` 条;这些数据不能作为正式试点通过,下一步优先补内容负责人确认的核心流程素材和正式组织身份映射,不用烟测记录替代。该组织身份映射结论已由 2026-07-15 线上组织同步闭环条目替代,内容/案例/正式试点样本风险仍需继续跟进。
- 2026-07-14 BRD 5.4 训练隐私边界补强:组织快照存在且默认关闭显示字段时,员工历史、主管复盘详情、任务列表和正式试点 CSV 明细不再直接返回历史 `trainee_name`,统一回退为“员工”;新产生的训练、每日题和错题再练记录也不再默认写入姓名,只有显式开启 `aihr.org-sync.store-display-fields` 才展示/保留名称。新增服务回归断言与 `demo-check` marker,保留稳定 `formal_ext_party_id`、项目和训练证据字段;该修复不替代历史显示字段清理、保留期和法务确认。
- 2026-07-14 BRD G3 组织快照缺失 fail-closed:主管团队接口此前在 `aihr_org_snapshot` 不存在时回退读取训练/派发表,生产迁移遗漏可能把历史姓名和非正式范围暴露给后台主管视图;现仅 `dev/local` profile 允许演示回退,其他 profile 在组织快照不可用时返回空团队并停止继续查询活动数据。新增“非 Demo 无快照直接为空”回归测试与 `demo-check` marker,不改变本地演示路径。
- 2026-07-14 BRD 5.4 隐私开关一致性修复:部分兼容查询此前只有在检测到组织快照表时才隐藏姓名,组织表暂缺时可能绕过 `store-display-fields=false`;现员工历史、任务/主管记录、复盘详情及无快照演示成员读取均统一由显示开关控制,默认关闭即返回“员工”。dev 配置仍显式开启用于演示,生产默认关闭;AIHR 全量真测试通过,未修改业务数据。
- 2026-07-14 BRD 严格门禁绕过修复:`AIHR_DEMO_CHECK_LIBRARY_ONLY=true` 仅允许测试加载脚本函数,和 `AIHR_PILOT_STRICT=true` 同时使用时现在直接失败,避免调试开关把正式试点检查静默跳过;新增回归断言,未修改业务数据。
- 2026-07-14 线上浏览器身份复核:使用数据库已有手机号 `13900001111` 和当前 dev 验证码规则登录 `https://peilian.njzhmj.top/h5/` 成功,但随后进入“确认岗位”页并提示“未从组织数据匹配到岗位”,说明线上手机号登录链路可用而正式组织岗位映射仍未闭合;本轮未点击岗位确认,不写入线上岗位数据。
- 2026-07-14 BRD 本轮线上只读复核:生产根站、`/h5/`、`/prod-api/auth/tenant/list` 和 `/prod-api/api/aihr/mobile/home/user` 均返回 `200`;线上仍加载管理端 `assets/index-CJZ3Ax3Z.js` 与 H5 `assets/index-D4-NrEpb.js`。当前本地 `HEAD=8d5cb3d6` 的隐私/组织快照修复尚未重新构建或发布,本轮未执行生产静态同步、后端重启或业务数据写入;线上手机号登录仍会进入“确认岗位”但无法匹配正式组织岗位,P0 组织同步缺口保持未完成。
- 2026-07-14 BRD 5.4 组织快照响应字段复核:`OrgPersonRow` 不包含 `person_phone`,手机号只用于服务端身份映射、过滤和统计;`/api/aihr/org/snapshot` 仍要求 `superadmin/hr_operator`,`store-display-fields=false` 时姓名和部门返回空值。当前未发现新的手机号响应泄露,因此不新增重复脱敏代码;正式组织同步、手机号覆盖率和历史字段治理仍保持 P0 未完成。
- 2026-07-14 BRD 本轮线上只读复核:生产根站、`/h5/`、`/prod-api/auth/tenant/list` 和 `/prod-api/api/aihr/mobile/home/user` 均返回 `200`;线上仍加载管理端 `assets/index-CJZ3Ax3Z.js` 与 H5 `assets/index-D4-NrEpb.js`。当前本地 `HEAD=8d5cb3d6` 的隐私/组织快照修复尚未重新构建或发布,本轮未执行生产静态同步、后端重启或业务数据写入;线上手机号登录仍会进入“确认岗位”但无法匹配正式组织岗位。该 P0 组织同步缺口已由 2026-07-15 线上组织同步闭环条目替代,本条只保留当时线上资源状态。
- 2026-07-14 BRD 5.4 组织快照响应字段复核:`OrgPersonRow` 不包含 `person_phone`,手机号只用于服务端身份映射、过滤和统计;`/api/aihr/org/snapshot` 仍要求 `superadmin/hr_operator`,`store-display-fields=false` 时姓名和部门返回空值。当前未发现新的手机号响应泄露,因此不新增重复脱敏代码;正式组织同步和手机号覆盖率已由 2026-07-15 线上同步闭环补齐,历史字段治理仍需独立跟进。
- 2026-07-14 BRD 发布预检复核:在隔离干净工作树按当前 `HEAD=8f2ace4a` 重新构建管理端、`mobile-uni` H5 和后端 jar,`release-preflight.sh` 的产物新鲜度、根站和租户业务码检查通过;本地管理端主资源 `index-CX4fynEb.js`(SHA-256 `c800022a22e82e81782da590cfec81145852014a6521f7521775720e0f1087fe`)与 H5 `index-C1WoTt0t.js`(SHA-256 `bfb07609acecde3678ed18bf48ce022f36596c6b946e076436fe242cf3e15675`)均与线上 `index-CJZ3Ax3Z.js` / `index-D4-NrEpb.js` 不一致,预检按预期停止;本轮未执行生产静态同步、后端重启或业务数据写入。
- 2026-07-14 BRD G3 OSS 元数据租户隔离修复:SOP 文档去重、处理概览和文件解析元数据此前通过 `JdbcTemplate` 仅按 `sys_oss.oss_id` 读取/更新,未显式约束 `sys_oss.tenant_id`;现统一要求 `sys_oss.tenant_id = aihr_knowledge_attach.tenant_id` 或当前租户,避免跨租户 OSS 元数据被误读/覆盖。新增 `AihrSopSeedServiceTest` 契约断言与 `demo-check` marker;未修改业务数据或生产环境。
- 2026-07-14 BRD G3 Qdrant 共享 collection 隔离修复:重建单租户向量索引此前会删除整个共享 Qdrant collection,并用全局点数与当前租户 MySQL 数量比较;现改为按当前租户 payload filter 删除和统计点数,保留其他租户向量。新增回归契约与 `demo-check` marker;未修改业务数据或生产环境。
@@ -456,4 +474,5 @@
- 2026-07-15 BRD G3 候选人面试操作角色边界修复:`/api/recruit/interview/start`、`answer`、`finish` 此前只要求登录,普通后台系统用户可绕过 HR/管理员权限创建或完成面试;现统一限制为 APP 候选人本人或 `superadmin/hr_operator`,候选人会话仍按本人手机号绑定。新增源码契约测试和 `demo-check` marker;尚未发布生产。
- 2026-07-15 BRD G3 面试未知会话状态边界修复:系统用户调用 `answer` 携带不存在或已失效的 `sessionId` 此前会返回“已暂存”而不暴露会话无效;现统一要求会话存在且属于当前租户,`finish` 保留 HR 管理端既有的兼容性创建逻辑。新增服务回归测试和 `demo-check` marker;尚未发布生产。
- 2026-07-15 BRD 发布状态只读复核:生产根站、`/h5/`、`/prod-api/auth/tenant/list` 和 `/prod-api/api/aihr/mobile/home/user` 均返回 HTTP `200`,`wygj-aihr.service` 为 `active`;生产 H5 仍加载 `index-CDn6TrX8.js`,本地最新候选人面试权限/未知会话修复提交 `217edb09` 尚未证明已发布。本轮仅执行 HTTP、服务状态和 H5 资源只读检查,未同步静态资源、重启后端、执行迁移或写入生产业务数据。
# 2026-07-15 BRD G3/G6 训练语音原始地址暴露收紧:ASR/TTS 成功响应此前可直接返回 `sys_oss.url`,训练历史、主管复盘和管理端复盘在缺少 `audioOssId` 时也会回退播放原始 `audioUrl`;现统一只回传受保护 OSS 编号,服务端持久化/响应仅保留 `data:audio/*` 内联降级,客户端也拒绝 HTTP 音频地址直接播放。TTS 仍写入 `sys_oss`,旧移动端通过内联 data URL 保持可播放;已补源码契约测试和两端回放边界,未修改生产资源或生产数据。
- 2026-07-15 BRD G3/G6 训练语音原始地址暴露收紧:ASR/TTS 成功响应此前可直接返回 `sys_oss.url`,训练历史、主管复盘和管理端复盘在缺少 `audioOssId` 时也会回退播放原始 `audioUrl`;现统一只回传受保护 OSS 编号,服务端持久化/响应仅保留 `data:audio/*` 内联降级,客户端也拒绝 HTTP 音频地址直接播放。TTS 仍写入 `sys_oss`,旧移动端通过内联 data URL 保持可播放;已补源码契约测试和两端回放边界,未修改生产资源或生产数据。
- 2026-07-15 BRD 4.6/P0 组织同步线上闭环:生产 `/opt/wygj/config/wygj.env` 已配置开放组织同步变量并备份为 `/opt/wygj/config/wygj.env.bak-orgsync-20260715141150`,`wygj-aihr.service` 重启后租户接口和员工首页 API 均返回业务成功;线上执行 `POST /prod-api/api/aihr/org/sync` dry-run 与覆盖同步成功,开放平台返回公司 17、部门 963、员工 3417,生产 `aihr_org_snapshot` 为 3417 行、手机号可映射 3392、手机号不可用 25、疑似乱码 0、在职 2943、离职 474。本轮未替换 jar 或静态资源;25 名员工手机号不可用是上游数据问题,不阻塞组织同步功能发布,但正式试点仍需真实训练、校准和 SOP 评审样本。
+2 -2
View File
@@ -20,7 +20,7 @@
| 4 | 三角色对练 `/train/practice` | 开始对练 → 填入参考回复或输入真实回复 → 继续一轮 → 结束并评分 | 已完成闭环、导师改写、新增对练记录;数据库已启用 chat 模型时,客户回复与评分为真实 LLM 生成(回复不再是固定台词,分数随话术变化),未配置时使用本地剧本兜底 |
| 5 | 案例沉淀 `/knowledge/cases` | 上传真实语音 → ASR 转写 → AI 整理 → 送审 → 入库 → 查看案例详情/回放原始音频 | 已完成语音转写、原始音频 OSS 留痕、整理、入库、学习点、主管点评和按项目权限查看持久化转写/摘要详情;预渲染视频样片仍未接入,不把音频回放当作“查看样片”完成证据 |
| 6 | SOP知识库 `/knowledge/sop` | 上传 txt/md/PDF/Word/Excel/PPT 文档或使用 seed 文档 → 检索 → 生成训练题 | 已完成闭环、引用 SOP 原文片段、训练题已生成 |
| 7 | 资料处理 `/knowledge/processing` | 打开页面 → 查看解析任务 → 查看处理链路 → 可选点“服务端导入”导入 `.data/import` 下少量样例 | 可看到资料总量、等待/解析中/完成/失败、片段数、向量化状态和事件列表 |
| 7 | 资料处理 `/knowledge/processing` | 打开页面 → 查看解析任务 → 查看处理链路 → 点“批量导入”选择少量文件或 ZIP | 可看到资料总量、等待/解析中/完成/失败、片段数、向量化状态、批次进度和事件列表;页面不出现“选择目录”“服务端导入” |
## AI陪练二期增量脚本
@@ -34,7 +34,7 @@
试点正式验收前,用 `AIHR_PILOT_TENANT_ID=000000 AIHR_PILOT_START_DATE=2026-07-07 AIHR_PILOT_END_DATE=2026-07-10 AIHR_PILOT_STRICT=true ./scripts/demo-check.sh` 检查 M5 样本闸门,租户和日期替换为本批试点的真实值。闸门只统计目标租户、该时间窗内的数据;正式试点人员必须通过唯一手机号映射到在职组织快照,达到 10 次已完成对练的人数需覆盖试点人员的 80% 以上。校准样本、AI/人工分档一致率和 SOP 可用率未达标时同样失败,不用静态演示 marker 或历史 seed 数据代替真实试点数据。
2026-07-10 本地快照(时间窗 `2026-07-07..2026-07-10`):场景 `12/12`、开发活动身份 `50` 人,但达到 10 次对练者 `0` 人;窗口内能关联正式试点会话的校准样本为 `0/20`,因此分档一致率暂不可验收;已评审 SOP `2/2` 可用,另有 `119` 条待评审。严格预检当前**失败**于正式组织人员门槛:3001 名本地在职人员只有 1 名具备唯一可用手机号,活动数据也只有 1 人能唯一匹配正式组织,且该人员达到 10 次对练的数量为 `0/1`。开发数据和非正式会话校准不能替代正式试点人员;补齐上游手机号并重新同步前,不得宣称一期业务验收完成。
2026-07-15 线上组织同步快照:开放平台返回 17 个公司、963 个部门、3417 名员工;生产 `aihr_org_snapshot` 已覆盖为 3417 行,其中 3392 人具备可用于手机号登录映射的号码,25 人手机号仍不可用,疑似乱码为 0,在职 2943 人、离职 474 人。组织同步能力和“至少 20 名正式人员可映射”的发布门槛已具备;25 人属于上游数据质量问题,不阻塞功能发布。严格试点验收仍必须用真实批次窗口产生训练、人工校准和 SOP 评审样本;旧窗口 `2026-07-07..2026-07-10` 没有人达到 10 次对练,不能作为一期业务验收完成证据。
## 录屏兜底
+17 -4
View File
@@ -50,7 +50,7 @@ portless
Qdrant 默认本地无需配置;远端或自定义 collection 可用 `AIHR_QDRANT_URL`、`AIHR_QDRANT_COLLECTION`、`AIHR_QDRANT_API_KEY` 覆盖。服务端资料导入根目录可用 `AIHR_IMPORT_ROOT` 或 `-Daihr.import.root` 覆盖。组织人员同步可用 `AIHR_ORG_SYNC_BASE_URL` 指向外部开放平台 `/api/open/v1` 前缀,并配置 `AIHR_ORG_SYNC_ACCESS_TOKEN` 或 `AIHR_ORG_SYNC_CLIENT_ID`/`AIHR_ORG_SYNC_CLIENT_SECRET`;业务请求会用 client secret 生成 HMAC-SHA256 hex 签名。移动端手机号登录的短信模板 ID、阿里云 AccessKey、Secret 和短信签名都通过环境变量注入;本地放根目录 `.env.local`,`scripts/dev-backend.sh` 会自动加载。若开放平台凭证放在 `backend/.env`,启动脚本也会加载该文件,并把 `client_id`/`client_secret` 映射为组织同步实际读取的 `AIHR_ORG_SYNC_CLIENT_ID`/`AIHR_ORG_SYNC_CLIENT_SECRET`。
组织同步写入前先运行只读预检:`node scripts/verify-demo-questions.mjs --org-dry-run`。dry-run 不检查或变更本地快照表结构,也不写数据库;输出只包含人数、手机号覆盖、脱敏数、疑似乱码数和警告,不输出员工姓名。只有 `phone_linked` 能覆盖至少 20 名正式试点人员且上游修复疑似乱码后,才切换管理端组织同步为写入模式。
组织同步写入前先运行只读预检:`node scripts/verify-demo-questions.mjs --org-dry-run`。dry-run 不检查或变更本地快照表结构,也不写数据库;输出只包含人数、手机号覆盖、脱敏数、疑似乱码数和警告,不输出员工姓名。2026-07-15 当前开放平台数据已满足写入条件:3417 名员工中 3392 人可手机号映射,疑似乱码为 0;仍有 25 人手机号不可用,确认后可用 `allowPartialReplace=true` 覆盖写入。
正式试点预检必须指定当前批次租户和时间窗,例如:`AIHR_PILOT_TENANT_ID=000000 AIHR_PILOT_START_DATE=2026-07-07 AIHR_PILOT_END_DATE=2026-07-10 AIHR_PILOT_STRICT=true ./scripts/demo-check.sh`。脚本只接受安全租户编号和 `YYYY-MM-DD` 日期,只统计目标租户窗口内完成的训练、校准和 SOP 评审;人员先按唯一手机号映射到在职组织快照,完训口径为每人至少 10 次已完成对练。
@@ -121,12 +121,12 @@ AIHR_AI_SPEECH_ENABLED=true
- `aihr_practice_mysql8.sql` 已导入;移动端员工训练记录落 `aihr_practice_session`,用于训练历史、主管待复盘列表和能力画像聚合
- `aihr_interview_result_mysql8.sql` 已纳入 reset 脚本;AI 面试评分完成后结果落 `aihr_interview_result`
- `aihr_candidate_material_mysql8.sql` 已纳入;候选人端补充资料文件写 `sys_oss`/MinIO,关系落 `aihr_candidate_material`
- `aihr_org_snapshot_mysql8.sql` 已纳入 reset 脚本;组织人员本地 seed(2 个住宅项目 22 人,项目经理/主管/一线三层)支撑演示,外部开放组织系统配置完成后用 `POST /api/aihr/org/sync` 拉取 `company/department/employee` 快照并覆盖本地 `aihr_org_snapshot`
- `aihr_org_snapshot_mysql8.sql` 已纳入 reset 脚本;组织人员本地 seed(2 个住宅项目 22 人,项目经理/主管/一线三层)支撑演示,外部开放组织系统配置完成后用 `POST /api/aihr/org/sync` 拉取 `company/department/employee` 快照并覆盖本地 `aihr_org_snapshot`。2026-07-15 生产已完成该配置和覆盖同步,线上快照为 3417 名员工。
- 组织同步生产默认关闭 `aihr.org-sync.store-display-fields`,不把外部姓名/部门写入或返回组织人员展示快照;开发环境显式打开该开关仅用于 Demo。项目范围、岗位和外部主体 ID仍用于权限与身份映射。
- 本地组织 seed 带演示手机号,可用 `13900000103` 验证员工端自动识别物业管家岗位,用 `13900000202` 验证主管端项目范围
- SOP 知识库支持 `.txt/.md/.markdown/.pdf/.doc/.docx/.xls/.xlsx/.ppt/.pptx` 上传到 MinIO 后解析入库,接口为 `POST /api/knowledge/doc/upload`,单文件上限 100MB;管理端上传请求单独放宽到 180s,PDF 解析/归类/向量化较慢时不要改全局 axios 超时。资料处理中心异步接口另支持 `.zip`(≤500MB),后台安全解压后逐文件入队;最多 1000 个子文件、解压总量 ≤2GB,不支持嵌套 ZIP
- 视频(`.mp4/.mov/.avi/.mkv/.webm/.m4v`,≤500MB、≤60 分钟)只走资料处理中心批量导入(异步队列):ffmpeg 抽音轨分段调 asr 转写 + 抽关键帧调 vision 提取画面文字,合并后归类切片入库,片段带 `[mm:ss]` 时间戳;**依赖服务器安装 ffmpeg/ffprobe**(macOS `brew install ffmpeg`,Linux `apt install ffmpeg`)
- 服务端目录导入接口为 `POST /api/knowledge/doc/import-local-task`,只读取导入根目录下的相对目录,后台逐文件复用同一上传解析链路;`POST /api/knowledge/doc/import-tasks/{id}/cancel` 可取消运行中任务;`POST /api/knowledge/doc/import-local` 保留为同步调试接口。
- 服务端目录导入接口为 `POST /api/knowledge/doc/import-local-task`,只读取导入根目录下的相对目录,后台逐文件复用同一上传解析链路;`POST /api/knowledge/doc/import-tasks/{id}/cancel` 可取消运行中任务;`POST /api/knowledge/doc/import-local` 保留为同步调试接口。这组接口仅供运维/调试,不在资料处理页提供入口。
- 启用 `aihr_model_config.category='vector'` 的模型配置后,上传会同步写入片段 embedding,并尽力 upsert 到 Qdrant;模型配置页可查看 Qdrant 维度、点数和片段向量数,并在维度不一致时重建索引;未配置或 Qdrant 不可用时只走 MySQL Fulltext/seed fallback,不影响检索。
- 后端 `ruoyi-admin` 已完成 Maven 打包,并通过 portless 暴露为 `https://wygj-api.localhost/`
- AIHR 真跑测试必须显式关闭父 POM 的默认跳测:`mvn -f backend/pom.xml -pl ruoyi-modules/ruoyi-aihr -am -DskipTests=false test`;普通 `mvn ... test` 只适合编译/打包检查。
@@ -151,6 +151,19 @@ TOKEN=<登录后 access_token>
curl -fsS https://wygj-api.localhost/api/knowledge/doc/vector-index-status -H "Authorization: Bearer $TOKEN"
```
## 线上管理端静态发布
线上根站由 Caddy 从服务器 `/opt/wygj/www` 提供;同一目录下的 `/h5` 是移动端静态资源。只改管理端静态资源时无需重启后端,但必须先备份整个目录,并且同步根目录时不能使用 `--delete`,以免删除移动端资源。
```bash
npm --prefix frontend run build:prod
ssh YCWY 'ts=$(date +%Y%m%d%H%M%S); mkdir -p /opt/wygj/backups; cp -a /opt/wygj/www /opt/wygj/backups/www-$ts; echo /opt/wygj/backups/www-$ts'
rsync -az frontend/dist/ YCWY:/opt/wygj/www/
curl -k -s https://peilian.njzhmj.top/ | sed -n '1,20p'
```
发布后以管理员真实会话回归受影响页面;如需核对指定资源,可比较本地构建文件和远端对应文件的 SHA-256。该流程不发布后端、不迁移数据库,也不覆盖 `/opt/wygj/www/h5`。
## 线上移动端静态发布
线上 `peilian.njzhmj.top` 由 Caddy 服务,`/h5*` 映射到服务器 `/opt/wygj/www/h5`,并 fallback 到 `/h5/index.html`。只改移动端静态资源时无需重启后端。
@@ -201,7 +214,7 @@ RELEASE_REMOTE_URL=https://peilian.njzhmj.top RELEASE_VERIFY_REMOTE_MATCH=true R
- 三角色对练:进入 `/train/practice`,点击“开始对练” → 完成两轮真实或参考回复 → “结束并评分”,应看到“已完成闭环”“导师改写”和新增对练记录。
- 案例沉淀:进入 `/knowledge/cases`,上传真实语音 → “AI 整理” → “送审” → “入库”,应看到“已完成闭环”和新增案例记录;上传必须先完成 ASR 转写。
- SOP知识库:进入 `/knowledge/sop`,可上传 txt/md/PDF/Word/Excel/PPT 文档入库;点击“检索” → “生成训练题”,应看到“已完成闭环”、命中数据库 SOP 原文片段和训练题;数据库不可用时页面回退 seed。
- 资料处理:进入 `/knowledge/processing`,应看到资料总量、解析任务表、处理链路、规则与风险;可用少量文件验证“批量导入/选择目录/服务端导入”。**批量导入走异步队列**:提交即返回,页面出现“本次批量上传”进度面板(排队/加工中/完成/失败 + 单条重试),后台 worker 并发 2 逐条解析入库;暂存目录默认 `./.data/staging`(`aihr.upload.staging` 覆盖)。服务端导入读取 `./.data/import` 下的相对目录,启动后台任务并在页面显示进度,运行中任务可点“取消”;目录导入的重试粒度是同目录重新导入,批量上传的重试粒度是单文件。
- 资料处理:进入 `/knowledge/processing`,应看到资料总量、解析任务表、处理链路、规则与风险;页面只保留“批量导入”和“刷新”,不应出现“选择目录”“服务端导入”或目录导入任务面板。**批量导入走异步队列**:提交即返回,页面出现“本次批量上传”进度面板(排队/加工中/完成/失败 + 单条重试),后台 worker 并发 2 逐条解析入库;支持多文件和 ZIP,暂存目录默认 `./.data/staging`(`aihr.upload.staging` 覆盖)。
- uni-app 员工端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/user/today/index`,手机号登录(dev 验证码固定 `123456`)。今日页进入问师傅、练习、案例素材和个人页;练习页应能完成开始练习、提交回应、结束评分、每日三题提交,个人页同步训练历史和成长证据包。每日三题正式按组织快照 `hire_date` 判断入职三个月窗口;本地 Demo 若快照尚无该字段,仅由 `dev/local` profile 且 `application-dev.yml` 的 `aihr.practice.allow-legacy-daily-drill-fallback=true` 启用训练次数回退,生产 profile 即使误传环境变量也强制关闭。
- 移动端登录后若组织快照接口返回 `401/403`,只降级为手动岗位确认,不应清除手机号登录态;岗位确认页仍需允许员工选择“生活顾问”后继续进入业务页。
- uni-app 主管端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/supervisor/index/index`,应看到团队概览、团队画像、团队预警、指派专项、待复盘和复盘详情;从团队画像派专项后,最近专项应立即回读新记录。
+2 -2
View File
@@ -40,7 +40,7 @@
| 优先级 | 项目 | 需要什么才能继续 |
|---|---|---|
| P0 | 线上包与角色路由 | 生产服务、根站、H5 和公开业务接口正常,但线上仍加载上一发布批次资源;当前 `HEAD=0bfaee7d` 的管理端/H5/后端 hash 尚未与线上对齐,本轮未执行发布。认证态员工/主管/管理端回归仍需正式 OTP 或测试账号,主管正式角色仍需正式组织数据验证。 |
| P0 | 线上包与角色路由 | 生产服务、根站、H5 和公开业务接口正常;2026-07-15 已单独发布管理端资料处理分页并以真实管理员会话回归。该静态发布不代表当前分支 H5 或后端已对齐线上;认证态员工/主管回归仍需正式 OTP 或测试账号,主管正式角色仍需正式组织数据验证。 |
| P1 | 案例学习/视频详情 | 原始音频 `mediaUrl/mediaOssId` 已形成真实留痕和回放;学习点已从真实摘要提取并持久化,主管点评已有受保护接口和两端展示;仍需业务提供一期预渲染视频样片,并确定相关训练场景字段后再完成视频详情页面。 |
| P1 | 正式组织数据 | 用正式员工、项目和试点时间窗口验证团队量化、成长证据和 M5 导出;不使用本地 smoke 样本替代。 |
| P2 | 三期页面 | 个人 AI 助理、开放问题榜、积分/荣誉、完整七维偏好、独立 AI 教练编排按阶段二/三单独立项。 |
@@ -80,7 +80,7 @@
| 28 | SOP 好评/差评反馈 | `79:674` | `mobile-uni/src/pages/user/sop/index.vue` | [x] 已实现 | 已按 Figma 语义对齐为「有帮助/没解决」双按钮,保留真实反馈接口、提交后状态提示与按钮锁定;浏览器已验证真实搜索、点击反馈、结果提示和两个按钮 disabled。Figma 中的「收藏」当前无后端持久化接口,未添加假按钮 |
| 29 | SOP 后台待复核 | `80:655` | `frontend/src/views/knowledge/sop.vue` | [x] 已实现 | 已补真实答案反馈待复核队列、待复核/已复核筛选、状态展示与「标记已复核」动作;浏览器已验证刷新加载临时待复核样本、点击复核后从待办移除并清理测试数据 |
| 30 | SOP 知识库管理 | `81:2` | `frontend/src/views/knowledge/sop.vue` | [x] 已实现 | 已修正 |
| 31 | 异步资料处理队列 | `81:750` | `frontend/src/views/knowledge/processing.vue` | [x] 已实现 | 已修正;ZIP 支持已随当前批次发布,仍需真实资料和权限账号回归 |
| 31 | 异步资料处理队列 | `81:750` | `frontend/src/views/knowledge/processing.vue` | [x] 已实现 | ZIP 异步入队已在生产复核;解析任务列表已于 2026-07-15 发布前端分页(10/20/50 条),真实管理员会话已验证翻页与筛选复位。 |
| 32 | 案例语音上传 | `79:706` | `mobile-uni/src/pages/user/cases/index.vue`、`frontend/src/views/knowledge/cases.vue` | [x] 已实现 | 已修正 |
| 33 | 案例 AI 整理结果 | `79:734` | `frontend/src/views/knowledge/cases.vue` | [x] 已实现 | 已修正 |
| 34 | 案例审核/筛选/发布 | `82:2` | `frontend/src/views/knowledge/cases.vue` | [x] 已实现 | 已修正 |
+3 -3
View File
@@ -6,7 +6,7 @@
| 文档 | 用途 |
|---|---|
| [DEV_SETUP.md](DEV_SETUP.md) | 本地端口、账号、启动步骤、基础链路验证、移动端 H5 静态发布 |
| [DEV_SETUP.md](DEV_SETUP.md) | 本地端口、账号、启动步骤、基础链路验证、管理端与移动端 H5 静态发布 |
| [FIGMA_DESIGN_INVENTORY.md](FIGMA_DESIGN_INVENTORY.md) | Figma 页面节点索引、设计批次范围、取消项和全文件一致性审计结果 |
| [FIGMA_DESIGN_SYSTEM_GUIDE.md](FIGMA_DESIGN_SYSTEM_GUIDE.md) | 员工端通用视觉元素、业务元素、状态映射和 LLM 组页规则 |
| [FIGMA_IMPLEMENTATION_MATRIX.md](FIGMA_IMPLEMENTATION_MATRIX.md) | 70 张正式画板与代码/线上实现状态、二期边界和剩余动作 |
@@ -19,14 +19,14 @@
| [个人AI助理阶段二专项TechSpec.md](个人AI助理阶段二专项TechSpec.md) | 员工个人知识空间的物理分域、数据模型、API、检索融合、权限、安全、删除和测试规格 |
| [个人AI助理阶段二开发推进计划.md](个人AI助理阶段二开发推进计划.md) | 个人 AI 助理阶段二按 P0/P1 拆分的逐任务实施、测试、提交和试点闸门 |
| [AI陪练二期开发推进计划.md](AI陪练二期开发推进计划.md) | 总纲阶段一执行文档:AI 陪练从 MVP 演示闭环推进到管家(生活顾问)岗位试点可用;区分工程就绪与正式业务试点证据 |
| [BRD_IMPLEMENTATION_AUDIT.md](BRD_IMPLEMENTATION_AUDIT.md) | BRD 功能、权限、迁移、线上资源和未完成项的证据记录;不替代正式发布验收 |
| [BRD_IMPLEMENTATION_AUDIT.md](BRD_IMPLEMENTATION_AUDIT.md) | 顶部维护现阶段结论与三端输入/BRD 匹配矩阵,下方保留功能、权限、迁移、线上资源和未完成项证据;不替代正式发布验收 |
| [BRD_PRODUCTION_MIGRATION_RUNBOOK.md](BRD_PRODUCTION_MIGRATION_RUNBOOK.md) | AIHR BRD 生产 schema/内置内容迁移顺序、只读核验和发布后回归口径 |
| [20260708/uni-app用户侧前端重建计划.md](20260708/uni-app用户侧前端重建计划.md) | 当前用户侧 `mobile-uni/` 重建计划、三端页面拆分、portless 入口、真实浏览器验证和验收进展 |
| [20260708/数字师傅学练问报整合方案.md](20260708/数字师傅学练问报整合方案.md) | 产品定义(学练问报+问题榜+学分晋升+个人 AI 助理)、半年会发布会方案分层及客户需求逐项处置对照 |
| [20260708/发布会演示候选题单.md](20260708/发布会演示候选题单.md) | 2026-07-08 发布会演示候选题单,作为产品讨论留档,不作为阶段一开发入口 |
| [基于AI的银城员工端APP项目立项与开发规划会议-2026年07月07日-来自【Get 笔记】.md](基于AI的银城员工端APP项目立项与开发规划会议-2026年07月07日-来自【Get%20笔记】.md) | 2026-07-07 立项会纪要原文(总纲的输入源,只作留档) |
| [20260708/企业内部AI培训学习APP产品需求与发布会内容讨论(纪要)](20260708/) | 2026-07-08 产品讨论纪要原文及客户"第三版"docx(整合方案的输入源,只作留档) |
| [open-org-sync-api-design-v1.md](open-org-sync-api-design-v1.md) | 开放组织同步系统 `/open/v1` 接口设计,`POST /api/aihr/org/sync` 的外部契约 |
| [open-org-sync-api-design-v1.md](open-org-sync-api-design-v1.md) | 开放组织同步系统 `/api/open/v1` 接口设计,`POST /api/aihr/org/sync` 的外部契约 |
| [物业AI人力资源系统业务需求文档BRD.md](物业AI人力资源系统业务需求文档BRD.md) | 业务需求、范围边界、角色、风险与验收 |
| [物业AI人力资源系统开发规格TechSpec.md](物业AI人力资源系统开发规格TechSpec.md) | 工程结构、数据模型、页面路由、API 和核心实现规格 |
| [BACKLOG.md](BACKLOG.md) | 需求池与延后事项(B1–B8:数据权限/人设语音/生成图片/生成视频/员工画像/视觉检索/数字师傅) |
+5 -5
View File
@@ -17,7 +17,7 @@
| 2. 模型能力 | `chat_provider / chat_model` 改造为 `aihr_model_*`,最小 OpenAI-compatible 调用边界 | 多模型市场、图像、SSE、成本看板 | 模型列表可查;数据库配置后可调用 `/chat/completions` |
| 3. 文档解析 | 文本/Markdown/PDF/Word/Excel/PPT loader、OSS-first 上传与分片 | 异步重试队列、图片智能分析 | txt/md/PDF/Word/Excel/PPT 文件可落 OSS 并解析为 fragment |
| 4. 检索与 embedding | MySQL Fulltext + OpenAI-compatible embedding + Qdrant 最小向量召回 | Milvus/Weaviate 全量适配、独立向量库后台 | 同一问题返回带分数片段,配置 vector 模型后片段有 embedding,Qdrant 可用时参与 RRF 融合 |
| 5. 资料处理状态 | 解析任务状态页、资料分类、处理链路、多文件/目录选择上传、服务端后台目录导入任务 | 单失败文件重试、分布式队列 | 能查看等待解析/解析中/已完成/失败、片段数、向量化状态并导入 MVP 样例文件 |
| 5. 资料处理状态 | 解析任务状态页、资料分类、处理链路、多文件/ZIP 异步上传、单文件重试、服务端运维目录导入接口 | 分布式队列 | 能查看等待解析/解析中/已完成/失败、片段数、向量化状态,并从页面批量导入 MVP 样例文件 |
| 6. RAG 回答 | 带引用回答、训练题生成 | 多模型市场、成本看板 | SOP 页面展示真实引用 |
| 7. Chat | 最小会话、消息、引用来源 | 多智能体、工作流、MCP、Skills | 可围绕 SOP 连续追问 |
@@ -72,9 +72,9 @@
- 新增后端 API:`GET /api/knowledge/processing/overview`。
- 新增前端页面:`/knowledge/processing`,菜单名“资料处理”;`SOP知识库` 菜单保持独立不改名。
- 页面聚合展示资料总量、已完成、处理中、失败、资料分类、解析任务表、处理链路、规则风险和事件列表。
- 批量导入先复用 `POST /api/knowledge/doc/upload`,支持多文件和浏览器目录选择。
- 新增 `POST /api/knowledge/doc/import-local-task`、`GET /api/knowledge/doc/import-tasks` 和 `POST /api/knowledge/doc/import-tasks/{id}/cancel`,只读取 `AIHR_IMPORT_ROOT` / `aihr.import.root` 下的相对目录,写入 `aihr_knowledge_import_task` 后后台逐文件复用上传解析链路,页面轮询进度并支持取消运行中任务;`POST /api/knowledge/doc/import-local` 保留同步调试。
- 页面聚合展示资料总量、已完成、处理中、失败、资料分类、解析任务表、处理链路、规则风险和事件列表;解析任务表按当前筛选结果前端分页,默认 10 条/页,可切换 20/50 条,筛选或刷新时回到第一页。
- 页面批量导入走 `POST /api/knowledge/doc/upload-async`,支持多文件和 ZIP,按批次轮询并可单文件重试;不提供浏览器目录选择。
- `POST /api/knowledge/doc/import-local-task`、`GET /api/knowledge/doc/import-tasks`、`POST /api/knowledge/doc/import-tasks/{id}/cancel` 和同步 `POST /api/knowledge/doc/import-local` 仅保留为运维/调试接口,不在资料处理页暴露。
## 当前第六片
@@ -92,5 +92,5 @@
- 工作流、多智能体、MCP、Skills
- 全量模型管理后台
- 完整流式 chat 与消息持久化
- 单失败文件重试、导入任务暂停、分布式队列
- 导入任务暂停、分布式队列
- 大规模资料的异步向量重建进度条
+74 -72
View File
@@ -1,5 +1,7 @@
# 开放平台组织与预算同步 API 设计方案 v1
> 线上前缀修正(2026-07-15):当前域名 `https://wuye.meihe.cc` 只有 `/api/*` 会代理到后端开放平台;实际接入必须使用 `https://wuye.meihe.cc/api/open/v1`。不要使用 `https://wuye.meihe.cc/open/v1`,否则可能命中前端 SPA 或 nginx,返回 HTML 而不是开放接口 JSON。
## 1. 文档目标
本文档用于定义本系统对外开放的组织与预算同步方案,覆盖以下对象:
@@ -47,7 +49,7 @@
### 3.2 架构原则
- 对外统一入口:全部走 `backend` 的 `/open/v1/*`
- 对外统一入口:全部走 `backend` 的 `/api/open/v1/*`
- 内外账号隔离:外部系统不用内部员工登录账号
- 事件通知最小化:通知消息只传事件元信息,不传完整业务数据
- 数据主动拉取:业务明细通过开放接口主动拉取
@@ -68,7 +70,7 @@
↓
订阅者收到消息
↓
7天内调用 /open/v1/sync/changes 或对象接口主动拉取
7天内调用 /api/open/v1/sync/changes 或对象接口主动拉取
↓
记录同步任务、同步明细、游标、审计日志
↓
@@ -470,66 +472,66 @@ X-Nonce
开放平台统一前缀:
```text
/open/v1
/api/open/v1
```
### 9.1 认证接口
- `POST /open/v1/auth/token`
- `POST /open/v1/auth/refresh`
- `GET /open/v1/auth/me`
- `POST /api/open/v1/auth/token`
- `POST /api/open/v1/auth/refresh`
- `GET /api/open/v1/auth/me`
### 9.2 订阅管理接口
- `POST /open/v1/subscriptions`
- `GET /open/v1/subscriptions`
- `GET /open/v1/subscriptions/{subscription_id}`
- `PATCH /open/v1/subscriptions/{subscription_id}`
- `POST /open/v1/subscriptions/{subscription_id}/enable`
- `POST /open/v1/subscriptions/{subscription_id}/disable`
- `POST /api/open/v1/subscriptions`
- `GET /api/open/v1/subscriptions`
- `GET /api/open/v1/subscriptions/{subscription_id}`
- `PATCH /api/open/v1/subscriptions/{subscription_id}`
- `POST /api/open/v1/subscriptions/{subscription_id}/enable`
- `POST /api/open/v1/subscriptions/{subscription_id}/disable`
### 9.3 事件通知接口
- `GET /open/v1/events`
- `GET /open/v1/events/{event_id}`
- `POST /open/v1/events/{event_id}/ack`
- `POST /open/v1/events/{event_id}/nack`
- `GET /api/open/v1/events`
- `GET /api/open/v1/events/{event_id}`
- `POST /api/open/v1/events/{event_id}/ack`
- `POST /api/open/v1/events/{event_id}/nack`
### 9.4 数据拉取接口
- `GET /open/v1/sync/changes`
- `GET /open/v1/sync/snapshot`
- `GET /open/v1/groups/{id}`
- `GET /open/v1/companies/{id}`
- `GET /open/v1/departments/{id}`
- `GET /open/v1/employees/{id}`
- `GET /open/v1/budget-versions/{id}`
- `GET /open/v1/budget-subjects/{id}`
- `GET /open/v1/budget-items/{id}`
- `GET /open/v1/budget-plans/{id}`
- `GET /api/open/v1/sync/changes`
- `GET /api/open/v1/sync/snapshot`
- `GET /api/open/v1/groups/{id}`
- `GET /api/open/v1/companies/{id}`
- `GET /api/open/v1/departments/{id}`
- `GET /api/open/v1/employees/{id}`
- `GET /api/open/v1/budget-versions/{id}`
- `GET /api/open/v1/budget-subjects/{id}`
- `GET /api/open/v1/budget-items/{id}`
- `GET /api/open/v1/budget-plans/{id}`
### 9.5 同步任务接口
- `POST /open/v1/sync/jobs`
- `GET /open/v1/sync/jobs/{job_id}`
- `POST /open/v1/sync/jobs/{job_id}/complete`
- `POST /api/open/v1/sync/jobs`
- `GET /api/open/v1/sync/jobs/{job_id}`
- `POST /api/open/v1/sync/jobs/{job_id}/complete`
### 9.6 补数申请接口
- `POST /open/v1/replay-requests`
- `GET /open/v1/replay-requests`
- `GET /open/v1/replay-requests/{request_id}`
- `POST /open/v1/replay-requests/{request_id}/cancel`
- `POST /open/v1/replay-requests/{request_id}/approve`
- `POST /open/v1/replay-requests/{request_id}/reject`
- `POST /open/v1/replay-requests/{request_id}/execute`
- `POST /api/open/v1/replay-requests`
- `GET /api/open/v1/replay-requests`
- `GET /api/open/v1/replay-requests/{request_id}`
- `POST /api/open/v1/replay-requests/{request_id}/cancel`
- `POST /api/open/v1/replay-requests/{request_id}/approve`
- `POST /api/open/v1/replay-requests/{request_id}/reject`
- `POST /api/open/v1/replay-requests/{request_id}/execute`
### 9.7 追踪与审计接口
- `GET /open/v1/traces/{trace_id}`
- `GET /open/v1/audits`
- `GET /open/v1/subscriptions/{subscription_id}/deliveries`
- `GET /open/v1/subscriptions/{subscription_id}/sync-records`
- `GET /api/open/v1/traces/{trace_id}`
- `GET /api/open/v1/audits`
- `GET /api/open/v1/subscriptions/{subscription_id}/deliveries`
- `GET /api/open/v1/subscriptions/{subscription_id}/sync-records`
---
@@ -537,7 +539,7 @@ X-Nonce
### 10.1 获取令牌
`POST /open/v1/auth/token`
`POST /api/open/v1/auth/token`
请求示例:
@@ -565,11 +567,11 @@ X-Nonce
### 10.2 刷新令牌
`POST /open/v1/auth/refresh`
`POST /api/open/v1/auth/refresh`
### 10.3 查询当前应用
`GET /open/v1/auth/me`
`GET /api/open/v1/auth/me`
返回内容:
@@ -587,7 +589,7 @@ X-Nonce
### 11.1 创建订阅
`POST /open/v1/subscriptions`
`POST /api/open/v1/subscriptions`
请求示例:
@@ -633,7 +635,7 @@ X-Nonce
### 11.2 查询订阅列表
`GET /open/v1/subscriptions`
`GET /api/open/v1/subscriptions`
支持筛选:
@@ -643,8 +645,8 @@ X-Nonce
### 11.3 启停订阅
- `POST /open/v1/subscriptions/{subscription_id}/enable`
- `POST /open/v1/subscriptions/{subscription_id}/disable`
- `POST /api/open/v1/subscriptions/{subscription_id}/enable`
- `POST /api/open/v1/subscriptions/{subscription_id}/disable`
---
@@ -652,7 +654,7 @@ X-Nonce
### 12.1 拉取事件列表
`GET /open/v1/events`
`GET /api/open/v1/events`
查询参数:
@@ -685,7 +687,7 @@ X-Nonce
### 12.2 事件确认收到
`POST /open/v1/events/{event_id}/ack`
`POST /api/open/v1/events/{event_id}/ack`
请求示例:
@@ -698,7 +700,7 @@ X-Nonce
### 12.3 事件确认失败
`POST /open/v1/events/{event_id}/nack`
`POST /api/open/v1/events/{event_id}/nack`
请求示例:
@@ -715,7 +717,7 @@ X-Nonce
### 13.1 增量拉取
`GET /open/v1/sync/changes`
`GET /api/open/v1/sync/changes`
查询参数:
@@ -758,7 +760,7 @@ X-Nonce
### 13.2 全量快照拉取
`GET /open/v1/sync/snapshot`
`GET /api/open/v1/sync/snapshot`
查询参数:
@@ -779,35 +781,35 @@ X-Nonce
#### 集团
`GET /open/v1/groups/{id}`
`GET /api/open/v1/groups/{id}`
#### 公司
`GET /open/v1/companies/{id}`
`GET /api/open/v1/companies/{id}`
#### 部门
`GET /open/v1/departments/{id}`
`GET /api/open/v1/departments/{id}`
#### 员工
`GET /open/v1/employees/{id}`
`GET /api/open/v1/employees/{id}`
#### 预算版本
`GET /open/v1/budget-versions/{id}`
`GET /api/open/v1/budget-versions/{id}`
#### 预算科目
`GET /open/v1/budget-subjects/{id}`
`GET /api/open/v1/budget-subjects/{id}`
#### 预算项
`GET /open/v1/budget-items/{id}`
`GET /api/open/v1/budget-items/{id}`
#### 预算计划
`GET /open/v1/budget-plans/{id}`
`GET /api/open/v1/budget-plans/{id}`
### 13.4 单对象接口通用参数
@@ -821,7 +823,7 @@ X-Nonce
### 14.1 创建同步任务
`POST /open/v1/sync/jobs`
`POST /api/open/v1/sync/jobs`
用途:
@@ -853,11 +855,11 @@ X-Nonce
### 14.2 查询同步任务
`GET /open/v1/sync/jobs/{job_id}`
`GET /api/open/v1/sync/jobs/{job_id}`
### 14.3 回报同步结果
`POST /open/v1/sync/jobs/{job_id}/complete`
`POST /api/open/v1/sync/jobs/{job_id}/complete`
请求示例:
@@ -932,7 +934,7 @@ X-Nonce
### 16.3 发起补数申请
`POST /open/v1/replay-requests`
`POST /api/open/v1/replay-requests`
请求示例:
@@ -963,29 +965,29 @@ X-Nonce
### 16.4 查询补数申请
`GET /open/v1/replay-requests`
`GET /api/open/v1/replay-requests`
### 16.5 查询补数申请详情
`GET /open/v1/replay-requests/{request_id}`
`GET /api/open/v1/replay-requests/{request_id}`
### 16.6 取消补数申请
`POST /open/v1/replay-requests/{request_id}/cancel`
`POST /api/open/v1/replay-requests/{request_id}/cancel`
### 16.7 审批补数申请
#### 批准
`POST /open/v1/replay-requests/{request_id}/approve`
`POST /api/open/v1/replay-requests/{request_id}/approve`
#### 驳回
`POST /open/v1/replay-requests/{request_id}/reject`
`POST /api/open/v1/replay-requests/{request_id}/reject`
### 16.8 执行补数
`POST /open/v1/replay-requests/{request_id}/execute`
`POST /api/open/v1/replay-requests/{request_id}/execute`
执行方式:
@@ -999,7 +1001,7 @@ X-Nonce
### 17.1 查询链路追踪
`GET /open/v1/traces/{trace_id}`
`GET /api/open/v1/traces/{trace_id}`
返回应包含:
@@ -1014,7 +1016,7 @@ X-Nonce
### 17.2 查询审计日志
`GET /open/v1/audits`
`GET /api/open/v1/audits`
可按以下条件筛选:
@@ -0,0 +1,128 @@
# 下一步工作计划(BRD 对齐版)
> 版本:v2.1(2026-07-15 二次修订:发布前只跑本地预检、remote match+schema 移到发布后;案例底线补齐算术;CER 阈值归 B4 确认;B7 按生产实测字段改写)
> 基准:《物业AI人力资源系统业务需求文档BRD.md》v1.2(唯一事实源)
> 阶段边界:《银城员工端APP分阶段实施总纲.md》阶段一(陪练)+ 2026-07-08《数字师傅学练问报整合方案》定案
> 现状证据:《BRD_IMPLEMENTATION_AUDIT.md》2026-07-15 最新条目 + 本日生产只读复核
> 时间锚点:半年会产品发布(须带一线真实使用数据)→ 2026-09 收费季前试点可用
---
## 0. 当前基线(2026-07-15 生产实测)
**已完成**(不再列入待办):
- 生产已发布至 `eacf1a0a` 批次并有后续静态增量,线上 H5 = `index-rPeDLbpR.js`;发布预检通过资源/后端哈希与健康检查。
- 生产 schema **16/16 齐备**,内置 Prompt **6/6**,生活顾问启用场景 **14 条**(含服务推介/增值 1、日常服务 1)。
- **组织同步已线上闭环**:开放平台拉取公司 17 / 部门 963 / 员工 3417;`aihr_org_snapshot` 3417 行,手机号可映射 **3392**,在职 2943。主管身份与项目数据权限的数据基础已就位。
**真实缺口**(本计划的全部工作对象):
- 正式试点证据全部为 0:评分校准 0/20、SOP 人工评审 0/14、案例 0/20、满意度 0、候选资料 0(L1-B/C/D)。
- SOP 文档仅 3/5,缺服务推介/增值与日常服务两类的真实业务内容确认(4.3.4、L1-B)。
- 方言 ASR 零实测(9.1 MVP 阻塞项、L1-C ≤5s)。
- 仓库有 17 个已跟踪修改 + 2 个未跟踪文件未收拢,发布预检拒绝任何脏工作区,当前修复批次无法发布。
- 25 名员工手机号不可用(上游数据问题,不阻塞,需反馈开放平台)。
- PII 出境条款、成本计量契约、HR 学分规则等外部输入未闭合(G3/G6、4.5)。
**结论:最大阻塞已从"发布与组织数据"转移到"试点圈定(B3)与内容/评审样本"。** 所有新增页面/功能默认冻结(守 MVP 切割线,BRD 附录 C 头号风险 = 范围失控)。
---
## 1. 主线 A:锁定发布批次,原子发布(本周内)
目标:把 `eacf1a0a` 之后累积的修复(G3 脱敏补强、案例音频收紧、岗位-SOP 收口等)作为一个命名 release batch 发布,线上 = release commit。
| # | 任务 | 依据 | 完成定义 | 期限 |
|---|---|---|---|---|
| A1 | 收拢工作区:对当前 17 个已跟踪修改按内容分批提交(后端服务/测试、文档、前端各一批),2 个未跟踪文件(本计划、`processing-import-ui.test.sh`)一并提交或显式移出;形成命名 release commit | `release-preflight.sh` 拒绝任何脏工作区 | `git status --porcelain` 为空;release commit 落字 | 07-16 |
| A2 | 确定发布窗口 + 备份/回滚责任人 | 12.1、Runbook 前置条件 1 | 窗口时间、执行人、回滚人三项落字 | 07-16 |
| A3 | **一次原子切换**:锁定提交 → 干净 worktree 构建三端 → **本地预检**(`release-preflight.sh` 不带 remote 开关;发布前线上还是旧版本,remote match 必然失败)→ DB/静态资源/后端备份 → 同步静态资源与后端、重启。**当前批次未包含 SQL 迁移;若收拢后出现新迁移,从本批次拆出并按 Runbook 单独执行** | 6.3、L1-C、preflight 脚本 71–72 行开关耦合 | 本地预检通过 → 发布完成;任一步失败按备份回滚,当天不重试第二次 | 07-17 |
| A4 | **发布后远端复检与回归**:`RELEASE_REMOTE_URL=https://peilian.njzhmj.top RELEASE_VERIFY_REMOTE_MATCH=true RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true ./scripts/release-preflight.sh`(此时线上=本地构建,match 可通过)+ 认证态浏览器回归(员工/主管/管理端各 1 条路径,正式 OTP)+ 非 strict `./scripts/demo-check.sh` 输出数据现状(**strict 门禁留到 B3 窗口确定后**,strict 模式强制要求 `AIHR_PILOT_START_DATE/END_DATE`) | 10.2、`demo-check.sh` 参数约束 | 远端静态资源、后端 hash 与 schema 复检通过;三端认证态回归留证;数据缺口清单留档审计记录 | 07-17 |
---
## 2. 主线 B:外部输入催办清单(今天发出,B3 为最大阻塞)
每项需在发出时填负责人与回复期限;到兜底触发日仍无答复即升级 HR 负责人(BRD 第 13 章"集成负责人指派"至今未闭合)。
| # | 需要的输入 | 提供方 | 负责人 | 回复期限 | 兜底触发日 | 阻塞的 BRD 条款 | 不给的后果 |
|---|---|---|---|---|---|---|---|
| B3 | **试点项目圈定(1–2 个住宅项目)+ 窗口起止日期 + ≥20 名员工名单**(组织数据已就位,可直接从 3392 条手机号映射中圈人) | HR 负责人 | 待指派 | 07-18 | 07-22 | 10.2-D | M5 全部指标无分母;半年会没有"真实使用数据" |
| B2 | 补 2 份真实 SOP 文档(现 3/5),并由业务确认全部五类核心流程的成功条件、价格/取消规则、回访口径;随后完成 14 条场景/SOP 的人工评审(现 0/14) | 内容负责人/HR | 待指派 | 07-20 | 07-24 | 4.3.4、L1-B(SOP≥5) | SOP 覆盖与 RAG 可用率(≥80%)无法验收 |
| B9 | **历史案例批量提供**:试点前 **≥20 条**历史案例语音/材料入库并脱敏审核,不依赖试点新增量补齐验收底线;试点期继续按"每周每项目 1 条"采集新案例 | 各项目负责人 | 待指派 | 07-22 | 07-25 | 4.6、L1-B(案例≥20) | 案例库验收必然失败 |
| B4 | 方言 ASR 厂商选型(**阶段一只选 1 种方言**,按试点区域确认;BRD 9.1 只要求 1 条路径)+ 费用授权 + **同时确认 CER 达标阈值**(BRD 只定了 ≤5s 响应,识别准确率的验收线需业务拍板,否则 C3 实测无法判定"达标") | 技术组+HR | 待指派 | 07-20 | 07-24 | 4.3.3、9.1、L1-C | MVP 阻塞项零实测,且测了也无法判定通过 |
| B5 | 案例讲解视频预渲染样片 1 条(半年会素材;**不阻塞案例上传闭环验收**——L0-4 只要求"语音上传→AI 整理") | 业务 | 待指派 | 07-31 | 08-05 | 4.6、9.1 | 半年会演示缺 1 条示范视频(止损线内最低配置) |
| B6 | 大模型/ASR/TTS 供应商 PII 留存与跨境条款确认(音频本体、图片本体外发部分) | 法务/安全 | 待指派 | 07-24 | 07-31 | G3、G6、F3 | 生产前闸门无法关闭 |
| B7 | 组织快照最小字段清单与保留期:生产实测姓名 0、部门 0(展示字段默认关已生效),但 `project_name` 仍保留 3417 行;需法务/安全核对 `project_name`、`person_phone` 等仍保留字段是否在最小清单内,及历史清理范围 | 法务/安全 | 待指派 | 07-24 | 07-31 | 5.4(只存 party_id 硬约束) | P0 存储边界无法关闭 |
| B8 | 认证等级/学分规则契约(初/中/高级条件、学分来源与分值、防刷) | HR | 待指派 | 07-31 | 08-07 | 4.5、10.2-A | 成长页只能继续挂"规则待配置、不生效" |
| B10 | 25 名员工手机号不可用 → 反馈开放平台修数(低优先级,不阻塞) | 开放平台 | 待指派 | 07-31 | — | 5.4 | 25 人无法登录 APP |
追办顺序:**B3 → B9 → B2 → B4**,其余并行。
---
## 3. 主线 C:工程收尾(小、快、不开新战线)
| # | 任务 | 依据 | 完成定义 | 期限 |
|---|---|---|---|---|
| C1 | "问师傅"文案对齐:`pages/user/today/index.vue` 的"语音提问,快速解答"**直接改为符合现状的文字**(语音问答入 backlog,届时复用 `speech.ts` + `/api/ai/asr`,不新增接口) | 4.7、2026-07-15 审计 | 首页承诺与 SOP 页能力一致 | 07-16(随 A1 批次发布) |
| C2 | 主管身份与项目数据权限验收:组织数据已就位,用正式主管账号认证态验证——本项目团队可见、跨项目不可见、训练记录/待复盘按项目过滤 | 5.4、G3、L1-B | 认证态回归留证写入审计记录 | 07-18 |
| C3 | 方言实测(B4 选型后):**1 种方言**,固定样本集(≥20 条真实短音频),记录字错率(CER)与单轮响应 P95(≤5s,L1-C);CER 与 B4 确认的阈值比对——**阈值未确认前只记录数据、不判定达标** | 4.3.3、9.1、L1-C | 样本数、CER、P95 三项数据落审计记录;CER ≤ B4 阈值且 P95 ≤5s 才在验收表标"通过" | B4+3 天 |
| C4 | LLM/ASR/TTS 调用计量:待 B6/财务给出计费字段与单价后,新增租户范围 `llm_call_log`(模块/模型/token/延迟/费用)+ 月度上限告警与自动降级;此前维持手动断路器,不硬编码价格 | 6.3、G6 | 有持久化计量与可配置上限 | B6 后一周内 |
| C5 | 案例入库流水线支援 B9:批量导入入口复用现有上传/整理/筛选链路,脱敏门禁逐条通过;不为批量导入新做页面 | 4.6、L1-B | ≥20 条历史案例状态"已入库"且脱敏扫描 0 命中 | 07-25 |
---
## 4. 主线 D:正式试点与 L1 验收(B3 就位后启动,目标 8 月中出证据包)
按 BRD 10.2 四组验收逐项闭合,全部以严格门禁 + 正式窗口数据为准,**禁止 seed/烟测/演示账号冒充**(审计第 5 节完成定义)。
| 周次 | 动作 | 闭合的验收项 |
|---|---|---|
| 试点第 0 周(预备) | 试点名单在组织快照中逐一核对(手机号可登录);SOP 5 流程入库 + 14 条评审完成(B2);**历史案例 ≥20 条入库审核完成(B9/C5)**;员工开通与培训动员(配 G4 激励沟通) | L1-B:SOP≥5、组织导入、项目级权限 |
| 试点第 1–2 周 | ≥20 名员工真实对练(人均目标 10 次);每日一练推送;主管完成复盘与派发闭环;同步采集满意度(1–5 分);案例按"每周每项目 1 条"继续新增 | L1-A 育闭环;L1-D 人均次数/完训率/满意度 |
| 试点第 2 周起 | 人工校准 ≥20 条,计算 AI/人工分档一致率(目标 ≥70%);统计 RAG 可用回答率(目标 ≥80%);抽查人工复核可否决 AI 分的证据(G1/G2) | L1-C 一致率/可用率;G1/G2 |
| 试点收口 | 案例库 ≥20 条(存量+增量,脱敏门禁通过);`GET /api/train/practice/export` 按窗口导出正式 CSV;以试点窗口日期跑 `AIHR_PILOT_STRICT=true AIHR_PILOT_START_DATE=<起> AIHR_PILOT_END_DATE=<止> ./scripts/demo-check.sh` 全绿;形成 L1 验收证据包 | L1 全项;半年会"真实使用数据" |
**半年会演示止损线**(07-08 定案):只保「生活顾问的一天」主线,实操**问 + 练**两个模块;陪练 + 总结卡 + 1 条示范视频为最低配置,其余全部可砍。
---
## 5. 明确不做(守边界,防范围失控)
| 项 | 依据 |
|---|---|
| 个人 AI 助理/个人知识空间(文字/图片/文件/链接收藏、混合问答、PPT) | BRD 4.8 明确阶段二;有独立 TechSpec 与推进计划 |
| 员工端图片/视频训练输入(4.3.3 终态缺口) | 《AI陪练二期开发推进计划》约定文本场景稳定后独立评估;届时只落有业务目的的场景(拍照报修、品检) |
| 开放问题榜、积分/排行榜/荣誉墙运营化 | 总纲阶段二;07-08 定案排行榜默认关 |
| 师徒关系/拜师池/带徒福利 | 业务已否决(07-08) |
| G5 情绪树洞 | 业务/法务/安全决策未定,在匿名边界与零落库合同明确前保持未实现,不用陪练情绪数据冒充 |
| 企微/钉钉/工单集成、SSO、知识图谱、多项目类型 | D2/D4/D8 既定决策不变 |
---
## 6. 里程碑总览
```
07-15(今日) B 催办清单发出(B3 置顶) + C1 文案修改
07-16 A1 收拢工作区成 release commit + A2 发布窗口落字
07-17 A3 原子发布(预检→备份→切换→回归) + A4 结构回归与数据缺口留档
07-18 C2 主管身份/项目权限认证态验收(组织数据已就位,不依赖外部)
07-18~07-25 B2 SOP 补齐与评审 / B9+C5 历史案例 ≥20 条入库 / C3 方言实测(依赖 B4)
07-28~08-08 D 试点窗口(1–2 项目、≥20 人、2 周;以 B3 实际答复为准)
08-11~08-15 L1 证据包收口:strict 门禁全绿(带试点窗口日期)+ CSV 导出
半年会前 「生活顾问的一天」演示彩排 ×2 + 录屏兜底(沿用 BRD 11.2 彩排纪律)
2026-09 前 收费季试点可用状态确认
```
## 7. 风险与止损
1. **B3 试点圈定拖延是当前最大单点风险**(组织数据已就位,决策成本已最低):07-22 仍无答复,升级 HR 负责人;试点每晚一周,半年会"真实使用数据"窗口就少一周。
2. **案例 20 条**:依赖 B9 存量导入;若试点前不足 20 条,立即提高采集频率(每项目每周 2–3 条)并如实下调收口预期,不用未脱敏或演示数据凑数。
3. **发布失败**:A3 原子流程任一步失败即按备份回滚,当天不重试第二次,先归因。
4. **范围失控**(BRD 附录 C 头号风险):任何新页面/新功能请求一律进 `docs/BACKLOG.md`;每周对照本计划复盘一次偏差。
5. **方言不达标**:若 CER/P95 不达标,按 BRD 9.2 止损——保"1 条方言路径可演示",验收表如实标注差距,不虚标通过。
6. **计划保鲜**:《BRD_IMPLEMENTATION_AUDIT.md》条目非严格时序,引用前须以"生产只读复核 + 线上实测"确认基线;本计划每次执行前先校验第 0 节事实是否仍成立。
---
*本计划由工程侧起草,v2.1 已按 Codex 审查修订;B 表负责人/期限需业务方确认后生效。执行进展回写《BRD_IMPLEMENTATION_AUDIT.md》,本文件只改计划不记证据。*
@@ -181,7 +181,7 @@ mobile/
| `/train/mistakes` | 错题本 | P1 |
| `/knowledge/sop` | SOP 库(住宅类检索→引用→训练题) | P0跑通 |
| `/knowledge/cases` | **案例库(英雄路径B:语音上传→整理)** | P0跑通 |
| `/knowledge/processing` | 资料处理(解析状态、处理链路、浏览器/服务端导入) | P1已提前落地 |
| `/knowledge/processing` | 资料处理(解析状态、处理链路、多文件/ZIP 批量导入) | P1已提前落地 |
| `/system/model` | 模型配置(供应商 Key/Base URL/模型启停/测试、向量库状态与重建) | P1已提前落地 |
| `/competency/radar` | 能力雷达图 | P1 |
| `/competency/cert` | 认证/激励 | P1 |
@@ -268,7 +268,7 @@ POST /api/ai/score req:{ rubricId, dialogue } resp:{ dimensions, co
- 同步:`POST /api/sync/pull`(拉取组织人员,MVP 可读快照文件)
- 知识检索(RAG):`POST /api/knowledge/search` → `{ queryText, category, answer, reference, docs[], snippets[], training[], records[] }`
- 知识上传解析:`POST /api/knowledge/doc/upload` → `multipart/form-data { file, category }`,支持 `.txt/.md/.markdown/.pdf/.doc/.docx/.xls/.xlsx/.ppt/.pptx`、100MB 内;先落 `sys_oss` 并绑定 `aihr_knowledge_attach.oss_id`,返回 `{ docId, ossId, fileName, category, fragments, snippets[] }`;管理端上传请求 timeout 为 180s。
- 服务端目录导入:`POST /api/knowledge/doc/import-local-task` → `{ directory, category, limit }`,只允许读取 `AIHR_IMPORT_ROOT` / `aihr.import.root` 下的相对目录,写入后台导入任务并逐文件复用上传解析链路;`GET /api/knowledge/doc/import-tasks` 返回任务进度列表;`POST /api/knowledge/doc/import-tasks/{id}/cancel` 取消运行中任务;`POST /api/knowledge/doc/import-local` 保留同步调试。
- 服务端目录导入:`POST /api/knowledge/doc/import-local-task` → `{ directory, category, limit }`,只允许读取 `AIHR_IMPORT_ROOT` / `aihr.import.root` 下的相对目录,写入后台导入任务并逐文件复用上传解析链路;`GET /api/knowledge/doc/import-tasks` 返回任务进度列表;`POST /api/knowledge/doc/import-tasks/{id}/cancel` 取消运行中任务;`POST /api/knowledge/doc/import-local` 保留同步调试。这组接口仅供运维/调试,不在 `/knowledge/processing` 页面暴露。
- 资料处理状态:`GET /api/knowledge/processing/overview` → 聚合附件状态、片段数、向量化状态、分类、处理链路和事件列表。
- 片段向量化:同一上传接口在 `category=vector` 模型配置可用时调用 OpenAI-compatible `/embeddings`,写入 `embedding_json/embedding_model/embedding_time`,并尽力 upsert 到 Qdrant;未配置或 Qdrant 不可用不阻塞上传。
- 向量库状态与重建:`GET /api/knowledge/doc/vector-index-status` 返回当前 vector 模型维度、Qdrant collection 维度、点数和片段向量数;`POST /api/knowledge/doc/rebuild-vector-index` 清空旧 embedding、删除 collection,并按当前 vector 模型重建。外部 embedding 成功但 Qdrant 维度不一致时不降级为本地 hash。