Просмотр исходного кода

TruckRoutingSummary Update

MergeProblem1
B.E.N.S.O.N 17 часов назад
Родитель
Сommit
632d0de6eb
2 измененных файлов: 101 добавлений и 5 удалений
  1. +86
    -4
      src/components/FinishedGoodSearch/FinishedGoodSearch.tsx
  2. +15
    -1
      src/components/FinishedGoodSearch/TruckRoutingSummaryTab.tsx

+ 86
- 4
src/components/FinishedGoodSearch/FinishedGoodSearch.tsx Просмотреть файл

@@ -41,7 +41,9 @@ import dayjs, { Dayjs } from 'dayjs';
import { PrinterCombo } from "@/app/api/settings/printer"; import { PrinterCombo } from "@/app/api/settings/printer";
import { Autocomplete } from "@mui/material"; import { Autocomplete } from "@mui/material";
import FGPickOrderTicketReleaseTable from "./FGPickOrderTicketReleaseTable"; 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 { interface Props {
pickOrders: PickOrderResult[]; pickOrders: PickOrderResult[];
@@ -75,6 +77,12 @@ const PickOrderSearch: React.FC<Props> = ({ pickOrders, printerCombo }) => {
const [selectedPrinterForAllDraft, setSelectedPrinterForAllDraft] = useState<PrinterCombo | null>(null); const [selectedPrinterForAllDraft, setSelectedPrinterForAllDraft] = useState<PrinterCombo | null>(null);
const [selectedPrinterForDraft, setSelectedPrinterForDraft] = useState<PrinterCombo | null>(null); const [selectedPrinterForDraft, setSelectedPrinterForDraft] = useState<PrinterCombo | null>(null);
const [selectedPrinterForRecord, setSelectedPrinterForRecord] = useState<PrinterCombo | null>(null); const [selectedPrinterForRecord, setSelectedPrinterForRecord] = useState<PrinterCombo | null>(null);
const [truckRoutingFilters, setTruckRoutingFilters] = useState<TruckRoutingSummaryFilters>({
storeId: "",
truckLanceCode: "",
date: "",
});
const [isPrintingRoutingSummary, setIsPrintingRoutingSummary] = useState(false);






@@ -279,6 +287,73 @@ const [selectedPrinterForDraft, setSelectedPrinterForDraft] = useState<PrinterCo


},[t, fgPickOrdersData, selectedPrinterForAllDraft]); },[t, fgPickOrdersData, selectedPrinterForAllDraft]);


const handlePrintTruckRoutingSummary = useCallback(async () => {
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(() => { useEffect(() => {
@@ -671,9 +746,14 @@ const handleAssignByLane = useCallback(async (
height: '40px', height: '40px',
}, },
}} }}
onClick={handleAllDraft}
onClick={isTruckRoutingTab ? handlePrintTruckRoutingSummary : handleAllDraft}
disabled={isTruckRoutingTab ? !canPrintTruckRoutingSummary : false}
> >
{t("Print All Draft")} ({releasedOrderCount})
{isTruckRoutingTab
? isPrintingRoutingSummary
? "生成中..."
: "列印報告"
: `${t("Print All Draft")} (${releasedOrderCount})`}
</Button> </Button>
{/* {/*
<Button <Button
@@ -766,7 +846,9 @@ const handleAssignByLane = useCallback(async (
listScope="all" listScope="all"
/> />
)} )}
{tabIndex === 5 && <TruckRoutingSummaryTab />}
{tabIndex === 5 && (
<TruckRoutingSummaryTab onFiltersChange={setTruckRoutingFilters} />
)}
</Box> </Box>
</Box> </Box>
); );


+ 15
- 1
src/components/FinishedGoodSearch/TruckRoutingSummaryTab.tsx Просмотреть файл

@@ -7,7 +7,17 @@ import { clientAuthFetch } from "@/app/utils/clientAuthFetch";
import { NEXT_PUBLIC_API_URL } from "@/config/api"; import { NEXT_PUBLIC_API_URL } from "@/config/api";
import { fetchTruckRoutingLaneOptions, fetchTruckRoutingStoreOptions, ReportOption } from "@/app/(main)/report/truckRoutingSummaryApi"; import { fetchTruckRoutingLaneOptions, fetchTruckRoutingStoreOptions, ReportOption } from "@/app/(main)/report/truckRoutingSummaryApi";


const TruckRoutingSummaryTab: React.FC = () => {
export type TruckRoutingSummaryFilters = {
storeId: string;
truckLanceCode: string;
date: string;
};

interface Props {
onFiltersChange?: (filters: TruckRoutingSummaryFilters) => void;
}

const TruckRoutingSummaryTab: React.FC<Props> = ({ onFiltersChange }) => {
const [storeOptions, setStoreOptions] = useState<ReportOption[]>([]); const [storeOptions, setStoreOptions] = useState<ReportOption[]>([]);
const [laneOptions, setLaneOptions] = useState<ReportOption[]>([]); const [laneOptions, setLaneOptions] = useState<ReportOption[]>([]);
const [storeId, setStoreId] = useState(""); const [storeId, setStoreId] = useState("");
@@ -33,6 +43,10 @@ const TruckRoutingSummaryTab: React.FC = () => {
} }
}; };


useEffect(() => {
onFiltersChange?.({ storeId, truckLanceCode, date });
}, [storeId, truckLanceCode, date, onFiltersChange]);

const canDownload = storeId && truckLanceCode && date && !loading; const canDownload = storeId && truckLanceCode && date && !loading;


const onDownload = async () => { const onDownload = async () => {


Загрузка…
Отмена
Сохранить