本提交含两部分。第一部分是本轮工作;第二部分是此前一直留在工作区、
从未提交的对象化重构,与第一部分在文件上互相咬合(internal/repository
整个包都是未跟踪状态,且 api 层已有文件引用它),无法拆成两个可编译的提交。
一、仓库层收口 A1 批(本轮工作)
把 api 层手写的 store.DB 查询收进具名仓库方法,只给真正获益的对象做方法,
不机械包裹全量。本批迁移 22 处裸查询(courses.go 9 / media.go 12 / products.go 1),
新增方法:
- MediaFileRepo.ListByBind / ListForAudit / MarkExtracted
- KnowledgeChunkRepo.CountByMediaFile
- ProductRepo.GetVisibleByID
两条业务口径改由仓库单点持有,避免各处手写漂移:
「只有 approved 素材出现在课程详情」与「已停用产品不在课程详情露出」。
修掉两个真实缺陷:
- ProductRepo.GetByID 缺 Where 条件。此前 GET /api/products/{id} 对任意 id 都返回
第一条产品、对不存在的 id 返回 200,且 PUT /api/products/{id} 会覆盖第一条产品
—— 数据损坏级。全仓扫描确认这是唯一一处同型写法。
- ProductRepo.Delete 写 status="deleted",而 DELETE 处理器文档与回包都声称
"inactive",接口在说谎;管理员用 status=all 拉列表会看到前端不认识的状态。
已对齐为 inactive(与 CourseRepo.Delete 一致)。
删除 8 个零调用且列名不存在的死方法(一调即 SQL 报错):
- media_file 上的 file_path / file_type / approval_status 三列并不存在,
GetByPath / ListByType / UpdateStatus 全废
- knowledge_chunk 上的 space_id 列不存在(模型早已改为 knowledge_space_key),
List / Total / ListBySpaceIDs / DeleteBySpace / SearchByVector 全废
取舍边界:能对当前 schema 跑通的死方法保留,跑不通的删或修。
CourseRepo.List 补齐 status=all 档(此前传给它会当作 status='all' 过滤出空列表)。
该方法此前零调用,现与产品列表语义对齐。
验证:go build ./... 与 go test ./... 全绿;另用真实 HTTP 请求验证 34 项
(课程 17 / 产品 3 / 素材 14),跑在数据库副本与独立 KB_DATA_DIR 上,
含 multipart 真上传 → 审批 → pdftotext 提取 → 分片入库的完整链路。
二、此前未提交的对象化重构(非本轮工作)
- 新增 internal/repository 仓库层、connectors、skills、specialists、xapps、jsonutil,
model/task_record|task_run|task_artifact、api/task_runtime|action_definition|chat_message
- 删除 api/app_definition、connectors、my_app_center、notification、office_skill、
export_docx|pptx|xlsx、official_account_* 等,随 XApp/Skill/Specialist/Connector
可插拔打包方向(AR10/AR11)调整
- 资产目录归位:backend-go/knowledge_source → assets/knowledge/source、
training_materials → assets/training/materials;README 内相对路径同步加深两级;
deploy env 补 ASSET_ROOT_DIR 并改 KNOWLEDGE_SOURCE_DIR / TRAINING_MATERIALS_DIR
- 前端新增 skills/ specialists/ connectors/ xapps/ 目录与对应页面
验证:前端 npm run build 通过(7.26s)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
11 KiB
11 KiB
项目状态总览(PROJECT_STATE)
单一事实源:新对话默认先读此文件恢复上下文;每次关键决策后必须更新。 最后更新:2026-09-16
1. 项目是什么
eai_agentplatform — EAI 数字员工平台(AI Agent Platform)。 纯内网本地化的企业 AI 数字员工平台,围绕数字员工(专家)、知识库底座、自动化工坊、 考试评估与系统管理组织业务能力。配套全局 AI 助手。
2. 当前状态
已完成
- ✅ PRD V1.1 最终定稿(docs/PRD.md / 设计稿)
- ✅ 文档架构搭建(docs/ 体系)
- ✅ 编码规范制定(TOP_CODING_RULES.md / CLAUDE.md / PROJECT_STATE.md)
- ✅ 知识入库体系(BE05)后端代码落地:knowledge_source 表 + 解析/扫描/摄入 + 审批 API + 脚本
已完成(Go 后端)
- ✅ 后端重写为 Go 完成:认证 / CRUD / 考试 / 素材媒体 / 知识入库 / AI PathCoach / 系统管理
- ✅ 交付形态落地:单二进制 + systemd + Clonezilla 清理清单(backend-go/deploy/)
- ✅ 岗位与知识对应能力(P0):Position / PositionKnowledge 表 + 岗位 CRUD + 知识映射 +
用户设岗(
user.position_id)+ 岗位驱动组卷(exam_paper.position_id→pickQuestions岗位过滤分支); 前端「岗位管理」页 + 映射编辑面板 + 用户/考试关联岗位下拉 - ✅ 岗位能力闭环(P1 + P2):学员「我的岗位应学清单」(
/api/my/position)+ 成绩按岗位聚合(/api/system/exam-stats-by-position)+ 岗位考试蓝图(position_exam_blueprint); 错题本(mistake_record)+ 简答题 LLM 评分(essay题型 +essay_grade能力)+ 后端自动化测试(_test.go,go test ./...全绿) - ✅ 学员成长体系(对标竞品,突破「极简/禁止学情分析」边界):学习积分 + 排行榜(
point_event+user.learning_points);考试合格证书(certificate,正式通过自动颁发);学习档案/能力雷达 (/api/my/profile,按域掌握度 + 薄弱域 + 成绩趋势);前端新增「我的学习档案 / 我的证书 / 学习排行榜」页 - ✅ 组织架构 + 消息通知:部门字典(
department)+ 按部门学情统计(/api/system/department-stats); 站内通知(notification,考试发布/考试通过发证/设岗三事件推送)+ 侧栏铃铛角标; 社交社区/讨论区定死不做
待开始
- ⬜ 按
docs/01_System_Overall/SY19_Universal_Digital_Worker_Product_Planning.md将当前项目从“已有专员雏形”进一步收口为“通用数字员工平台 V1.0”
3. 已拍板决策
| # | 决策 | 状态 |
|---|---|---|
| D01 | 前端:Vue3 + Vite + Element Plus | 已定 |
| D02 | 后端:Go + Gin + GORM + SQLite(modernc 纯Go驱动) | 已定 |
| D03 | 认证:JWT(golang-jwt)+ bcrypt | 已定 |
| D04 | 文档转换:LibreOffice(裸进程)+ pdftotext | 已定 |
| D05 | AI 底座:内网 OpenAI 兼容接口(非公网) | 已定 |
| D06 | 视频仅预览、不提取文本、不进 AI | 已定 |
| D07 | 知识检索:混合检索(向量 brute-force + 关键词兜底),数据量小无需 ANN | 已定 |
| D08 | 审批通过后异步转换/提取 | 已定 |
| D09 | 视频 > 100MB 分片上传 + 断点续传 | 已定 |
| D10 | 题库 + 组卷配置(随机/固定抽题) | 已定 |
| D11 | 角色:employee / admin 两级,无复杂权限 | 已定 |
| D12 | 结构化知识源通道:assets/knowledge/source/ md → knowledge_source 表审批 → 摄入 product/question/chunk | 已定 |
| D13 | 向量检索:brute-force 余弦 + Ollama bge-m3 embedding(单容器双模型,随盘交付) | 已定 |
| D14 | 交付形态:裸进程 + systemd + Clonezilla 整盘克隆,Go 单二进制无源码交付 | 已定 |
| D15 | 岗位与知识对应:Position/PositionKnowledge 表 + 用户单岗位(user.position_id)+ 岗位驱动组卷 |
已定(P0 落地) |
| D16 | 岗位考试蓝图:position_exam_blueprint 按「域 + 题型」抽样(题目无级别字段,不做级别加权);蓝图存在时优先于岗位映射抽题 |
已定(P1 落地) |
| D17 | 错题本(学员自助,非学情分析,自测/正式均写)+ 简答题 LLM 评分(essay 题型,复用 title_gen 路由,essay_grade 不扣点) |
已定(P2 落地) |
| D18 | 突破原「极致极简/杜绝学情分析」边界:新增学员成长体系 = 学习积分+排行榜(游戏化)+ 考试证书(认证)+ 学习档案/能力雷达(学情,学员自助视角);积分规则集中常量可调 | 已定(V1.6 落地) |
| D19 | 部门组织架构(department 字典表,用户以 department 字符串归属、改名同步)+ 按部门学情统计;站内消息通知(考试发布/通过发证/设岗三事件);社交社区/讨论区定死不做 | 已定(V1.7 落地) |
| D20 | 当前阶段产品路线收口为「先通用、后定制」:先做标准化通用数字员工产品包,不直接追 WorkBuddy 的高自由度路线;第一批优先沉淀知识运营、培训考试、内容生成、任务推进 4 个通用数字员工,后续再长行业包与企业半定制 | 已定(见 docs/01_System_Overall/SY19_Universal_Digital_Worker_Product_Planning.md) |
| D21 | 前端曾短暂采用「冻结归档」机制保存停用代码;当前已取消该策略,早期历史代码直接删除,不再维护 frontend/src/_frozen/。站内通知如需恢复,按当前实现重新设计,不再依赖冻结稿。 |
已更新 |
| D22 | 任务记录延迟到发出第一条消息时创建(对齐 WorkBuddy:新建任务只是导航动作,不落库)。「新建任务」只做「回到 /home 开场画布 + 清空当前任务」,任务标题由第一句话决定、专员取输入框 + 里先选的那个(pendingSpecialistKey 暂存,建任务时作为 specialist_key 一并提交,后端已支持)。不允许存在没聊过天的空任务 —— 原实现点一次落一条 新任务,是「最近任务」堆满空行的根因 |
已定(V1.8 落地) |
| D23 | 侧边栏「最近任务」的行菜单(对齐 ChatGPT 悬停 ⋯ + WorkBuddy 任务卡「更多」):重命名(就地编辑,回车提交/Esc 取消)、置顶(新增 worker_task.pinned,排序 pinned DESC, updated_at DESC)、删除(新增 DELETE /api/worker/my-tasks/:id,硬删、无回收站,确认框写明「无法恢复」)。对照后不做:分享任务(纯内网无意义)、打开文件夹(Web 无此能力)、保存到工作空间(项目无 workspace 概念)、归档(没有「已归档」入口可找回,等于软删陷阱)。el-dropdown 加 :persistent="false" —— 默认每行留一份隐藏菜单在 DOM 里,50 条任务就是 50 份 |
已定 |
| D24 | SQLite 定期备份内置进二进制(不用外部 cron/systemd timer):启动时补一次 + 每小时查是否到期,默认间隔 24h、保留最近 7 份,落在 data/backups/(systemd 是 ProtectSystem=strict,只放开了 data/ 可写)。快照用 VACUUM INTO 而非 cp 主库 —— 边服务边写时 cp 可能拷到写了一半的页。产出自检 SQLite 文件头,不合格即删。另提供 -backup 子命令供升级/迁移前手工备一份。边界:只防误删/误改/写坏,不防整盘损坏,跨机保存仍需人工 |
已定(见 deploy/DELIVERY.md 第 7 节) |
| D25 | 平台总架构继续采用 6 层,但第 5 层正式升级为 对象层(Expert / Skill / App);新增与“专家 / 技能”并列的第三类一级对象 App,其定位是“长程任务运行壳”而非页面或大技能。任务统一定义为“工作实例容器”,可挂载主 app、右栏 expert、后台 skill;消息流降级为对话轨迹,长程状态由 app_state + app_event + domain_data 承载。产品一级导航目标态需完整描述为 新建任务 / 项目 / 专家·技能·连接器 / 长程APP / 知识库 / 后台管理 / 我的,其中 知识库 被确认为组织级默认必装的内建 App,拥有一级直达入口;其它专题型业务主导航后续应优先收敛为 app 并归入“长程APP”。文档锚点:docs/01_System_Overall/SY22_Role_Skill_App_Unified_Task_Architecture.md |
已定 |
| D26 | 路由命名正式拆分为三类以避免混同:ai_route_* 专指 AI 模型路由;object_entry_route 专指 Expert / Skill / App 等业务对象的进入入口;page_route 专指普通页面导航。后端 API、前端对象配置与导航配置均按该口径收口;旧 route / entry_route 已降为启动时一次性迁移并随后删除的历史列,不再保留为日常兼容字段。 |
已定 |
4. 文档索引
| 文档 | 路径 | 说明 |
|---|---|---|
| PRD | ../docs/PRD.md |
产品需求文档(V1.1 最终版) |
| 设计稿 | ../docs/eaisalestrain_app设计稿.md |
完整 PRD 中文原稿 |
| DB Schema | ../docs/db_schema.md |
9 张核心表字段设计 |
| API 文档 | ../docs/api.md |
API 接口定义 |
| 部署文档 | ../docs/deploy.md |
部署架构与步骤 |
| 变更日志 | ../docs/changelog.md |
版本变更记录 |
| 知识入库体系 | ../docs/04_Backend/BE05_Knowledge_Ingest_Module.md |
上传→生成→审批→入库总设计 |
| 知识源目录 | assets/knowledge/source/ |
结构化知识源 md(5 份,28 产品 + 20 题) |
| 培训资料目录 | assets/training/materials/ |
培训课程资产与种子源文件 |
| 编码准则 | ../TOP_CODING_RULES.md |
编码与调试最高准则 |
| AI 协作锚点 | CLAUDE.md |
AI 新对话启动仪式 |
5. 目录结构(当前)
pj0235-eai_agentplatform-ubu/ # 工作区根(仓库根)
├── TOP_CODING_RULES.md # 编码与调试最高准则
├── start_dev_10231_10232.sh # 开发启动脚本
├── docs/ # 设计文档(项目级,与代码分离)
│ ├── 00_AI_Context/ # AI 协作上下文
│ ├── 01_System_Overall/ # 系统总览
│ ├── 02_Architecture/ # 架构设计
│ ├── 04_Backend/ # 后端设计与 API
│ ├── 06_Product_Lines/ # 产品线与前端设计
│ ├── 08_Design_Rules/ # UI/UX 设计规范
│ ├── PRD.md / db_schema.md / api.md / deploy.md / changelog.md
│ ├── eaisalestrain_app设计稿.md # 完整 PRD 中文原稿
│ └── 博昇产品与渠道合作表.md # 知识源权威数据
└── eai_agentplatform/ # 应用代码
├── backend-go/ # Go 后端(正式,唯一后端,已完成)
│ ├── cmd/ internal/ # Go 源码
│ ├── data/ # 运行时数据(db+media,git 忽略)
│ └── deploy/ # 交付物(systemd/env/清理脚本/DELIVERY.md)
├── assets/ # 内容资产层(运行时输入,不属于源码)
│ ├── knowledge/source/ # 知识源 Markdown
│ └── training/materials/ # 培训资料资产
├── frontend/ # 前端代码
├── CLAUDE.md
├── PROJECT_STATE.md
└── .gitignore