From 09984951fb86aedc953c48681730f87adc86dab0 Mon Sep 17 00:00:00 2001 From: duxingchen Date: Thu, 3 Sep 2026 16:27:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E5=B1=80=E6=A6=82=E8=A7=88/?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E7=AE=A1=E7=90=86/=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E7=9C=8B=E6=9D=BF=E8=B7=B3=E8=BD=AC=E7=BB=9F=E4=B8=80=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=96=B0=E6=A0=87=E7=AD=BE=E9=A1=B5=E6=89=93=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/admin/AdminDashboard.tsx | 20 +++++++------------ frontend/src/pages/admin/AdminPeoplePage.tsx | 7 ++----- .../src/pages/admin/AdminProductsPage.tsx | 4 +--- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/frontend/src/pages/admin/AdminDashboard.tsx b/frontend/src/pages/admin/AdminDashboard.tsx index 6829e27..a839a46 100644 --- a/frontend/src/pages/admin/AdminDashboard.tsx +++ b/frontend/src/pages/admin/AdminDashboard.tsx @@ -4,7 +4,6 @@ import { RefreshCw, Loader2, AlertCircle, ArrowRight, ArrowUp, ArrowDown, ArrowUpDown, Clock, MessageCircle, CheckCircle2, Users, } from "lucide-react"; -import { useNavigate } from "react-router-dom"; import { Radio, DatePicker, Drawer, Input } from "antd"; import dayjs, { type Dayjs } from "dayjs"; import { @@ -79,10 +78,9 @@ function durationLabel(h: number) { } function WipRow({ t }: { t: WipTask }) { - const nav = useNavigate(); const handleClick = () => { if (t.product_sn) { - nav(`/admin/tasks?sn=${t.product_sn}`); + window.open(`/admin/tasks?sn=${t.product_sn}`, "_blank"); } }; return ( @@ -162,11 +160,10 @@ function MsgRow({ m }: { m: ProductMessageItem }) { // ─── 已完成明细项(卡片式) ───────────────────────────── function CompletedRow({ t }: { t: CompletedTask }) { - const nav = useNavigate(); const completedTime = t.completed_at ? dayjs(t.completed_at).format("YYYY-MM-DD HH:mm") : ""; return (
t.product_sn && nav(`/admin/tasks?sn=${t.product_sn}`)} + onClick={() => t.product_sn && window.open(`/admin/tasks?sn=${t.product_sn}`, "_blank")} className="cursor-pointer rounded-lg border border-gray-100 bg-white px-4 py-3 transition-shadow hover:border-emerald-200 hover:shadow-md" >
@@ -191,12 +188,11 @@ function CompletedRow({ t }: { t: CompletedTask }) { // ─── 被驳回明细项(卡片式) ────────────────────────────── function RejectedRow({ t }: { t: RejectedTask }) { - const nav = useNavigate(); const timeStr = t.rejected_at ? dayjs(t.rejected_at).format("YYYY-MM-DD HH:mm") : ""; const isRework = t.kind === "rework"; return (
t.product_sn && nav(`/admin/tasks?sn=${t.product_sn}`)} + onClick={() => t.product_sn && window.open(`/admin/tasks?sn=${t.product_sn}`, "_blank")} className="cursor-pointer rounded-lg border border-gray-100 bg-white px-4 py-3 transition-shadow hover:border-red-200 hover:shadow-md" >
@@ -286,8 +282,6 @@ export default function AdminDashboard() { const [opDetailLoading, setOpDetailLoading] = useState(false); const [opDetailTitle, setOpDetailTitle] = useState(""); - const navigate = useNavigate(); - // ── 加载主数据 ── const loadData = useCallback((key: DateRangeKey, range: [Dayjs, Dayjs] | null) => { setLoading(true); @@ -536,7 +530,7 @@ export default function AdminDashboard() {
- - - diff --git a/frontend/src/pages/admin/AdminPeoplePage.tsx b/frontend/src/pages/admin/AdminPeoplePage.tsx index 437349e..b528b04 100644 --- a/frontend/src/pages/admin/AdminPeoplePage.tsx +++ b/frontend/src/pages/admin/AdminPeoplePage.tsx @@ -1,9 +1,8 @@ /** 人员看板 — 实时在制品 + 历史工时台账 */ import { useEffect, useMemo, useState } from "react"; import { - Users, Package, ChevronDown, ChevronRight, Loader2, AlertCircle, RefreshCw, Clock, Download, + Users, Package, ChevronDown, ChevronRight, Loader2, AlertCircle, Clock, Download, } from "lucide-react"; -import { useNavigate } from "react-router-dom"; import { Radio, DatePicker, Table, Button, AutoComplete, Modal, Timeline, Image, Select } from "antd"; import type { ColumnsType } from "antd/es/table"; import dayjs, { type Dayjs } from "dayjs"; @@ -83,8 +82,6 @@ export default function AdminPeoplePage() { } }); - const navigate = useNavigate(); - const load = () => { setLoading(true); fetchPeopleWorkload() @@ -338,7 +335,7 @@ export default function AdminPeoplePage() { {w.devices.map((d) => (
navigate(`/admin/tasks?sn=${d.serial_number}`)} + onClick={() => window.open(`/admin/tasks?sn=${d.serial_number}`, "_blank")} className="flex cursor-pointer items-center gap-3 rounded-lg border border-gray-100 bg-white px-4 py-2.5 transition-shadow hover:border-blue-200 hover:shadow-md" > diff --git a/frontend/src/pages/admin/AdminProductsPage.tsx b/frontend/src/pages/admin/AdminProductsPage.tsx index 784a823..8e0c0b6 100644 --- a/frontend/src/pages/admin/AdminProductsPage.tsx +++ b/frontend/src/pages/admin/AdminProductsPage.tsx @@ -1,5 +1,4 @@ import { useEffect, useState, useMemo } from "react"; -import { useNavigate } from "react-router-dom"; import { Printer, RefreshCw, Loader2, QrCode, Plus, Settings, X, Package, Hash, Tag, MapPin, Clock, Timer, CalendarDays, @@ -29,7 +28,6 @@ interface ProductGroup { groupKey: string; products: ProductResponse[]; allInWar export default function AdminProductsPage() { const { toast } = useToast(); - const navigate = useNavigate(); const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -229,7 +227,7 @@ export default function AdminProductsPage() {
{group.products.map(p => ( -
navigate(`/admin/tasks?sn=${p.serial_number}`)} className="group relative flex cursor-pointer flex-col rounded-xl bg-white shadow-sm ring-1 ring-gray-100 transition-shadow hover:shadow-md"> +
window.open(`/admin/tasks?sn=${p.serial_number}`, "_blank")} className="group relative flex cursor-pointer flex-col rounded-xl bg-white shadow-sm ring-1 ring-gray-100 transition-shadow hover:shadow-md">