feat: 看板重构 — 在制品看板 + 留言未读数

核心理念转变:
  旧: 最近操作历史(谁做了什么)
  新: 当前在制品状态(谁的活卡了多久)

后端:
  - DashboardStats 新增 unread_messages(协同留言总数)
  - 新增 GET /dashboard/wip-tasks(在制品端点)
  - 按滞留时间升序排列,PENDING/WIP 任务倒计时
  - 自动计算 duration_hours(已滞留小时数)

前端:
  - 品质卡片: 新增留言未读数(紫色)
  - 在制品看板: 替换原最近动态
    每行显示: 状态徽标 | 任务名+负责人+身份证 | 滞留时长
  - 滞留颜色: 48h+红 | 24h+橙 | 8h+黄 | <8h灰
  - 系统通知可点击跳转
This commit is contained in:
2026-08-12 13:40:08 +08:00
parent 00fae01eed
commit 39377ae5e4
4 changed files with 155 additions and 202 deletions

View File

@ -12,15 +12,17 @@ export interface DashboardStats {
tasks_rejected: number;
tasks_rework: number;
unread_notifications: number;
unread_messages: number;
}
export interface RecentActivity {
action: string;
export interface WipTask {
task_id: string;
task_name: string;
operator: string;
assignee: string;
product_sn: string;
time: string;
remark: string | null;
status: string;
received_at: string;
duration_hours: number;
}
export async function fetchDashboardStats(): Promise<DashboardStats> {
@ -28,14 +30,7 @@ export async function fetchDashboardStats(): Promise<DashboardStats> {
return data;
}
export async function fetchRecentActivity(
limit = 10,
since?: string,
until?: string,
): Promise<RecentActivity[]> {
const params: Record<string, string | number> = { limit };
if (since) params.since = since;
if (until) params.until = until;
const { data } = await api.get<RecentActivity[]>("/dashboard/recent-activity", { params });
export async function fetchWipTasks(limit = 20): Promise<WipTask[]> {
const { data } = await api.get<WipTask[]>("/dashboard/wip-tasks", { params: { limit } });
return data;
}