Commit 8645a0f7 authored by edy's avatar edy

feat(ui): refine task workbench output panel

parent d60ecae9
Pipeline #18461 failed
...@@ -70,7 +70,7 @@ export function AppSidebar({ ...@@ -70,7 +70,7 @@ export function AppSidebar({
<nav className="nav-list" aria-label="主导航"> <nav className="nav-list" aria-label="主导航">
{[ {[
{ id: "chat" as const, label: "对话" }, { id: "chat" as const, label: "对话" },
{ id: "tasks" as const, label: "任务面板" }, { id: "tasks" as const, label: "工作台" },
{ id: "knowledge" as const, label: ui.knowledge }, { id: "knowledge" as const, label: ui.knowledge },
{ id: "plugins" as const, label: ui.plugins }, { id: "plugins" as const, label: ui.plugins },
{ id: "settings" as const, label: ui.settings } { id: "settings" as const, label: ui.settings }
......
import type { TaskPanelItem } from "@qjclaw/shared-types" import type { TaskPanelItem } from "@qjclaw/shared-types"
export interface TaskPanelSummary {
creditsUsed: number
messageCount: number
artifactCount: number
employeeCount: number
}
function toDateInputValue(date: Date) { function toDateInputValue(date: Date) {
const year = date.getFullYear() const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, "0") const month = String(date.getMonth() + 1).padStart(2, "0")
...@@ -25,12 +32,15 @@ export const mockTaskPanelItems: TaskPanelItem[] = [ ...@@ -25,12 +32,15 @@ export const mockTaskPanelItems: TaskPanelItem[] = [
taskTitle: "整理本周选题方向与发布节奏", taskTitle: "整理本周选题方向与发布节奏",
status: "running", status: "running",
statusDetail: "正在汇总账号定位、目标人群和栏目节奏", statusDetail: "正在汇总账号定位、目标人群和栏目节奏",
creditsUsed: 1280,
messageCount: 36,
updatedAt: "10:42",
artifacts: [ artifacts: [
{ id: "artifact-content-outline", name: "选题规划草稿.md", kind: "文档", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/选题规划草稿.md" }, { id: "artifact-content-outline", name: "选题规划草稿.md", kind: "文档", summary: "本周内容主线、栏目节奏与素材需求草案。", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/选题规划草稿.md" },
{ id: "artifact-content-calendar", name: "发布日历.xlsx", kind: "表格", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/发布日历.xlsx" }, { id: "artifact-content-calendar", name: "发布日历.xlsx", kind: "表格", summary: "按平台拆分的发布排期与负责人视图。", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/发布日历.xlsx" },
{ id: "artifact-content-persona", name: "目标人群画像.md", kind: "文档", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/目标人群画像.md" }, { id: "artifact-content-persona", name: "目标人群画像.md", kind: "文档", summary: "核心受众痛点、决策因素与内容偏好。", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/目标人群画像.md" },
{ id: "artifact-content-topics", name: "栏目选题池.csv", kind: "表格", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/栏目选题池.csv" }, { id: "artifact-content-topics", name: "栏目选题池.csv", kind: "表格", summary: "可复用选题、关键词和参考链接集合。", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/栏目选题池.csv" },
{ id: "artifact-content-brief", name: "账号定位简报.pdf", kind: "文档", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/账号定位简报.pdf" } { id: "artifact-content-brief", name: "账号定位简报.pdf", kind: "文档", summary: "账号定位、差异化表达和近期目标摘要。", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/账号定位简报.pdf" }
] ]
}, },
{ {
...@@ -40,8 +50,11 @@ export const mockTaskPanelItems: TaskPanelItem[] = [ ...@@ -40,8 +50,11 @@ export const mockTaskPanelItems: TaskPanelItem[] = [
taskTitle: "复盘昨日内容表现", taskTitle: "复盘昨日内容表现",
status: "completed", status: "completed",
statusDetail: "已完成互动数据摘要与优化建议", statusDetail: "已完成互动数据摘要与优化建议",
creditsUsed: 640,
messageCount: 18,
updatedAt: "09:18",
artifacts: [ artifacts: [
{ id: "artifact-content-review", name: "昨日内容复盘与下轮优化建议.md", kind: "文档", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/昨日内容复盘与下轮优化建议.md" } { id: "artifact-content-review", name: "昨日内容复盘与下轮优化建议.md", kind: "文档", summary: "互动、转化和评论反馈的复盘结论。", url: "/Users/edy/Documents/qianjiangclaw/tasks/content/昨日内容复盘与下轮优化建议.md" }
] ]
}, },
{ {
...@@ -51,8 +64,11 @@ export const mockTaskPanelItems: TaskPanelItem[] = [ ...@@ -51,8 +64,11 @@ export const mockTaskPanelItems: TaskPanelItem[] = [
taskTitle: "生成知乎回答结构", taskTitle: "生成知乎回答结构",
status: "completed", status: "completed",
statusDetail: "已完成回答大纲与首版正文", statusDetail: "已完成回答大纲与首版正文",
creditsUsed: 920,
messageCount: 24,
updatedAt: "11:05",
artifacts: [ artifacts: [
{ id: "artifact-zhihu-answer", name: "知乎回答初稿.md", kind: "文档", url: "/Users/edy/Documents/qianjiangclaw/tasks/zhihu/知乎回答初稿.md" } { id: "artifact-zhihu-answer", name: "知乎回答初稿.md", kind: "文档", summary: "问题拆解、回答结构和首版正文内容。", url: "/Users/edy/Documents/qianjiangclaw/tasks/zhihu/知乎回答初稿.md" }
] ]
}, },
{ {
...@@ -62,8 +78,11 @@ export const mockTaskPanelItems: TaskPanelItem[] = [ ...@@ -62,8 +78,11 @@ export const mockTaskPanelItems: TaskPanelItem[] = [
taskTitle: "整理竞品问答素材", taskTitle: "整理竞品问答素材",
status: "running", status: "running",
statusDetail: "正在提取高赞回答结构和关键词", statusDetail: "正在提取高赞回答结构和关键词",
creditsUsed: 760,
messageCount: 21,
updatedAt: "11:36",
artifacts: [ artifacts: [
{ id: "artifact-zhihu-research", name: "竞品问答素材汇总-长文件名用于验证省略显示效果.xlsx", kind: "表格", url: "/Users/edy/Documents/qianjiangclaw/tasks/zhihu/竞品问答素材汇总-长文件名用于验证省略显示效果.xlsx" } { id: "artifact-zhihu-research", name: "竞品问答素材汇总-长文件名用于验证省略显示效果.xlsx", kind: "表格", summary: "高赞回答结构、关键词和引用素材汇总。", url: "/Users/edy/Documents/qianjiangclaw/tasks/zhihu/竞品问答素材汇总-长文件名用于验证省略显示效果.xlsx" }
] ]
}, },
{ {
...@@ -73,6 +92,9 @@ export const mockTaskPanelItems: TaskPanelItem[] = [ ...@@ -73,6 +92,9 @@ export const mockTaskPanelItems: TaskPanelItem[] = [
taskTitle: "筛选高意向线索名单", taskTitle: "筛选高意向线索名单",
status: "pending", status: "pending",
statusDetail: "等待线索表上传后开始处理", statusDetail: "等待线索表上传后开始处理",
creditsUsed: 0,
messageCount: 4,
updatedAt: "12:10",
artifacts: [] artifacts: []
}, },
{ {
...@@ -82,12 +104,47 @@ export const mockTaskPanelItems: TaskPanelItem[] = [ ...@@ -82,12 +104,47 @@ export const mockTaskPanelItems: TaskPanelItem[] = [
taskTitle: "生成活动海报文案", taskTitle: "生成活动海报文案",
status: "failed", status: "failed",
statusDetail: "素材包缺少主视觉图片", statusDetail: "素材包缺少主视觉图片",
creditsUsed: 360,
messageCount: 12,
updatedAt: "18:22",
artifacts: [
{ id: "artifact-poster-brief", name: "活动海报文案草稿.txt", kind: "文档", summary: "活动主题、主标题和利益点文案草稿。", url: "/Users/edy/Documents/qianjiangclaw/tasks/poster/活动海报文案草稿.txt" }
]
},
{
id: "mock-task-yesterday-leads",
date: toDateInputValue(addDays(new Date(), -1)),
expertName: "平台精准线索专家",
taskTitle: "清洗昨日线索表",
status: "completed",
statusDetail: "已完成重复线索剔除和等级标注",
creditsUsed: 520,
messageCount: 16,
updatedAt: "17:40",
artifacts: [ artifacts: [
{ id: "artifact-poster-brief", name: "活动海报文案草稿.txt", kind: "文档", url: "/Users/edy/Documents/qianjiangclaw/tasks/poster/活动海报文案草稿.txt" } { id: "artifact-yesterday-leads", name: "昨日高意向线索清单.xlsx", kind: "表格", summary: "线索分级、跟进优先级和备注字段。", url: "/Users/edy/Documents/qianjiangclaw/tasks/leads/昨日高意向线索清单.xlsx" },
{ id: "artifact-yesterday-followup", name: "跟进话术建议.md", kind: "文档", summary: "按线索来源拆分的首轮沟通建议。", url: "/Users/edy/Documents/qianjiangclaw/tasks/leads/跟进话术建议.md" }
] ]
} }
] ]
export function summarizeTaskPanelItems(items: TaskPanelItem[]): TaskPanelSummary {
const employeeCount = new Set(items.map((item) => item.expertName)).size
const summary = items.reduce<TaskPanelSummary>((nextSummary, item) => {
nextSummary.creditsUsed += item.creditsUsed ?? 0
nextSummary.messageCount += item.messageCount ?? 0
nextSummary.artifactCount += item.artifacts.length
return nextSummary
}, {
creditsUsed: 0,
messageCount: 0,
artifactCount: 0,
employeeCount
})
return summary
}
export async function loadTaskPanelItems(date: string): Promise<TaskPanelItem[]> { export async function loadTaskPanelItems(date: string): Promise<TaskPanelItem[]> {
return mockTaskPanelItems.filter((item) => item.date === date) return mockTaskPanelItems.filter((item) => item.date === date)
} }
This diff is collapsed.
...@@ -861,6 +861,7 @@ export interface TaskPanelArtifact { ...@@ -861,6 +861,7 @@ export interface TaskPanelArtifact {
id: string; id: string;
name: string; name: string;
kind?: string; kind?: string;
summary?: string;
url?: string; url?: string;
} }
...@@ -871,6 +872,9 @@ export interface TaskPanelItem { ...@@ -871,6 +872,9 @@ export interface TaskPanelItem {
taskTitle: string; taskTitle: string;
status: TaskPanelStatus; status: TaskPanelStatus;
statusDetail: string; statusDetail: string;
creditsUsed?: number;
messageCount?: number;
updatedAt?: string;
artifacts: TaskPanelArtifact[]; artifacts: TaskPanelArtifact[];
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment