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