feat: 看板全局时间筛选 + 协同留言抽屉
任务1 — 后端时间快照逻辑:
get_dashboard_stats 新增 since/until 参数
PENDING/WIP/总数 → 永远实时快照(忽略时间筛选)
COMPLETED/REJECTED → 严格按时段过滤
完成率基于过滤后的COMPLETED计算
任务2 — 前端时间筛选器:
Radio.Button: 今天 | 近7天 | 近30天 | 自定义
DatePicker.RangePicker 自定义区间
切换时重新拉取 /dashboard/stats
任务3 — 协同留言抽屉:
后端: GET /dashboard/messages(上帝视角全厂数据)
JOIN Product → serial_number + material_name
支持 keyword 搜: SN/物料名/留言人/内容
按 created_at 倒序
前端: Drawer + Input.Search + List
点击"留言"数字打开抽屉
分页展示: 留言人/内容/SN标签/物料名/时间
This commit is contained in:
@ -25,8 +25,25 @@ export interface WipTask {
|
||||
duration_hours: number;
|
||||
}
|
||||
|
||||
export async function fetchDashboardStats(): Promise<DashboardStats> {
|
||||
const { data } = await api.get<DashboardStats>("/dashboard/stats");
|
||||
export interface ProductMessageItem {
|
||||
id: string;
|
||||
content: string;
|
||||
operator_name: string;
|
||||
product_sn: string;
|
||||
material_name: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export interface ProductMessageList {
|
||||
items: ProductMessageItem[];
|
||||
total: number;
|
||||
}
|
||||
|
||||
export async function fetchDashboardStats(since?: string, until?: string): Promise<DashboardStats> {
|
||||
const params: Record<string, string> = {};
|
||||
if (since) params.since = since;
|
||||
if (until) params.until = until;
|
||||
const { data } = await api.get<DashboardStats>("/dashboard/stats", { params });
|
||||
return data;
|
||||
}
|
||||
|
||||
@ -34,3 +51,12 @@ export async function fetchWipTasks(limit = 20): Promise<WipTask[]> {
|
||||
const { data } = await api.get<WipTask[]>("/dashboard/wip-tasks", { params: { limit } });
|
||||
return data;
|
||||
}
|
||||
|
||||
export async function fetchDashboardMessages(
|
||||
keyword = "", skip = 0, limit = 30,
|
||||
): Promise<ProductMessageList> {
|
||||
const { data } = await api.get<ProductMessageList>("/dashboard/messages", {
|
||||
params: { keyword, skip, limit },
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user