feat(assistant): unify confirmed memory capture

This commit is contained in:
2026-07-20 02:30:06 +08:00
parent 46a6156d8c
commit 0a5fc9a463
32 changed files with 949 additions and 242 deletions
@@ -7,6 +7,7 @@
> v1.3 更新(2026-07-11):阶段二新增员工个人 AI 助理,首批做个人资料/链接收藏、时间检索、带引用问答和工作整理;PPT 生成后置为 P1;北森等外部个人数据归阶段三。
> v1.4 更新(2026-07-19):个人助理增加确认式长期记忆,并把一级入口收敛为“工作助手 / 查全网”;内部个人资料、项目记录和企业知识默认自动路由,来源在答案中透明展示。
> v1.5 更新(2026-07-19):“工作上报”由传统表单主路径改为微信式语音/照片/视频会话,AI 整理并按需追问,用户确认后才提交既有审核链。
> v1.6 更新(2026-07-19):“记一下”升级为确认式统一采集。系统先建议服务线索、住户画像、优秀案例、个人想法、待跟进事项或工作记录,用户选择仅自己保存或提交公司处理;位置字段缺失不阻断保存,公司处理在正式接口接入前只标记待流转。
> 与《银城员工端APP分阶段实施总纲》《AI陪练二期开发推进计划》的关系:本方案是增量修订,不推翻既有阶段划分;§4.2 回写清单已于 2026-07-08 执行——总纲升 v0.3、二期计划升 v0.8。BRD 已升至 v1.4,同步个人助理与工作上报交互定案;BRD 4.4 师徒演练等旧口径仍待后续版本继续修订。
---
@@ -160,7 +161,7 @@
| P0 | 个人资料问答与总结 | 可选择个人资料/企业知识范围;答案展示引用来源,权限不足或无结果时明确提示 |
| P0 | 时间与主题检索 | 支持“从哪天到哪天”“哪些资料与保洁管理相关”等查询 |
| P0 | 工作问题与灵感整理 | 将零散输入整理为结论、行动项、待确认事项,不替员工自动对外发送 |
| P0 | 确认式长期记忆 | 从文字/ASR 转写识别住户需求、待跟进事项和个人经验;必须经用户确认,个人经验写个人域,住户需求/跟进事项写项目业务域 |
| P0 | 确认式统一采集 | 从文字/ASR 转写建议服务线索、住户画像、优秀案例、个人想法、待跟进事项和工作记录;缺少项目/楼栋/单元/房号仍可保存;用户明确选择仅自己保存或提交公司处理 |
| P1 | 多资料对比、周报/月报、汇报提纲 | 输出可编辑结构,保留每个结论的资料来源 |
| P1 | PPT 生成与导出 | 先确认大纲和模板再生成;不作为阶段二首批上线阻塞项 |
@@ -169,6 +170,7 @@
- 个人资料默认私有,分享给团队或沉淀企业知识库需员工明确操作并进入审核链。
- 企业密级权限继续生效;个人助理不得因“个人收藏”绕过账号等级 × 知识密级控制。
- 工作助手自动路由只覆盖已授权内部域;内部无命中时提示用户是否“查全网”,不得自动转发原问题或住户/项目数据。
- “提交公司处理”先写可靠 `PENDING` 流转记录;外部线索/工单接口、凭证和回执未确定时不得假装已送达。优秀案例可作为建议类型,但正式工作上报仍需进入既有确认与审核链。
- 网页内容保存原链接、抓取时间与正文快照;外链抓取需增加安全、版权和内容失效检查。
- 阶段三接入北森后,才允许在授权范围内分析考勤、请假、任职等 HR 数据;阶段二不复制或模拟这些外部数据。
+16 -15
View File
@@ -14,7 +14,7 @@
| 案例沉淀 `/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 知识库 `/pages/user/sop/index`、`/knowledge/sop` | `POST /api/knowledge/query`、`POST /api/knowledge/query-media`、`GET /api/knowledge/resources/{attachmentId}/content`、`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 混合召回;内部登录端可选传 `conversationId/contextVersion`,服务端保留 30 分钟不活跃过期、最近 6 轮脱敏截断上下文,用现有 chat 模型或保守规则输出 `QA/FILE/VIDEO/DATA_TOOL` 和 `rewrittenQuery`,旧版本冲突返回 `409`。原文件/视频仅从当前命中且仍有授权的附件返回,内容接口每次重新计算租户、应用和主体权限;无资源时明确返回空列表,不生成假链接。旧客户端和外部 API 保持单轮无状态。搜索继续返回 `reviewId/promptVersion`,员工反馈保存评审批次;详细边界见 [专项设计](20260718/问师傅多轮会话与原始资料交付设计.md)。员工学习页按当前 APP 身份读取正式岗前/入职任务,资格证据无正式数据时明确返回 `NOT_CONFIGURED` |
| 工作助手确认式项目记忆 `/pages/user/sop/index`、`/pages/user/assistant/memories` | 既有 `POST /api/knowledge/query` 可选返回 `memoryCandidate`;`GET /api/aihr/personal-assistant/memory-candidates?status=DRAFT`、`POST /api/aihr/personal-assistant/memory-candidates/{id}/confirm`、`POST .../{id}/dismiss`、`GET /api/aihr/service-memories`、`GET /api/aihr/service-memories/{id}` | 2026-07-19 最小切片只识别 `RESIDENT_NEED/FOLLOW_UP` 并保存到 `PROJECT_SERVICE`。用户文字或 ASR 转写进入同一候选检测;候选草稿不是长期记忆,只有当前员工显式确认后才按服务端解析出的 `tenant_id + project_code` 写入项目服务记录和版本表。多项目无法唯一判断时返回 `NEEDS_INPUT`,不能显示确认按钮;确认携带 `expectedVersion + idempotencyKey`,同键同内容重放返回原结果,同键不同内容或旧版本返回冲突。提醒默认关闭;首批不创建个人知识库、Qdrant collection,也不把个人想法写入项目域 |
| 工作助手确认式统一采集 `/pages/user/sop/index`、`/pages/user/assistant/memories` | 既有 `POST /api/knowledge/query` 可选返回 `memoryCandidate`;`GET /api/aihr/personal-assistant/memory-candidates?status=DRAFT`、`POST /api/aihr/personal-assistant/memory-candidates/{id}/confirm`、`POST .../{id}/dismiss`、`GET /api/aihr/personal-assistant/assistant-captures?limit=50`;旧项目记录继续使用 `/api/aihr/service-memories` | 文字或 ASR 转写复用同一候选检测。显式“记一下”生成 `ASSISTANT_CAPTURE/DRAFT`,项目和房屋位置缺失只作可选提示;系统建议 `SERVICE_LEAD/RESIDENT_PROFILE/CASE/PERSONAL_NOTE/FOLLOW_UP/PROJECT_NOTE`。确认必须带 `expectedVersion + idempotencyKey + saveScope(PRIVATE|COMPANY)`;PRIVATE 仅本人可见,COMPANY 写入 PENDING 待流转,正式外部接收端未配置前不得显示已送达。提醒默认关闭且单独确认;音色不在本次范围 |
| 资料处理 `/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` 才启用固定码。 |
@@ -222,9 +222,9 @@ Content-Type: application/json
空间、授权和应用管理接口统一位于 `/api/knowledge/admin`:`spaces`、`spaces/{id}/grants`、`spaces/{id}/documents`、`apps`、`apps/{id}/spaces`、`apps/{id}/rotate-token`。`DELETE /spaces/{id}/documents/{attachId}` 只解绑当前空间成员;其他空间仍引用同一 OSS 时原文件不会删除。仅知识平台管理角色可调用,API_TOKEN 创建或轮换后只返回一次明文。完整初始化、令牌保管、legacy 迁移与回滚步骤见 [KNOWLEDGE_PLATFORM_RUNBOOK.md](KNOWLEDGE_PLATFORM_RUNBOOK.md)。
## 工作助手项目服务记忆最小切片
## 工作助手确认式统一采集
该切片复用上面的短会话请求,不新增另一套问答 session。登录员工说“记一下:3 栋 2 单元 1201 室住户想了解养老服务,十天后回访”时,`POST /api/knowledge/query` 在正常回答字段之外可返回:
该链路复用上面的短会话请求,不新增另一套问答 session。登录员工说“帮我记一下三栋 3203 需要保洁服务”时,`POST /api/knowledge/query` 在正常回答字段之外可返回;缺少单元不会阻断用户保存:
```json
{
@@ -232,18 +232,18 @@ Content-Type: application/json
"id": 301,
"version": 1,
"status": "DRAFT",
"memoryType": "RESIDENT_NEED",
"targetDomain": "PROJECT_SERVICE",
"memoryType": "SERVICE_LEAD",
"targetDomain": "ASSISTANT_CAPTURE",
"draft": {
"buildingName": "3栋",
"unitName": "2单元",
"roomNo": "1201",
"category": "养老服务咨询",
"summary": "住户希望了解社区养老服务",
"unitName": "",
"roomNo": "3203",
"category": "服务线索",
"summary": "需要保洁服务",
"occurredAt": "2026-07-19T14:00:00+08:00",
"followUpAt": null
},
"missingFields": [],
"missingFields": ["unitName"],
"expiresAt": "2026-07-20T14:00:00+08:00"
}
}
@@ -259,17 +259,18 @@ Content-Type: application/json
{
"expectedVersion": 1,
"idempotencyKey": "memory-confirm-301-<stable-uuid>",
"saveScope": "COMPANY",
"enableReminder": false,
"draft": {
"buildingName": "3栋",
"unitName": "2单元",
"roomNo": "1201",
"category": "养老服务咨询",
"summary": "住户希望了解社区养老服务",
"unitName": "",
"roomNo": "3203",
"category": "服务线索",
"summary": "需要保洁服务",
"occurredAt": "2026-07-19T14:00:00+08:00",
"followUpAt": null
}
}
```
服务端必须在事务中锁定候选,重新解析当前员工有效项目,写入 `aihr_service_memory` 与 `aihr_service_memory_version` 后再把候选改为 `CONFIRMED`。`DRAFT` 默认 24 小时过期;`NEEDS_INPUT` 只用于继续追问。列表、详情和后续问答召回必须同时过滤当前租户和授权 `project_code`,不得因为记录由本人创建而绕过项目权限。
服务端在事务中锁定候选,写入 `aihr_assistant_capture` 后才把候选改为 `CONFIRMED`。`PRIVATE` 对应 `deliveryStatus=NOT_REQUIRED`;`COMPANY` 对应 `PENDING`。`DRAFT` 默认 24 小时过期,列表查询强制过滤当前租户与 owner。`GET /api/aihr/personal-assistant/assistant-captures?saveScope=COMPANY&limit=50` 只展示本人的企业流转状态;PENDING 不是已生成工单或已上报成功。后续 `/api/knowledge/query` 可受控召回确认记录,引用域分别为 `PERSONAL / COMPANY / PROJECT_SERVICE`;个人和公司采集按 `tenant_id + owner_user_id` 过滤,旧项目记录继续按项目权限过滤。
+4
View File
@@ -21,6 +21,10 @@
“已部署”不等于“正式试点通过”。当前可以确认生产包和基础运行状态,不能把未执行的正式账号、真机和业务窗口验收写成已完成。
### 未发布工作区增量(2026-07-20)
工作助手“记一下”统一采集已完成本地编码、数据库迁移、目标测试、390×844 视觉交互和真实 HTTP 召回验证;`PRIVATE` 仅本人可见,`COMPANY` 只写 `PENDING`。该增量尚未提交或部署,不属于上表的生产包;外部线索/工单投递、正式回执、个人文件/网页知识空间仍未实现。
## 2. 三端输入与 BRD 匹配
| 角色端 | 当前能力 | BRD 判断 |
+5 -5
View File
@@ -14,7 +14,7 @@
上述事实只证明本批版本和 schema 已发布。正式 OTP、真机能力、角色权限正反例和严格试点窗口仍需按发布后回归及 `DEMO_ACCEPTANCE.md` 验收。
2026-07-19 增量在上述基线上新增“项目服务记忆最小切片”:候选信息只有在当前员工明确确认后,才会写入其已授权项目的服务记录;本批不包含个人想法/经验的长期知识库、跨项目共享、自动提醒或向量化个人资料。同日的“工作上报语音会话化”把既有 `aihr_work_report` 纳入结构门禁,并补充 `request_key/request_hash` 和租户内提交人唯一索引,用于确认上报的幂等重试,不新建草稿或会话表。全网 AI 提供方加密主密钥改为数据库内部配置后,发布门禁统一为 `40/40`。
2026-07-20 待发布增量把“项目服务记忆最小切片”扩展为工作助手确认式统一采集:显式“记一下”生成候选,用户确认后按 `PRIVATE/COMPANY` 写入 `aihr_assistant_capture`;个人记录仅本人可见,公司记录先保持 `PENDING`,正式接收端和回执尚未实现。旧 `aihr_service_memory/version` 继续兼容项目记录;本批仍不包含个人文件/网页知识空间、自动派单或向量化个人资料。同批“工作上报语音会话化”只为既有 `aihr_work_report` 补 `request_key/request_hash` 和唯一索引。加入统一采集表后,待发布结构门禁为 `41/41`。
## 发布前置条件
@@ -57,7 +57,7 @@ mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aih
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260719_web_search_qwen_mysql8.sql
```
顺序原因:场景补充依赖三张场景/Rubric 基础表;五维迁移依赖场景和 Rubric;岗位/SOP/任务/资格迁移只补正式数据契约,不写业务行,也不代表岗位适用范围、任务规则或资格标准已经获得 HR 确认。住宅 SOP 和 Prompt 迁移只补内置内容,不代表内容已完成业务复核。知识会话迁移只新增短期上下文表,不生成业务对话。排序规则兼容迁移先对齐本批发布表,全量排序规则迁移再统一历史 `aihr_*` 表;两者都读取目标库 `aihr_knowledge_info.tenant_id` 的实际排序规则。服务记忆迁移创建候选、正式记录和版本留痕三张表;工作上报幂等迁移随后只补原表列与唯一索引。两者同样对齐目标排序规则,兼容历史生产库与全新 MySQL 8 数据库。
顺序原因:场景补充依赖三张场景/Rubric 基础表;五维迁移依赖场景和 Rubric;岗位/SOP/任务/资格迁移只补正式数据契约,不写业务行,也不代表岗位适用范围、任务规则或资格标准已经获得 HR 确认。住宅 SOP 和 Prompt 迁移只补内置内容,不代表内容已完成业务复核。知识会话迁移只新增短期上下文表,不生成业务对话。排序规则兼容迁移先对齐本批发布表,全量排序规则迁移再统一历史 `aihr_*` 表;两者都读取目标库 `aihr_knowledge_info.tenant_id` 的实际排序规则。服务记忆迁移创建候选、统一采集、兼容项目记录和版本留痕四张表;工作上报幂等迁移随后只补原表列与唯一索引。两者同样对齐目标排序规则,兼容历史生产库与全新 MySQL 8 数据库。
## 迁移后只读核验
@@ -82,7 +82,7 @@ WHERE table_schema = DATABASE()
'aihr_candidate_material', 'aihr_interview_result', 'aihr_candidate_employee_link',
'aihr_position_responsibility', 'aihr_sop_applicability',
'aihr_onboard_task', 'aihr_qualification_gate',
'aihr_memory_candidate', 'aihr_service_memory', 'aihr_service_memory_version',
'aihr_memory_candidate', 'aihr_assistant_capture', 'aihr_service_memory', 'aihr_service_memory_version',
'aihr_work_report'
)
ORDER BY table_name;
@@ -128,14 +128,14 @@ GROUP BY question_type
ORDER BY question_type;
```
预期是三张场景/Rubric 表、岗位题库、训练反馈表、五张考试表、三张全网检索表、问题榜/激励六张表、三张证据表、知识平台治理表、三张候选人/面试表、四张岗位/SOP/任务/资格契约表,以及三张项目服务记忆表和原工作上报表均存在;工作上报幂等字段为 `2/2`,会话证据字段为 `8/8`,专项批量/内容快照字段为 `8/8`,候选资料审核字段为 `2/2`,面试复核字段为 `6/6`,字段查询覆盖所有列,内置 Prompt 数量为 `6`。五个岗位各有 `20` 个场景,`daily/special` 各有 `100` 道题;其中 `14` 个未完成正式审核的高风险场景及其 `28` 道题保持禁用。岗位/SOP/任务/资格表及新服务记忆表为空是允许的;这只证明 schema/seed 迁移完成,不证明已有员工确认过记忆、完整个人知识库或严格试点完成。
预期是三张场景/Rubric 表、岗位题库、训练反馈表、五张考试表、三张全网检索表、问题榜/激励六张表、三张证据表、知识平台治理表、三张候选人/面试表、四张岗位/SOP/任务/资格契约表,以及四张记忆表和原工作上报表均存在;工作上报幂等字段为 `2/2`,会话证据字段为 `8/8`,专项批量/内容快照字段为 `8/8`,候选资料审核字段为 `2/2`,面试复核字段为 `6/6`,字段查询覆盖所有列,内置 Prompt 数量为 `6`。五个岗位各有 `20` 个场景,`daily/special` 各有 `100` 道题;其中 `14` 个未完成正式审核的高风险场景及其 `28` 道题保持禁用。岗位/SOP/任务/资格表及新记忆表为空是允许的;这只证明 schema/seed 迁移完成,不证明已有员工确认过记忆、完整个人知识库或严格试点完成。
## 迁移后应用回归
1. 重启 `wygj-aihr.service`,确认状态为 `active`。
2. 检查根站、`/h5/`、租户接口和员工首页 API 的 HTTP 与业务码均为 `200`。
3. 用正式测试账号完成员工端训练、主管复盘和管理端场景/Prompt 只读检查;不要使用开发固定验证码验证生产安全策略。
4. 用具备单一项目授权的正式测试账号,在“工作助手”说出一条包含房号、住户需求和跟进时间的测试信息;确认候选卡前数据库不得出现正式服务记录,确认后只能写入该账号已授权的 `project_code`。随后新开对话查询该事项,必须能召回;双击确认不得重复写入。测试结束保留审计证据,不直接删除生产业务记录。
4. 用正式测试账号在“工作助手”说“帮我记一下三栋 3203 需要保洁服务”;确认前 `aihr_assistant_capture` 不得新增。分别验证 `PRIVATE` 仅本人可召回、`COMPANY` 只显示 `PENDING` 且没有虚假送达回执;新开对话按房号查询必须只命中对应记录,双击确认不得重复写入。测试结束保留审计证据,不直接删除生产业务记录。
5. 用员工测试账号进入“工作上报”,确认首屏为语音会话而非传统表单;完成一次整理、建议类型修改和显式确认。确认前 `aihr_work_report` 行数不变,重复提交同一 `request_key` 只有一条 `PENDING` 记录,“我的上报”返回同一 ID;普通员工审核仍为 `403`,审核通过不自动写入案例、知识或积分表。
6. 迁移完成后再按同一正式时间窗运行:
+2 -2
View File
@@ -21,7 +21,7 @@
| 5 | 案例沉淀 `/knowledge/cases` | 上传真实语音 → ASR 转写 → AI 整理 → 送审 → 入库 → 查看案例详情/回放原始音频 | 已完成语音转写、原始音频 OSS 留痕、整理、入库、学习点、主管点评和按项目权限查看持久化转写/摘要详情;预渲染视频样片仍未接入,不把音频回放当作“查看样片”完成证据 |
| 6 | SOP知识库 `/knowledge/sop` | 上传 txt/md/PDF/Word/Excel/PPT 文档或使用 seed 文档 → 检索 → 生成训练题 | 已完成闭环、引用 SOP 原文片段、训练题已生成 |
| 7 | 资料处理 `/knowledge/processing` | 打开页面 → 查看解析任务 → 查看处理链路 → 点“批量导入”选择少量文件或 ZIP | 可看到资料总量、等待/解析中/完成/失败、片段数、向量化状态、批次进度和事件列表;页面不出现“选择目录”“服务端导入” |
| 8 | 员工端工作助手 `/h5/#/pages/user/sop/index` | 语音或文字说“记一下:3 栋 2 单元 1201 室住户想了解养老服务,十天后回访” → 查看候选卡 → 先暂不保存,再重新生成并确认 → 打开“我的资料与记忆” → 新对话按房号查询 | 一级只显示“工作助手 / 查全网”;候选卡可修改、暂不保存、确认保存,提醒默认关闭;暂不保存不写正式记录,确认后只写当前授权项目且双击不重复;新对话能按项目权限召回并展示来源。该项只验收项目服务记忆最小切片,不代表完整个人资料库已交付 |
| 8 | 员工端工作助手 `/h5/#/pages/user/sop/index` | 语音或文字说“帮我记一下三栋 3203 需要保洁服务” → 查看系统建议卡 → 在缺少单元时分别验证“暂不保存”和“仅自己保存” → 再建一条选择“提交公司处理” → 打开“我的资料与记忆” | 一级只显示“工作助手 / 查全网”;位置缺失是可选提示而非阻断;卡片可修改、暂不保存、仅自己保存、提交公司处理,提醒默认关闭;同一会话重复描述更新原卡,“另外记一条”才生成新卡;个人记录显示仅自己,公司记录显示待流转,不能显示已送达 |
## AI陪练二期增量脚本
@@ -49,6 +49,6 @@
## 不演示
- 不演示 SSO、权限配置、知识图谱、数字人视频生成、绩效挂钩。
- 不把“项目服务记忆最小切片”演示成完整个人助理:个人文档/网页收藏、个人经验知识库、PPT 生成、自动提醒和项目服务记忆 Qdrant 向量化仍不在本批范围。
- 不把“确认式统一采集”演示成完整个人助理:个人文档/网页收藏、个人知识库向量化、PPT 生成仍不在本批范围;COMPANY/PENDING 也不代表正式线索或工单接口已经投递成功。
- 不承诺管理端 AI 面试、案例沉淀已写入正式业务数据库;三角色对练(管理端与移动端)记录写入 `aihr_practice_session`;候选人补充资料写 `sys_oss` + `aihr_candidate_material`,HR 可审核状态,但不做复杂审批流转;SOP 检索与文档上传使用 `aihr_knowledge_*` 本地表,失败时回退 seed。
- 大模型不作为演示硬依赖:模型管理已启用 chat 模型时,三角色对练为真实 LLM 生成与评分(asr/tts 配置后语音输入/播报可用);未配置或现场调用失败时全链路自动回退 seed,演示不中断。
+2 -2
View File
@@ -218,7 +218,7 @@ RELEASE_REMOTE_URL=https://peilian.njzhmj.top RELEASE_VERIFY_REMOTE_MATCH=true R
- SOP知识库:进入 `/knowledge/sop`,可上传 txt/md/PDF/Word/Excel/PPT 文档入库;点击“检索” → “生成训练题”,应看到“已完成闭环”、命中数据库 SOP 原文片段和训练题;数据库不可用时页面回退 seed。
- 资料处理:进入 `/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 即使误传环境变量也强制关闭。
- 工作助手项目服务记忆:`/h5/#/pages/user/sop/index` 一级入口只保留“工作助手 / 查全网”,既有文字、ASR、媒体、数据工具和 30 分钟/最近 6 轮短会话链保持不变;`/h5/#/pages/user/assistant/memories` 展示待确认候选和当前项目可见的服务记录。首批只落 `aihr_memory_candidate`、`aihr_service_memory`、`aihr_service_memory_version` 三张关系表,不依赖新的 Qdrant collection。候选卡未确认前不得查询到正式记录,提醒默认关闭。
- 工作助手确认式统一采集:`/h5/#/pages/user/sop/index` 一级入口只保留“工作助手 / 查全网”,既有文字、ASR、媒体、数据工具和 30 分钟/最近 6 轮短会话链保持不变;显式“记一下/帮我记/保存一下”返回 `DRAFT` 确认卡,位置缺失只作可选提示。确认后写 `aihr_assistant_capture`:`PRIVATE/NOT_REQUIRED` 仅本人可见,`COMPANY/PENDING` 只表示待流转;旧项目记录继续使用 `aihr_service_memory/version`。`/h5/#/pages/user/assistant/memories` 展示待确认候选和本人已确认记录;不依赖新的 Qdrant collection,提醒默认关闭。
- 移动端登录后若组织快照接口返回 `401/403`,只降级为手动岗位确认,不应清除手机号登录态;岗位确认页仍需允许员工选择“生活顾问”后继续进入业务页。
- uni-app 主管端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/supervisor/index/index`,应看到团队概览、团队画像、团队预警、指派专项、待复盘和复盘详情;从团队画像派专项后,最近专项应立即回读新记录。
- uni-app 候选人端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/candidate/index/index`,手机号登录(dev 验证码固定 `123456`)→ “开始面试/面试练习”完成答题评分;“补充资料”选择 PDF/Word/图片后上传,应看到资料状态。Codex 内置浏览器不支持本地文件选择时,用真实 HTTP multipart smoke 代替浏览器文件选择。
@@ -234,6 +234,6 @@ API_BASE=https://wygj-api.localhost ./scripts/personal-assistant-smoke.sh
# 登录后只读核验:TOKEN=<mobile-access-token> API_BASE=https://wygj-api.localhost ./scripts/personal-assistant-smoke.sh
```
工作助手记忆本地人工回归至少覆盖:以有且只有一个 `project_code` 的员工登录;说出完整房屋定位、需求和时间后看到 `DRAFT` 卡;刷新“我的资料与记忆”仍能恢复;点击“暂不保存”不产生正式记录;重新生成后双击“确认保存”只写一条记录和一个初始版本;新开对话可按房号或事项召回。再用无项目、多个项目无法唯一判断及另一项目账号做反例,分别应为安全拒绝/`NEEDS_INPUT`/不可见。
工作助手记忆本地人工回归至少覆盖:登录后说“帮我记一下三栋 3203 需要保洁服务”,即使缺少单元也应看到 `DRAFT` 卡;“暂不保存”不产生正式记录;“仅自己保存”后只由本人召回;“提交公司处理”只显示 `PENDING`,不得显示已送达;同一会话重复描述更新原卡,“另外记一条”才新建;双击确认不得重复写入。再用另一账号验证个人记录不可见,并验证按精确房号查询不会混入同楼栋其他房号。
完整演示脚本与录屏兜底见 [DEMO_ACCEPTANCE.md](DEMO_ACCEPTANCE.md)。
+2 -2
View File
@@ -21,8 +21,8 @@
| [superpowers/plans/2026-07-16-multi-tenant-knowledge-platform.md](superpowers/plans/2026-07-16-multi-tenant-knowledge-platform.md) | 多租户多知识空间统一问答平台按 schema、授权、检索、上传、数据工具、管理端、多端联调和发布拆分的实施计划 |
| [AI人力资源系统项目规划方案与AI接口说明.md](AI人力资源系统项目规划方案与AI接口说明.md) | 对外会议版口径、数字师傅定位、AI 接口和供应商规划 |
| [银城员工端APP分阶段实施总纲.md](银城员工端APP分阶段实施总纲.md) | 三阶段总纲:陪练 → 大喇叭+知识学习平台(含学模块、开放问题榜、员工个人 AI 助理) → 北森对接;身份三轴模型与防遗漏分发策略 |
| [个人AI助理阶段二专项TechSpec.md](个人AI助理阶段二专项TechSpec.md) | 员工个人知识空间的物理分域、数据模型、API、检索融合、权限、安全、删除和测试规格 |
| [个人AI助理阶段二开发推进计划.md](个人AI助理阶段二开发推进计划.md) | 个人 AI 助理阶段二按 P0/P1 拆分的逐任务实施、测试、提交和试点闸门 |
| [个人AI助理阶段二专项TechSpec.md](个人AI助理阶段二专项TechSpec.md) | 工作助手确认式统一采集的当前契约,以及后续个人知识空间的数据分域、检索、权限、安全和测试规格 |
| [个人AI助理阶段二开发推进计划.md](个人AI助理阶段二开发推进计划.md) | 后续个人资料/网页/PPT 能力的 P0/P1 任务计划;“记一下”当前实现以专项 TechSpec 为准 |
| [prototypes/personal-assistant-work-helper-voice-first-v2.png](prototypes/personal-assistant-work-helper-voice-first-v2.png) | 个人助理并入「问 · 数字师傅」后的语音优先会话、自动内部路由与确认记忆卡实现基准 |
| [prototypes/work-report-voice-conversation-v1.png](prototypes/work-report-voice-conversation-v1.png) | 工作上报从传统表单升级为微信式语音/照片/视频采集、AI 整理追问和确认审核的高保真实现基准 |
| [WORK_REPORT_IMPLEMENTATION_AGENT_PROMPT.md](WORK_REPORT_IMPLEMENTATION_AGENT_PROMPT.md) | 可直接交给独立开发 Agent 的工作上报实现 Prompt,包含文件边界、API、交互修订、测试和视觉验收口径 |
+56 -38
View File
@@ -1,6 +1,6 @@
# 员工个人 AI 助理 / 个人知识空间专项 TechSpec
> 版本:v1.1 | 日期:2026-07-19
> 版本:v1.2 | 日期:2026-07-19
>
> 归属:《银城员工端 APP 分阶段实施总纲》阶段二
>
@@ -9,6 +9,10 @@
> 实施边界:首批交付个人资料收藏、检索、带引用问答、工作整理,以及“识别候选记忆 → 用户确认 → 分域持久化 → 可追溯召回”闭环;PPT 生成为 P1;北森、考勤等外部数据归阶段三。
>
> v1.1 需求补充:客户明确提出,员工在对话中描述住户需求、待跟进事项或个人经验时,个人助理应识别值得长期保留的信息,返回可编辑确认卡;仅在用户确认后写入对应记忆域,后续问答可按权限召回。模型不得直接修改数据库,提醒必须单独确认。
>
> v1.2 实施收口:显式“记一下 / 帮我记 / 保存一下”统一生成 `ASSISTANT_CAPTURE` 确认卡;楼栋、单元、房号和项目均为可补充信息,不再阻断保存。用户必须选择“仅自己保存 / 提交公司处理”;公司处理首批只可靠写入待流转队列,未配置正式接收接口前不得显示“已送达”。音色不在本次范围。
当前代码状态(2026-07-20):候选检测、六类系统建议、同会话合并、可编辑确认、PRIVATE/COMPANY 持久化、可选跟进时间、“我的资料与记忆”列表,以及确认记录按 owner/项目权限参与后续问答召回均已实现。召回引用明确区分 `PERSONAL / COMPANY / PROJECT_SERVICE`。外部线索/工单投递 Worker、正式回执、统一采集转工作上报确认卡,以及个人文件/网页知识空间仍是后续工作,开发者不得从 `PENDING` 状态推断这些能力已完成。
## 0. 交互设计基准
@@ -22,8 +26,8 @@
2. 工作助手自动在已授权的个人资料、项目记录和企业知识中路由;首屏主路径不要求一线员工选择资料域,高级筛选只能放入次级入口。
3. 会话保持语音优先:输入区默认“按住说话”,键盘为切换能力;师傅回复优先显示语音条,正文可通过“转文字”展开。
4. ASR 转写以普通用户消息进入同一会话;候选检测不得绕过当前会话、登录态或项目权限。
5. 确认卡至少展示类型、对象、事项、保存位置、可见范围、明确回访日期和“加入跟进提醒”选项。
6. “修改 / 暂不保存 / 确认保存”必须是三个独立动作;只有“确认保存”可以触发长期持久化,保存和提醒分别确认。
5. 确认卡至少展示系统建议类型、对象、事项、可见范围、明确回访日期和“加入跟进提醒”选项;缺少房号等信息只作弱提示。
6. `ASSISTANT_CAPTURE` 卡必须提供“修改 / 暂不保存 / 仅自己保存 / 提交公司处理”四个明确动作;旧项目服务卡继续保留“确认保存”。保存和提醒分别确认。
7. 回答或保存结果只展示实际使用的来源,不得暗示已查询未命中的资料,更不得自动把内部内容转发到全网。
若设计图中的示例文案、间距或字段与本文的数据权限、安全、状态机或 API 约束冲突,以本文约束为准;视觉实现应继续复用现有 `ChatComposer`、女性数字师傅头像和「今日 / 练 / 问 / 我」底栏。
@@ -40,8 +44,8 @@
4. 默认由“工作助手”在个人资料、项目业务记忆和企业知识之间自动路由并展示实际来源;资料范围只作为次级高级筛选。
5. 输出结论、行动项和待确认事项,并逐条展示引用来源。
6. 删除个人资料时同步清理关系库、对象存储和向量索引。
7. 从文字或 ASR 转写中识别“住户需求、待跟进事项、个人经验”三类候选记忆,返回可编辑确认卡。
8. 用户确认后,将个人经验写入本人私有空间,将住户需求与跟进事项写入项目业务记忆;两域分别鉴权和检索。
7. 从文字或 ASR 转写中识别服务线索、住户画像、优秀案例、个人想法、待跟进事项和工作记录,返回可编辑确认卡。
8. 用户确认保存范围:`PRIVATE` 仅本人可见;`COMPANY` 进入企业待流转队列。项目服务旧记录继续按项目权限独立保存和检索。
9. 后续问答可召回已确认记忆,并展示来源消息、记录时间、当前状态和可见范围。
10. 对确认后的修改保留版本历史;提醒时间与长期保存分别确认。
@@ -55,6 +59,7 @@
- 不复用企业知识表增加 `scope_type` 来承载个人数据。
- 不把普通聊天历史自动升级为长期记忆,不在用户确认前写入个人或项目长期记忆表。
- 不允许 LLM 直接执行 SQL、更新业务实体、创建提醒或对外发送消息;模型只生成结构化候选草稿。
- 不把 `COMPANY/PENDING` 描述成已生成工单、已上报或已送达;正式接收端、认证和回执协议确定后才启用投递 Worker。
- 不把住户服务事实只存入员工私人空间;这类记录属于项目业务域,员工调岗后仍按项目权限保留。
- 阶段二首批不替代权威房屋、住户、工单或 CRM 主数据;未接入权威主数据时不得伪造住户身份。
@@ -71,6 +76,7 @@
| 向量检索 | 新建 `aihr_personal_knowledge` collection | Qdrant filter 必须包含 `tenant_id + owner_user_id` |
| 企业知识检索 | 调用现有企业 RAG 服务 | 继续执行企业知识密级、项目和角色权限 |
| 项目业务记忆 | 独立 `aihr_service_memory` 关系表;关系库检索为 2026-07-19 最小切片,Qdrant 仅列为后续增强 | 查询必须包含 `tenant_id + project_code`,不得写入个人或企业知识表 |
| 对话统一采集 | `aihr_memory_candidate` 暂存确认卡,确认后写 `aihr_assistant_capture` | `PRIVATE` 仅按 owner 查询;`COMPANY` 以 outbox 状态流转,不允许前端伪造已送达 |
禁止将个人资料写入:
@@ -146,13 +152,12 @@ org.dromara.aihr.knowledge.parse
文字输入 / 语音 ASR 转写
→ 规则预筛(明确“记一下”等意图,或同时出现对象 + 需求/跟进事实)
→ 服务端先提取并令牌化楼栋、单元、房号、姓名、电话等标识
→ LLM 仅输出符合 JSON Schema 的候选类型、摘要、缺失字段和置信度
→ 服务端恢复标识并校验当前租户、项目、字段完整性、重复记录和权限
→ 信息不足:在会话中追问,不允许确认
→ 信息完整:持久化 DRAFT 候选并返回可编辑确认卡
→ 用户修改并确认(携带幂等键和 expectedVersion)
→ 确定性 Service 按 PERSONAL / PROJECT_SERVICE 分域写关系库
→ 事务提交后异步写检索索引
→ 当前 P0 用确定性规则建议类型和分类;后续模型只能输出符合 JSON Schema 的候选建议
→ 服务端校验当前租户、项目、重复记录、权限和敏感字段
→ 显式“记一下”始终持久化 DRAFT;项目/楼栋/单元/房号缺失只列为可选补充项
→ 用户修改并选择 PRIVATE / COMPANY(携带幂等键和 expectedVersion)
→ 确定性 Service 写 `aihr_assistant_capture`;PRIVATE 记为 NOT_REQUIRED,COMPANY 记为 PENDING
→ 正式企业接收端接入后,由独立投递 Worker 消费 PENDING 并记录回执;当前不得假投递
→ 如用户另行确认 followUpAt,则进入“今日安排”;不默认创建提醒
```
@@ -161,7 +166,7 @@ org.dromara.aihr.knowledge.parse
1. 候选检测可自动发生,但任何置信度都不得跳过用户确认。
2. DRAFT 候选只为跨刷新恢复确认卡,不进入检索和回答;忽略或过期后清理草稿内容。
3. 同一来源消息和候选哈希在有效期内只展示一次,避免重复打扰。
4. 当前仓库没有权威房屋/住户主数据。首批允许保存经员工确认的项目、楼栋、单元、房号定位;声称“某位住户”但缺少可区分房号或权威主体 ID 时必须追问。
4. 当前仓库没有权威房屋/住户主数据。首批允许保存经员工确认的可选项目、楼栋、单元、房号定位;缺少这些字段仍可保存,但不得据此虚构或合并住户身份。
5. 关系数据库是事实源,向量索引只负责召回;索引写入失败不得丢失已确认记录,可重试重建。
## 3. 身份、权限与数据隔离
@@ -308,8 +313,8 @@ Message 保存:
| tenant_id/owner_user_id/project_code | varchar | 当前身份与候选项目范围;项目键使用现有组织快照的 `project_code`,不是自造数值 ID |
| source_conversation_id/source_request_id | varchar(64) | 来源短会话与本次问答请求;当前「问」链没有持久化消息 ID |
| candidate_hash | varchar(64) | 来源 + 规范化草稿哈希,用于防重复 |
| memory_type | varchar(30) | PERSONAL_NOTE / WORK_IDEA / RESIDENT_NEED / FOLLOW_UP |
| target_domain | varchar(30) | PERSONAL / PROJECT_SERVICE |
| memory_type | varchar(30) | SERVICE_LEAD / RESIDENT_PROFILE / CASE / PERSONAL_NOTE / FOLLOW_UP / PROJECT_NOTE |
| target_domain | varchar(30) | 新候选为 ASSISTANT_CAPTURE;确认后记录结果映射为 PERSONAL / COMPANY;旧记录兼容 PROJECT_SERVICE |
| status | varchar(20) | NEEDS_INPUT / DRAFT / CONFIRMED / DISMISSED / EXPIRED |
| draft_json | json | 可编辑结构化草稿;不得包含未脱敏模型原始响应 |
| missing_fields_json | json | 仍需追问的字段 |
@@ -322,7 +327,16 @@ Message 保存:
约束:`UNIQUE(tenant_id, owner_user_id, source_request_id, candidate_hash)`;DRAFT 默认 24 小时过期,DISMISSED/EXPIRED 的 `draft_json` 在 24 小时内物理清理。
### 4.8 `aihr_service_memory`
### 4.8 `aihr_assistant_capture`
用户确认后的统一采集事实源。核心字段为 `tenant_id/owner_user_id/project_code/save_scope/suggested_type/building_name/unit_name/room_no/category/summary/detail/occurred_at/follow_up_at/source_conversation_id/source_request_id/delivery_status/delivery_attempts/next_delivery_at/external_record_id/last_error/confirm_idempotency_key/confirm_request_hash/version/create_time/update_time`。
- `save_scope=PRIVATE` 时 `delivery_status=NOT_REQUIRED`,查询必须同时带 `tenant_id + owner_user_id`。
- `save_scope=COMPANY` 时首批写 `delivery_status=PENDING`;`DELIVERED` 只能由拿到外部成功回执的投递 Worker 更新。
- `confirm_idempotency_key` 在租户和 owner 范围唯一,确认事务先写采集记录再关闭候选,任一步失败整体回滚。
- 表内不保存原始录音、模型原始输出或伪造的住户主体 ID;音色不属于本表和本次实现。
### 4.9 `aihr_service_memory`
项目共享的住户需求和待跟进事实,不放入个人知识表。
@@ -345,7 +359,7 @@ Message 保存:
索引至少包含 `(tenant_id, project_code, status, follow_up_at)`、`(tenant_id, project_code, building_name, unit_name, room_no)`;首批关系库检索覆盖 `title/summary/detail`,后续若启用向量检索,payload 强制包含 `tenant_id + project_code + memory_id + status`。
### 4.9 `aihr_service_memory_version`
### 4.10 `aihr_service_memory_version`
每次确认修改、状态变更或作废都追加版本:`memory_id/version/snapshot_json/change_type/change_reason/operator_user_id/create_time`。快照只保存业务字段,不复制姓名、电话等无关标识;`UNIQUE(memory_id, version)`。
@@ -354,7 +368,7 @@ Message 保存:
### 5.1 Qdrant
- 完整阶段目标:个人资料使用 `aihr_personal_knowledge` collection;项目业务记忆使用独立 `aihr_service_memory` collection,两者不混 collection。
- 2026-07-19 项目服务记忆最小切片只使用 MySQL 关系库,不创建新的 Qdrant collection;不得因未做向量化而回退到无权限过滤的企业 collection。
- 确认式统一采集和兼容项目服务记录只使用 MySQL 关系库,不创建新的 Qdrant collection;不得因未做向量化而回退到无权限过滤的企业 collection。
- 向量维度:跟随当前启用的 vector 模型;模型或维度变化使用独立重建任务。
- 个人 payload:`tenant_id`、`owner_user_id`、`space_id`、`item_id`、`fragment_id`、`source_type`、`captured_at`;必建 index 为 `tenant_id`、`owner_user_id`、`item_id`。
- 项目业务记忆后续 payload:`tenant_id`、`project_code`、`memory_id`、`status`、`occurred_at`、`updated_at`;必建 index 为 `tenant_id`、`project_code`、`memory_id`、`status`。
@@ -498,6 +512,7 @@ Message 保存:
| GET | `/memory-candidates?status=DRAFT` | 恢复当前用户尚未过期的确认卡 |
| POST | `/memory-candidates/{id}/confirm` | 提交编辑后的草稿、`expectedVersion`、`idempotencyKey`;分域写入 |
| POST | `/memory-candidates/{id}/dismiss` | 明确不保存;同源候选本会话不再提示 |
| GET | `/assistant-captures?saveScope=PRIVATE|COMPANY&limit=50` | 查看本人的已确认记录及公司流转状态 |
| GET | `/api/aihr/service-memories` | 按当前项目、状态、日期、楼栋/单元/房号查询 |
| GET | `/api/aihr/service-memories/{id}` | 项目权限内查看详情、来源和版本 |
| PATCH | `/api/aihr/service-memories/{id}` | 携带 `expectedVersion` 修改必要字段或状态并生成版本 |
@@ -508,22 +523,22 @@ Message 保存:
{
"idempotencyKey": "01J-memory-confirm-301",
"expectedVersion": 1,
"targetDomain": "PROJECT_SERVICE",
"memoryType": "RESIDENT_NEED",
"subject": {
"saveScope": "COMPANY",
"draft": {
"projectCode": "YC-RESIDENTIAL-03",
"buildingName": "3栋",
"unitName": "2单元",
"roomNo": "1201"
"roomNo": "1201",
"category": "服务线索",
"summary": "住户希望了解社区可提供的养老服务",
"occurredAt": "2026-07-19T14:00:00+08:00",
"followUpAt": null
},
"category": "养老服务咨询",
"summary": "住户希望了解社区可提供的养老服务",
"occurredAt": "2026-07-19T14:00:00+08:00",
"followUpAt": null
"enableReminder": false
}
```
服务端必须忽略请求中的 `projectCode` 作为授权依据,仅用它与当前登录态可访问项目做一致性校验;客户端可省略该字段。确认成功返回 `targetDomain/targetId/version`;同一 `idempotencyKey` 重放必须返回同一结果,不重复创建记录,同一键配不同请求体必须拒绝。
服务端必须忽略请求中的 `projectCode` 作为授权依据,仅用它与当前登录态可访问项目做一致性校验;客户端可省略该字段。确认成功返回 `targetDomain=PERSONAL|COMPANY/targetId/version`;同一 `idempotencyKey` 重放必须返回同一结果,不重复创建记录,同一键配不同请求体必须拒绝。
## 7. 网页采集安全
@@ -595,11 +610,12 @@ Message 保存:
### 9.3 候选与业务记忆生命周期
- NEEDS_INPUT/DRAFT 候选默认 24 小时过期,不进入任何检索索引。
- DRAFT 候选默认 24 小时过期,不进入任何检索索引;NEEDS_INPUT 仅兼容旧候选。
- DISMISSED/EXPIRED 候选的结构化草稿在 24 小时内清理,只保留候选 ID、状态、来源消息 ID 和时间戳用于防重复。
- 个人记忆沿用个人 item 删除链路。
- 项目业务记忆不因创建员工离职而删除;按项目业务保留策略管理,首批只允许 `VOID` 作废并保留版本。
- `follow_up_at` 到期只进入员工端“今日安排”查询;推送通知、短信或自动派单不在首批范围。
- 统一采集 `PRIVATE` 记录只按 owner 保存;`COMPANY/PENDING` 保留到企业流转成功或人工关闭,失败只更新重试状态,不丢记录。
## 10. 前端设计
@@ -629,8 +645,8 @@ src/services/personal-assistant.ts API 客户端
- “资料范围”是次级设置而非一级 Tab;手动模式才允许选择个人资料、项目记录或企业知识。
- “查全网”保持独立入口和接口。内部资料无命中时只显示“是否查全网”,必须由用户点击后才进入外部查询;包含住户或项目内部信息时不得自动带入原问题。
- 每条用户文字或 ASR 转写完成后可触发候选检测;普通问答不得频繁弹卡,同源候选被忽略后本会话不再提示。
- 确认卡必须展示类型、对象定位、摘要、保存范围、记录时间和可选跟进时间,并提供“修改 / 暂不保存 / 确认保存”。
- 信息不足时显示追问,不展示可确认按钮;“某位住户”但无法唯一定位时不得保存为 RESIDENT。
- 统一采集确认卡必须展示系统建议类型、对象定位、摘要、保存范围、记录时间和可选跟进时间,并提供“修改 / 暂不保存 / 仅自己保存 / 提交公司处理”。
- 项目、楼栋、单元或房号不足时只显示“可继续补充”,不阻断保存;未接入权威住户主数据时不得把模糊描述保存成确定身份。
- 保存与提醒是两个独立选择;未填写 `followUpAt` 不创建提醒或今日任务。
- 项目业务记忆引用必须展示来源时间、当前状态和最后更新时间;历史状态不能冒充当前事实。
- 删除前明确提示会删除附件、解析正文和搜索索引。
@@ -649,7 +665,7 @@ src/services/personal-assistant.ts API 客户端
| `PERSONAL_NO_CITATION` | 无足够资料支撑 | 不生成业务结论 |
| `ENTERPRISE_SCOPE_FORBIDDEN` | 无企业知识范围权限 | 保留个人结果,提示企业范围不可用 |
| `PERSONAL_AI_DISABLED` | AI 成本闸门关闭 | 仍允许收藏和关键词检索,暂停摘要/问答 |
| `MEMORY_CANDIDATE_NEEDS_INPUT` | 对象或必要字段不完整 | 继续追问,不展示确认按钮 |
| `MEMORY_CANDIDATE_NEEDS_INPUT` | 旧候选对象或必要字段不完整 | 兼容展示为可编辑卡;统一采集的新 DRAFT 不以位置缺失阻断保存 |
| `MEMORY_CANDIDATE_EXPIRED` | 确认草稿已过期 | 基于原消息重新识别,不直接写入 |
| `MEMORY_CONFIRM_CONFLICT` | 版本冲突或幂等键对应不同内容 | 刷新确认卡,禁止覆盖 |
| `SERVICE_MEMORY_PROJECT_FORBIDDEN` | 当前用户无项目访问权 | 统一显示不可访问,不泄露记录存在性 |
@@ -669,8 +685,10 @@ src/services/personal-assistant.ts API 客户端
- prompt injection 文本不得改变系统指令。
- 规则预筛不会把普通问答误判为候选;明确“记一下”必定进入候选检测。
- 模型候选输出不能覆盖服务端解析的 tenant、project、楼栋、单元和房号。
- NEEDS_INPUT、DRAFT、CONFIRMED、DISMISSED、EXPIRED 状态转换只允许规定方向。
- DRAFT、CONFIRMED、DISMISSED、EXPIRED 状态转换只允许规定方向;NEEDS_INPUT 仅兼容旧候选。
- 同一确认幂等键只生成一个目标记录;版本冲突不覆盖较新业务记忆。
- 裸房号只在楼栋/单元上下文后识别,年份、时长、金额不能误判为房号。
- 相同会话中重复表达同一显式记录更新原卡;“另外记 / 再记一条 / 新的一条”生成新卡。
### 12.2 集成测试
@@ -694,8 +712,8 @@ src/services/personal-assistant.ts API 客户端
6. 检查引用徽标和原始来源。
7. 删除资料并确认列表、问答和下载均不可再访问。
8. 切换另一手机号,确认看不到前一用户的资料、标题和会话。
9. 语音描述一条住户需求,检查信息不足时先追问,字段完整后出现确认卡。
10. 分别执行“暂不保存”和“确认保存”,验证前者不进入检索,后者可按楼栋/日期召回并显示来源、状态和更新时间。
9. 语音说“帮我记一下三栋 3203 需要保洁服务”,检查缺少单元时仍出现可确认卡且只作可选提示。
10. 分别执行“暂不保存 / 仅自己保存 / 提交公司处理”,验证前者不落长期表、私有记录仅本人可见、公司记录显示 PENDING 而非已送达。
11. 确认时不设置跟进日期,验证不会生成今日任务;另建一条带 `followUpAt` 的记录,验证只出现一次。
12. 双击确认或重放请求,验证只创建一条记录;修改后验证版本递增且旧状态不被当作当前答案。
@@ -762,7 +780,7 @@ src/services/personal-assistant.ts API 客户端
- `backend/script/sql/aihr_personal_knowledge_mysql8.sql`
- `backend/script/sql/aihr_service_memory_mysql8.sql`
- `backend/script/sql/update/aihr_20260719_service_memory_mysql8.sql`(项目服务记忆最小切片生产增量)
- `backend/script/sql/update/aihr_20260719_service_memory_mysql8.sql`(确认候选、统一采集和兼容项目服务记录的生产增量)
- `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/**`
- `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/memory/**`(候选识别、确认编排与项目业务记忆)
- `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/**`
@@ -792,10 +810,10 @@ src/services/personal-assistant.ts API 客户端
5. 个人资料默认私有,分享和企业入库走 P1 审核链。
6. PPT 是 P1,不阻塞阶段二首批。
7. 北森、考勤等外部个人数据属于阶段三。
8. 对话历史不是长期记忆;只有用户确认的候选才能进入个人或项目业务记忆。
9. 个人经验写个人域,住户需求和跟进事项写项目业务域,不因创建员工调岗而丢失。
8. 对话历史不是长期记忆;只有用户确认的候选才能进入统一采集或兼容项目业务记忆。
9. 统一采集由用户选择 PRIVATE / COMPANY;COMPANY 先进入可靠待流转状态,不能用前端成功提示代替外部回执。
10. 模型只生成结构化草稿,主体解析、授权、幂等、版本和数据库写入全部由确定性服务完成。
11. 保存和提醒分别确认;未设置 `followUpAt` 不产生今日任务、推送或自动派单。
12. 当前没有权威住户主数据时不伪造主体 ID;无法唯一定位的住户信息必须先追问。
12. 当前没有权威住户主数据时不伪造主体 ID;无法唯一定位不阻断记录一般事项,但不得将其解释为确定住户档案。
13. 用户界面不暴露系统的三域架构作为一级选择;一级只保留“工作助手 / 查全网”,内部来源默认自动路由并以引用透明展示。
14. 公网查询永不由 AUTO 触发;必须由用户明确进入“查全网”,且不得自动携带住户或项目内部信息。
@@ -10,6 +10,8 @@
**交互设计基准:** [工作助手语音优先与确认记忆设计图](prototypes/personal-assistant-work-helper-voice-first-v2.png)。该图是 Task 10 的实现参考,不是当前生产截图;安全、权限、状态机和 API 冲突时以 [专项 TechSpec](个人AI助理阶段二专项TechSpec.md) 为准。
**当前边界:** Task 10 的“记一下”已复用 `/api/knowledge/query`、`aihr_memory_candidate` 和 `aihr_assistant_capture` 完成本地闭环;本计划其余个人文件、网页、独立 `/ask`、分享和 PPT 任务仍未实施,不得按计划文本推断已完成。
---
## 0. 执行边界
@@ -1,11 +1,12 @@
# 物业行业 AI 人力资源系统 · 业务需求文档(BRD)
> 版本:v1.4(统一版)| 日期:2026-07-19
> 版本:v1.5(统一版)| 日期:2026-07-19
> 定位:本文是本项目的**唯一事实源(Single Source of Truth)**,收敛此前所有讨论与文档,取代分散的局部材料作为业务需求基准。
> v1.1 变更:第 5 章数据模型方向补充"HR 主干已对齐《手册》卷1 第9章"结论(见 5.2)。
> v1.2 变更:新增阶段二“员工个人 AI 助理 / 个人知识空间”需求(见 4.8),明确个人资料、网页链接、时间检索、来源引用、PPT 增强项和阶段三外部 HR 数据边界。
> v1.3 变更:个人助理新增确认式长期记忆;一级交互收敛为“工作助手 / 查全网”,内部个人资料、项目业务记录和企业知识默认自动路由并透明展示来源。
> v1.4 变更:员工“工作上报”改为复用数字师傅的微信式语音会话,AI 只整理可编辑草稿,用户确认后进入原有审核链,审核通过仍不自动入知识库。
> v1.5 变更:“记一下”收敛为统一采集确认卡,系统建议分类,用户选择仅自己保存或提交公司处理;项目和房屋位置缺失不阻断保存,正式企业接口未接入前只展示待流转。
>
> **收敛来源**:
> - 《物业管家与生活顾问 AI 陪练系统建设方案》(原始业务方案,陪练视角)
@@ -160,7 +161,7 @@
- **个人资料收藏**:员工可保存个人工作文字、PDF/Word/Excel/PPT、图片和网页链接;系统记录来源、收藏时间、主题、解析状态和原始附件,支持删除与导出。
- **个人检索与问答**:支持按日期范围、主题和来源查询个人内容,例如“上周收藏了哪些保洁管理资料”;基于选定资料总结、分析和提炼行动建议,回答必须展示引用来源。
- **内部知识自动路由**:员工默认只使用“工作助手”,系统在个人资料、项目业务记录和企业知识之间按意图和权限自动路由并展示实际引用;“资料范围”仅作为次级手动筛选,不要求普通员工预先理解数据域。
- **确认式长期记忆**:系统可从文字或语音转写中识别住户需求、待跟进事项和个人经验,但只能生成可编辑候选卡;用户确认后,个人经验写入本人私有域,住户需求和跟进事项写入项目业务域,后续召回必须展示来源、时间和当前状态。
- **确认式统一采集**:显式“记一下/帮我记/保存一下”从文字或语音转写生成可编辑候选卡,系统建议服务线索、住户画像、优秀案例、个人想法、待跟进事项或工作记录;项目/楼栋/单元/房号缺失只作可选提示。用户必须选择“仅自己保存”或“提交公司处理”,后者在正式接收接口接入前仅进入待流转状态,不得宣称已生成工单或已上报。
- **工作思路整理**:对日常冲突、工作灵感和零散想法生成结论、行动项、待确认事项;AI 仅辅助整理,不自动代替员工对外发布或作出管理决策。
- **内容生成**:阶段二首批提供摘要、提纲和可编辑文字;多资料对比、周报/月报和 PPT 生成作为阶段二增强项,PPT 先确认大纲与模板再生成。
- **分享与入库**:个人资料默认本人可见;分享给团队或沉淀为企业知识时必须由本人明确发起,经过权限校验、脱敏、审核和版本治理。
@@ -1,12 +1,13 @@
# 物业行业 AI 人力资源系统 · 开发规格(Tech Spec)
> 版本:v1.5 | 日期:2026-07-19
> 版本:v1.6 | 日期:2026-07-19
> 定位:**开发层唯一依据**。回答"怎么建"——工程结构、数据表、API 契约、Prompt 规格、集成适配。
> v1.1 变更:数据模型对齐《手册》卷1 第9章 HR 主干,补 3 张 backbone 表(职位职责/雇员绩效/雇用终止),新增附录 D 对照表。
> v1.2 变更:第 6 章按 Codex 设计评审重写——状态机补异常/终止态、COACH_CHECK 工程化、评分引擎分层(P0 单 LLM / P1 融合)、澄清"单场对练评分 vs 跨期能力画像"两套评分、Prompt 加固 + RAG 硬约束、新增 6.5 P0/P1 切分。
> v1.3 变更:Qdrant 作为一期向量索引层落地;SOP 知识库检索升级为 MySQL Fulltext + Qdrant RRF 融合,MySQL/MinIO 仍是事实源。
> v1.4 变更:移动端拆为独立 `mobile/` Vue/Vite Web/H5 工程,承载员工端、候选人端、主管端;后台管理端继续在 `frontend/`。
> v1.5 变更:当前用户侧以 `mobile-uni/` 为准;员工工作上报复用 `ChatComposer` 改为语音优先会话,增加无状态 AI 整理草稿契约,确认后继续提交既有 `aihr_work_report` 审核链。
> v1.6 变更:工作助手显式“记一下”复用 `/api/knowledge/query` 的 `memoryCandidate`,确认后写 `aihr_assistant_capture`;位置字段改为可选,增加 PRIVATE/COMPANY 范围、跟进时间和待流转状态。音色不在本次实现范围。
> 配套:需求见[《物业AI人力资源系统业务需求文档BRD》](物业AI人力资源系统业务需求文档BRD.md);2026-07 MVP 执行计划已归档到[《AI人力资源系统一期MVP版作战清单》](archive/2026-07-mvp-delivery/AI人力资源系统一期MVP版作战清单.md)。
> **优先级图例**:`P0`=2026-07-05 MVP 演示必需 · `P1`=一期必需 · `P2`=二期/推迟。
> 决策基线:若依基座 / 集中式前后端分离 / 本地登录 / 公有大模型API / 一期RAG / 组织人员外部同步(MVP 用快照) / 数据范围以项目为主体。
@@ -111,7 +111,7 @@
| MVP | 收藏个人文字、PDF/Word/Excel/PPT、图片和网页链接;自动提取正文、标题、来源、收藏时间和主题标签 | 阶段二首批 |
| MVP | 按日期范围、主题、来源查询“我哪些天收藏了什么”;基于选定资料问答、总结、提炼工作想法,答案必须带来源 | 阶段二首批 |
| MVP | 将冲突处理、工作灵感、保洁管理等问题交给个人助理分析;允许同时引用个人资料与有权限的企业知识 | 阶段二首批 |
| MVP | 从文字或语音中识别住户需求、待跟进事项和个人经验,返回可编辑确认卡;确认后个人经验写个人域,住户需求/跟进事项写项目业务域 | 阶段二首批 |
| MVP | 显式“记一下/帮我记/保存一下”生成可编辑确认卡;用户选择仅自己保存或提交公司处理,后者在正式接收端接入前只显示待流转 | 已完成本地实现,待发布验证 |
| 增强 | 多份资料对比、周报/月报、结构化汇报提纲、个人知识标签和长期记忆 | 阶段二后半 |
| 增强 | 将总结导出为 PPT/汇报材料;先生成可编辑大纲,再生成文件,不把“一键 PPT”作为首批阻塞项 | 阶段二后半/P1 |
| 外部数据 | 北森、考勤、请假、组织任职等个人数据接入后再做跨系统分析 | 阶段三 |