import { useState, useCallback, useMemo, memo } from "react"; import { Search, Loader2, AlertCircle, GitBranch, RefreshCw, X, Plus, Warehouse, UserPlus, } from "lucide-react"; import TaskFlowView from "./TaskFlowView"; import { getTaskTree, receiveTask, rejectTask, transferTask, } from "../../services/taskApi"; import { useToast } from "../ui/Toast"; import type { ProductScanResponse, TaskResponse } from "../../types/api"; import { getStatusConfig } from "../../constants/task"; // ============================================================ // 通用 Modal 容器 // ============================================================ const Modal = memo(function Modal({ open, onClose, title, children, }: { open: boolean; onClose: () => void; title: string; children: React.ReactNode; }) { if (!open) return null; return (
{/* 遮罩 */}
{/* 弹窗 */}

{title}

{children}
); }); // ============================================================ // 确认接收弹窗 // ============================================================ export const ReceiveConfirmModal = memo(function ReceiveConfirmModal({ open, task, submitting, onClose, onConfirm, }: { open: boolean; task: TaskResponse | null; submitting: boolean; onClose: () => void; onConfirm: () => void; }) { if (!task) return null; return (

{task.task_name}

当前状态: {getStatusConfig(task.status).label} {" → "} 进行中 (WIP)

确认接收后,该任务将标记为"进行中",系统将记录接收时间。

); }); // ============================================================ // 品质驳回弹窗 // ============================================================ export const RejectModal = memo(function RejectModal({ open, task, submitting, onClose, onSubmit, }: { open: boolean; task: TaskResponse | null; submitting: boolean; onClose: () => void; onSubmit: (reason: string) => void; }) { const [reason, setReason] = useState(""); if (!task) return null; function handleSubmit(e: React.FormEvent) { e.preventDefault(); const trimmed = reason.trim(); if (!trimmed) return; onSubmit(trimmed); setReason(""); } function handleClose() { setReason(""); onClose(); } return (

{task.task_name}

⚠ 驳回后将自动生成返工任务,分配给上一道工序负责人