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?) — 完工裂变转交
131 lines
3.5 KiB
TypeScript
131 lines
3.5 KiB
TypeScript
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;
|
||
}
|