From 1037d8eb5a04d518f06bc3bb4d041a37f8d584fb Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Mon, 20 Apr 2026 23:37:10 +0800 Subject: [PATCH 1/2] search expiry item --- src/app/(main)/stockOutIssueRecord/page.tsx | 2 +- src/app/api/stockIssue/actions.ts | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/app/(main)/stockOutIssueRecord/page.tsx b/src/app/(main)/stockOutIssueRecord/page.tsx index 88f6790..70e91dd 100644 --- a/src/app/(main)/stockOutIssueRecord/page.tsx +++ b/src/app/(main)/stockOutIssueRecord/page.tsx @@ -13,7 +13,7 @@ export const metadata: Metadata = { const PickOrder: React.FC = async () => { const { t } = await getServerI18n("pickOrder"); - PreloadPickOrder(); + // PreloadPickOrder(); return ( <> diff --git a/src/app/api/stockIssue/actions.ts b/src/app/api/stockIssue/actions.ts index 5d52d32..f48f2cd 100644 --- a/src/app/api/stockIssue/actions.ts +++ b/src/app/api/stockIssue/actions.ts @@ -69,9 +69,21 @@ export const fetchBadItemList = cache(async (issueCategory: string = "lot_issue" }); -export const fetchExpiryItemList = cache(async () => { +export interface ExpiryItemFilter { + expiryDate?: string; + itemCode?: string; + itemName?: string; +} + +export const fetchExpiryItemList = cache(async (filters?: ExpiryItemFilter) => { + const params = new URLSearchParams(); + if (filters?.expiryDate) params.set("expiryDate", filters.expiryDate); + if (filters?.itemCode) params.set("itemCode", filters.itemCode); + if (filters?.itemName) params.set("itemName", filters.itemName); + const queryString = params.toString(); + const url = `${BASE_API_URL}/pickExecution/issues/expiryItem${queryString ? `?${queryString}` : ""}`; return serverFetchJson( - `${BASE_API_URL}/pickExecution/issues/expiryItem`, + url, { next: { tags: ["Expiry Item List"] }, }, From 43866245338b3fb7ff3d41cae7c1ad59636e761d Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Mon, 20 Apr 2026 23:59:54 +0800 Subject: [PATCH 2/2] update --- src/components/StockIssue/SearchPage.tsx | 71 ++++++++++++++++++++---- 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/src/components/StockIssue/SearchPage.tsx b/src/components/StockIssue/SearchPage.tsx index e509a13..884ec49 100644 --- a/src/components/StockIssue/SearchPage.tsx +++ b/src/components/StockIssue/SearchPage.tsx @@ -11,6 +11,7 @@ import { batchSubmitExpiryItem, batchSubmitMissItem, ExpiryItemResult, + fetchExpiryItemList, StockIssueLists, StockIssueResult, submitBadItem, @@ -27,6 +28,9 @@ interface Props { type SearchQuery = { lotNo: string; + itemCode: string; + itemName: string; + expiryDate: string; }; type SearchParamNames = keyof SearchQuery; @@ -34,7 +38,12 @@ const SearchPage: React.FC = ({ dataList }) => { const BATCH_CHUNK_SIZE = 20; const { t } = useTranslation("inventory"); const [tab, setTab] = useState<"miss" | "bad" | "expiry">("miss"); - const [search, setSearch] = useState({ lotNo: "" }); + const [search, setSearch] = useState({ + lotNo: "", + itemCode: "", + itemName: "", + expiryDate: "", + }); const { data: session } = useSession() as { data: SessionWithTokens | null }; const currentUserId = session?.id ? parseInt(session.id) : undefined; const [formOpen, setFormOpen] = useState(false); @@ -57,14 +66,36 @@ const SearchPage: React.FC = ({ dataList }) => { const [batchProgress, setBatchProgress] = useState<{ done: number; total: number } | null>(null); const [paging, setPaging] = useState({ pageNum: 1, pageSize: 10 }); const searchCriteria: Criterion[] = useMemo( - () => [ - { - label: t("Lot No."), - paramName: "lotNo", - type: "text", - }, - ], - [t], + () => { + if (tab === "expiry") { + return [ + { + label: t("Item Code"), + paramName: "itemCode", + type: "text", + }, + { + label: t("Item"), + paramName: "itemName", + type: "text", + }, + { + label: t("Expiry Date"), + paramName: "expiryDate", + type: "date", + }, + ]; + } + + return [ + { + label: t("Lot No."), + paramName: "lotNo", + type: "text", + }, + ]; + }, + [t, tab], ); const filterBySearch = useCallback( @@ -317,9 +348,27 @@ const SearchPage: React.FC = ({ dataList }) => { [t, handleSubmitSingle, submittingIds, currentUserId], ); - const handleSearch = useCallback((query: Record) => { + const handleSearch = useCallback(async (query: Record) => { setSearch(query); - }, []); + setPaging((prev) => ({ ...prev, pageNum: 1 })); + + if (tab !== "expiry") { + return; + } + + try { + const result = await fetchExpiryItemList({ + itemCode: query.itemCode?.trim() || undefined, + itemName: query.itemName?.trim() || undefined, + expiryDate: query.expiryDate || undefined, + }); + setExpiryItems(result); + setSelectedIds([]); + } catch (error) { + console.error("Failed to search expiry items:", error); + alert(t("Failed to load expiry items")); + } + }, [tab, t]); const handleTabChange = useCallback( (_: React.SyntheticEvent, value: string) => {