From 9913e9a8d8ac48dfcb019403e3b8c1f9f1db8732 Mon Sep 17 00:00:00 2001 From: tommy Date: Sun, 19 Jul 2026 03:55:34 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E8=87=AA=E5=8B=95=E8=B7=B3=E8=BD=89bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DoWorkbench/DoWorkbenchTabs.tsx | 11 ++++++++--- .../DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx | 6 +++++- src/components/ItemTracing/ItemTracingDocLink.tsx | 4 ++++ src/components/Jodetail/JodetailSearch.tsx | 3 +++ src/components/Jodetail/completeJobOrderRecord.tsx | 5 +++++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/components/DoWorkbench/DoWorkbenchTabs.tsx b/src/components/DoWorkbench/DoWorkbenchTabs.tsx index 05c24a8..20eef11 100644 --- a/src/components/DoWorkbench/DoWorkbenchTabs.tsx +++ b/src/components/DoWorkbench/DoWorkbenchTabs.tsx @@ -74,6 +74,8 @@ const DoWorkbenchTabsInner: React.FC = ({ defaultTabIndex = 0, printerCom urlTargetDateRaw && urlTargetDateRaw.trim() !== "" ? decodeURIComponent(urlTargetDateRaw.trim()) : null; + /** Item Tracing deep-link only; DO finish redirect must not set this. */ + const urlOpenDetail = searchParams.get("openDetail") === "1"; const [tab, setTab] = React.useState(defaultTabIndex); const [lanePanelPrefs, setLanePanelPrefs] = React.useState( @@ -147,10 +149,11 @@ const DoWorkbenchTabsInner: React.FC = ({ defaultTabIndex = 0, printerCom setTab(newTab); const params = new URLSearchParams(searchParams.toString()); params.set("tab", String(newTab)); - /* ticketNo / targetDate deep-link for Finished Good Record tabs */ + /* ticketNo / targetDate / openDetail deep-link for Finished Good Record tabs */ if (newTab !== 2 && newTab !== 3) { params.delete("ticketNo"); params.delete("targetDate"); + params.delete("openDetail"); } const qs = params.toString(); router.replace(qs ? `${pathname}?${qs}` : pathname, { scroll: false }); @@ -380,24 +383,26 @@ const DoWorkbenchTabsInner: React.FC = ({ defaultTabIndex = 0, printerCom diff --git a/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx b/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx index bec0322..c304353 100644 --- a/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx +++ b/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx @@ -48,6 +48,8 @@ type Props = { labelPrinter: PrinterCombo | null; initialTicketNo?: string | null; initialTargetDate?: string | null; + /** When true (Item Tracing `openDetail=1`), auto-open matching ticket detail. */ + openDetail?: boolean; }; const GoodPickExecutionWorkbenchRecord: React.FC = ({ @@ -57,6 +59,7 @@ const GoodPickExecutionWorkbenchRecord: React.FC = ({ labelPrinter, initialTicketNo, initialTargetDate, + openDetail = false, }) => { const { t } = useTranslation("pickOrder"); const { data: session } = useSession() as { data: SessionWithTokens | null }; @@ -509,13 +512,14 @@ const GoodPickExecutionWorkbenchRecord: React.FC = ({ const initialDetailOpenedRef = useRef(false); useEffect(() => { + if (!openDetail) return; if (initialDetailOpenedRef.current || loading || !initialTicketNo?.trim()) return; const tn = initialTicketNo.trim(); const match = records.find((r) => r.ticketNo?.trim() === tn); if (!match) return; initialDetailOpenedRef.current = true; void handleDetailClick(match); - }, [records, loading, initialTicketNo, handleDetailClick]); + }, [openDetail, records, loading, initialTicketNo, handleDetailClick]); const handleBackToList = useCallback(() => { setShowDetailView(false); diff --git a/src/components/ItemTracing/ItemTracingDocLink.tsx b/src/components/ItemTracing/ItemTracingDocLink.tsx index 44a198d..118b064 100644 --- a/src/components/ItemTracing/ItemTracingDocLink.tsx +++ b/src/components/ItemTracing/ItemTracingDocLink.tsx @@ -47,6 +47,8 @@ const ItemTracingDocLink: React.FC = ({ params.set("tab", String(workbenchTab)); params.set("ticketNo", ticketNo.trim()); if (linkTargetDate) params.set("targetDate", linkTargetDate); + // Only Item Tracing deep-links should auto-open detail (not DO finish redirect). + params.set("openDetail", "1"); href = `/doworkbench?${params.toString()}`; } else if (kind === "jodetail" && (consoCode || code)) { const params = new URLSearchParams(); @@ -54,6 +56,7 @@ const ItemTracingDocLink: React.FC = ({ // Prefer PI-* pick order code for jodetail search; consoCode may be PICK-*. params.set("pickOrderCode", (code || consoCode || "").trim()); if (linkTargetDate) params.set("targetDate", linkTargetDate); + params.set("openDetail", "1"); href = `/jodetail?${params.toString()}`; } else if (kind === "pick") { // /pickOrder/detail?consoCode=… is retired — only link when we have a TI-* workbench ticket. @@ -65,6 +68,7 @@ const ItemTracingDocLink: React.FC = ({ params.set("tab", String(workbenchTab)); params.set("ticketNo", workbenchTicket); if (linkTargetDate) params.set("targetDate", linkTargetDate); + params.set("openDetail", "1"); href = `/doworkbench?${params.toString()}`; } else { return <>{code}; diff --git a/src/components/Jodetail/JodetailSearch.tsx b/src/components/Jodetail/JodetailSearch.tsx index 5a410b6..d0535af 100644 --- a/src/components/Jodetail/JodetailSearch.tsx +++ b/src/components/Jodetail/JodetailSearch.tsx @@ -62,6 +62,8 @@ const JodetailSearch: React.FC = ({ printerCombo }) => { const match = urlTargetDateRaw.match(/(\d{4}-\d{2}-\d{2})/); return match ? match[1] : undefined; })(); + /** Item Tracing deep-link only; other navigations must not set this. */ + const urlOpenDetail = searchParams.get("openDetail") === "1"; const urlTabIndex = useMemo(() => { if (urlTabRaw == null) return undefined; const n = parseInt(urlTabRaw, 10); @@ -513,6 +515,7 @@ const JodetailSearch: React.FC = ({ printerCombo }) => { printQty={printQty} initialPickOrderCode={urlPickOrderCode} initialTargetDate={urlTargetDate} + openDetail={urlOpenDetail} /> )} {tabIndex === 2 && } diff --git a/src/components/Jodetail/completeJobOrderRecord.tsx b/src/components/Jodetail/completeJobOrderRecord.tsx index b67f9eb..939fe18 100644 --- a/src/components/Jodetail/completeJobOrderRecord.tsx +++ b/src/components/Jodetail/completeJobOrderRecord.tsx @@ -60,6 +60,8 @@ interface Props { printQty?: number; initialPickOrderCode?: string; initialTargetDate?: string; + /** When true (Item Tracing `openDetail=1`), auto-open matching pick-order detail. */ + openDetail?: boolean; } // 修改:已完成的 Job Order Pick Order 接口 @@ -121,6 +123,7 @@ const CompleteJobOrderRecord: React.FC = ({ printQty: printQtyProp, initialPickOrderCode, initialTargetDate, + openDetail = false, }) => { const { t } = useTranslation("jo"); const router = useRouter(); @@ -383,6 +386,7 @@ const CompleteJobOrderRecord: React.FC = ({ }, [fetchLotDetailsData]); useEffect(() => { + if (!openDetail) return; if (initialDetailOpenedRef.current || completedJobOrderPickOrdersLoading) return; const code = initialPickOrderCode?.trim(); if (!code) return; @@ -395,6 +399,7 @@ const CompleteJobOrderRecord: React.FC = ({ initialDetailOpenedRef.current = true; void handleDetailClick(match); }, [ + openDetail, completedJobOrderPickOrders, completedJobOrderPickOrdersLoading, initialPickOrderCode,