Files
track/frontend/src/services/taskApi.ts
duxingchen 2b5e3ae4c3 feat(frontend): 更新 TS 类型定义与 API 服务层,对接后端重构接口
types/api.ts:
- TaskSummary/TaskResponse 新增 is_rework, reject_reason, received_at, completed_at 字段
- 新增 TASK_STATUS 常量 (PENDING/WIP/COMPLETED/REJECTED/ARCHIVED)
- 新增 TaskTransferResponse, TaskRejectPayload, TaskTransferPayload 类型
- ProductScanResponse 新增 current_location_id, task_tree 字段

types/admin.ts:
- ProductResponse 新增 current_location_id 字段

services/taskApi.ts:
- 新增 getTaskTree(serialNumber) — 产品全景任务树
- 新增 receiveTask(taskId) — 确认接收
- 新增 rejectTask(taskId, reason) — 品质驳回
- 新增 transferTask(taskId, assignees, name, note?) — 完工裂变转交
2026-08-04 17:30:12 +08:00

131 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import api from "./api";
import type {
TaskResponse,
TaskCompleteResponse,
TaskTransferResponse,
TaskListResponse,
ProductScanResponse,
TaskRejectPayload,
TaskTransferPayload,
} from "../types/api";
// ============================================================
// 请求体类型
// ============================================================
export interface SubtaskCreatePayload {
task_name: string;
assignee_id: string | null;
notify_parent_on_complete: boolean;
}
export interface TaskCompletePayload {
operator_id: string | null;
next_assignee_id: string | null;
next_task_name: string | null;
remark: string | null;
}
// ============================================================
// API 方法
// ============================================================
/** 获取任务详情 — 递归包含子任务树 */
export async function getTask(taskId: string): Promise<TaskResponse> {
const { data } = await api.get<TaskResponse>(`/tasks/${taskId}`);
return data;
}
/** 获取任务列表(可按产品筛选) */
export async function listTasks(productId?: string): Promise<TaskListResponse> {
const params = productId ? { product_id: productId } : {};
const { data } = await api.get<TaskListResponse>("/tasks/", { params });
return data;
}
/** 创建子任务 */
export async function createSubtask(
parentTaskId: string,
payload: SubtaskCreatePayload
): Promise<TaskResponse> {
const { data } = await api.post<TaskResponse>(
`/tasks/${parentTaskId}/subtasks`,
payload
);
return data;
}
/** 完成任务 + 转交(旧版单步) */
export async function completeTask(
taskId: string,
payload: TaskCompletePayload
): Promise<TaskCompleteResponse> {
const { data } = await api.post<TaskCompleteResponse>(
`/tasks/${taskId}/complete`,
payload
);
return data;
}
// ============================================================
// 新版核心业务 API重构后
// ============================================================
/**
* 获取产品全景任务树 — 用于十字矩阵树状图。
* 对应后端 GET /api/v1/products/scan/{serialNumber}
*/
export async function getTaskTree(
serialNumber: string
): Promise<ProductScanResponse> {
const { data } = await api.get<ProductScanResponse>(
`/products/scan/${encodeURIComponent(serialNumber)}`
);
return data;
}
/**
* 确认接收任务 — PENDING → WIP。
* 对应后端 POST /api/v1/tasks/{taskId}/receive
*/
export async function receiveTask(taskId: string): Promise<TaskResponse> {
const { data } = await api.post<TaskResponse>(`/tasks/${taskId}/receive`);
return data;
}
/**
* 品质驳回 — → REJECTED后端自动创建返工任务。
* 对应后端 POST /api/v1/tasks/{taskId}/reject
*/
export async function rejectTask(
taskId: string,
reason: string
): Promise<TaskResponse> {
const { data } = await api.post<TaskResponse>(
`/tasks/${taskId}/reject`,
{ reason } satisfies TaskRejectPayload
);
return data;
}
/**
* 完工裂变转交 — → COMPLETED批量创建下家任务。
* 对应后端 POST /api/v1/tasks/{taskId}/transfer
*/
export async function transferTask(
taskId: string,
nextAssignees: string[],
nextTaskName: string,
note?: string
): Promise<TaskTransferResponse> {
const { data } = await api.post<TaskTransferResponse>(
`/tasks/${taskId}/transfer`,
{
next_assignees: nextAssignees,
next_task_name: nextTaskName,
note,
} satisfies TaskTransferPayload
);
return data;
}