diff --git a/src/app/api/pickOrder/actions.ts b/src/app/api/pickOrder/actions.ts index d34c3a9..f21a60b 100644 --- a/src/app/api/pickOrder/actions.ts +++ b/src/app/api/pickOrder/actions.ts @@ -1064,6 +1064,19 @@ export const newassignPickOrder = async (data: AssignPickOrderInputs) => { return response; }; +export const cancelPickOrders = async (pickOrderIds: number[]) => { + const response = await serverFetchJson( + `${BASE_API_URL}/pickOrder/cancel`, + { + method: "POST", + body: JSON.stringify({ pickOrderIds }), + headers: { "Content-Type": "application/json" }, + }, + ); + revalidateTag("pickorder"); + return response; +}; + // Missing function 2: releaseAssignedPickOrders export const releaseAssignedPickOrders = async (data: AssignPickOrderInputs) => { const response = await serverFetchJson( diff --git a/src/components/PickOrderSearch/AssignAndRelease.tsx b/src/components/PickOrderSearch/AssignAndRelease.tsx index adb2d7f..b34b49a 100644 --- a/src/components/PickOrderSearch/AssignAndRelease.tsx +++ b/src/components/PickOrderSearch/AssignAndRelease.tsx @@ -19,7 +19,7 @@ import { Checkbox, TablePagination, } from "@mui/material"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { newassignPickOrder, @@ -27,6 +27,7 @@ import { releaseAssignedPickOrders, assignPickOrderWorkbenchV2, releasePickOrderWorkbenchV2, + cancelPickOrders, } from "@/app/api/pickOrder/actions"; import { fetchNameList, NameList ,fetchNewNameList, NewNameList} from "@/app/api/user/actions"; import { FormProvider, useForm } from "react-hook-form"; @@ -92,6 +93,8 @@ const AssignAndRelease: React.FC = ({ filterArgs }) => { const [selectedPickOrderIds, setSelectedPickOrderIds] = useState([]); const [filteredItems, setFilteredItems] = useState([]); const [isLoadingItems, setIsLoadingItems] = useState(false); + const [isCancelling, setIsCancelling] = useState(false); + const cancelInFlightRef = useRef(false); const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 10, @@ -398,6 +401,38 @@ const AssignAndRelease: React.FC = ({ filterArgs }) => { formProps.reset(); }, [formProps]); + const handleCancelPickOrders = useCallback(async () => { + if (selectedPickOrderIds.length === 0) return; + if (cancelInFlightRef.current) return; + if (!window.confirm(t("Confirm Cancel Pick Order"))) return; + + cancelInFlightRef.current = true; + setIsCancelling(true); + setIsUploading(true); + try { + const res = await cancelPickOrders(selectedPickOrderIds); + if (res && res.code === "SUCCESS") { + setSelectedPickOrderIds([]); + fetchNewPageItems(pagingController, filterArgs); + } else { + console.error("Cancel pick orders failed:", res); + } + } catch (error) { + console.error("Error cancelling pick orders:", error); + } finally { + setIsCancelling(false); + setIsUploading(false); + cancelInFlightRef.current = false; + } + }, [ + selectedPickOrderIds, + setIsUploading, + fetchNewPageItems, + pagingController, + filterArgs, + t, + ]); + // 组件挂载时加载数据 useEffect(() => { console.log("=== Component mounted ==="); @@ -549,7 +584,7 @@ const AssignAndRelease: React.FC = ({ filterArgs }) => { )} - + + diff --git a/src/i18n/en/pickOrder.json b/src/i18n/en/pickOrder.json index 18623dc..5c8cb77 100644 --- a/src/i18n/en/pickOrder.json +++ b/src/i18n/en/pickOrder.json @@ -228,6 +228,8 @@ "Selected": "Selected", "Select Items": "Select Items", "Assign": "Assign", + "Cancel Pick Order": "Cancel Pick Order", + "Confirm Cancel Pick Order": "Cancel the selected pick order(s)? They will no longer appear on this page.", "Release": "Release", "Pick Execution": "Pick Execution", "Create Pick Order": "Create Pick Order", diff --git a/src/i18n/zh/pickOrder.json b/src/i18n/zh/pickOrder.json index f77fe74..a8b68e7 100644 --- a/src/i18n/zh/pickOrder.json +++ b/src/i18n/zh/pickOrder.json @@ -230,6 +230,8 @@ "Selected": "已選", "Select Items": "選擇貨品", "Assign": "分派提料單", + "Cancel Pick Order": "取消提料單", + "Confirm Cancel Pick Order": "確定取消已選提料單?取消後將不再顯示於此頁。", "Release": "放單", "Pick Execution": "進行提料", "Create Pick Order": "建立貨品提料單",