From ae404ae43369e4a3f06e47996b0471b166785fe5 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Thu, 16 Oct 2025 16:09:48 +0800 Subject: [PATCH] update --- src/app/api/pickOrder/actions.ts | 22 ++- .../FGPickOrderInfoCard.tsx | 6 +- .../FinishedGoodFloorLanePanel.tsx | 35 ++-- .../FinishedGoodSearch/GoodPickExecution.tsx | 153 ++++++++---------- src/i18n/zh/pickOrder.json | 4 + 5 files changed, 112 insertions(+), 108 deletions(-) diff --git a/src/app/api/pickOrder/actions.ts b/src/app/api/pickOrder/actions.ts index 8e885a9..48417b2 100644 --- a/src/app/api/pickOrder/actions.ts +++ b/src/app/api/pickOrder/actions.ts @@ -17,7 +17,7 @@ import { import { PurchaseQcResult } from "../po/actions"; import { StringNullableChain } from "lodash"; // import { BASE_API_URL } from "@/config/api"; - +import dayjs from "dayjs"; export interface SavePickOrderLineRequest { itemId: number qty: number @@ -399,14 +399,15 @@ export const updatePickExecutionIssueStatus = async ( revalidateTag("pickExecutionIssues"); return result; }; -export async function fetchStoreLaneSummary(storeId: string): Promise { - // ✅ 硬编码测试日期 - 改成你想测试的日期 - const testDate = "2025-10-16"; // 或者 "2025-10-16", "2025-10-17" 等 - +export async function fetchStoreLaneSummary(storeId: string, requiredDate?: string): Promise { + const dateToUse = requiredDate || dayjs().format('YYYY-MM-DD'); + const url = `${BASE_API_URL}/doPickOrder/summary-by-store?storeId=${encodeURIComponent(storeId)}&requiredDate=${encodeURIComponent(dateToUse)}`; const response = await serverFetchJson( - `${BASE_API_URL}/doPickOrder/summary-by-store?storeId=${encodeURIComponent(storeId)}&requiredDate=${testDate}`, + url, { method: "GET", + cache: "no-store", + next: { revalidate: 0 } } ); return response; @@ -486,6 +487,15 @@ export const fetchFGPickOrders = async (pickOrderId: number) => { ); return response; }; +export const fetchFGPickOrdersByUserId = async (userId: number) => { + const response = await serverFetchJson( + `${BASE_API_URL}/pickOrder/fg-pick-orders/${userId}`, + { + method: "GET", + }, + ); + return response; +}; export const updateSuggestedLotLineId = async (suggestedPickLotId: number, newLotLineId: number) => { const response = await serverFetchJson>( `${BASE_API_URL}/suggestedPickLot/update-suggested-lot/${suggestedPickLotId}`, diff --git a/src/components/FinishedGoodSearch/FGPickOrderInfoCard.tsx b/src/components/FinishedGoodSearch/FGPickOrderInfoCard.tsx index 3335e57..d5f95c1 100644 --- a/src/components/FinishedGoodSearch/FGPickOrderInfoCard.tsx +++ b/src/components/FinishedGoodSearch/FGPickOrderInfoCard.tsx @@ -47,7 +47,7 @@ const FGPickOrderInfoCard: React.FC = ({ fgOrder }) => { @@ -56,7 +56,7 @@ const FGPickOrderInfoCard: React.FC = ({ fgOrder }) => { @@ -65,7 +65,7 @@ const FGPickOrderInfoCard: React.FC = ({ fgOrder }) => { diff --git a/src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx b/src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx index b33b279..7849a53 100644 --- a/src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx +++ b/src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx @@ -24,25 +24,35 @@ const FinishedGoodFloorLanePanel: React.FC = ({ onPickOrderAssigned }) => const [isAssigning, setIsAssigning] = useState(false); const [selectedDate, setSelectedDate] = useState("today"); - const loadSummaries = useCallback(async () => { + const loadData = async (dateValue: string) => { setIsLoadingSummary(true); try { + let dateOffset = 0; + if (dateValue === "tomorrow") dateOffset = 1; + else if (dateValue === "dayAfterTomorrow") dateOffset = 2; + + const requiredDate = dayjs().add(dateOffset, "day").format("YYYY-MM-DD"); + console.log("🔄 requiredDate:", requiredDate); const [s2, s4] = await Promise.all([ - fetchStoreLaneSummary("2/F"), - fetchStoreLaneSummary("4/F") + fetchStoreLaneSummary("2/F", requiredDate), + fetchStoreLaneSummary("4/F", requiredDate), ]); + console.log("🔄 s2:", s2); + console.log("🔄 s4:", s4); + setSummary2F(s2); setSummary4F(s4); - } catch (error) { - console.error("Error loading summaries:", error); + } catch (e) { + console.error("load summaries failed:", e); } finally { setIsLoadingSummary(false); } - }, []); + }; + // 初始化 useEffect(() => { - loadSummaries(); - }, [loadSummaries]); + loadData("today"); + }, []); const handleAssignByLane = useCallback(async ( storeId: string, @@ -61,7 +71,7 @@ const FinishedGoodFloorLanePanel: React.FC = ({ onPickOrderAssigned }) => if (res.code === "SUCCESS") { console.log("✅ Successfully assigned pick order from lane", truckLanceCode); window.dispatchEvent(new CustomEvent('pickOrderAssigned')); - loadSummaries(); // 刷新按钮状态 + loadData(selectedDate); // 刷新按钮状态 onPickOrderAssigned?.(); } else if (res.code === "USER_BUSY") { Swal.fire({ @@ -95,7 +105,7 @@ const FinishedGoodFloorLanePanel: React.FC = ({ onPickOrderAssigned }) => } finally { setIsAssigning(false); } - }, [currentUserId, t, loadSummaries, onPickOrderAssigned]); + }, [currentUserId, t, selectedDate, onPickOrderAssigned]); const getDateLabel = (offset: number) => { return dayjs().add(offset, 'day').format('YYYY-MM-DD'); @@ -126,7 +136,10 @@ const FinishedGoodFloorLanePanel: React.FC = ({ onPickOrderAssigned }) => id="date-select" value={selectedDate} label={t("Select Date")} - onChange={(e) => setSelectedDate(e.target.value)} + onChange={(e) => { + setSelectedDate(e.target.value); + loadData(e.target.value); + }} > {t("Today")} ({getDateLabel(0)}) diff --git a/src/components/FinishedGoodSearch/GoodPickExecution.tsx b/src/components/FinishedGoodSearch/GoodPickExecution.tsx index 2b91287..1aa1d85 100644 --- a/src/components/FinishedGoodSearch/GoodPickExecution.tsx +++ b/src/components/FinishedGoodSearch/GoodPickExecution.tsx @@ -26,7 +26,7 @@ import { updateStockOutLineStatus, createStockOutLine, recordPickExecutionIssue, - fetchFGPickOrders, // ✅ Add this import + fetchFGPickOrdersByUserId, // ✅ Add this import FGPickOrderResponse, autoAssignAndReleasePickOrder, AutoAssignReleaseResponse, @@ -49,7 +49,7 @@ import { SessionWithTokens } from "@/config/authConfig"; import { fetchStockInLineInfo } from "@/app/api/po/actions"; import GoodPickExecutionForm from "./GoodPickExecutionForm"; import FGPickOrderCard from "./FGPickOrderCard"; -import FinishedGoodFloorLanePanel from "./FGPickOrderCard"; +import FinishedGoodFloorLanePanel from "./FinishedGoodFloorLanePanel"; import FGPickOrderInfoCard from "./FGPickOrderInfoCard"; interface Props { filterArgs: Record; @@ -357,28 +357,12 @@ const PickExecution: React.FC = ({ filterArgs, onFgPickOrdersChange }) => setFgPickOrdersLoading(true); try { - // Get all pick order IDs from combinedLotData - const pickOrderIds = Array.from(new Set(combinedLotData.map(lot => lot.pickOrderId))); + // ✅ 简化:直接使用 userId 调用 API,不需要循环 + const fgPickOrders = await fetchFGPickOrdersByUserId(currentUserId); - if (pickOrderIds.length === 0) { - setFgPickOrders([]); - onFgPickOrdersChange?.([]); - return; - } - - // Fetch FG pick orders for each pick order ID - const fgPickOrdersPromises = pickOrderIds.map(pickOrderId => - fetchFGPickOrders(pickOrderId) - ); - - const fgPickOrdersResults = await Promise.all(fgPickOrdersPromises); - - // Flatten the results (each fetchFGPickOrders returns an array) - const allFgPickOrders = fgPickOrdersResults.flat(); - - setFgPickOrders(allFgPickOrders); - onFgPickOrdersChange?.(allFgPickOrders); - console.log("✅ Fetched FG pick orders:", allFgPickOrders); + setFgPickOrders(fgPickOrders); + onFgPickOrdersChange?.(fgPickOrders); + console.log("✅ Fetched FG pick orders for user:", fgPickOrders); } catch (error) { console.error("❌ Error fetching FG pick orders:", error); setFgPickOrders([]); @@ -386,12 +370,14 @@ const PickExecution: React.FC = ({ filterArgs, onFgPickOrdersChange }) => } finally { setFgPickOrdersLoading(false); } - }, [currentUserId, combinedLotData]); + }, [currentUserId, onFgPickOrdersChange]); + + // ✅ 简化:移除复杂的 useEffect 依赖 useEffect(() => { - if (combinedLotData.length > 0) { + if (currentUserId) { fetchFgPickOrdersData(); } - }, [combinedLotData, fetchFgPickOrdersData, onFgPickOrdersChange]); + }, [currentUserId, fetchFgPickOrdersData]); // ✅ Handle QR code button click const handleQrCodeClick = (pickOrderId: number) => { @@ -963,69 +949,60 @@ const PickExecution: React.FC = ({ filterArgs, onFgPickOrdersChange }) => return sortedData.slice(startIndex, endIndex); }, [combinedLotData, paginationController]); - return ( - - {/* ✅ 条件渲染:没有活动订单时显示楼层选择面板 */} - {!combinedDataLoading && fgPickOrders.length === 0 ? ( - { - if (currentUserId) { - fetchAllCombinedLotData(currentUserId); - } - }} - /> - ) : ( - // ✅ 有活动订单时,显示 FG 订单信息卡片 - - {fgPickOrdersLoading ? ( - - - - ) : ( - - {fgPickOrders.length === 0 ? ( - - - {t("No FG pick orders found")} - - - ) : ( - // ✅ 使用新的 FGPickOrderInfoCard 组件(类似 DoInfoCard 的格式) - fgPickOrders.map((fgOrder) => ( - - )) - )} - - )} - - )} - - {/* Modals */} - setQrModalOpen(false)} - lot={selectedLotForQr} - onQrCodeSubmit={handleQrCodeSubmit} - combinedLotData={combinedLotData} - /> - - { - setPickExecutionFormOpen(false); - setSelectedLotForExecutionForm(null); - }} - onSubmit={handlePickExecutionFormSubmit} - selectedLot={selectedLotForExecutionForm} - selectedPickOrderLine={null} - pickOrderId={selectedLotForExecutionForm?.pickOrderId} - pickOrderCreateDate={null} +// ... existing code ... + +return ( + + {/* ✅ 修复:改进条件渲染逻辑 */} + {combinedDataLoading || fgPickOrdersLoading ? ( + // ✅ 数据加载中,显示加载指示器 + + + + ) : fgPickOrders.length === 0 ? ( + // ✅ 没有活动订单,显示楼层选择面板 + { + if (currentUserId) { + fetchAllCombinedLotData(currentUserId); + } + }} /> - - ); + ) : ( + // ✅ 有活动订单,显示 FG 订单信息 + + {fgPickOrders.map((fgOrder) => ( + + ))} + + )} + + {/* Modals */} + setQrModalOpen(false)} + lot={selectedLotForQr} + onQrCodeSubmit={handleQrCodeSubmit} + combinedLotData={combinedLotData} + /> + + { + setPickExecutionFormOpen(false); + setSelectedLotForExecutionForm(null); + }} + onSubmit={handlePickExecutionFormSubmit} + selectedLot={selectedLotForExecutionForm} + selectedPickOrderLine={null} + pickOrderId={selectedLotForExecutionForm?.pickOrderId} + pickOrderCreateDate={null} + /> + +); }; export default PickExecution; \ No newline at end of file diff --git a/src/i18n/zh/pickOrder.json b/src/i18n/zh/pickOrder.json index 2a33c10..f277eef 100644 --- a/src/i18n/zh/pickOrder.json +++ b/src/i18n/zh/pickOrder.json @@ -14,6 +14,10 @@ "Do you want to start?": "確定開始嗎?", "Start": "開始", "Start Success": "開始成功", + "Truck Lance Code": "車牌號碼", + "Completed Date": "完成日期", + "Completed Time": "完成時間", + "Start Fail": "開始失敗", "Start PO": "開始採購訂單", "Do you want to complete?": "確定完成嗎?",