diff --git a/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx b/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx index bff5df8..123175d 100644 --- a/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx +++ b/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx @@ -41,7 +41,9 @@ import dayjs, { Dayjs } from 'dayjs'; import { PrinterCombo } from "@/app/api/settings/printer"; import { Autocomplete } from "@mui/material"; import FGPickOrderTicketReleaseTable from "./FGPickOrderTicketReleaseTable"; -import TruckRoutingSummaryTab from "./TruckRoutingSummaryTab"; +import TruckRoutingSummaryTab, { TruckRoutingSummaryFilters } from "./TruckRoutingSummaryTab"; +import { clientAuthFetch } from "@/app/utils/clientAuthFetch"; +import { NEXT_PUBLIC_API_URL } from "@/config/api"; interface Props { pickOrders: PickOrderResult[]; @@ -75,6 +77,12 @@ const PickOrderSearch: React.FC = ({ pickOrders, printerCombo }) => { const [selectedPrinterForAllDraft, setSelectedPrinterForAllDraft] = useState(null); const [selectedPrinterForDraft, setSelectedPrinterForDraft] = useState(null); const [selectedPrinterForRecord, setSelectedPrinterForRecord] = useState(null); + const [truckRoutingFilters, setTruckRoutingFilters] = useState({ + storeId: "", + truckLanceCode: "", + date: "", + }); + const [isPrintingRoutingSummary, setIsPrintingRoutingSummary] = useState(false); @@ -279,6 +287,73 @@ const [selectedPrinterForDraft, setSelectedPrinterForDraft] = useState { + const { storeId, truckLanceCode, date } = truckRoutingFilters; + if (!storeId || !truckLanceCode || !date) { + Swal.fire({ + position: "bottom-end", + icon: "warning", + text: "請先選擇 2/F 或 4/F、車線和日期", + showConfirmButton: false, + timer: 1800, + }); + return; + } + + setIsPrintingRoutingSummary(true); + try { + if (!selectedPrinterForAllDraft) { + Swal.fire({ + position: "bottom-end", + icon: "warning", + text: t("Please select a printer first"), + showConfirmButton: false, + timer: 1500 + }); + return; + } + + const qs = new URLSearchParams({ + printerId: selectedPrinterForAllDraft.id.toString(), + printQty: "1", + storeId, + truckLanceCode, + date, + }).toString(); + const url = `${NEXT_PUBLIC_API_URL}/truck-routing-summary/print-direct?${qs}`; + const response = await clientAuthFetch(url, { + method: "GET", + }); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP ${response.status}: ${errorText}`); + } + Swal.fire({ + position: "bottom-end", + icon: "success", + text: t("Printed Successfully."), + showConfirmButton: false, + timer: 1500 + }); + } catch (error) { + console.error("Failed to print Truck Routing Summary", error); + Swal.fire({ + icon: "error", + text: "列印送貨路線摘要失敗,請稍後再試。", + }); + } finally { + setIsPrintingRoutingSummary(false); + } + }, [truckRoutingFilters, selectedPrinterForAllDraft, t]); + + const isTruckRoutingTab = tabIndex === 5; + const canPrintTruckRoutingSummary = Boolean( + truckRoutingFilters.storeId && + truckRoutingFilters.truckLanceCode && + truckRoutingFilters.date && + !isPrintingRoutingSummary, + ); + useEffect(() => { @@ -671,9 +746,14 @@ const handleAssignByLane = useCallback(async ( height: '40px', }, }} - onClick={handleAllDraft} + onClick={isTruckRoutingTab ? handlePrintTruckRoutingSummary : handleAllDraft} + disabled={isTruckRoutingTab ? !canPrintTruckRoutingSummary : false} > - {t("Print All Draft")} ({releasedOrderCount}) + {isTruckRoutingTab + ? isPrintingRoutingSummary + ? "生成中..." + : "列印報告" + : `${t("Print All Draft")} (${releasedOrderCount})`} {/*