CANCERYS\kw093 14 часов назад
Родитель
Сommit
484d96203f
2 измененных файлов: 14 добавлений и 64 удалений
  1. +2
    -0
      src/app/api/stockTake/actions.ts
  2. +12
    -64
      src/components/StockRecord/SearchPage.tsx

+ 2
- 0
src/app/api/stockTake/actions.ts Просмотреть файл

@@ -427,6 +427,8 @@ export interface StockTransactionResponse {
itemId: number; itemId: number;
itemCode: string | null; itemCode: string | null;
itemName: string | null; itemName: string | null;
uomId?: number | null;
uomDesc?: string | null;
balanceQty: number | null; balanceQty: number | null;
qty: number; qty: number;
type: string | null; type: string | null;


+ 12
- 64
src/components/StockRecord/SearchPage.tsx Просмотреть файл

@@ -1,7 +1,7 @@
"use client"; "use client";


import SearchBox, { Criterion } from "../SearchBox"; import SearchBox, { Criterion } from "../SearchBox";
import { useCallback, useMemo, useState, useEffect, useRef } from "react";
import { useCallback, useMemo, useState, useRef, useEffect } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import SearchResults, { Column } from "../SearchResults/index"; import SearchResults, { Column } from "../SearchResults/index";
import { StockTransactionResponse, SearchStockTransactionRequest } from "@/app/api/stockTake/actions"; import { StockTransactionResponse, SearchStockTransactionRequest } from "@/app/api/stockTake/actions";
@@ -38,10 +38,7 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
const [filterArgs, setFilterArgs] = useState<Record<string, any>>({}); const [filterArgs, setFilterArgs] = useState<Record<string, any>>({});
const isInitialMount = useRef(true); const isInitialMount = useRef(true);
const [searchTrigger, setSearchTrigger] = useState(0); const [searchTrigger, setSearchTrigger] = useState(0);
// 添加分页状态
const [page, setPage] = useState(0);
const [pageSize, setPageSize] = useState<number | string>(10);
const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 100 });
const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 10 });
const [hasSearchQuery, setHasSearchQuery] = useState(false); const [hasSearchQuery, setHasSearchQuery] = useState(false);
const [totalCount, setTotalCount] = useState(initialDataList.length); const [totalCount, setTotalCount] = useState(initialDataList.length);
@@ -128,21 +125,7 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
return processed; return processed;
}, [dataList]); }, [dataList]);
// 修复:使用 processedData 初始化 filteredList
const [filteredList, setFilteredList] = useState<ExtendedStockTransaction[]>(processedData);

// 当 processedData 变化时更新 filteredList(不更新 pagingController,避免循环)
useEffect(() => {
setFilteredList(processedData);
// 只在初始加载时设置 pageSize
if (isInitialMount.current && processedData.length > 0) {
setPageSize("all");
setPagingController(prev => ({ ...prev, pageSize: processedData.length }));
setPage(0);
isInitialMount.current = false;
}
}, [processedData]);
const filteredList = processedData;


// API 调用函数(参考 PoSearch 的实现) // API 调用函数(参考 PoSearch 的实现)
// API 调用函数(参考 PoSearch 的实现) // API 调用函数(参考 PoSearch 的实现)
@@ -172,7 +155,7 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
startDate: filterArgs.startDate || null, startDate: filterArgs.startDate || null,
endDate: filterArgs.endDate || null, endDate: filterArgs.endDate || null,
pageNum: pagingController.pageNum - 1 || 0, pageNum: pagingController.pageNum - 1 || 0,
pageSize: pagingController.pageSize || 100,
pageSize: pagingController.pageSize || 10,
}; };
const res = await searchStockTransactions(params); const res = await searchStockTransactions(params);
@@ -230,24 +213,6 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
} }
}, [newPageFetch, pagingController, filterArgs, searchTrigger]); }, [newPageFetch, pagingController, filterArgs, searchTrigger]);


// 分页处理函数
const handleChangePage = useCallback((event: unknown, newPage: number) => {
setPage(newPage);
setPagingController(prev => ({ ...prev, pageNum: newPage + 1 }));
}, []);

const handleChangeRowsPerPage = useCallback((event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
const newSize = parseInt(event.target.value, 10);
if (newSize === -1) {
setPageSize("all");
setPagingController(prev => ({ ...prev, pageSize: 100, pageNum: 1 })); // 用 100 觸發後端回傳全部
} else if (!isNaN(newSize)) {
setPageSize(newSize);
setPagingController(prev => ({ ...prev, pageSize: newSize, pageNum: 1 }));
}
setPage(0);
}, []);

const searchCriteria: Criterion<string>[] = useMemo( const searchCriteria: Criterion<string>[] = useMemo(
() => [ () => [
{ {
@@ -313,6 +278,12 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
</Box> </Box>
), ),
}, },
{
name: "uomDesc" as keyof ExtendedStockTransaction,
label: t("UOM"),
align: "left",
renderCell: (item) => <>{item.uomDesc || "-"}</>,
},
{ {
name: "inQty" as keyof ExtendedStockTransaction, name: "inQty" as keyof ExtendedStockTransaction,
label: t("In Qty"), label: t("In Qty"),
@@ -387,7 +358,6 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
}); });
setSearchTrigger(prev => prev + 1); setSearchTrigger(prev => prev + 1);
// 重置分页 // 重置分页
setPage(0);
setPagingController(prev => ({ ...prev, pageNum: 1 })); setPagingController(prev => ({ ...prev, pageNum: 1 }));
}, []); }, []);


@@ -395,31 +365,9 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
setHasSearchQuery(false); setHasSearchQuery(false);
// 重置 filterArgs,触发 useEffect 调用 API // 重置 filterArgs,触发 useEffect 调用 API
setFilterArgs({}); setFilterArgs({});
setPage(0);
setPagingController(prev => ({ ...prev, pageNum: 1 })); setPagingController(prev => ({ ...prev, pageNum: 1 }));
}, []); }, []);


const paginatedItems = useMemo(() => {
if (pageSize === "all") {
return filteredList;
}
const size = typeof pageSize === 'number' ? pageSize : 10;
const start = page * size;
return filteredList.slice(start, start + size);
}, [filteredList, pageSize, page]);

// 计算传递给 SearchResults 的 pageSize(确保在选项中)
const actualPageSizeForTable = useMemo(() => {
if (pageSize === "all") {
return totalCount > 0 ? totalCount : filteredList.length;
}
const size = typeof pageSize === 'number' ? pageSize : 10;
if (![10, 25, 100].includes(size)) {
return size;
}
return size;
}, [pageSize, filteredList.length, totalCount]);

return ( return (
<> <>
<SearchBox <SearchBox
@@ -429,9 +377,9 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => {
/> />
{loading && <Box sx={{ p: 2 }}>{t("Loading...")}</Box>} {loading && <Box sx={{ p: 2 }}>{t("Loading...")}</Box>}
<SearchResults<ExtendedStockTransaction> <SearchResults<ExtendedStockTransaction>
items={paginatedItems}
items={filteredList}
columns={columns} columns={columns}
pagingController={{ ...pagingController, pageSize: actualPageSizeForTable }}
pagingController={pagingController}
setPagingController={setPagingController} setPagingController={setPagingController}
totalCount={totalCount} totalCount={totalCount}
isAutoPaging={false} isAutoPaging={false}


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