From 1bc33546a044cbc84dd9595c19dbcd9a4e309fc9 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期六, 10 一月 2026 14:06:10 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/page/sta/StaPanel.jsx |   73 ++++++++++++++++++++++++++++++++++--
 1 files changed, 68 insertions(+), 5 deletions(-)

diff --git a/zy-acs-flow/src/page/sta/StaPanel.jsx b/zy-acs-flow/src/page/sta/StaPanel.jsx
index c65053f..b247569 100644
--- a/zy-acs-flow/src/page/sta/StaPanel.jsx
+++ b/zy-acs-flow/src/page/sta/StaPanel.jsx
@@ -13,6 +13,10 @@
     Divider,
     CircularProgress,
     Stack,
+    FormControl,
+    InputLabel,
+    Select,
+    MenuItem,
 } from '@mui/material';
 import {
     useTranslate,
@@ -42,12 +46,16 @@
 ];
 
 const RESERVE_COLUMN_COUNT = 11;
+const RESERVE_TYPE_OPTIONS = ['IN', 'OUT'];
+const RESERVE_STATE_OPTIONS = ['reserved', 'waiting', 'confirmed', 'canceled', 'timeout'];
 const StaPanel = () => {
     const record = useRecordContext();
     const translate = useTranslate();
     const dataProvider = useDataProvider();
     const [reserves, setReserves] = useState([]);
     const [isReservesLoading, setIsReservesLoading] = useState(false);
+    const [typeFilter, setTypeFilter] = useState('');
+    const [stateFilter, setStateFilter] = useState('');
     const taskIds = useMemo(() => extractIds(reserves, 'taskId'), [reserves]);
     const segmentIds = useMemo(() => extractIds(reserves, 'segmentId'), [reserves]);
     const agvIds = useMemo(() => extractIds(reserves, 'agvId'), [reserves]);
@@ -68,6 +76,19 @@
         () => createLabelMap(agvRecords, (item) => item.uuid),
         [agvRecords]
     );
+
+    const filteredReserves = useMemo(() => {
+        if (!typeFilter && !stateFilter) {
+            return reserves;
+        }
+        return reserves.filter((reserve) => {
+            const matchesType =
+                !typeFilter || normalizeValueKey(reserve?.type) === normalizeValueKey(typeFilter);
+            const matchesState =
+                !stateFilter || normalizeValueKey(reserve?.state) === normalizeValueKey(stateFilter);
+            return matchesType && matchesState;
+        });
+    }, [reserves, typeFilter, stateFilter]);
 
     useEffect(() => {
         if (!record?.id) {
@@ -151,6 +172,48 @@
                         <Typography variant="subtitle1" gutterBottom>
                             {translate('menu.staReserve')}
                         </Typography>
+                        <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2} mb={2}>
+                            <FormControl size="small" sx={{ minWidth: 160 }}>
+                                <InputLabel id="sta-panel-reserve-type-label">
+                                    {translate('table.field.staReserve.type')}
+                                </InputLabel>
+                                <Select
+                                    labelId="sta-panel-reserve-type-label"
+                                    value={typeFilter}
+                                    label={translate('table.field.staReserve.type')}
+                                    onChange={(event) => setTypeFilter(event.target.value)}
+                                >
+                                    <MenuItem value="">
+                                        {translate('common.action.deselect')}
+                                    </MenuItem>
+                                    {RESERVE_TYPE_OPTIONS.map((option) => (
+                                        <MenuItem key={option} value={option}>
+                                            {formatReserveType(option, translate)}
+                                        </MenuItem>
+                                    ))}
+                                </Select>
+                            </FormControl>
+                            <FormControl size="small" sx={{ minWidth: 160 }}>
+                                <InputLabel id="sta-panel-reserve-state-label">
+                                    {translate('table.field.staReserve.state')}
+                                </InputLabel>
+                                <Select
+                                    labelId="sta-panel-reserve-state-label"
+                                    value={stateFilter}
+                                    label={translate('table.field.staReserve.state')}
+                                    onChange={(event) => setStateFilter(event.target.value)}
+                                >
+                                    <MenuItem value="">
+                                        {translate('common.action.deselect')}
+                                    </MenuItem>
+                                    {RESERVE_STATE_OPTIONS.map((option) => (
+                                        <MenuItem key={option} value={option}>
+                                            {formatReserveState(option, translate)}
+                                        </MenuItem>
+                                    ))}
+                                </Select>
+                            </FormControl>
+                        </Stack>
                         <Table size="small">
                             <TableHead>
                                 <TableRow>
@@ -180,7 +243,7 @@
                                         </TableCell>
                                     </TableRow>
                                 )}
-                                {!isReservesLoading && reserves.length === 0 && (
+                                {!isReservesLoading && filteredReserves.length === 0 && (
                                     <TableRow>
                                         <TableCell colSpan={RESERVE_COLUMN_COUNT}>
                                             <Typography variant="body2" color="textSecondary">
@@ -189,7 +252,7 @@
                                         </TableCell>
                                     </TableRow>
                                 )}
-                                {reserves.map((reserve) => (
+                                {filteredReserves.map((reserve) => (
                                     <TableRow key={reserve.id}>
                                         <TableCell>{reserve.uuid || '-'}</TableCell>
                                         <TableCell>{getReferenceLabel(taskLabelMap, reserve.taskId)}</TableCell>
@@ -260,7 +323,7 @@
                     height: 14,
                     borderRadius: '50%',
                     backgroundColor: color,
-                    boxShadow: `0 0 6px ${color}`,
+                    boxShadow: `0 0 3px ${color}`,
                     border: '1px solid rgba(0,0,0,0.12)'
                 }} />
                 <Typography variant="body2">
@@ -278,7 +341,7 @@
     if (isFalsy(value)) {
         return '#9e9e9e';
     }
-    return '#ff9800';
+    return '#d40000ff';
 };
 
 const isTruthy = (value) => {
@@ -336,7 +399,7 @@
     if (id === undefined || id === null || id === '') {
         return '-';
     }
-    return map?.[id] || id;
+    return map?.[id] || '-';
 };
 
 const formatReserveType = (value, translate) =>

--
Gitblit v1.9.1