Преглед на файлове

TruckRoutingSummary Update

MergeProblem1
B.E.N.S.O.N преди 12 часа
родител
ревизия
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 { 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<Props> = ({ pickOrders, printerCombo }) => {
const [selectedPrinterForAllDraft, setSelectedPrinterForAllDraft] = useState<PrinterCombo | null>(null);
const [selectedPrinterForDraft, setSelectedPrinterForDraft] = 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]);

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(() => {
@@ -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})`}
</Button>
{/*
<Button
@@ -766,7 +846,9 @@ const handleAssignByLane = useCallback(async (
listScope="all"
/>
)}
{tabIndex === 5 && <TruckRoutingSummaryTab />}
{tabIndex === 5 && (
<TruckRoutingSummaryTab onFiltersChange={setTruckRoutingFilters} />
)}
</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 { 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 [laneOptions, setLaneOptions] = useState<ReportOption[]>([]);
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 onDownload = async () => {


Зареждане…
Отказ
Запис