From de775f4215716901eb7c63efe4264096ffb41db1 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Wed, 29 Apr 2026 11:11:13 +0800 Subject: [PATCH] fix ticket release table ui and can not continue use lot print model --- .../WorkbenchGoodPickExecutionDetail.tsx | 2 + .../WorkbenchTicketReleaseTable.tsx | 94 +++++++++++++++++-- .../JoWorkbench/newJobPickExecution.tsx | 2 + .../WorkbenchPickExecution.tsx | 2 +- .../ProductionProcessList.tsx | 1 + 5 files changed, 91 insertions(+), 10 deletions(-) diff --git a/src/components/DoWorkbench/WorkbenchGoodPickExecutionDetail.tsx b/src/components/DoWorkbench/WorkbenchGoodPickExecutionDetail.tsx index 54abc51..15028cb 100644 --- a/src/components/DoWorkbench/WorkbenchGoodPickExecutionDetail.tsx +++ b/src/components/DoWorkbench/WorkbenchGoodPickExecutionDetail.tsx @@ -996,6 +996,8 @@ const fetchAllCombinedLotData = useCallback(async (userId?: number, pickOrderIdO setWorkbenchLotLabelInitialPayload(null); } setWorkbenchLotLabelReminderText(reminderText ?? null); + // Clear latched success so the lot-label modal effect cannot instantly re-close on open. + setQrScanSuccess(false); setWorkbenchLotLabelModalOpen(true); }, [], diff --git a/src/components/DoWorkbench/WorkbenchTicketReleaseTable.tsx b/src/components/DoWorkbench/WorkbenchTicketReleaseTable.tsx index 7418579..46625b7 100644 --- a/src/components/DoWorkbench/WorkbenchTicketReleaseTable.tsx +++ b/src/components/DoWorkbench/WorkbenchTicketReleaseTable.tsx @@ -49,6 +49,18 @@ function requiredDeliveryDateToDayString(value: unknown): string { return dayjs(value as string | number | Date).format("YYYY-MM-DD"); } +function formatTicketDateTime(value: unknown): string { + if (!value) return "-"; + if (Array.isArray(value)) { + return arrayToDayjs(value as number[], true).format("HH:mm"); + } + const parsedDate = dayjs(value as string, "YYYYMMDDHHmmss"); + if (!parsedDate.isValid()) { + return dayjs(value as string | number | Date).format("HH:mm"); + } + return parsedDate.format("HH:mm"); +} + function isCompletedStatus(status: string | null | undefined): boolean { return (status ?? "").toLowerCase() === "completed"; } @@ -71,6 +83,8 @@ const WorkbenchTicketReleaseTableTab: React.FC = () => { const [selectedStatus, setSelectedStatus] = useState("released"); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); + const [now, setNow] = useState(dayjs()); + const [lastDataRefreshTime, setLastDataRefreshTime] = useState(null); const [paginationController, setPaginationController] = useState({ pageNum: 0, pageSize: 5, @@ -82,6 +96,7 @@ const WorkbenchTicketReleaseTableTab: React.FC = () => { const dayStr = queryDate.format("YYYY-MM-DD"); const result = await fetchWorkbenchTicketReleaseTable(dayStr, dayStr); setData(result); + setLastDataRefreshTime(dayjs()); } catch (error) { console.error("Error fetching workbench ticket release table:", error); setData([]); @@ -92,8 +107,17 @@ const WorkbenchTicketReleaseTableTab: React.FC = () => { useEffect(() => { void loadData(); + const id = setInterval(() => { + void loadData(); + }, 5 * 60 * 1000); + return () => clearInterval(id); }, [loadData]); + useEffect(() => { + const tick = setInterval(() => setNow(dayjs()), 30 * 1000); + return () => clearInterval(tick); + }, []); + const dayStr = queryDate.format("YYYY-MM-DD"); const filteredData = useMemo(() => { return data.filter((item) => { @@ -231,6 +255,16 @@ const WorkbenchTicketReleaseTableTab: React.FC = () => { {t("completed")} + + + + {t("Now")}: {now.format("HH:mm")} + + + {t("Auto-refresh every 5 minutes")} | {t("Last updated")}:{" "} + {lastDataRefreshTime ? lastDataRefreshTime.format("HH:mm:ss") : "--:--:--"} + + {loading ? ( @@ -240,17 +274,47 @@ const WorkbenchTicketReleaseTableTab: React.FC = () => { ) : ( <> - +
- + {t("Store ID")} {t("Required Delivery Date")} - {t("Truck Information")} - {t("Shop Name")} + + + + {t("Truck Information")} + + + {t("Truck Lane Code")} - {t("Departure Time")} + + + + {t("Shop Name")} {t("Loading Sequence")} - {t("Ticket Information")} + + + + {t("Ticket Information")} + + + {t("Ticket No.")} ({t("Status")}) + + + {t("Released Time")} - {t("Completed Time")} + + + {t("Handler Name")} - {t("Number of FG Items (Order Item(s) Count)")} + + {t("Number of FG Items (Order Item(s) Count)")} + {t("Actions")} @@ -276,13 +340,25 @@ const WorkbenchTicketReleaseTableTab: React.FC = () => { {row.truckDepartureTime && } - {row.shopName || "-"} + {row.shopName || "-"} {row.loadingSequence ?? "-"} - {row.ticketNo || "-"} ({row.ticketStatus ? t(row.ticketStatus.toLowerCase()) : "-"}) + + + {row.ticketNo || "-"} ({row.ticketStatus ? t(row.ticketStatus.toLowerCase()) : "-"}) + + + {t("Released Time")}: {formatTicketDateTime(row.ticketReleaseTime)} + + + {t("Completed Time")}: {formatTicketDateTime(row.ticketCompleteDateTime)} + + {row.handlerName ?? "-"} - {row.numberOfFGItems ?? 0} + + {row.numberOfFGItems ?? 0} + {showDoPickOpsButtons(row) ? ( diff --git a/src/components/JoWorkbench/newJobPickExecution.tsx b/src/components/JoWorkbench/newJobPickExecution.tsx index c90f38f..48d0f48 100644 --- a/src/components/JoWorkbench/newJobPickExecution.tsx +++ b/src/components/JoWorkbench/newJobPickExecution.tsx @@ -1083,6 +1083,8 @@ const JobPickExecution: React.FC = ({ filterArgs, onBackToList }) => { setWorkbenchLotLabelInitialPayload(null); } setWorkbenchLotLabelReminderText(reminderText ?? null); + // Clear latched success so the lot-label modal effect cannot instantly re-close on open. + setQrScanSuccess(false); setWorkbenchLotLabelModalOpen(true); }, []); diff --git a/src/components/PickOrderSearch/WorkbenchPickExecution.tsx b/src/components/PickOrderSearch/WorkbenchPickExecution.tsx index c5d635c..a419267 100644 --- a/src/components/PickOrderSearch/WorkbenchPickExecution.tsx +++ b/src/components/PickOrderSearch/WorkbenchPickExecution.tsx @@ -1495,7 +1495,7 @@ const WorkbenchPickExecution: React.FC = ({ filterArgs }) => { onClick={() => openWorkbenchLotLabelModalForLot(r)} sx={{ flexShrink: 0, fontSize: "0.7rem", py: 0.25, minWidth: "auto", px: 1, whiteSpace: "nowrap" }} > - {t("挑號 QR 碼")} + {t(" 批號 QR 碼")} ) : null} diff --git a/src/components/ProductionProcess/ProductionProcessList.tsx b/src/components/ProductionProcess/ProductionProcessList.tsx index 5fcafe8..2c2a34c 100644 --- a/src/components/ProductionProcess/ProductionProcessList.tsx +++ b/src/components/ProductionProcess/ProductionProcessList.tsx @@ -555,6 +555,7 @@ const ProductProcessList: React.FC = ({ {t("Job Order")}: {jobOrderCode} +