[ { "id": "FE-100", "category": "agent", "priority": 0, "description": "Agent 对话页面 - SSE流式对话/会话管理/Skill进度展示", "steps": [ "左侧会话列表:新建/切换/删除会话", "消息区域:用户/助手气泡正确显示", "助手消息支持Markdown渲染", "SSE流式输出实时显示", "Skill执行状态指示器正常工作", "停止生成功能正常", "空状态显示欢迎页和快捷操作" ], "passes": true }, { "id": "FE-101", "category": "agent", "priority": 0, "description": "Skill 管理页面 - 查看/启停/详情", "steps": [ "Skill列表卡片网格正确显示", "启用/禁用Skill功能正常", "Skill详情抽屉展示完整信息", "搜索过滤功能正常" ], "passes": true }, { "id": "FE-102", "category": "agent", "priority": 0, "description": "Skill 提示词自定义 - 详情抽屉中查看/编辑/保存/恢复默认提示词", "steps": [ "打开Skill详情时加载并回显当前提示词列表", "每个提示词折叠面板可展开编辑(textarea)", "保存提示词调用后端API持久化到数据库", "恢复默认按钮还原为硬编码的默认提示词", "保存后刷新详情验证持久化成功" ], "passes": true }, { "id": "FE-110", "category": "video-scratch", "priority": 0, "description": "Skill 配置面板增强 - 详情抽屉增加参数配置tab", "steps": [ "Skill详情抽屉增加 tabs: 基本信息 / 参数配置 / 提示词", "视频抽帧Skill: fps滑块(1-10)、图片质量滑块(50-100)", "旧伤检测Skill: 模型选择下拉框、batchSize输入、batchDelay输入", "损伤定位Skill: groundingWindow输入(模型固定豆包,不可选)", "最佳帧筛选Skill: 模型选择、topN输入", "报告生成Skill: 模型选择", "配置修改后调用后端API持久化", "不同Skill根据name动态展示不同的配置项" ], "passes": true }, { "id": "FE-111", "category": "video-scratch", "priority": 0, "description": "检测结果展示页 - 解析报告JSON渲染结果页面", "steps": [ "新增路由 /agent/detection-result", "统计卡片区: 车况评分/损伤数/标注帧数/分析帧数", "视频信息卡片: 时长/分辨率/FPS/抽取帧数", "整体评估区: AI生成的评估文字", "损伤汇总表: 位置/类型/严重程度/时间/描述", "损伤详情: 最佳帧原图+标注图对比展示", "处理建议列表", "支持查看历史检测记录" ], "passes": true }, { "id": "FE-001", "category": "infrastructure", "priority": 1, "description": "项目基础框架搭建(Cool Admin Vue 3)", "steps": [ "安装依赖 pnpm i", "启动开发服务器 pnpm dev", "验证 http://localhost:9001 可访问", "验证代理到后端 /dev/ → http://127.0.0.1:8003 正常" ], "passes": true }, { "id": "FE-002", "category": "infrastructure", "priority": 1, "description": "登录和权限系统UI", "steps": [ "打开登录页面正常显示", "输入用户名密码登录成功", "登录后跳转到主页", "侧边栏菜单根据权限动态显示", "登出功能正常" ], "passes": true }, { "id": "FE-003", "category": "infrastructure", "priority": 1, "description": "系统管理页面(用户/角色/菜单/部门)", "steps": [ "用户管理页面:列表/新增/编辑/删除", "角色管理页面:列表/新增/编辑/删除/权限分配", "菜单管理页面:树形列表/新增/编辑/删除", "部门管理页面:树形列表/新增/编辑/删除" ], "passes": true }, { "id": "FE-004", "category": "infrastructure", "priority": 1, "description": "流程编排UI框架(Vue Flow拖拽画布)", "steps": [ "流程列表页面显示所有流程", "新建流程进入编辑界面", "画布可拖拽缩放", "左侧节点面板可拖入节点", "节点可连线", "小地图和控制器可用" ], "passes": true }, { "id": "FE-005", "category": "functional", "priority": 2, "description": "流程节点配置面板 - 点击节点弹出配置表单", "steps": [ "点击开始节点显示输入参数配置", "点击LLM节点显示模型选择和Prompt配置", "点击代码节点显示Monaco代码编辑器", "点击判断节点显示条件表达式配置", "点击结束节点显示输出配置", "配置修改后自动保存到流程数据" ], "passes": false }, { "id": "FE-006", "category": "functional", "priority": 2, "description": "流程保存和发布功能", "steps": [ "点击保存按钮保存流程草稿", "保存成功显示提示", "点击发布按钮(飞机图标)发布流程", "发布成功更新流程状态", "流程列表显示发布状态" ], "passes": false }, { "id": "FE-007", "category": "functional", "priority": 2, "description": "流程调试面板 - 在编辑界面测试运行流程", "steps": [ "点击调试按钮打开调试面板", "输入测试参数", "点击运行发送调试请求", "实时显示节点执行状态", "显示LLM流式输出", "显示最终结果" ], "passes": false }, { "id": "FE-008", "category": "functional", "priority": 2, "description": "流程执行日志页面", "steps": [ "查看流程执行历史列表", "按流程名称/时间筛选", "查看单次执行详情", "查看各节点执行结果", "查看执行耗时" ], "passes": false }, { "id": "FE-009", "category": "functional", "priority": 2, "description": "知识库管理页面", "steps": [ "知识库类型列表/新增/编辑/删除", "数据源管理(上传文件/添加链接)", "知识条目列表/搜索/启用禁用", "知识库配置(向量模型/分块参数)" ], "passes": false }, { "id": "FE-010", "category": "functional", "priority": 3, "description": "知识图谱可视化 - 3D力导向图展示实体关系", "steps": [ "3D图谱渲染节点和关系", "节点可点击查看详情", "支持缩放/旋转/平移", "新增/编辑/删除节点和关系" ], "passes": false }, { "id": "FE-011", "category": "functional", "priority": 3, "description": "流程自动布局 - ELK算法自动排列节点", "steps": [ "点击自动布局按钮", "节点按ELK算法自动排列", "连线不交叉", "布局动画过渡" ], "passes": false }, { "id": "FE-012", "category": "functional", "priority": 3, "description": "流程导入导出", "steps": [ "导出流程为JSON文件", "从JSON文件导入流程", "导入后画布正确还原", "验证节点和连线完整性" ], "passes": false }, { "id": "FE-013", "category": "functional", "priority": 3, "description": "字典管理页面", "steps": [ "字典类型列表/新增/编辑/删除", "字典条目列表/新增/编辑/删除", "前端组件可通过key获取字典数据" ], "passes": false }, { "id": "FE-014", "category": "functional", "priority": 3, "description": "定时任务管理页面", "steps": [ "任务列表显示状态和Cron", "新增/编辑任务", "暂停/恢复任务", "查看任务执行日志" ], "passes": false }, { "id": "FE-015", "category": "functional", "priority": 3, "description": "文件空间管理页面", "steps": [ "文件列表显示", "文件上传", "文件预览/下载", "文件删除" ], "passes": false }, { "id": "FE-016", "category": "functional", "priority": 3, "description": "插件管理页面", "steps": [ "插件列表显示", "上传新插件", "启用/禁用插件", "插件配置" ], "passes": false }, { "id": "FE-017", "category": "integration", "priority": 4, "description": "TYCM审核定制 - 审核仪表盘页面", "steps": [ "显示审核统计数据(今日/本周/本月)", "审核通过率图表", "审核耗时分布", "待审核队列" ], "passes": false }, { "id": "FE-018", "category": "integration", "priority": 4, "description": "TYCM审核定制 - 审核结果列表页面", "steps": [ "审核结果列表(通过/拒绝/待审核)", "按时间/类型/结果筛选", "查看单条审核详情", "查看审核流程执行轨迹" ], "passes": false }, { "id": "FE-019", "category": "infrastructure", "priority": 5, "description": "国际化支持", "steps": [ "中文/英文切换", "所有页面文本国际化", "Element Plus组件国际化" ], "passes": false }, { "id": "FE-020", "category": "infrastructure", "priority": 5, "description": "暗黑模式主题切换", "steps": [ "亮色/暗色模式切换", "流程编辑器适配暗色模式", "所有页面样式适配" ], "passes": false }, { "id": "FE-130", "category": "agent-evolution", "priority": 0, "description": "Skill分类UI - skillType标签展示 + 分类筛选", "steps": [ "【类型定义】修改 src/modules/agent/types/index.d.ts: SkillMeta接口增加 skillType?: 'compute' | 'llm' 字段(与后端BE-130同步)", "【卡片标签】修改 views/skills.vue: 每个Skill卡片的分类tag旁边增加skillType标签: compute显示'纯计算'绿色tag(#67C23A), llm显示'需要LLM'蓝色tag(#409EFF); 使用el-tag组件: {{skill.skillType==='compute'?'纯计算':'需要LLM'}}", "【筛选功能】在skills.vue顶部搜索框旁边增加skillType筛选: 使用el-radio-group或el-segmented: 全部/纯计算(compute)/需要LLM(llm); 新增 ref filterType = 'all'; 修改filteredSkills计算属性: 先按filterType过滤再按searchText搜索", "【skill-detail增强】修改 components/skill-detail.vue: 基本信息tab的el-descriptions中增加一行展示skillType(同样用彩色tag)", "【验证】卡片上正确显示skillType标签颜色; 筛选功能正确过滤; 详情抽屉显示skillType; 当后端未返回skillType时(旧数据)不崩溃", "【难度评估】低难度。纯前端UI改动,只涉及skills.vue和skill-detail.vue两个文件。数据来源已有: GET /admin/agent/skill/metas 返回的数据中会包含skillType字段(由BE-130后端提供)" ], "passes": true }, { "id": "FE-131", "category": "agent-evolution", "priority": 0, "description": "Agent管理列表页 - 卡片网格展示所有Agent + 状态管理 + 操作按钮", "steps": [ "【类型定义】修改 types/index.d.ts: 新增 AgentInfo 接口 { id:number, name:string, label:string, description:string, icon?:string, systemPrompt?:string, skills:string[], modelConfig?:{apiKey:string,apiUrl:string,modelId:string}, config?:any, status:number(0=草稿1=已发布), createTime?:string, updateTime?:string }", "【页面创建】创建 views/agent-list.vue: 参考skills.vue的卡片网格布局; 顶部: 搜索框+新建Agent按钮(el-button type=primary); 卡片网格(el-row+el-col :span=8): 每张卡片显示 icon+label+description(2行省略)+Skill数量badge+状态tag(草稿灰/已发布绿); 卡片底部操作: 编辑按钮+发布/取消发布开关+对话测试按钮+删除按钮(确认弹窗)", "【API调用】使用admin接口(需Token): GET列表用 POST /dev/admin/agent/info/page; 删除用 POST /dev/admin/agent/info/delete {ids:[id]}; 发布/取消用 POST /dev/admin/agent/info/update {id,status:1或0}; 获取Token: const { user } = useBase(); headers: { Authorization: user.token }", "【已发布Agent展示API信息】已发布的Agent卡片底部显示调用地址: POST /open/agent/run/invoke, agentId: {id}; 可复制按钮(navigator.clipboard)", "【对话测试】点击'对话测试'按钮: 跳转到 /agent/chat 页面并传递query参数 agentId; 或使用 router.push({ path:'/agent/chat', query:{ agentId:id } })", "【验证】卡片列表正确渲染; 新建/编辑/删除/发布功能正常; API调用地址正确展示; 对话测试跳转正常", "【难度评估】中等难度。页面结构参考skills.vue,但交互逻辑更复杂(CRUD+状态切换)。需要后端BE-133先完成提供API" ], "passes": true }, { "id": "FE-132", "category": "agent-evolution", "priority": 0, "description": "Agent编辑页 - 基本信息/Skill选择/系统提示词/模型配置/接口配置 5个Tab", "steps": [ "【页面创建】创建 views/agent-edit.vue: 使用el-drawer(宽度700px)或独立页面; 接收props: visible(boolean) + agentId(number|null,null=新建); 使用el-tabs展示5个配置Tab", "【Tab1-基本信息】el-form表单: name(唯一标识,英文下划线,创建后不可改), label(显示名称), description(textarea), icon(el-input或图标选择器); 表单验证: name和label必填", "【Tab2-Skill配置】从后端加载全部Skill列表(GET /dev/admin/agent/skill/metas); 展示为勾选列表: el-checkbox-group绑定agent.skills数组; 每个Skill项展示: 勾选框+name+label+skillType彩色tag+description(1行省略); 已勾选的Skill高亮显示", "【Tab3-系统提示词】el-input type=textarea :rows=15 绑定agent.systemPrompt; 提供'加载默认模板'按钮: 根据已选Skill自动生成推荐prompt(列出Skill名称和推荐工作流); 支持Markdown预览(可选)", "【Tab4-模型配置】el-form: apiUrl(输入框), apiKey(密码输入框), modelId(输入框); 说明文字: '不配置则使用系统默认LLM配置'; 参考现有skill-model.vue的布局", "【Tab5-接口配置】只读展示区域(已发布时可见): 调用地址 POST /open/agent/run/invoke; 请求示例JSON(根据当前Agent配置动态生成); 可复制按钮", "【保存逻辑】新建: POST /dev/admin/agent/info/add { name,label,description,icon,systemPrompt,skills:JSON.stringify(selectedSkills),modelConfig:JSON.stringify(modelConfig),status:0 }; 编辑: POST /dev/admin/agent/info/update { id,...fields }; 保存成功后emit('saved')通知列表页刷新", "【加载逻辑】编辑时: POST /dev/admin/agent/info/info {id:agentId} 获取Agent详情; JSON.parse(skills)和JSON.parse(modelConfig)反序列化", "【验证】新建Agent表单验证正常; Skill勾选列表正确展示skillType标签; 保存成功持久化; 编辑时正确回显所有配置; 接口配置tab正确展示API示例", "【难度评估】中等偏高难度。5个tab内容丰富,Skill选择列表需要加载全量Skill并展示skillType。可分步实现: 先做Tab1+Tab2+保存(核心功能),再做Tab3~5(增强功能)" ], "passes": true }, { "id": "FE-133", "category": "agent-evolution", "priority": 0, "description": "对话页改造 - Agent选择器 + 动态欢迎页 + 按Agent过滤会话", "steps": [ "【Agent Store扩展】修改 store/chat.ts: 新增状态 agents:ref([]); currentAgentId:ref(null); 新增方法 loadAgents(): POST /dev/open/agent/info/list 获取已发布Agent列表; selectAgent(agentId:number|null): 设置currentAgentId; 修改sendMessage(): 传递currentAgentId到chat接口 body中加 agentId: currentAgentId.value", "【Agent选择器UI】修改 views/chat.vue: 当messages.length===0(空状态/欢迎页)时,替换现有欢迎页为Agent选择器: 顶部标题'选择AI助手'; Agent卡片网格(el-row+el-col :span=8): 每张卡片显示icon+label+description+Skill数量; 第一张卡片为'通用助手'(不指定agentId,拥有所有Skill); 点击卡片选择Agent: selectAgent(agent.id); 选择后显示该Agent的欢迎信息和快捷操作", "【动态欢迎页】选择Agent后(currentAgentId!=null): 显示该Agent的icon+label+description; 快捷操作按钮根据Agent.config.quickActions动态展示(如果有); 默认快捷操作: 通用Agent显示现有3个快捷操作; 视频划痕检测Agent显示'开始检测视频'按钮", "【会话过滤】修改 store/chat.ts loadSessions(): 当currentAgentId有值时,传 agentId 参数给 /open/agent/chat/sessions; 切换Agent时重新加载会话列表; 新建对话时自动使用当前Agent", "【路由参数】chat.vue onMounted时检查 route.query.agentId: 如果有则自动选择对应Agent(从agent-list页面跳转过来的场景)", "【URL参数】修改 chat.vue: 使用 useRoute() 获取 query.agentId; 如果有值则调用 selectAgent(Number(route.query.agentId))", "【验证】空状态显示Agent选择器; 选择Agent后显示对应欢迎页; 发送消息时agentId正确传递; 会话按Agent过滤; 不选Agent时使用通用模式(兼容旧行为); 从agent-list跳转过来自动选中Agent", "【难度评估】中等难度。改动集中在chat.vue(欢迎页改造)和store/chat.ts(Agent状态管理)。需要注意: 1)Agent列表用open接口(不需Token); 2)currentAgentId变化时要重新加载会话; 3)向下兼容不选Agent的场景" ], "passes": true }, { "id": "FE-134", "category": "agent-evolution", "priority": 0, "description": "Agent菜单配置 + 路由注册", "steps": [ "【路由注册】修改 src/modules/agent/config.ts: 在views数组中新增路由对象 { path:'/agent/agents', meta:{title:'Agent管理'}, component:() => import('./views/agent-list.vue') }; 如果agent-edit.vue是独立页面也要注册路由(如果是抽屉则不需要)", "【数据库菜单】通过MCP数据库工具在base_sys_menu表插入新菜单: INSERT INTO base_sys_menu (parentId, name, router, type, icon, orderNum, isShow) VALUES (112, 'Agent管理', '/agent/agents', 1, 'icon-setting', 1, 1); — parentId=112是'Agent管理'目录; type=1是页面; orderNum=1排在Agent对话后面", "【菜单排序调整】可选: 调整现有菜单orderNum使Agent管理排在合适位置: Agent对话(0) → Agent管理(1) → Skill管理(2) → 检测结果(3)", "【验证】刷新页面后左侧菜单出现'Agent管理'菜单项; 点击菜单正确跳转到/agent/agents页面; admin角色自动拥有该菜单权限(Cool Admin机制)", "【难度评估】低难度。参考现有3个页面的路由注册方式。数据库菜单使用MCP工具INSERT即可" ], "passes": true }, { "id": "FE-400", "category": "audit-order", "priority": 0, "description": "审核订单列表页 - 分页表格+多条件筛选+操作按钮", "steps": [ "创建 src/modules/audit/ 模块目录(views/components/types/config.ts)", "创建 views/order-list.vue: el-table分页列表", "列: 订单号/订单类型(投保|理赔)/主机厂/审核状态(彩色tag)/Agent名称/耗时/创建时间/操作", "筛选: 订单类型下拉/审核状态下拉/时间范围选择/订单号搜索", "操作按钮: 查看详情/重新审核/人工复审", "API调用: POST /admin/audit/order/page", "路由注册: /audit/orders, config.ts配置", "数据库菜单: base_sys_menu新增审核管理目录+订单列表页面" ], "passes": false }, { "id": "FE-401", "category": "audit-order", "priority": 0, "description": "审核订单详情页 - 订单信息+步骤明细+Agent对话+审核结果", "steps": [ "创建 views/order-detail.vue: 多区块详情页", "区块1-基本信息: 订单号/类型/主机厂/状态/Agent/耗时 el-descriptions", "区块2-审核步骤明细: el-timeline时间线展示各步骤(stepType+stepName+score+passed+输出数据)", "区块3-OCR识别结果展示: 根据stepType动态渲染(身份证表格/发票表格/行驶证表格等)", "区块4-Agent对话过程: 可展开查看Supervisor与Skill的完整交互(复用message-item组件)", "区块5-最终审核结果: 通过/驳回/转人工 + 原因 + 评分", "操作: 重新审核按钮/人工复审按钮(弹窗输入备注+选择结果)", "API调用: POST /admin/audit/order/info + GET audit_order_detail列表" ], "passes": false }, { "id": "FE-402", "category": "audit-order", "priority": 0, "description": "审核统计面板 - 审核量/通过率/耗时分布/趋势图表", "steps": [ "创建 views/dashboard.vue: 审核数据看板", "统计卡片: 今日审核量/通过率/平均耗时/待审核数", "图表1: 近7天审核量趋势(折线图, echarts或自定义canvas)", "图表2: 审核结果分布(饼图: 通过/驳回/转人工/失败)", "图表3: 各主机厂审核量对比(柱状图)", "图表4: 审核耗时分布(直方图)", "支持时间范围切换(今日/本周/本月/自定义)", "API调用: POST /admin/audit/stats" ], "passes": false }, { "id": "FE-403", "category": "audit-order", "priority": 0, "description": "审核模块菜单配置 + 路由注册 + 类型定义", "steps": [ "创建 types/index.d.ts: AuditOrder/AuditOrderDetail/AuditStats接口定义", "创建 config.ts: 注册3个路由(/audit/orders, /audit/orders/:id, /audit/dashboard)", "数据库菜单: base_sys_menu新增审核管理目录(parentId=null) + 3个子页面", "菜单排序: 审核管理目录排在Agent管理之后", "验证: 登录后左侧菜单显示审核管理+子菜单, 点击跳转正常" ], "passes": false }, { "id": "FE-500", "category": "agent", "priority": 0, "description": "Agent对话页实时语音交互 - Socket.io连接+麦克风录音+TTS播放+全屏语音面板", "steps": [ "创建 hooks/realtime-voice.ts: useRealtimeVoice composable(Socket.io连接/麦克风PCM录音/TTS句子级缓冲播放/状态机/ASR&Chat消息管理)", "创建 components/voice-chat-button.vue: 麦克风图标按钮(Agent配置realtime_voice Skill时显示)", "创建 components/voice-chat-panel.vue: 全屏语音对话面板(对话气泡+通话计时+静音/挂断)", "修改 views/chat.vue: 集成语音按钮和面板, hasVoiceSkill计算属性", "修改 types/index.d.ts: 新增VoiceMessage接口", "验证: 选择配置了realtime_voice Skill的Agent→显示麦克风按钮→点击弹出面板→说话→ASR文字出现→AI回复出现→TTS音频播放" ], "passes": false }, { "id": "FE-501", "category": "agent", "priority": 0, "description": "Skill配置面板改进 - 实时语音音色下拉+模型下拉+文生图配置", "steps": [ "修改 components/skill-config.vue: 实时语音音色改为filterable allow-create下拉(4个精品音色选项)", "修改 components/skill-config.vue: 模型版本改为下拉选择(O/O2.0/SC/SC2.0)", "修改 components/skill-config.vue: 文生图Skill配置面板(分辨率/宽高比/输出格式/水印等)", "验证: Skill管理页→实时语音Skill→参数配置→音色下拉正确显示,文生图Skill配置面板正确显示" ], "passes": false } ]