"use client"; import { useCallback, useEffect, useState } from "react"; import { adminApi, errMessage, type WorkOrder } from "@/lib/admin-api"; import { Badge, Button, Card, EmptyState, ErrorState, LoadingBlock, Modal, Pagination, Select, StatCard, TableWrap, Td, TextInput, Th, formatTime, statusTone, useToast, } from "@/components/admin/ui"; const STATUS_OPTIONS = [ { value: "", label: "全部状态" }, { value: "待处理", label: "待处理" }, { value: "处理中", label: "处理中" }, { value: "待审核", label: "待审核" }, { value: "已完成", label: "已完成" }, { value: "已驳回", label: "已驳回" }, ]; export function WorkOrdersSection() { const toast = useToast(); const [items, setItems] = useState([]); const [total, setTotal] = useState(0); const [totalPages, setTotalPages] = useState(0); const [page, setPage] = useState(1); const [status, setStatus] = useState(""); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [busyId, setBusyId] = useState(null); const [reviewing, setReviewing] = useState(null); const load = useCallback(async () => { setLoading(true); setError(""); try { const result = await adminApi.workOrders({ status: status || undefined, page, page_size: 10 }); setItems(result.items ?? []); setTotal(result.total ?? 0); setTotalPages(result.total_pages ?? 0); } catch (e) { setError(errMessage(e, "工单列表加载失败")); } finally { setLoading(false); } }, [status, page]); useEffect(() => { void load(); }, [load]); async function run(id: number, task: () => Promise, message: string) { setBusyId(id); try { await task(); toast(message); await load(); } catch (e) { toast(errMessage(e, "操作失败"), "error"); } finally { setBusyId(null); } } const pending = items.filter((item) => item.status === "待处理").length; const reviewingCount = items.filter((item) => item.status === "待审核").length; return ( <>
0 ? "等待复核结论" : "暂无待复核工单"} />
{ setStatus(event.target.value); setPage(1); }}> {STATUS_OPTIONS.map((option) => ( ))} } > {loading ? ( ) : error ? ( void load()} /> ) : items.length === 0 ? ( ) : ( <> 工单号 类型 客户 当前节点 优先级 状态 创建时间 操作 {items.map((order) => ( {order.work_order_no} {order.order_type} {order.sub_type && · {order.sub_type}} #{order.customer_id ?? "--"} {order.current_node ?? "--"} {order.priority} {order.status} {formatTime(order.create_time)}
{order.status === "待处理" && ( )} {order.status === "处理中" && ( )} {order.status === "待审核" && ( )} {(order.status === "已完成" || order.status === "已驳回") && ( 已归档 )}
))}
)}
{reviewing && ( setReviewing(null)} onDone={async (approve, comment) => { await run( reviewing.id, () => adminApi.reviewWorkOrder(reviewing.id, approve, comment), approve ? "复核通过" : "已驳回" ); setReviewing(null); }} /> )} ); } function ReviewModal({ order, onClose, onDone, }: { order: WorkOrder; onClose: () => void; onDone: (approve: boolean, comment: string) => Promise; }) { const [comment, setComment] = useState(""); const [submitting, setSubmitting] = useState(false); async function submit(approve: boolean) { setSubmitting(true); try { await onDone(approve, comment); } finally { setSubmitting(false); } } return ( } >

工单类型:{order.order_type}

关联客户:#{order.customer_id ?? "--"}

优先级:{order.priority}

当前节点:{order.current_node ?? "--"}

{order.biz_content && (

业务内容

              {JSON.stringify(order.biz_content, null, 2)}
            
)}
setComment(event.target.value)} placeholder="填写复核说明" />
{order.handler_id !== null && (

提示:若复核人与处理人为同一人,系统仅提示不阻断。

)}
); }