feat: add project-scoped work assistant results

This commit is contained in:
2026-07-21 04:44:15 +08:00
parent 53b15e506c
commit 4536d607e3
75 changed files with 3281 additions and 507 deletions
+27 -10
View File
@@ -1,6 +1,6 @@
# 员工个人 AI 助理 / 个人知识空间专项 TechSpec
> 版本:v1.2 | 日期:2026-07-19
> 版本:v1.4 | 日期:2026-07-21
>
> 归属:《银城员工端 APP 分阶段实施总纲》阶段二
>
@@ -11,8 +11,12 @@
> v1.1 需求补充:客户明确提出,员工在对话中描述住户需求、待跟进事项或个人经验时,个人助理应识别值得长期保留的信息,返回可编辑确认卡;仅在用户确认后写入对应记忆域,后续问答可按权限召回。模型不得直接修改数据库,提醒必须单独确认。
>
> v1.2 实施收口:显式“记一下 / 帮我记 / 保存一下”统一生成 `ASSISTANT_CAPTURE` 确认卡;楼栋、单元、房号和项目均为可补充信息,不再阻断保存。用户必须选择“仅自己保存 / 提交公司处理”;公司处理首批只可靠写入待流转队列,未配置正式接收接口前不得显示“已送达”。音色不在本次范围。
>
> v1.3 文档收口:v1.2 描述的是 2026-07-20 已部署行为;多项目工作采集按[《工作助手与今日工作成果迭代计划》](工作助手与今日工作成果迭代计划-20260721.md)执行。个人笔记允许项目为空,项目工作记录必须先按名称选择当前项目;项目编码只作内部授权字段,不由用户输入。
>
> v1.4 本地实施回填:项目名称选择、项目化短会话、项目化确认卡、来源快照、业务状态历史、员工今日成果和主管项目成果已完成本地实现、真实 HTTP 与 390×844 验证,尚未提交、部署或生产验证。外部线索/工单/考勤投递仍保持 PENDING。
当前代码状态(2026-07-20):候选检测、六类系统建议、同会话合并、可编辑确认、PRIVATE/COMPANY 持久化、可选跟进时间、“我的资料与记忆”列表,以及确认记录按 owner/项目权限参与后续问答召回均已实现。召回引用明确区分 `PERSONAL / COMPANY / PROJECT_SERVICE`。外部线索/工单投递 Worker、正式回执、统一采集转工作上报确认卡,以及个人文件/网页知识空间仍是后续工作,开发者不得从 `PENDING` 状态推断这些能力已完成。
当前代码状态(2026-07-21 复核):2026-07-20 生产版本已包含候选检测、可编辑确认、PRIVATE/COMPANY 持久化、可选跟进时间、“我的资料与记忆”列表和受控召回。当前工作树进一步完成多项目、`ATTENDANCE/INSPECTION` 分类、来源绑定、状态闭环和今日成果,但这部分仍只完成本地验证。个人文件/网页知识空间、PPT 自动生成、外部线索/工单投递 Worker 和正式回执仍是后续工作;开发者不得从 `PENDING` 推断已派单或已送达。
## 0. 交互设计基准
@@ -20,6 +24,8 @@
设计资产:[personal-assistant-work-helper-voice-first-v2.png](prototypes/personal-assistant-work-helper-voice-first-v2.png)
多项目与今日成果联合高保真资产:[work-assistant-project-context-v3.png](prototypes/work-assistant-project-context-v3.png),仓库绝对路径为 `/Users/yuanjiantsui/dev/11-project/wygj/docs/prototypes/work-assistant-project-context-v3.png`;逐状态运行截图路径见[迭代计划 §1.5](工作助手与今日工作成果迭代计划-20260721.md#15-本地运行视觉证据390844)。
该图是阶段二「问」页和确认记忆流程的实现参考,不是当前生产截图。后续 Agent 实施 `mobile-uni/src/pages/user/sop/index.vue` 与记忆确认卡时应遵守以下不变量:
1. 页面标题保持“问 · 数字师傅”,一级只区分“工作助手 / 查全网”,不增加“个人助理”一级 Tab。
@@ -202,12 +208,14 @@ org.dromara.aihr.knowledge.parse
### 3.4 项目业务记忆权限
1. `project_code` 必须由当前登录员工的有效项目任职解析,沿用 `aihr_org_snapshot.project_code` 和现有知识授权口径;客户端不得指定越权项目。
2. 项目业务记忆的列表、详情、修改和召回必须同时过滤 `tenant_id + project_code`,创建人不因“本人记录”获得跨项目访问权。
3. 住户姓名、电话、身份证件和健康信息不作为自由文本检索字段;首批优先保存房屋定位、需求摘要、跟进状态和必要说明。
4. 发送外部模型前先由服务端提取并令牌化可识别信息;模型输出不得覆盖服务端保存的主体定位。
5. 员工修改已确认记录必须携带 `expectedVersion`,成功后新增版本快照,不原地抹除历史。
6. 项目业务记忆不能通过个人资料删除接口删除;作废使用 `VOID` 状态并保留操作人、原因和版本记录。
1. 个人笔记允许 `project_code` 为空;晨会、巡检、业主服务、画像、线索等项目工作记录必须先选择当前项目。
2. 客户端展示员工有权限的项目名称下拉列表,不展示或要求手输项目编码;选择结果可携带内部项目标识,服务端必须按当前登录员工的有效项目任职重新解析并校验,不能信任客户端字段。
3. 项目授权沿用 `aihr_org_snapshot.project_code` 和现有知识授权口径;同一员工的多项目成员关系按 `tenant_id + project_code + ext_party_id` 保留,客户端不得指定越权项目。
4. 项目业务记忆的列表、详情、修改和召回必须同时过滤 `tenant_id + project_code`,创建人不因“本人记录”获得跨项目访问权。
5. 住户姓名、电话、身份证件和健康信息不作为自由文本检索字段;首批优先保存房屋定位、需求摘要、跟进状态和必要说明。
6. 发送外部模型前先由服务端提取并令牌化可识别信息;模型输出不得覆盖服务端保存的主体定位。
7. 员工修改已确认记录必须携带 `expectedVersion`,成功后新增版本快照,不原地抹除历史。
8. 项目业务记忆不能通过个人资料删除接口删除;作废使用 `VOID` 状态并保留操作人、原因和版本记录。
## 4. 数据模型
@@ -329,11 +337,13 @@ Message 保存:
### 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`。
用户确认后的统一采集事实源。核心字段为 `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/work_date/business_status/source_snapshot_json/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 范围唯一,确认事务先写采集记录再关闭候选,任一步失败整体回滚。
- `business_status` 固定为 `RECORDED/PENDING/IN_PROGRESS/COMPLETED/VOID`;状态历史保留原状态、目标状态、操作人、说明和时间,状态幂等键不得跨记录或目标状态复用。
- `source_snapshot_json` 只保存最小必要来源快照和受保护 OSS 引用,源文件通过重新鉴权接口交付,不保存公开 URL。
- 表内不保存原始录音、模型原始输出或伪造的住户主体 ID;音色不属于本表和本次实现。
### 4.9 `aihr_service_memory`
@@ -513,6 +523,11 @@ Message 保存:
| POST | `/memory-candidates/{id}/confirm` | 提交编辑后的草稿、`expectedVersion`、`idempotencyKey`;分域写入 |
| POST | `/memory-candidates/{id}/dismiss` | 明确不保存;同源候选本会话不再提示 |
| GET | `/assistant-captures?saveScope=PRIVATE|COMPANY&limit=50` | 查看本人的已确认记录及公司流转状态 |
| POST | `/assistant-captures/{id}/status` | 带 `businessStatus/note/idempotencyKey` 推进本地处理状态 |
| GET | `/assistant-captures/{id}/status-history` | 查看状态审计历史 |
| GET | `/assistant-captures/{id}/source` | 重新鉴权读取确认记录绑定的原始媒体 |
| POST | `/api/aihr/work-results/mine/generate` | 按员工、项目和自然日幂等生成今日成果 |
| GET | `/api/aihr/work-results/project` | 主管按目标项目权限查看团队当日成果 |
| GET | `/api/aihr/service-memories` | 按当前项目、状态、日期、楼栋/单元/房号查询 |
| GET | `/api/aihr/service-memories/{id}` | 项目权限内查看详情、来源和版本 |
| PATCH | `/api/aihr/service-memories/{id}` | 携带 `expectedVersion` 修改必要字段或状态并生成版本 |
@@ -532,13 +547,15 @@ Message 保存:
"category": "服务线索",
"summary": "住户希望了解社区可提供的养老服务",
"occurredAt": "2026-07-19T14:00:00+08:00",
"workDate": "2026-07-19",
"businessStatus": "PENDING",
"followUpAt": null
},
"enableReminder": false
}
```
服务端必须忽略请求中的 `projectCode` 作为授权依据,仅用它与当前登录态可访问项目做一致性校验;客户端可省略该字段。确认成功返回 `targetDomain=PERSONAL|COMPANY/targetId/version`;同一 `idempotencyKey` 重放必须返回同一结果,不重复创建记录,同一键配不同请求体必须拒绝。
服务端必须忽略请求中的 `projectCode` 作为授权依据,仅用它与当前登录态可访问项目做一致性校验;个人笔记可省略该字段,项目工作记录不得省略。确认成功返回 `targetDomain=PERSONAL|COMPANY/targetId/version`;同一 `idempotencyKey` 重放必须返回同一结果,不重复创建记录,同一键配不同请求体必须拒绝。
## 7. 网页采集安全