From 9e84e0199af37546a5fe76befdf004fae84ca921 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期三, 25 二月 2026 13:36:34 +0800
Subject: [PATCH] 站点初始化,批量增加

---
 rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx |  127 +++++++++++++++++++++++++++++++++--------
 1 files changed, 101 insertions(+), 26 deletions(-)

diff --git a/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx b/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx
index 6509b57..49be844 100644
--- a/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx
+++ b/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx
@@ -30,12 +30,15 @@
     ReferenceInput,
     ReferenceArrayInput,
     AutocompleteInput,
-    DeleteButton,    
-    
+    DeleteButton,
+
 } from 'react-admin';
-import { Box, Typography, Card, Stack } from '@mui/material';
+import { Box, Typography, Card, Stack, Button } from '@mui/material';
+import ContentCopyIcon from '@mui/icons-material/ContentCopy';
+import PlaylistAddIcon from '@mui/icons-material/PlaylistAdd';
 import { styled } from '@mui/material/styles';
 import BasStationCreate from "./BasStationCreate";
+import BasStationInitModal from "./BasStationInitModal";
 import BasStationPanel from "./BasStationPanel";
 import EmptyData from "../../components/EmptyData";
 import MyCreateButton from "../../components/MyCreateButton";
@@ -45,6 +48,9 @@
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
 import WarehouseAreaField from "./WarehouseAreaField";
+import CrossZoneAreaField from "./CrossZoneAreaField";
+import ContainerTypesField from "./ContainerTypesField";
+import ChipArrayField from '@/page/components/ChipArrayField';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -56,16 +62,17 @@
     '& .column-name': {
     },
     '& .opt': {
-        width: 200
+        width: 220
     },
 }));
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" />,
+    <DateInput label='common.time.before' source="timeEnd" />,
 
-    <TextInput source="stationName" label="table.field.basStation.stationName" />,
+    <TextInput source="stationName" label="table.field.basStation.stationName" alwaysOn />,
+    <TextInput source="stationId" label="table.field.basStation.stationId" alwaysOn />,
     <NumberInput source="inAble" label="table.field.basStation.inAble" />,
     <NumberInput source="outAble" label="table.field.basStation.outAble" />,
     <TextInput source="useStatus" label="table.field.basStation.useStatus" />,
@@ -89,13 +96,38 @@
         resettable
     />,
 ]
-
+const CopyButton = ({ setCopyRecord, setCreateDialog }) => {
+    const record = useRecordContext();
+    const translate = useTranslate();
+    if (!record) return null;
+    return (
+        <Button
+            size="small"
+            startIcon={<ContentCopyIcon fontSize="small" />}
+            sx={{ padding: '1px', fontSize: '.75rem', minWidth: 'auto' }}
+            onClick={(e) => {
+                e.stopPropagation();
+                const { id, createTime, updateTime, createBy, updateBy, createBy$, updateBy$, ...rest } = record;
+                const copied = { ...rest };
+                if (record.areaIds) copied.areaIds = [...(Array.isArray(record.areaIds) ? record.areaIds : [])];
+                if (record.containerTypes) copied.containerTypes = [...(Array.isArray(record.containerTypes) ? record.containerTypes : [])];
+                setCopyRecord(copied);
+                setCreateDialog(true);
+            }}
+        >
+            {translate('toolbar.copy')}
+        </Button>
+    );
+};
 const BasStationList = () => {
     const translate = useTranslate();
 
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
-
+    const [areaFieldDialog, setAreaFieldDialog] = useState(false);
+    const [areaFieldDialog2, setAreaFieldDialog2] = useState(false);
+    const [copyRecord, setCopyRecord] = useState(null);
+    const [initDialogOpen, setInitDialogOpen] = useState(false);
     return (
         <Box display="flex">
             <List
@@ -115,6 +147,16 @@
                     <TopToolbar>
                         <FilterButton />
                         <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <Button
+                          variant="text"
+                          color="primary"
+                          size="small"
+                          startIcon={<PlaylistAddIcon />}
+                          onClick={() => setInitDialogOpen(true)}
+                          sx={{ ml: 1 }}
+                        >
+                          {translate('toolbar.siteInit')}
+                        </Button>
                         <SelectColumnsButton preferenceKey='basStation' />
                         <MyExportButton />
                     </TopToolbar>
@@ -124,61 +166,94 @@
                 <StyledDatagrid
                     preferenceKey='basStation'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                    rowClick={(id, resource, record) => false}                    
+                    rowClick={(id, resource, record) => false}
                     expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
+                    omit={['id', 'createTime', 'createBy', 'createBy$', 'memo', 'updateBy$', 'updateTime', 'autoTransfer', 'isCrossZone', 'isWcs', 'area$', 'memo']}
                 >
                     <NumberField source="id" />
+                    {/* <TextField source="type$" label="table.field.basStation.type" /> */}                    
                     <TextField source="stationName" label="table.field.basStation.stationName" />
+                    <TextField source="stationId" label="table.field.basStation.stationId" />               
+                    <FunctionField
+                        source="type"
+                        label="table.field.basStation.type"
+                        render={record => record.type === 1 ? '鏅�氱珯鐐�' : '鏅鸿兘绔欑偣'}
+                    />
+                    <TextField source="useStatus$" label="table.field.basStation.useStatus" />
+                    <WrapperField cellClassName="containerType" label="table.field.basStation.containerType">
+                        <ChipArrayField
+                            source="containerTypes$"
+                            apiEndpoint="/dictData/many/{ids}"
+                            labelField="label"
+                            dialogTitle={translate('table.field.basStation.containerType')}
+                            initialDisplayCount={1}
+                            placeholderText="{count} 涓尯鍩�"
+                        />
+                    </WrapperField>
+                    <TextField source="barcode" label="table.field.basStation.barcode" />
                     <FunctionField
                         source="inAble"
                         label="table.field.basStation.inAble"
                         render={record => record.inAble === 1 ? '鏄�' : '鍚�'}
-                    />                    
+                    />
                     <FunctionField
                         source="outAble"
                         label="table.field.basStation.outAble"
                         render={record => record.inAble === 1 ? '鏄�' : '鍚�'}
                     />
-                    <TextField source="useStatus$" label="table.field.basStation.useStatus" />
-                    <NumberField source="area$" label="table.field.basStation.area" />                    
+                    <NumberField source="area$" label="table.field.basStation.area" />
                     <FunctionField
                         source="isCrossZone"
                         label="table.field.basStation.isCrossZone"
                         render={record => record.inAble === 1 ? '鏄�' : '鍚�'}
                     />
-                    <TextField source="crossZoneArea" label="table.field.basStation.crossZoneArea" />                    
-                    
+                    <WrapperField cellClassName="crossZoneArea" label="table.field.basStation.crossZoneArea">
+                        {/* <CrossZoneAreaField
+                            open={areaFieldDialog}
+                            setOpen={setAreaFieldDialog}
+                        /> */}
+                        <ChipArrayField
+                            source="areaIds"
+                            apiEndpoint="/warehouseAreas/many/{ids}"
+                            labelField="name"
+                            dialogTitle={translate('table.field.basStation.crossZoneArea')}
+                            initialDisplayCount={1}
+                            placeholderText="{count} 涓尯鍩�"
+                        />
+                    </WrapperField>
                     <FunctionField
                         source="isWcs"
                         label="table.field.basStation.isWcs"
                         render={record => record.inAble === 1 ? '鏄�' : '鍚�'}
-                    />                    
-                    <NumberField source="containerType$" label="table.field.basStation.containerType" />
-                    <TextField source="barcode" label="table.field.basStation.barcode" />                    
+                    />
                     <FunctionField
                         source="autoTransfer"
                         label="table.field.basStation.autoTransfer"
                         render={record => record.inAble === 1 ? '鏄�' : '鍚�'}
                     />
-                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField>
+                    <TextField source="updateBy$" label="common.field.updateBy" />
                     <DateField source="updateTime" label="common.field.updateTime" showTime />
-                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField>
-                    <DateField source="createTime" label="common.field.createTime" showTime />                    
+                    <TextField source="createBy$" label="common.field.createBy" />
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    {/* <BooleanField source="statusBool" label="common.field.status" sortable={false} /> */}
                     <TextField source="memo" label="common.field.memo" sortable={false} />
                     <WrapperField cellClassName="opt" label="common.field.opt">
+                        <CopyButton setCopyRecord={setCopyRecord} setCreateDialog={setCreateDialog} />
                         <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                         <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                     </WrapperField>
                 </StyledDatagrid>
+
             </List>
             <BasStationCreate
                 open={createDialog}
                 setOpen={setCreateDialog}
+                copyRecord={copyRecord}
+                onClose={() => setCopyRecord(null)}
+            />
+            <BasStationInitModal
+              open={initDialogOpen}
+              setOpen={setInitDialogOpen}
             />
             <PageDrawer
                 title='BasStation Detail'

--
Gitblit v1.9.1