"use client"; import { Box, Card, CardContent, CardActions, Typography, CircularProgress, Grid, Chip, Button, TablePagination, } from "@mui/material"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { AllPickedStockTakeListReponse, getApproverStockTakeRecords, } from "@/app/api/stockTake/actions"; import dayjs from "dayjs"; import { OUTPUT_DATE_FORMAT } from "@/app/utils/formatUtil"; const PER_PAGE = 6; interface ApproverAllCardListProps { onCardClick: (session: AllPickedStockTakeListReponse) => void; } const ApproverAllCardList: React.FC = ({ onCardClick, }) => { const { t } = useTranslation(["inventory", "common"]); const [loading, setLoading] = useState(false); const [sessions, setSessions] = useState([]); const [page, setPage] = useState(0); const fetchSessions = useCallback(async () => { setLoading(true); try { const data = await getApproverStockTakeRecords(); const list = Array.isArray(data) ? data : []; // 找出最新一轮的 planStartDate const withPlanStart = list.filter((s) => s.planStartDate); if (withPlanStart.length === 0) { setSessions([]); setPage(0); return; } const latestPlanStart = withPlanStart .map((s) => s.planStartDate as string) .sort((a, b) => dayjs(b).valueOf() - dayjs(a).valueOf())[0]; // 这一轮下所有 section 的卡片 const roundSessions = list.filter((s) => s.planStartDate === latestPlanStart); // 汇总这一轮的总 item / lot 数 const totalItems = roundSessions.reduce( (sum, s) => sum + (s.totalItemNumber || 0), 0 ); const totalLots = roundSessions.reduce( (sum, s) => sum + (s.totalInventoryLotNumber || 0), 0 ); // 用这一轮里的第一条作为代表,覆盖汇总数字 const representative = roundSessions[0]; const mergedRound: AllPickedStockTakeListReponse = { ...representative, totalItemNumber: totalItems, totalInventoryLotNumber: totalLots, }; // UI 上只展示这一轮一张卡 setSessions([mergedRound]); setPage(0); } catch (e) { console.error(e); setSessions([]); } finally { setLoading(false); } }, []); useEffect(() => { fetchSessions(); }, [fetchSessions]); const getStatusColor = (status: string | null) => { if (!status) return "default"; const statusLower = status.toLowerCase(); if (statusLower === "completed") return "success"; if (statusLower === "approving") return "info"; return "warning"; }; const paged = useMemo(() => { const startIdx = page * PER_PAGE; return sessions.slice(startIdx, startIdx + PER_PAGE); }, [page, sessions]); if (loading) { return ( ); } return ( {paged.map((session) => { const statusColor = getStatusColor(session.status); const planStart = session.planStartDate ? dayjs(session.planStartDate).format(OUTPUT_DATE_FORMAT) : "-"; return ( onCardClick(session)} > {t("Stock Take Round")}: {planStart} {t("Plan Start Date")}: {planStart} {t("Total Items")}: {session.totalItemNumber} {t("Total Lots")}: {session.totalInventoryLotNumber} {session.status ? ( ) : ( )} ); })} {sessions.length > 0 && ( setPage(p)} rowsPerPageOptions={[PER_PAGE]} /> )} ); }; export default ApproverAllCardList;