From 401e85bb3749bb9107f65ddaa15868a0a9ba852e Mon Sep 17 00:00:00 2001
From: verou <857149855@qq.com>
Date: 星期五, 11 四月 2025 14:18:46 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop

---
 rsf-admin/src/page/purchase/PurchaseItemList.jsx                                               |   25 
 rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx                                      |  173 ++++++++
 rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx                                      |   98 ++--
 rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx                               |   13 
 rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java                    |    3 
 rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx                                    |    2 
 rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx                                    |   12 
 rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx                                    |  158 +++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java  |   14 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java                |   43 ++
 rsf-admin/src/page/purchase/PurchaseItemCreate.jsx                                             |    0 
 rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx                                      |   23 
 rsf-admin/src/i18n/zh.js                                                                       |   11 
 rsf-admin/src/page/purchase/PurchaseItemEdit.jsx                                               |    0 
 rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx                                             |    2 
 rsf-admin/src/i18n/en.js                                                                       |    3 
 rsf-admin/src/page/ResourceContent.js                                                          |   18 
 rsf-admin/.env                                                                                 |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java     |    9 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java                   |   20 
 rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx                                      |  163 +++++++
 rsf-admin/src/page/system/serialRule/SerialRuleList.jsx                                        |   27 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java |   15 
 rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx                                             |   18 
 rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx                                    |   47 +-
 rsf-admin/src/page/taskLog/TaskItemLogList.jsx                                                 |    1 
 rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml                            |    1 
 rsf-admin/src/page/purchase/PurchaseEdit.jsx                                                   |  201 ++++-----
 rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx                                      |   42 -
 /dev/null                                                                                      |   18 
 rsf-admin/src/page/system/dicts/dictType/index.jsx                                             |    2 
 rsf-admin/src/page/purchase/PurchaseList.jsx                                                   |   24 
 rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx                                      |   34 -
 33 files changed, 837 insertions(+), 385 deletions(-)

diff --git a/rsf-admin/.env b/rsf-admin/.env
index a8ce658..a3c69b2 100644
--- a/rsf-admin/.env
+++ b/rsf-admin/.env
@@ -1,3 +1,3 @@
-VITE_BASE_IP=192.168.4.24
+VITE_BASE_IP=127.0.0.1
 # VITE_BASE_IP=47.76.147.249
 VITE_BASE_PORT=8080
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index daf2177..c18734e 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -9,6 +9,9 @@
             fail: "Fail",
             dataError: "Submit data was error, Please check",
         },
+        button: {
+            edit: "Edit",
+        },
         field: {
             id: 'ID',
             uuid: 'uuid',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 7a43338..f2bf06e 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -9,6 +9,9 @@
             fail: "鏈嶅姟鍣ㄩ敊璇�",
             dataError: "鏁版嵁閿欒锛岃浠旂粏妫�鏌�",
         },
+        button: {
+            edit: "缂栬緫",
+        },
         field: {
             id: 'ID',
             uuid: '缂栧彿',
@@ -507,14 +510,14 @@
                 code: "ASN鍗曞彿",
                 poCode: "PO缂栫爜",
                 poId: "PO鏍囪瘑",
-                type: "鍗曟嵁绫诲瀷",
+                type: "绫诲瀷",
                 wkType: "涓氬姟绫诲瀷",
                 anfme: "鏁伴噺",
-                qty: "宸插畬鎴愭暟閲�",
+                qty: "瀹屾垚鏁伴噺",
                 logisNo: "鐗╂祦鍗曞彿",
                 arrTime: "棰勮鍒拌揪鏃堕棿",
-                rleStatus: "閲婃斁鐘舵��",
-                ntyStatus: "璐ㄦ涓婃姤鐘舵��",
+                rleStatus: "鐘舵��",
+                ntyStatus: "涓婃姤鐘舵��",
             },
             asnOrderItem: {
                 asnId: "涓诲崟鏍囪瘑",
diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js
index 2ead1d2..82f7ee1 100644
--- a/rsf-admin/src/page/ResourceContent.js
+++ b/rsf-admin/src/page/ResourceContent.js
@@ -23,18 +23,18 @@
 import qlyInspect from './qlyInspect';
 import qlyIsptItem from './qlyIsptItem';
 import dictType from './system/dicts/dictType';
-import dictData from './system/dicts/dictData';
+// import dictData from './system/dicts/dictData';
 import companys from './basicInfo/companys';
 import locType from './basicInfo/locType';
 import locArea from './basicInfo//locArea';
 import locAreaMatRela from './basicInfo/locAreaMatRela';
 import locAreaMat from './basicInfo/locAreaMat';
-import serialRuleItem from './system/serialRuleItem';
+// import serialRuleItem from './system/serialRuleItem';
 import serialRule from './system/serialRule';
 import whMat from './basicInfo/whMat';
 import asnOrder from './asnOrder';
 import asnOrderItem from './asnOrderItem';
-import purchaseItem from './purchaseItem';
+// import purchaseItem from './purchaseItem';
 import purchase from './purchase';
 import fields from './fields';
 import fieldsItem from './fieldsItem';
@@ -89,12 +89,12 @@
             return qlyIsptItem;
         case 'dictType':
             return dictType;
-        case 'dictData':
-            return dictData;
+        // case 'dictData':
+        //     return dictData;
         case 'companys':
             return companys;
-        case 'serialRuleItem':
-            return serialRuleItem;
+        // case 'serialRuleItem':
+        //     return serialRuleItem;
         case 'serialRule':
             return serialRule;
         case 'whMat':
@@ -105,8 +105,8 @@
             return asnOrderItem;
         case 'asnOrderLog':
             return asnOrderLog;
-        case 'purchaseItem':
-            return purchaseItem;
+        // case 'purchaseItem':
+        //     return purchaseItem;
         case 'purchase':
             return purchase;
         case 'fields':
diff --git a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogCreate.jsx b/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogCreate.jsx
deleted file mode 100644
index e1c793e..0000000
--- a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogCreate.jsx
+++ /dev/null
@@ -1,265 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    CreateBase,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SaveButton,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    Toolbar,
-    required,
-    useDataProvider,
-    useNotify,
-    Form,
-    useCreateController,
-} from 'react-admin';
-import {
-    Dialog,
-    DialogActions,
-    DialogContent,
-    DialogTitle,
-    Stack,
-    Grid,
-    Box,
-} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
-
-const AsnOrderItemLogCreate = (props) => {
-    const { open, setOpen } = props;
-
-    const translate = useTranslate();
-    const notify = useNotify();
-
-    const handleClose = (event, reason) => {
-        if (reason !== "backdropClick") {
-            setOpen(false);
-        }
-    };
-
-    const handleSuccess = async (data) => {
-        setOpen(false);
-        notify('common.response.success');
-    };
-
-    const handleError = async (error) => {
-        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
-    };
-
-    return (
-        <>
-            <CreateBase
-                record={{}}
-                transform={(data) => {
-                    return data;
-                }}
-                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
-            >
-                <Dialog
-                    open={open}
-                    onClose={handleClose}
-                    aria-labelledby="form-dialog-title"
-                    fullWidth
-                    disableRestoreFocus
-                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-                >
-                    <Form>
-                        <DialogTitle id="form-dialog-title" sx={{
-                            position: 'sticky',
-                            top: 0,
-                            backgroundColor: 'background.paper',
-                            zIndex: 1000
-                        }}
-                        >
-                            {translate('create.title')}
-                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
-                                <DialogCloseButton onClose={handleClose} />
-                            </Box>
-                        </DialogTitle>
-                        <DialogContent sx={{ mt: 2 }}>
-                            <Grid container rowSpacing={2} columnSpacing={2}>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.asnOrderItemLog.asnId"
-                                        source="asnId"
-                                        autoFocus
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.asnCode"
-                                        source="asnCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.platItemId"
-                                        source="platItemId"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.asnOrderItemLog.poDetlId"
-                                        source="poDetlId"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.poCode"
-                                        source="poCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.fieldsIndex"
-                                        source="fieldsIndex"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.matnrId"
-                                        source="matnrId"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.matnrCode"
-                                        source="matnrCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.maktx"
-                                        source="maktx"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.asnOrderItemLog.anfme"
-                                        source="anfme"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.stockUnit"
-                                        source="stockUnit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.asnOrderItemLog.purQty"
-                                        source="purQty"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.purUnit"
-                                        source="purUnit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.asnOrderItemLog.qty"
-                                        source="qty"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.splrCode"
-                                        source="splrCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.splrBatch"
-                                        source="splrBatch"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.splrName"
-                                        source="splrName"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.qrcode"
-                                        source="qrcode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.trackCode"
-                                        source="trackCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.barcode"
-                                        source="barcode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.asnOrderItemLog.packName"
-                                        source="packName"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <SelectInput
-                                        label="table.field.asnOrderItemLog.ntyStatus"
-                                        source="ntyStatus"
-                                        choices={[
-                                            { id: 0, name: ' 鏈笂鎶�' },
-                                            { id:  1, name: ' 宸蹭笂鎶�' },
-                                        ]}
-                                    />
-                                </Grid>
-
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <StatusSelectInput />
-                                </Grid>
-                                <Grid item xs={12} display="flex" gap={1}>
-                                    <Stack direction="column" spacing={1} width={'100%'}>
-                                        <MemoInput />
-                                    </Stack>
-                                </Grid>
-                            </Grid>
-                        </DialogContent>
-                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
-                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
-                                <SaveButton />
-                            </Toolbar>
-                        </DialogActions>
-                    </Form>
-                </Dialog>
-            </CreateBase>
-        </>
-    )
-}
-
-export default AsnOrderItemLogCreate;
diff --git a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogEdit.jsx b/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogEdit.jsx
deleted file mode 100644
index dab571c..0000000
--- a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogEdit.jsx
+++ /dev/null
@@ -1,238 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    SaveButton,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
-
-const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
-    return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton />
-            <DeleteButton mutationMode="optimistic" />
-        </Toolbar>
-    )
-}
-
-const AsnOrderItemLogEdit = () => {
-    const translate = useTranslate();
-
-    return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
-            >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.asnOrderItemLog.asnId"
-                                source="asnId"
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.asnCode"
-                                source="asnCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.platItemId"
-                                source="platItemId"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.asnOrderItemLog.poDetlId"
-                                source="poDetlId"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.poCode"
-                                source="poCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.fieldsIndex"
-                                source="fieldsIndex"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.matnrId"
-                                source="matnrId"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.matnrCode"
-                                source="matnrCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.maktx"
-                                source="maktx"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.asnOrderItemLog.anfme"
-                                source="anfme"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.stockUnit"
-                                source="stockUnit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.asnOrderItemLog.purQty"
-                                source="purQty"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.purUnit"
-                                source="purUnit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.asnOrderItemLog.qty"
-                                source="qty"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.splrCode"
-                                source="splrCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.splrBatch"
-                                source="splrBatch"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.splrName"
-                                source="splrName"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.qrcode"
-                                source="qrcode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.trackCode"
-                                source="trackCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.barcode"
-                                source="barcode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.asnOrderItemLog.packName"
-                                source="packName"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <SelectInput
-                                label="table.field.asnOrderItemLog.ntyStatus"
-                                source="ntyStatus"
-                                choices={[
-                                    { id: 0, name: ' 鏈笂鎶�' },
-                                    { id:  1, name: ' 宸蹭笂鎶�' },
-                                ]}
-                                validate={required()}
-                            />
-                        </Stack>
-
-                    </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
-    )
-}
-
-export default AsnOrderItemLogEdit;
diff --git a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogList.jsx b/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogList.jsx
deleted file mode 100644
index 6161f34..0000000
--- a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogList.jsx
+++ /dev/null
@@ -1,193 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import { useNavigate } from 'react-router-dom';
-import {
-    List,
-    DatagridConfigurable,
-    SearchInput,
-    TopToolbar,
-    SelectColumnsButton,
-    EditButton,
-    FilterButton,
-    CreateButton,
-    ExportButton,
-    BulkDeleteButton,
-    WrapperField,
-    useRecordContext,
-    useTranslate,
-    useNotify,
-    useListContext,
-    FunctionField,
-    TextField,
-    NumberField,
-    DateField,
-    BooleanField,
-    ReferenceField,
-    TextInput,
-    DateTimeInput,
-    DateInput,
-    SelectInput,
-    NumberInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    DeleteButton,
-} from 'react-admin';
-import { Box, Typography, Card, Stack } from '@mui/material';
-import { styled } from '@mui/material/styles';
-import AsnOrderItemLogCreate from "./AsnOrderItemLogCreate";
-import AsnOrderItemLogPanel from "./AsnOrderItemLogPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
-import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
-
-const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
-    '& .css-1vooibu-MuiSvgIcon-root': {
-        height: '.9em'
-    },
-    '& .RaDatagrid-row': {
-        cursor: 'auto'
-    },
-    '& .column-name': {
-    },
-    '& .opt': {
-        width: 200
-    },
-}));
-
-const filters = [
-    <SearchInput source="condition" alwaysOn />,
-
-    <NumberInput source="asnId" label="table.field.asnOrderItemLog.asnId" />,
-    <TextInput source="asnCode" label="table.field.asnOrderItemLog.asnCode" />,
-    <TextInput source="platItemId" label="table.field.asnOrderItemLog.platItemId" />,
-    <NumberInput source="poDetlId" label="table.field.asnOrderItemLog.poDetlId" />,
-    <TextInput source="poCode" label="table.field.asnOrderItemLog.poCode" />,
-    <TextInput source="fieldsIndex" label="table.field.asnOrderItemLog.fieldsIndex" />,
-    <TextInput source="matnrId" label="table.field.asnOrderItemLog.matnrId" />,
-    <TextInput source="matnrCode" label="table.field.asnOrderItemLog.matnrCode" />,
-    <TextInput source="maktx" label="table.field.asnOrderItemLog.maktx" />,
-    <NumberInput source="anfme" label="table.field.asnOrderItemLog.anfme" />,
-    <TextInput source="stockUnit" label="table.field.asnOrderItemLog.stockUnit" />,
-    <NumberInput source="purQty" label="table.field.asnOrderItemLog.purQty" />,
-    <TextInput source="purUnit" label="table.field.asnOrderItemLog.purUnit" />,
-    <NumberInput source="qty" label="table.field.asnOrderItemLog.qty" />,
-    <TextInput source="splrCode" label="table.field.asnOrderItemLog.splrCode" />,
-    <TextInput source="splrBatch" label="table.field.asnOrderItemLog.splrBatch" />,
-    <TextInput source="splrName" label="table.field.asnOrderItemLog.splrName" />,
-    <TextInput source="qrcode" label="table.field.asnOrderItemLog.qrcode" />,
-    <TextInput source="trackCode" label="table.field.asnOrderItemLog.trackCode" />,
-    <TextInput source="barcode" label="table.field.asnOrderItemLog.barcode" />,
-    <TextInput source="packName" label="table.field.asnOrderItemLog.packName" />,
-    <SelectInput source="ntyStatus" label="table.field.asnOrderItemLog.ntyStatus"
-        choices={[
-            { id: 0, name: ' 鏈笂鎶�' },
-            { id: 1, name: ' 宸蹭笂鎶�' },
-        ]}
-    />,
-
-    <TextInput label="common.field.memo" source="memo" />,
-    <SelectInput
-        label="common.field.status"
-        source="status"
-        choices={[
-            { id: '1', name: 'common.enums.statusTrue' },
-            { id: '0', name: 'common.enums.statusFalse' },
-        ]}
-        resettable
-    />,
-]
-
-const AsnOrderItemLogList = () => {
-    const translate = useTranslate();
-
-    const [createDialog, setCreateDialog] = useState(false);
-    const [drawerVal, setDrawerVal] = useState(false);
-
-    return (
-        <Box display="flex">
-            <List
-                sx={{
-                    flexGrow: 1,
-                    transition: (theme) =>
-                        theme.transitions.create(['all'], {
-                            duration: theme.transitions.duration.enteringScreen,
-                        }),
-                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
-                }}
-                title={"menu.asnOrderItemLog"}
-                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
-                filters={filters}
-                sort={{ field: "create_time", order: "desc" }}
-                actions={(
-                    <TopToolbar>
-                        <FilterButton />
-                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
-                        <SelectColumnsButton preferenceKey='asnOrderItemLog' />
-                        <MyExportButton />
-                    </TopToolbar>
-                )}
-                perPage={DEFAULT_PAGE_SIZE}
-            >
-                <StyledDatagrid
-                    preferenceKey='asnOrderItemLog'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                    rowClick={(id, resource, record) => false}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
-                >
-                    <NumberField source="id" />
-                    <NumberField source="asnId" label="table.field.asnOrderItemLog.asnId" />
-                    <TextField source="asnCode" label="table.field.asnOrderItemLog.asnCode" />
-                    <TextField source="platItemId" label="table.field.asnOrderItemLog.platItemId" />
-                    <NumberField source="poDetlId" label="table.field.asnOrderItemLog.poDetlId" />
-                    <TextField source="poCode" label="table.field.asnOrderItemLog.poCode" />
-                    <TextField source="fieldsIndex" label="table.field.asnOrderItemLog.fieldsIndex" />
-                    <TextField source="matnrId" label="table.field.asnOrderItemLog.matnrId" />
-                    <TextField source="matnrCode" label="table.field.asnOrderItemLog.matnrCode" />
-                    <TextField source="maktx" label="table.field.asnOrderItemLog.maktx" />
-                    <NumberField source="anfme" label="table.field.asnOrderItemLog.anfme" />
-                    <NumberField source="purQty" label="table.field.asnOrderItemLog.purQty" />
-                    <TextField source="purUnit" label="table.field.asnOrderItemLog.purUnit" />
-                    <NumberField source="qty" label="table.field.asnOrderItemLog.qty" />
-                    <TextField source="splrCode" label="table.field.asnOrderItemLog.splrCode" />
-                    <TextField source="splrBatch" label="table.field.asnOrderItemLog.splrBatch" />
-                    <TextField source="splrName" label="table.field.asnOrderItemLog.splrName" />
-                    <TextField source="qrcode" label="table.field.asnOrderItemLog.qrcode" />
-                    <TextField source="trackCode" label="table.field.asnOrderItemLog.trackCode" />
-                    <TextField source="packName" label="table.field.asnOrderItemLog.packName" />
-                    <TextField source="ntyStatus$" label="table.field.asnOrderItemLog.ntyStatus" sortable={false} />
-
-                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField>
-                    <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 />
-                    <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">
-                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
-                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
-                    </WrapperField>
-                </StyledDatagrid>
-            </List>
-            <AsnOrderItemLogCreate
-                open={createDialog}
-                setOpen={setCreateDialog}
-            />
-            <PageDrawer
-                title='AsnOrderItemLog Detail'
-                drawerVal={drawerVal}
-                setDrawerVal={setDrawerVal}
-            >
-            </PageDrawer>
-        </Box>
-    )
-}
-
-export default AsnOrderItemLogList;
diff --git a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogPanel.jsx b/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogPanel.jsx
deleted file mode 100644
index 8fb6c06..0000000
--- a/rsf-admin/src/page/asnOrderItemLog/AsnOrderItemLogPanel.jsx
+++ /dev/null
@@ -1,183 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
-import {
-    useTranslate,
-    useRecordContext,
-} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
-import * as Common from '@/utils/common'
-
-const AsnOrderItemLogPanel = () => {
-    const record = useRecordContext();
-    if (!record) return null;
-    const translate = useTranslate();
-    return (
-        <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.asnOrderItemLog.id'))}: {record.id}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.asnId" 
-                                property={record.asnId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.asnCode" 
-                                property={record.asnCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.platItemId" 
-                                property={record.platItemId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.poDetlId" 
-                                property={record.poDetlId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.poCode" 
-                                property={record.poCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.fieldsIndex" 
-                                property={record.fieldsIndex}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.matnrId" 
-                                property={record.matnrId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.matnrCode" 
-                                property={record.matnrCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.maktx" 
-                                property={record.maktx}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.anfme" 
-                                property={record.anfme}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.stockUnit" 
-                                property={record.stockUnit}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.purQty" 
-                                property={record.purQty}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.purUnit" 
-                                property={record.purUnit}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.qty" 
-                                property={record.qty}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.splrCode" 
-                                property={record.splrCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.splrBatch" 
-                                property={record.splrBatch}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.splrName" 
-                                property={record.splrName}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.qrcode" 
-                                property={record.qrcode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.trackCode" 
-                                property={record.trackCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.barcode" 
-                                property={record.barcode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.packName" 
-                                property={record.packName}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.asnOrderItemLog.ntyStatus" 
-                                property={record.ntyStatus$}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default AsnOrderItemLogPanel;
diff --git a/rsf-admin/src/page/asnOrderItemLog/index.jsx b/rsf-admin/src/page/asnOrderItemLog/index.jsx
deleted file mode 100644
index 555b583..0000000
--- a/rsf-admin/src/page/asnOrderItemLog/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import AsnOrderItemLogList from "./AsnOrderItemLogList";
-import AsnOrderItemLogEdit from "./AsnOrderItemLogEdit";
-
-export default {
-    list: AsnOrderItemLogList,
-    edit: AsnOrderItemLogEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
index f3701ff..3160580 100644
--- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
+++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
@@ -141,7 +141,7 @@
                     {translate('common.edit.title.common')}
                 </Typography>
             </Grid>
-            <AsnOrderItemLogList />
+            {/* <AsnOrderItemLogList /> */}
         </>
     )
 }
diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx
index 29c4a09..ceb24f6 100644
--- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx
+++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx
@@ -60,7 +60,6 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-
     <TextInput source="code" label="table.field.asnOrderLog.code" />,
     <TextInput source="poCode" label="table.field.asnOrderLog.poCode" />,
     <NumberInput source="poId" label="table.field.asnOrderLog.poId" />,
@@ -128,32 +127,27 @@
             >
                 <StyledDatagrid
                     preferenceKey='asnOrderLog'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    bulkActionButtons={false}
                     rowClick={'edit'}
                     expand={false}
                     expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'rleStatus']}
                 >
                     <NumberField source="id" />
                     <TextField source="code" label="table.field.asnOrderLog.code" />
                     <TextField source="poCode" label="table.field.asnOrderLog.poCode" />
                     <NumberField source="poId" label="table.field.asnOrderLog.poId" />
-                    <TextField source="type" label="table.field.asnOrderLog.type" />
-                    <TextField source="wkType" label="table.field.asnOrderLog.wkType" />
+                    <TextField source="type$" label="table.field.asnOrderLog.type" />
+                    <TextField source="wkType$" label="table.field.asnOrderLog.wkType" />
                     <NumberField source="anfme" label="table.field.asnOrderLog.anfme" />
                     <NumberField source="qty" label="table.field.asnOrderLog.qty" />
                     <TextField source="logisNo" label="table.field.asnOrderLog.logisNo" />
                     <DateField source="arrTime" label="table.field.asnOrderLog.arrTime" showTime />
                     <TextField source="rleStatus$" label="table.field.asnOrderLog.rleStatus" sortable={false} />
                     <TextField source="ntyStatus$" label="table.field.asnOrderLog.ntyStatus" sortable={false} />
-
-                    <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>
+                    <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} />
diff --git a/rsf-admin/src/page/batchRegular/BatchRegularCreate.jsx b/rsf-admin/src/page/batchRegular/BatchRegularCreate.jsx
deleted file mode 100644
index 74b73e1..0000000
--- a/rsf-admin/src/page/batchRegular/BatchRegularCreate.jsx
+++ /dev/null
@@ -1,132 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    CreateBase,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SaveButton,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    Toolbar,
-    required,
-    useDataProvider,
-    useNotify,
-    Form,
-    useCreateController,
-} from 'react-admin';
-import {
-    Dialog,
-    DialogActions,
-    DialogContent,
-    DialogTitle,
-    Stack,
-    Grid,
-    Box,
-} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
-
-const BatchRegularCreate = (props) => {
-    const { open, setOpen } = props;
-
-    const translate = useTranslate();
-    const notify = useNotify();
-
-    const handleClose = (event, reason) => {
-        if (reason !== "backdropClick") {
-            setOpen(false);
-        }
-    };
-
-    const handleSuccess = async (data) => {
-        setOpen(false);
-        notify('common.response.success');
-    };
-
-    const handleError = async (error) => {
-        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
-    };
-
-    return (
-        <>
-            <CreateBase
-                record={{}}
-                transform={(data) => {
-                    return data;
-                }}
-                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
-            >
-                <Dialog
-                    open={open}
-                    onClose={handleClose}
-                    aria-labelledby="form-dialog-title"
-                    fullWidth
-                    disableRestoreFocus
-                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-                >
-                    <Form>
-                        <DialogTitle id="form-dialog-title" sx={{
-                            position: 'sticky',
-                            top: 0,
-                            backgroundColor: 'background.paper',
-                            zIndex: 1000
-                        }}
-                        >
-                            {translate('create.title')}
-                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
-                                <DialogCloseButton onClose={handleClose} />
-                            </Box>
-                        </DialogTitle>
-                        <DialogContent sx={{ mt: 2 }}>
-                            <Grid container rowSpacing={2} columnSpacing={2}>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.batchRegular.name"
-                                        source="name"
-                                        parse={v => v}
-                                        autoFocus
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.batchRegular.code"
-                                        source="code"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.batchRegular.property"
-                                        source="property"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <StatusSelectInput />
-                                </Grid>
-                                <Grid item xs={12} display="flex" gap={1}>
-                                    <Stack direction="column" spacing={1} width={'100%'}>
-                                        <MemoInput />
-                                    </Stack>
-                                </Grid>
-                            </Grid>
-                        </DialogContent>
-                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
-                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
-                                <SaveButton />
-                            </Toolbar>
-                        </DialogActions>
-                    </Form>
-                </Dialog>
-            </CreateBase>
-        </>
-    )
-}
-
-export default BatchRegularCreate;
diff --git a/rsf-admin/src/page/batchRegular/BatchRegularEdit.jsx b/rsf-admin/src/page/batchRegular/BatchRegularEdit.jsx
deleted file mode 100644
index 36629d5..0000000
--- a/rsf-admin/src/page/batchRegular/BatchRegularEdit.jsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    SaveButton,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
-
-const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
-    return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton />
-            <DeleteButton mutationMode="optimistic" />
-        </Toolbar>
-    )
-}
-
-const BatchRegularEdit = () => {
-    const translate = useTranslate();
-
-    return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
-            >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.batchRegular.name"
-                                source="name"
-                                parse={v => v}
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.batchRegular.code"
-                                source="code"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.batchRegular.property"
-                                source="property"
-                                parse={v => v}
-                            />
-                        </Stack>
-
-                    </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
-    )
-}
-
-export default BatchRegularEdit;
diff --git a/rsf-admin/src/page/batchRegular/BatchRegularList.jsx b/rsf-admin/src/page/batchRegular/BatchRegularList.jsx
deleted file mode 100644
index 5a19e66..0000000
--- a/rsf-admin/src/page/batchRegular/BatchRegularList.jsx
+++ /dev/null
@@ -1,156 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import { useNavigate } from 'react-router-dom';
-import {
-    List,
-    DatagridConfigurable,
-    SearchInput,
-    TopToolbar,
-    SelectColumnsButton,
-    EditButton,
-    FilterButton,
-    CreateButton,
-    ExportButton,
-    BulkDeleteButton,
-    WrapperField,
-    useRecordContext,
-    useTranslate,
-    useNotify,
-    useListContext,
-    FunctionField,
-    TextField,
-    NumberField,
-    DateField,
-    BooleanField,
-    ReferenceField,
-    TextInput,
-    DateTimeInput,
-    DateInput,
-    SelectInput,
-    NumberInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    DeleteButton,
-} from 'react-admin';
-import { Box, Typography, Card, Stack } from '@mui/material';
-import { styled } from '@mui/material/styles';
-import BatchRegularCreate from "./BatchRegularCreate";
-import BatchRegularPanel from "./BatchRegularPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
-import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
-
-const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
-    '& .css-1vooibu-MuiSvgIcon-root': {
-        height: '.9em'
-    },
-    '& .RaDatagrid-row': {
-        cursor: 'auto'
-    },
-    '& .column-name': {
-    },
-    '& .opt': {
-        width: 200
-    },
-}));
-
-const filters = [
-    <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
-
-    <TextInput source="name" label="table.field.batchRegular.name" />,
-    <TextInput source="code" label="table.field.batchRegular.code" />,
-    <TextInput source="property" label="table.field.batchRegular.property" />,
-
-    <TextInput label="common.field.memo" source="memo" />,
-    <SelectInput
-        label="common.field.status"
-        source="status"
-        choices={[
-            { id: '1', name: 'common.enums.statusTrue' },
-            { id: '0', name: 'common.enums.statusFalse' },
-        ]}
-        resettable
-    />,
-]
-
-const BatchRegularList = () => {
-    const translate = useTranslate();
-
-    const [createDialog, setCreateDialog] = useState(false);
-    const [drawerVal, setDrawerVal] = useState(false);
-
-    return (
-        <Box display="flex">
-            <List
-                sx={{
-                    flexGrow: 1,
-                    transition: (theme) =>
-                        theme.transitions.create(['all'], {
-                            duration: theme.transitions.duration.enteringScreen,
-                        }),
-                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
-                }}
-                title={"menu.batchRegular"}
-                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
-                filters={filters}
-                sort={{ field: "create_time", order: "desc" }}
-                actions={(
-                    <TopToolbar>
-                        <FilterButton />
-                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
-                        <SelectColumnsButton preferenceKey='batchRegular' />
-                        <MyExportButton />
-                    </TopToolbar>
-                )}
-                perPage={DEFAULT_PAGE_SIZE}
-            >
-                <StyledDatagrid
-                    preferenceKey='batchRegular'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                    rowClick={(id, resource, record) => false}
-                    expand={() => <BatchRegularPanel />}
-                    expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
-                >
-                    <NumberField source="id" />
-                    <TextField source="name" label="table.field.batchRegular.name" />
-                    <TextField source="code" label="table.field.batchRegular.code" />
-                    <TextField source="property" label="table.field.batchRegular.property" />
-
-                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField>
-                    <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 />
-                    <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">
-                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
-                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
-                    </WrapperField>
-                </StyledDatagrid>
-            </List>
-            <BatchRegularCreate
-                open={createDialog}
-                setOpen={setCreateDialog}
-            />
-            <PageDrawer
-                title='BatchRegular Detail'
-                drawerVal={drawerVal}
-                setDrawerVal={setDrawerVal}
-            >
-            </PageDrawer>
-        </Box>
-    )
-}
-
-export default BatchRegularList;
diff --git a/rsf-admin/src/page/batchRegular/BatchRegularPanel.jsx b/rsf-admin/src/page/batchRegular/BatchRegularPanel.jsx
deleted file mode 100644
index d1c80be..0000000
--- a/rsf-admin/src/page/batchRegular/BatchRegularPanel.jsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
-import {
-    useTranslate,
-    useRecordContext,
-} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
-import * as Common from '@/utils/common'
-
-const BatchRegularPanel = () => {
-    const record = useRecordContext();
-    if (!record) return null;
-    const translate = useTranslate();
-    return (
-        <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.batchRegular.name'))}: {record.name}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.batchRegular.name" 
-                                property={record.name}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.batchRegular.code" 
-                                property={record.code}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.batchRegular.property" 
-                                property={record.property}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default BatchRegularPanel;
diff --git a/rsf-admin/src/page/batchRegular/index.jsx b/rsf-admin/src/page/batchRegular/index.jsx
deleted file mode 100644
index 5752ce6..0000000
--- a/rsf-admin/src/page/batchRegular/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import BatchRegularList from "./BatchRegularList";
-import BatchRegularEdit from "./BatchRegularEdit";
-
-export default {
-    list: BatchRegularList,
-    edit: BatchRegularEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.name}`
-    }
-};
diff --git a/rsf-admin/src/page/purchase/PurchaseEdit.jsx b/rsf-admin/src/page/purchase/PurchaseEdit.jsx
index b12726f..93bb094 100644
--- a/rsf-admin/src/page/purchase/PurchaseEdit.jsx
+++ b/rsf-admin/src/page/purchase/PurchaseEdit.jsx
@@ -28,12 +28,13 @@
 import CustomerTopToolBar from "../components/EditTopToolBar";
 import MemoInput from "../components/MemoInput";
 import StatusSelectInput from "../components/StatusSelectInput";
+import PurchaseItemList from "./PurchaseItemList";
 
 const FormToolbar = () => {
     const { getValues } = useFormContext();
 
     return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
+        <Toolbar sx={{ justifyContent: 'end' }}>
             <SaveButton />
             <DeleteButton mutationMode="optimistic" />
         </Toolbar>
@@ -44,26 +45,27 @@
     const translate = useTranslate();
 
     return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
+        <>
+            <Edit
+                redirect="list"
+                mutationMode={EDIT_MODE}
+                actions={<CustomerTopToolBar />}
+                aside={<EditBaseAside />}
             >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        {/* <Stack direction='row' gap={2}>
+                <SimpleForm
+                    shouldUnregister
+                    warnWhenUnsavedChanges
+                    toolbar={<FormToolbar />}
+                    mode="onTouched"
+                    defaultValues={{}}
+                // validate={(values) => { }}
+                >
+                    <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                        <Grid item xs={18} md={10}>
+                            <Typography variant="h6" gutterBottom>
+                                {translate('common.edit.title.main')}
+                            </Typography>
+                            {/* <Stack direction='row' gap={2}>
                             <TextInput
                                 label="table.field.purchase.code"
                                 source="code"
@@ -71,95 +73,80 @@
                                 autoFocus
                             />
                         </Stack> */}
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.purchase.type"
-                                source="type"
-                                parse={v => v}
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.purchase.source"
-                                source="source"
-                                parse={v => v}
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
+                            <Stack direction='row' gap={2}>
+                                <TextInput
+                                    label="table.field.purchase.type"
+                                    source="type$"
+                                    parse={v => v}
+                                    validate={required()}
+                                />
+                                <TextInput
+                                    label="table.field.purchase.source"
+                                    source="source"
+                                    parse={v => v}
+                                    validate={required()}
+                                />
+                                <DateInput
+                                    label="table.field.purchase.preArr"
+                                    source="preArr"
+                                />
+                                <NumberInput
+                                    label="table.field.purchase.anfme"
+                                    source="anfme"
+                                    validate={required()}
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
+                                <NumberInput
+                                    label="table.field.purchase.qty"
+                                    source="qty"
+                                    validate={required()}
+                                />
+                                <NumberInput
+                                    label="table.field.purchase.workQty"
+                                    source="workQty"
+                                    validate={required()}
+                                />
+                                <TextInput
+                                    label="table.field.purchase.channel"
+                                    source="channel"
+                                    parse={v => v}
+                                />
+                                <TextInput
+                                    label="table.field.purchase.platCode"
+                                    source="platCode"
+                                    parse={v => v}
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
                             <DateInput
-                                label="table.field.purchase.preArr"
-                                source="preArr"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.purchase.anfme"
-                                source="anfme"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.purchase.qty"
-                                source="qty"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.purchase.workQty"
-                                source="workQty"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.purchase.channel"
-                                source="channel"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.purchase.platCode"
-                                source="platCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <DateInput
-                                label="table.field.purchase.startTime"
-                                source="startTime"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <DateInput
-                                label="table.field.purchase.endTime"
-                                source="endTime"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.purchase.project"
-                                source="project"
-                                parse={v => v}
-                            />
-                        </Stack>
-
+                                    label="table.field.purchase.startTime"
+                                    source="startTime"
+                                />
+                                <DateInput
+                                    label="table.field.purchase.endTime"
+                                    source="endTime"
+                                />
+                                <TextInput
+                                    label="table.field.purchase.project"
+                                    source="project"
+                                    parse={v => v}
+                                />
+                            </Stack>
+                        </Grid>
+                        <Grid item xs={6} md={2}>
+                            <Typography variant="h6" gutterBottom>
+                                {translate('common.edit.title.common')}
+                            </Typography>
+                            <StatusSelectInput />
+                            <Box mt="2em" />
+                            <MemoInput />
+                        </Grid>
                     </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
+                </SimpleForm>
+            </Edit >
+            <PurchaseItemList />                            
+        </>
     )
 }
 
diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx b/rsf-admin/src/page/purchase/PurchaseItemCreate.jsx
similarity index 100%
rename from rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx
rename to rsf-admin/src/page/purchase/PurchaseItemCreate.jsx
diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemEdit.jsx b/rsf-admin/src/page/purchase/PurchaseItemEdit.jsx
similarity index 100%
rename from rsf-admin/src/page/purchaseItem/PurchaseItemEdit.jsx
rename to rsf-admin/src/page/purchase/PurchaseItemEdit.jsx
diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx b/rsf-admin/src/page/purchase/PurchaseItemList.jsx
similarity index 87%
rename from rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx
rename to rsf-admin/src/page/purchase/PurchaseItemList.jsx
index ce3083d..970263d 100644
--- a/rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx
+++ b/rsf-admin/src/page/purchase/PurchaseItemList.jsx
@@ -31,19 +31,16 @@
   ReferenceArrayInput,
   AutocompleteInput,
   DeleteButton,
+  useGetRecordId,
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
 import PurchaseItemCreate from "./PurchaseItemCreate";
-import PurchaseItemPanel from "./PurchaseItemPanel";
 import EmptyData from "../components/EmptyData";
 import MyCreateButton from "../components/MyCreateButton";
 import MyExportButton from '../components/MyExportButton';
 import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
-import CustomerTopToolBar from "../components/EditTopToolBar";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
   '& .css-1vooibu-MuiSvgIcon-root': {
@@ -90,19 +87,15 @@
 
 const PurchaseItemList = () => {
   const translate = useTranslate();
-
   const [createDialog, setCreateDialog] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
-
-  const location = useLocation();
-  const queryParams = new URLSearchParams(location.search);
-  const poId = queryParams.get("poId");
+  const poId = useGetRecordId();
 
   return (
     <>
-      {poId && <CustomerTopToolBar backPrevious={true} />}
       <Box display="flex">
         <List
+          resource="purchaseItem"
           sx={{
             flexGrow: 1,
             transition: (theme) =>
@@ -114,6 +107,7 @@
           title={"menu.purchaseItem"}
           empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
           filters={filters}
+          filter={{ purchaseId: poId }}
           sort={{ field: "create_time", order: "desc" }}
           actions={(
             <TopToolbar>
@@ -129,7 +123,7 @@
             preferenceKey='purchaseItem'
             bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
             rowClick={(id, resource, record) => false}
-            omit={['id', 'createTime', 'createBy', 'memo']}
+            omit={['id', 'createTime','purchaseId', 'platItemId', 'createBy', 'memo']}
           >
             <NumberField source="id" />
             <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" />
@@ -145,14 +139,9 @@
             <TextField source="splrName" label="table.field.purchaseItem.splrName" />
             <TextField source="splrCode" label="table.field.purchaseItem.splrCode" />
             <TextField source="splrBatch" label="table.field.purchaseItem.splrBatch" />
-
-            <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-              <TextField source="nickname" />
-            </ReferenceField>
+            <TextField source="updateBy$" label="common.field.updateBy" reference="user" />
             <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>
+            <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} />
diff --git a/rsf-admin/src/page/purchase/PurchaseList.jsx b/rsf-admin/src/page/purchase/PurchaseList.jsx
index ffdb648..0a45197 100644
--- a/rsf-admin/src/page/purchase/PurchaseList.jsx
+++ b/rsf-admin/src/page/purchase/PurchaseList.jsx
@@ -124,20 +124,13 @@
           preferenceKey='purchase'
           bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
           rowClick={'edit'}
-          expand={() => <PurchasePanel />}
+          expand={false}
           expandSingle={true}
-          omit={['id', 'createTime', 'createBy', 'memo']}
+          omit={['id', 'createTime', 'createBy', 'memo', 'preArr', 'channel','startTime','workQty', 'endTime']}
         >
           <NumberField source="id" />
-          <MyField
-            source="code"
-            label="table.field.purchase.code"
-            onClick={(event, record, val) => {
-              event.stopPropagation();
-              assign(record);
-            }}
-          />
-          <TextField source="type" label="table.field.purchase.type" />
+          <TextField source="code" label="table.field.purchase.code" />
+          <TextField source="type$" label="table.field.purchase.type" />
           <TextField source="source" label="table.field.purchase.source" />
           <DateField source="preArr" label="table.field.purchase.preArr" showTime />
           <NumberField source="anfme" label="table.field.purchase.anfme" />
@@ -148,14 +141,9 @@
           <DateField source="startTime" label="table.field.purchase.startTime" showTime />
           <DateField source="endTime" label="table.field.purchase.endTime" showTime />
           <TextField source="project" label="table.field.purchase.project" />
-
-          <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>
+          <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} />
diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx b/rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx
deleted file mode 100644
index 0662e94..0000000
--- a/rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx
+++ /dev/null
@@ -1,129 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
-import {
-    useTranslate,
-    useRecordContext,
-} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
-import * as Common from '@/utils/common'
-
-const PurchaseItemPanel = () => {
-    const record = useRecordContext();
-    if (!record) return null;
-    const translate = useTranslate();
-    return (
-        <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.purchaseItem.id'))}: {record.id}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.purchaseId"
-                                property={record.purchaseId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.platItemId"
-                                property={record.platItemId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.matnrCode"
-                                property={record.matnrCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.matnrName"
-                                property={record.matnrName}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.unit"
-                                property={record.unit}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.anfme"
-                                property={record.anfme}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.qty"
-                                property={record.qty}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.nromQty"
-                                property={record.nromQty}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.asnQty"
-                                property={record.asnQty}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.printQty"
-                                property={record.printQty}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.splrName"
-                                property={record.splrName}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.splrCode"
-                                property={record.splrCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.purchaseItem.splrBatch"
-                                property={record.splrBatch}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default PurchaseItemPanel;
diff --git a/rsf-admin/src/page/purchaseItem/index.jsx b/rsf-admin/src/page/purchaseItem/index.jsx
deleted file mode 100644
index 022b7ea..0000000
--- a/rsf-admin/src/page/purchaseItem/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import PurchaseItemList from "./PurchaseItemList";
-import PurchaseItemEdit from "./PurchaseItemEdit";
-
-export default {
-    list: PurchaseItemList,
-    edit: PurchaseItemEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
diff --git a/rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx b/rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx
index d04c3e1..55f78a6 100644
--- a/rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx
+++ b/rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx
@@ -21,10 +21,10 @@
     DeleteButton,
     useNotify,
     useRedirect,
+    useEditContext,
 } from 'react-admin';
 import { useWatch, useFormContext } from "react-hook-form";
 import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
 import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
 import EditBaseAside from "../../../components/EditBaseAside";
 import CustomerTopToolBar from "../../../components/EditTopToolBar";
@@ -33,17 +33,13 @@
 
 const FormToolbar = () => {
     const form = useFormContext();
+    const { record, isPending } = useEditContext();
     const redirect = useRedirect();
-    const notify = useNotify();
-    const onSuccess = (data) => {
-        const { dictTypeId, dictTypeCode } = data
-        notify(`淇敼鎴愬姛!`);
-        redirect(`/dictData?dictTypeId=${dictTypeId}&code=${dictTypeCode}`);
-    }
-
     return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton type="button" mutationOptions={{ onSuccess }} />
+        <Toolbar sx={{ justifyContent: 'end' }}>
+            <SaveButton type="button" mutationOptions={{onSuccess:() => {
+                redirect('/dictType/' + record?.dictTypeId)
+            } }}/>
             <DeleteButton mutationMode="optimistic" />
         </Toolbar>
     )
@@ -52,17 +48,15 @@
 const DictDataEdit = () => {
     const translate = useTranslate();
 
-
     return (
         <Edit
             redirect="list"
+            resource="dictData"
             mutationMode={EDIT_MODE}
             actions={<CustomerTopToolBar backPrevious={true} />}
             aside={<EditBaseAside />}
         >
             <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
                 toolbar={<FormToolbar />}
                 mode="onTouched"
                 defaultValues={{}}
@@ -77,8 +71,8 @@
                             <TextInput
                                 label="table.field.dictData.dictTypeId"
                                 source="dictTypeId"
+                                readOnly
                                 parse={v => v}
-                                autoFocus
                                 validate={required()}
                             />
                         </Stack>
@@ -86,6 +80,7 @@
                             <TextInput
                                 label="table.field.dictData.dictTypeCode"
                                 source="dictTypeCode"
+                                readOnly
                                 parse={v => v}
                                 validate={required()}
                             />
diff --git a/rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx b/rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx
index 5506184..2b0b618 100644
--- a/rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx
+++ b/rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx
@@ -31,19 +31,18 @@
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
+    useGetRecordId,
+    useGetPathForRecord,
+    useGetOne,
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
 import DictDataCreate from "./DictDataCreate";
-import DictDataPanel from "./DictDataPanel";
 import EmptyData from "../../../components/EmptyData";
 import MyCreateButton from "../../../components/MyCreateButton";
 import MyExportButton from '../../../components/MyExportButton';
 import PageDrawer from "../../../components/PageDrawer";
-import MyField from "../../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
-import CustomerTopToolBar from "../../../components/EditTopToolBar";
 
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -62,14 +61,12 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-
     <TextInput source="dictTypeId" label="table.field.dictData.dictTypeId" />,
     <TextInput source="dictTypeCode" label="table.field.dictData.dictTypeCode" />,
     <TextInput source="value" label="table.field.dictData.value" />,
     <TextInput source="label" label="table.field.dictData.label" />,
     <NumberInput source="sort" label="table.field.dictData.sort" />,
     // <TextInput source="color" label="table.field.dictData.color" />,
-
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
         label="common.field.status"
@@ -84,21 +81,16 @@
 
 const DictDataList = () => {
     const translate = useTranslate();
-
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
-    const [fit, setFilters] = useState(filters);
-    const location = useLocation();
-    const queryParams = new URLSearchParams(location.search);
-    const dictTypeId = queryParams.get('dictTypeId');
-    const dictTypeCode = queryParams.get('code');
-
+    const dictId = useGetRecordId();
+    const {data: dicts, isPending, error} =  useGetOne('dictType', {id: dictId});
+    
     return (
         <>
-            {dictTypeId && <CustomerTopToolBar backPrevious={true} />}
             <Box display="flex" >
-
                 <List
+                    resource="dictData"
                     sx={{
                         flexGrow: 1,
                         transition: (theme) =>
@@ -110,7 +102,7 @@
                     title={"menu.dictData"}
                     empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                     filters={filters}
-                    filter={dictTypeId ? { dictTypeId } : undefined}
+                    filter={{ dictTypeId: dictId }}
                     sort={{ field: "create_time", order: "desc" }}
                     actions={(
                         <TopToolbar>
@@ -125,7 +117,7 @@
                     <StyledDatagrid
                         preferenceKey='dictData'
                         bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                        rowClick={(id, resource, record) => false}
+                        rowClick="edit"
                         omit={['id', 'createTime', 'createBy', 'memo']}
                     >
                         <NumberField source="id" />
@@ -134,28 +126,22 @@
                         <TextField source="value" label="table.field.dictData.value" />
                         <TextField source="label" label="table.field.dictData.label" />
                         <NumberField source="sort" label="table.field.dictData.sort" />
-                        {/* <TextField source="color" label="table.field.dictData.color" /> */}
-
-                        <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>
+                        <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">
-                            <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
-                            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                            <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} redirect={"/dictType/" + dictId} />
                         </WrapperField>
                     </StyledDatagrid>
                 </List>
                 <DictDataCreate
                     open={createDialog}
+                    record={dicts}
                     setOpen={setCreateDialog}
-                    row={{ dictTypeId, dictTypeCode }}
                 />
                 <PageDrawer
                     title='DictData Detail'
diff --git a/rsf-admin/src/page/system/dicts/dictData/DictDataPanel.jsx b/rsf-admin/src/page/system/dicts/dictData/DictDataPanel.jsx
deleted file mode 100644
index 1f38976..0000000
--- a/rsf-admin/src/page/system/dicts/dictData/DictDataPanel.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
-import {
-    useTranslate,
-    useRecordContext,
-} from 'react-admin';
-import PanelTypography from "../../../components/PanelTypography";
-import * as Common from '@/utils/common'
-
-const DictDataPanel = () => {
-    const record = useRecordContext();
-    if (!record) return null;
-    const translate = useTranslate();
-    return (
-        <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.dictData.id'))}: {record.id}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.dictData.dictTypeId" 
-                                property={record.dictTypeId$}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.dictData.dictTypeCode" 
-                                property={record.dictTypeCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.dictData.value" 
-                                property={record.value}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.dictData.label" 
-                                property={record.label}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.dictData.sort" 
-                                property={record.sort}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.dictData.color" 
-                                property={record.color}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default DictDataPanel;
diff --git a/rsf-admin/src/page/system/dicts/dictData/index.jsx b/rsf-admin/src/page/system/dicts/dictData/index.jsx
deleted file mode 100644
index 31b11ac..0000000
--- a/rsf-admin/src/page/system/dicts/dictData/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import DictDataList from "./DictDataList";
-import DictDataEdit from "./DictDataEdit";
-
-export default {
-    list: DictDataList,
-    edit: DictDataEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
diff --git a/rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx b/rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx
similarity index 94%
rename from rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx
rename to rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx
index afc4ea0..058996b 100644
--- a/rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx
@@ -32,8 +32,7 @@
 import MemoInput from "../../../components/MemoInput";
 
 const DictDataCreate = (props) => {
-    const { open, setOpen, row } = props;
-
+    const { open, setOpen, record } = props;
     const translate = useTranslate();
     const notify = useNotify();
 
@@ -55,6 +54,7 @@
     return (
         <>
             <CreateBase
+                resource="dictData"
                 record={{}}
                 transform={(data) => {
                     return data;
@@ -88,10 +88,10 @@
                                     <TextInput
                                         label="table.field.dictData.dictTypeId"
                                         source="dictTypeId"
+                                        defaultValue={record?.id}
                                         parse={v => v}
-                                        autoFocus
+                                        readOnly
                                         validate={required()}
-                                        defaultValue={row.dictTypeId}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
@@ -99,8 +99,9 @@
                                         label="table.field.dictData.dictTypeCode"
                                         source="dictTypeCode"
                                         parse={v => v}
+                                        readOnly
+                                        defaultValue={record?.code}
                                         validate={required()}
-                                        defaultValue={row.dictTypeCode}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
@@ -115,6 +116,7 @@
                                     <TextInput
                                         label="table.field.dictData.label"
                                         validate={required()}
+                                        autoFocus
                                         source="label"
                                         parse={v => v}
                                     />
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx b/rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx
new file mode 100644
index 0000000..c80fbfc
--- /dev/null
+++ b/rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx
@@ -0,0 +1,163 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    Form,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+    useNotify,
+    useRedirect,
+    useEditContext,
+    EditBase,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import DialogCloseButton from "../../../components/DialogCloseButton";
+import EditBaseAside from "../../../components/EditBaseAside";
+import MemoInput from "../../../components/MemoInput";
+import StatusSelectInput from "../../../components/StatusSelectInput";
+
+const EditToolbar = () => {
+    const form = useFormContext();
+    const { record, isPending } = useEditContext();
+    const redirect = useRedirect();
+    return (
+        <Toolbar sx={{ justifyContent: 'end' }}>
+            <SaveButton type="button" mutationOptions={{
+                onSuccess: () => {
+                    redirect('/dictType/' + record?.dictTypeId)
+                }
+            }} />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const DictDataEdit = (props) => {
+    const { open, setOpen, record } = props;
+    const translate = useTranslate();
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+    return (
+        <>
+            <Edit
+                id={record?.id}
+                resource="dictData"
+                mutationMode={EDIT_MODE}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('update.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                                <Grid item xs={12} md={8}>
+                                    <Typography variant="h6" gutterBottom>
+                                        {translate('common.edit.title.main')}
+                                    </Typography>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.dictTypeId"
+                                            source="dictTypeId"
+                                            readOnly
+                                            defaultValue={record?.id}
+                                            parse={v => v}
+                                            validate={required()}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.dictTypeCode"
+                                            source="dictTypeCode"
+                                            defaultValue={record?.code}
+                                            readOnly
+                                            parse={v => v}
+                                            validate={required()}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.value"
+                                            source="value"
+                                            parse={v => v}
+                                            validate={required()}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.label"
+                                            source="label"
+                                            validate={required()}
+                                            parse={v => v}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <NumberInput
+                                            label="table.field.dictData.sort"
+                                            source="sort"
+                                        />
+                                    </Stack>
+                                </Grid>
+                                <Grid item xs={12} md={4}>
+                                    <Typography variant="h6" gutterBottom>
+                                        {translate('common.edit.title.common')}
+                                    </Typography>
+                                    <StatusSelectInput />
+                                    <Box mt="2em" />
+                                    <MemoInput />
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'end' }}  >
+                                <SaveButton type="button" mutationOptions={{
+                                    onSuccess: () => {
+                                        setOpen(false)
+                                    }
+                                }} />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </Edit >
+        </>
+    )
+}
+
+export default DictDataEdit;
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx b/rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx
new file mode 100644
index 0000000..c039b96
--- /dev/null
+++ b/rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx
@@ -0,0 +1,173 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate, useLocation } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+    useGetRecordId,
+    useGetPathForRecord,
+    useGetOne,
+    Button,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import DictDataCreate from "./DictDataCreate";
+import EmptyData from "../../../components/EmptyData";
+import MyCreateButton from "../../../components/MyCreateButton";
+import MyExportButton from '../../../components/MyExportButton';
+import PageDrawer from "../../../components/PageDrawer";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import DictDataEdit from "./DictDataEdit";
+import { use } from "react";
+
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <TextInput source="dictTypeId" label="table.field.dictData.dictTypeId" />,
+    <TextInput source="dictTypeCode" label="table.field.dictData.dictTypeCode" />,
+    <TextInput source="value" label="table.field.dictData.value" />,
+    <TextInput source="label" label="table.field.dictData.label" />,
+    <NumberInput source="sort" label="table.field.dictData.sort" />,
+    // <TextInput source="color" label="table.field.dictData.color" />,
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const DictDataList = () => {
+    const translate = useTranslate();
+    const [createDialog, setCreateDialog] = useState(false);
+    const [editDialog, setEditDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+    const [select, setSelect] = useState({});
+    const dictId = useGetRecordId();
+    const { data: dicts, isPending, error } = useGetOne('dictType', { id: dictId });
+
+    return (
+        <>
+            <Box display="flex" >
+                <List
+                    resource="dictData"
+                    sx={{
+                        flexGrow: 1,
+                        transition: (theme) =>
+                            theme.transitions.create(['all'], {
+                                duration: theme.transitions.duration.enteringScreen,
+                            }),
+                        marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    }}
+                    title={"menu.dictData"}
+                    empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                    filters={filters}
+                    filter={{ dictTypeId: dictId }}
+                    sort={{ field: "create_time", order: "desc" }}
+                    actions={(
+                        <TopToolbar>
+                            <FilterButton />
+                            <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                            <SelectColumnsButton preferenceKey='dictData' />
+                            <MyExportButton />
+                        </TopToolbar>
+                    )}
+                    perPage={DEFAULT_PAGE_SIZE}
+                >
+                    <StyledDatagrid
+                        bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                        rowClick={(id, resource ,record)=> {
+                            setSelect(record)
+                            setEditDialog(true)
+                        }}
+                        omit={['id', 'createTime', 'createBy', 'memo']}
+                    >
+                        <NumberField source="id" />
+                        <TextField source="dictTypeId" label="table.field.dictData.dictTypeId" />
+                        <TextField source="dictTypeCode" label="table.field.dictData.dictTypeCode" />
+                        <TextField source="value" label="table.field.dictData.value" />
+                        <TextField source="label" label="table.field.dictData.label" />
+                        <NumberField source="sort" label="table.field.dictData.sort" />
+                        <TextField source="updateBy$" label="common.field.updateBy" />
+                        <DateField source="updateTime" label="common.field.updateTime" 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">
+                            {/* <EditButton sx={{ padding: '1px', fontSize: '.75rem' }}  type="button" redirect={"/dictType/" + dictId} onClick={()=> {                               
+                               setEditDialog(true)
+                            }} /> */}
+                            <Button onClick={()=>{setEditDialog(true)}}>缂栬緫</Button>
+                            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode='pessimistic' redirect={"/dictType/" + dictId} />
+                        </WrapperField>
+                    </StyledDatagrid>
+                </List>
+                <DictDataEdit
+                    open={editDialog}
+                    record={select}
+                    setOpen={setEditDialog}
+                />
+                <DictDataCreate
+                    open={createDialog}
+                    record={dicts}
+                    setOpen={setCreateDialog}
+                />
+                <PageDrawer
+                    title='DictData Detail'
+                    drawerVal={drawerVal}
+                    setDrawerVal={setDrawerVal}
+                >
+                </PageDrawer>
+            </Box>
+        </>
+
+    )
+}
+
+export default DictDataList;
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx b/rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx
index 8acd215..0a31d6f 100644
--- a/rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx
@@ -33,10 +33,8 @@
 
 const DictTypeCreate = (props) => {
     const { open, setOpen } = props;
-
     const translate = useTranslate();
     const notify = useNotify();
-
     const handleClose = (event, reason) => {
         if (reason !== "backdropClick") {
             setOpen(false);
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx b/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx
index 6155c7b..c9905f0 100644
--- a/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx
@@ -28,11 +28,13 @@
 import CustomerTopToolBar from "../../../components/EditTopToolBar";
 import MemoInput from "../../../components/MemoInput";
 import StatusSelectInput from "../../../components/StatusSelectInput";
+import DictDataEdit  from "./DictDataEdit";
+import DictDataList from "./DictDataList";
 
 const FormToolbar = () => {
     const { getValues } = useFormContext();
     return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
+        <Toolbar sx={{ justifyContent: 'end' }}>
             <SaveButton />
             <DeleteButton mutationMode="optimistic" />
         </Toolbar>
@@ -41,61 +43,51 @@
 
 const DictTypeEdit = () => {
     const translate = useTranslate();
-    
     return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
+        <>
+            <Edit
+                redirect="list"
+                mutationMode={EDIT_MODE}
+                actions={<CustomerTopToolBar />}
+                aside={<EditBaseAside />}
             >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.dictType.code"
-                                source="code"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.dictType.name"
-                                source="name"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.dictType.description"
-                                source="description"
-                                parse={v => v}
-                            />
-                        </Stack>
-
+                <SimpleForm
+                    shouldUnregister
+                    warnWhenUnsavedChanges
+                    toolbar={<FormToolbar />}
+                    mode="onTouched"
+                    defaultValues={{}}
+                // validate={(values) => { }}
+                >
+                    <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                        <Grid item xs={14} md={10}>
+                            <Typography variant="h6" gutterBottom>
+                                {translate('common.edit.title.main')}
+                            </Typography>
+                            <Stack direction='row' gap={2}>
+                                <TextInput
+                                    label="table.field.dictType.code"
+                                    readOnly
+                                    source="code"
+                                    parse={v => v}
+                                />
+                                <TextInput
+                                    label="table.field.dictType.name"
+                                    source="name"
+                                    parse={v => v}
+                                />
+                                <TextInput
+                                    label="table.field.dictType.description"
+                                    source="description"
+                                    parse={v => v}
+                                />
+                            </Stack>
+                        </Grid>
                     </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
+                </SimpleForm>
+            </Edit >
+            <DictDataList />
+        </>
     )
 }
 
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx b/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
index e7d18bd..e5b7332 100644
--- a/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
@@ -35,14 +35,10 @@
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
 import DictTypeCreate from "./DictTypeCreate";
-import DictTypePanel from "./DictTypePanel";
 import EmptyData from "../../../components/EmptyData";
 import MyCreateButton from "../../../components/MyCreateButton";
 import MyExportButton from '../../../components/MyExportButton';
-import PageDrawer from "../../../components/PageDrawer";
-import MyField from "../../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -62,11 +58,9 @@
     <SearchInput source="condition" alwaysOn />,
     <DateInput label='common.time.after' source="timeStart" alwaysOn />,
     <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
-
     <TextInput source="code" label="table.field.dictType.code" />,
     <TextInput source="name" label="table.field.dictType.name" />,
     <TextInput source="description" label="table.field.dictType.description" />,
-
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
         label="common.field.status"
@@ -81,15 +75,8 @@
 
 const DictTypeList = () => {
     const translate = useTranslate();
-
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
-
-    const navigate = useNavigate();
-    const assign = (record) => {
-        navigate(`/dictData?dictTypeId=${record.id}&code=${record.code}`);
-    }
-
     return (
         <Box display="flex">
             <List
@@ -118,26 +105,21 @@
                 <StyledDatagrid
                     preferenceKey='dictType'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                    rowClick={(id, resource, record) => false}
+                    rowClick={'edit'}
                     omit={['id', 'createTime', 'createBy', 'memo']}
                 >
                     <NumberField source="id" />
-                    <MyField source="code" label="table.field.dictType.code"
-                        onClick={(event, record, val) => {
-                            event.stopPropagation();
-                            assign(record);
-                        }}
+                    <TextField source="code" label="table.field.dictType.code"
+                        // onClick={(event, record, val) => {
+                        //     event.stopPropagation();
+                        //     assign(record);
+                        // }}
                     />
                     <TextField source="name" label="table.field.dictType.name" />
                     <TextField source="description" label="table.field.dictType.description" />
-
-                    <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>
+                    <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} />
diff --git a/rsf-admin/src/page/system/dicts/dictType/index.jsx b/rsf-admin/src/page/system/dicts/dictType/index.jsx
index 7dc7dcb..b0f025e 100644
--- a/rsf-admin/src/page/system/dicts/dictType/index.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/index.jsx
@@ -11,7 +11,7 @@
 export default {
     list: DictTypeList,
     edit: DictTypeEdit,
-    show: ShowGuesser,
+    // show: ShowGuesser,
     recordRepresentation: (record) => {
         return `${record.name}`
     }
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx
deleted file mode 100644
index c3d15cc..0000000
--- a/rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-  CreateBase,
-  useTranslate,
-  TextInput,
-  NumberInput,
-  BooleanInput,
-  DateInput,
-  SaveButton,
-  SelectInput,
-  ReferenceInput,
-  ReferenceArrayInput,
-  AutocompleteInput,
-  Toolbar,
-  required,
-  useDataProvider,
-  useNotify,
-  Form,
-  useCreateController,
-} from "react-admin";
-import {
-  Dialog,
-  DialogActions,
-  DialogContent,
-  DialogTitle,
-  Stack,
-  Grid,
-  Box,
-} from "@mui/material";
-import DialogCloseButton from "../../components/DialogCloseButton";
-import SerialRuleItem from "../serialRuleItem/index";
-
-const SerialRuleDetail = (props) => {
-  const { open, setOpen } = props;
-
-  const translate = useTranslate();
-  const notify = useNotify();
-
-  const handleClose = (event, reason) => {
-    if (reason !== "backdropClick") {
-      setOpen(false);
-    }
-  };
-
-  const handleSuccess = async (data) => {
-    setOpen(false);
-    notify("common.response.success");
-  };
-
-  const handleError = async (error) => {
-    notify(error.message || "common.response.fail", {
-      type: "error",
-      messageArgs: { _: error.message },
-    });
-  };
-
-  return (
-    <>
-      <Dialog
-        open={open}
-        onClose={handleClose}
-        aria-labelledby="form-dialog-title"
-        fullWidth
-        disableRestoreFocus
-        maxWidth="xl" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-      >
-        <DialogTitle
-          id="form-dialog-title"
-          sx={{
-            position: "sticky",
-            top: 0,
-            backgroundColor: "background.paper",
-            zIndex: 1000,
-          }}
-        >
-          {translate("create.title")}
-          <Box sx={{ position: "absolute", top: 8, right: 8, zIndex: 1001 }}>
-            <DialogCloseButton onClose={handleClose} />
-          </Box>
-        </DialogTitle>
-
-        <DialogContent sx={{ mt: 2 }}>
-          <SerialRuleItem.list />
-        </DialogContent>
-      </Dialog>
-    </>
-  );
-};
-
-export default SerialRuleDetail;
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx
new file mode 100644
index 0000000..ca3b86c
--- /dev/null
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx
@@ -0,0 +1,158 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    Form,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography, Dialog, DialogContent, DialogTitle, DialogActions } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../../components/EditBaseAside";
+import DialogCloseButton from "../../components/DialogCloseButton";
+import CustomerTopToolBar from "../../components/EditTopToolBar";
+import MemoInput from "../../components/MemoInput";
+import StatusSelectInput from "../../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const SerialRuleItemEdit = (props) => {
+    const { open, setOpen, record } = props;
+    const translate = useTranslate();
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+    return (
+        <Edit
+            id={record.id}
+            redirect="list"
+            resource="serialRuleItem"
+            mutationMode={EDIT_MODE}
+        >
+            <Dialog
+                open={open}
+                onClose={handleClose}
+                aria-labelledby="form-dialog-title"
+                fullWidth
+                disableRestoreFocus
+                maxWidth="md"
+            >
+                <Form
+                    shouldUnregister
+                    warnWhenUnsavedChanges
+                    toolbar={<FormToolbar />}
+                    mode="onTouched"
+                    defaultValues={{}}
+                >
+                    <DialogTitle id="form-dialog-title" sx={{
+                        position: 'sticky',
+                        top: 0,
+                        backgroundColor: 'background.paper',
+                        zIndex: 1000
+                    }}
+                    >
+                        {translate('update.title')}
+                        <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                            <DialogCloseButton onClose={handleClose} />
+                        </Box>
+                    </DialogTitle>
+                    <DialogContent>
+                        <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                            <Grid item xs={12} md={8}>
+                                <Typography variant="h6" gutterBottom>
+                                    {translate('common.edit.title.main')}
+                                </Typography>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.ruleId"
+                                        source="ruleId"
+                                        readOnly
+                                        autoFocus
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <TextInput
+                                        label="table.field.serialRuleItem.wkType"
+                                        source="wkType$"
+                                        readOnly
+                                        parse={v => v}
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <TextInput
+                                        label="table.field.serialRuleItem.feildValue"
+                                        source="feildValue"
+                                        parse={v => v}
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.len"
+                                        source="len"
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.lenStr"
+                                        source="lenStr"
+                                        validate={required()}
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.sort"
+                                        source="sort"
+                                        validate={required()}
+                                    />
+                                </Stack>
+
+                            </Grid>
+                            <Grid item xs={12} md={4}>
+                                <Typography variant="h6" gutterBottom>
+                                    {translate('common.edit.title.common')}
+                                </Typography>
+                                <StatusSelectInput />
+                                <Box mt="2em" />
+                                <MemoInput />
+                            </Grid>
+                        </Grid>
+                    </DialogContent>
+                    <DialogActions>
+
+                    </DialogActions>
+                </Form>
+
+            </Dialog>
+        </Edit >
+    )
+}
+
+export default SerialRuleItemEdit;
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx
index c99a1bc..d21dae8 100644
--- a/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx
@@ -38,6 +38,7 @@
   AutocompleteInput,
   DeleteButton,
   useGetRecordId,
+  Button,
 } from "react-admin";
 import { Box, Typography, Card, Stack } from "@mui/material";
 import { styled } from "@mui/material/styles";
@@ -54,6 +55,7 @@
 } from "@/config/setting";
 import * as Common from "@/utils/common";
 import CustomerTopToolBar from "../../components/EditTopToolBar";
+import SerialRuleItemEdit from "./SerialRuleItemEdit";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
   "& .css-1vooibu-MuiSvgIcon-root": {
@@ -93,7 +95,9 @@
 const SerialRuleItemList = () => {
   const translate = useTranslate();
   const [createDialog, setCreateDialog] = useState(false);
+  const [editDialog, setEditDialog] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
+  const [select, setSelect] = useState({});
   const ruleId = useGetRecordId();
 
   return (
@@ -110,13 +114,7 @@
             marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
           }}
           title={"menu.serialRuleItem"}
-          empty={
-            <EmptyData
-              onClick={() => {
-                setCreateDialog(true);
-              }}
-            />
-          }
+          empty={false}
           filters={filters}
           filter={{ ruleId: ruleId }}
           sort={{ field: "create_time", order: "desc" }}
@@ -139,7 +137,10 @@
             bulkActionButtons={() => (
               <BulkDeleteButton mutationMode={OPERATE_MODE} />
             )}
-            rowClick={false}
+            rowClick={(id, resource, record) => {
+              setSelect(record)
+              setEditDialog(true)
+            }}
             omit={["id", "createTime", "createBy", "memo"]}
           >
             <NumberField source="id" />
@@ -164,29 +165,19 @@
               source="sort"
               label="table.field.serialRuleItem.sort"
             />
-            <ReferenceField
-              source="updateBy"
+            <TextField
+              source="updateBy$"
               label="common.field.updateBy"
-              reference="user"
-              link={false}
-              sortable={false}
-            >
-              <TextField source="nickname" />
-            </ReferenceField>
+            />
             <DateField
               source="updateTime"
               label="common.field.updateTime"
               showTime
             />
-            <ReferenceField
-              source="createBy"
+            <TextField
+              source="createBy$"
               label="common.field.createBy"
-              reference="user"
-              link={false}
-              sortable={false}
-            >
-              <TextField source="nickname" />
-            </ReferenceField>
+            />
             <DateField
               source="createTime"
               label="common.field.createTime"
@@ -203,15 +194,21 @@
               sortable={false}
             />
             <WrapperField cellClassName="opt" label="common.field.opt">
-              <EditButton sx={{ padding: "1px", fontSize: ".75rem" }} />
+              <Button onClick={() => {
+                setSelect(re)
+                setEditDialog(true)
+              }} label={'ra.action.edit'}
+              > </Button>
               <DeleteButton
                 sx={{ padding: "1px", fontSize: ".75rem" }}
                 mutationMode={OPERATE_MODE}
+                redirect={'/serialRule/' + ruleId}
               />
             </WrapperField>
           </StyledDatagrid>
         </List>
         <SerialRuleItemCreate open={createDialog} setOpen={setCreateDialog} />
+        <SerialRuleItemEdit open={editDialog} setOpen={setEditDialog} record={select} />
         <PageDrawer
           title="SerialRuleItem Detail"
           drawerVal={drawerVal}
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx
index 8b4c623..d7a19a9 100644
--- a/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx
@@ -41,8 +41,6 @@
 import { Box, Typography, Card, Stack } from "@mui/material";
 import { styled } from "@mui/material/styles";
 import SerialRuleCreate from "./SerialRuleCreate";
-import SerialRuleDetail from "./SerialRuleDetail";
-import SerialRulePanel from "./SerialRulePanel";
 import EmptyData from "../../components/EmptyData";
 import MyCreateButton from "../../components/MyCreateButton";
 import MyExportButton from "../../components/MyExportButton";
@@ -79,7 +77,6 @@
   <TextInput source="resetDep" label="table.field.serialRule.resetDep" />,
   <TextInput source="currValue" label="table.field.serialRule.currValue" />,
   <TextInput source="lastCode" label="table.field.serialRule.lastCode" />,
-
   <TextInput label="common.field.memo" source="memo" />,
   <SelectInput
     label="common.field.status"
@@ -165,29 +162,19 @@
             label="table.field.serialRule.lastCode"
           />
 
-          <ReferenceField
-            source="updateBy"
+          <TextField
+            source="updateBy$"
             label="common.field.updateBy"
-            reference="user"
-            link={false}
-            sortable={false}
-          >
-            <TextField source="nickname" />
-          </ReferenceField>
+           />
           <DateField
             source="updateTime"
             label="common.field.updateTime"
             showTime
           />
-          <ReferenceField
-            source="createBy"
+          <TextField
+            source="createBy$"
             label="common.field.createBy"
-            reference="user"
-            link={false}
-            sortable={false}
-          >
-            <TextField source="nickname" />
-          </ReferenceField>
+          />
           <DateField
             source="createTime"
             label="common.field.createTime"
@@ -209,7 +196,7 @@
         </StyledDatagrid>
       </List>
       <SerialRuleCreate open={createDialog} setOpen={setCreateDialog} />
-      <SerialRuleDetail open={detailDialog} setOpen={setDetailDialog} />
+      {/* <SerialRuleDetail open={detailDialog} setOpen={setDetailDialog} /> */}
       <PageDrawer
         title="SerialRule Detail"
         drawerVal={drawerVal}
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemCreate.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemCreate.jsx
deleted file mode 100644
index f51326e..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemCreate.jsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    CreateBase,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SaveButton,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    Toolbar,
-    required,
-    useDataProvider,
-    useNotify,
-    Form,
-    useCreateController,
-} from 'react-admin';
-import {
-    Dialog,
-    DialogActions,
-    DialogContent,
-    DialogTitle,
-    Stack,
-    Grid,
-    Box,
-} from '@mui/material';
-import DialogCloseButton from "../../components/DialogCloseButton";
-import StatusSelectInput from "../../components/StatusSelectInput";
-import MemoInput from "../../components/MemoInput";
-
-const SerialRuleItemCreate = (props) => {
-    const { open, setOpen } = props;
-
-    const translate = useTranslate();
-    const notify = useNotify();
-
-    const handleClose = (event, reason) => {
-        if (reason !== "backdropClick") {
-            setOpen(false);
-        }
-    };
-
-    const handleSuccess = async (data) => {
-        setOpen(false);
-        notify('common.response.success');
-    };
-
-    const handleError = async (error) => {
-        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
-    };
-
-    return (
-        <>
-            <CreateBase
-                record={{}}
-                transform={(data) => {
-                    return data;
-                }}
-                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
-            >
-                <Dialog
-                    open={open}
-                    onClose={handleClose}
-                    aria-labelledby="form-dialog-title"
-                    fullWidth
-                    disableRestoreFocus
-                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-                >
-                    <Form>
-                        <DialogTitle id="form-dialog-title" sx={{
-                            position: 'sticky',
-                            top: 0,
-                            backgroundColor: 'background.paper',
-                            zIndex: 1000
-                        }}
-                        >
-                            {translate('create.title')}
-                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
-                                <DialogCloseButton onClose={handleClose} />
-                            </Box>
-                        </DialogTitle>
-                        <DialogContent sx={{ mt: 2 }}>
-                            <Grid container rowSpacing={2} columnSpacing={2}>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.ruleId"
-                                        source="ruleId"
-                                        autoFocus
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.serialRuleItem.wkType"
-                                        source="wkType"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.serialRuleItem.feildValue"
-                                        source="feildValue"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.len"
-                                        source="len"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.lenStr"
-                                        source="lenStr"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.sort"
-                                        source="sort"
-                                        validate={required()}
-                                    />
-                                </Grid>
-
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <StatusSelectInput />
-                                </Grid>
-                                <Grid item xs={12} display="flex" gap={1}>
-                                    <Stack direction="column" spacing={1} width={'100%'}>
-                                        <MemoInput />
-                                    </Stack>
-                                </Grid>
-                            </Grid>
-                        </DialogContent>
-                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
-                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
-                                <SaveButton />
-                            </Toolbar>
-                        </DialogActions>
-                    </Form>
-                </Dialog>
-            </CreateBase>
-        </>
-    )
-}
-
-export default SerialRuleItemCreate;
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemEdit.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemEdit.jsx
deleted file mode 100644
index ecd5ba0..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemEdit.jsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    SaveButton,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../../components/EditBaseAside";
-import CustomerTopToolBar from "../../components/EditTopToolBar";
-import MemoInput from "../../components/MemoInput";
-import StatusSelectInput from "../../components/StatusSelectInput";
-
-const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
-    return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton />
-            <DeleteButton mutationMode="optimistic" />
-        </Toolbar>
-    )
-}
-
-const SerialRuleItemEdit = () => {
-    const translate = useTranslate();
-
-    return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
-            >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.ruleId"
-                                source="ruleId"
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.serialRuleItem.wkType"
-                                source="wkType"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.serialRuleItem.feildValue"
-                                source="feildValue"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.len"
-                                source="len"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.lenStr"
-                                source="lenStr"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.sort"
-                                source="sort"
-                                validate={required()}
-                            />
-                        </Stack>
-
-                    </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
-    )
-}
-
-export default SerialRuleItemEdit;
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemList.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemList.jsx
deleted file mode 100644
index 703190d..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemList.jsx
+++ /dev/null
@@ -1,234 +0,0 @@
-import React, {
-  useState,
-  useRef,
-  useEffect,
-  useMemo,
-  useCallback,
-} from "react";
-import { useNavigate, useLocation } from "react-router-dom";
-import {
-  List,
-  DatagridConfigurable,
-  SearchInput,
-  TopToolbar,
-  SelectColumnsButton,
-  EditButton,
-  FilterButton,
-  CreateButton,
-  ExportButton,
-  BulkDeleteButton,
-  WrapperField,
-  useRecordContext,
-  useTranslate,
-  useNotify,
-  useListContext,
-  FunctionField,
-  TextField,
-  NumberField,
-  DateField,
-  BooleanField,
-  ReferenceField,
-  TextInput,
-  DateTimeInput,
-  DateInput,
-  SelectInput,
-  NumberInput,
-  ReferenceInput,
-  ReferenceArrayInput,
-  AutocompleteInput,
-  DeleteButton,
-} from "react-admin";
-import { Box, Typography, Card, Stack } from "@mui/material";
-import { styled } from "@mui/material/styles";
-import SerialRuleItemCreate from "./SerialRuleItemCreate";
-import SerialRuleItemPanel from "./SerialRuleItemPanel";
-import EmptyData from "../../components/EmptyData";
-import MyCreateButton from "../../components/MyCreateButton";
-import MyExportButton from "../../components/MyExportButton";
-import PageDrawer from "../../components/PageDrawer";
-import MyField from "../../components/MyField";
-import {
-  PAGE_DRAWER_WIDTH,
-  OPERATE_MODE,
-  DEFAULT_PAGE_SIZE,
-} from "@/config/setting";
-import * as Common from "@/utils/common";
-import CustomerTopToolBar from "../../components/EditTopToolBar";
-
-const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
-  "& .css-1vooibu-MuiSvgIcon-root": {
-    height: ".9em",
-  },
-  "& .RaDatagrid-row": {
-    cursor: "auto",
-  },
-  "& .column-name": {},
-  "& .opt": {
-    width: 200,
-  },
-}));
-
-const filters = [
-  <SearchInput source="condition" alwaysOn />,
-  <DateInput label="common.time.after" source="timeStart" alwaysOn />,
-  <DateInput label="common.time.before" source="timeEnd" alwaysOn />,
-
-  <NumberInput source="ruleId" label="table.field.serialRuleItem.ruleId" />,
-  <TextInput source="wkType" label="table.field.serialRuleItem.wkType" />,
-  <TextInput
-    source="feildValue"
-    label="table.field.serialRuleItem.feildValue"
-  />,
-  <NumberInput source="len" label="table.field.serialRuleItem.len" />,
-  <NumberInput source="lenStr" label="table.field.serialRuleItem.lenStr" />,
-  <NumberInput source="sort" label="table.field.serialRuleItem.sort" />,
-
-  <TextInput label="common.field.memo" source="memo" />,
-  <SelectInput
-    label="common.field.status"
-    source="status"
-    choices={[
-      { id: "1", name: "common.enums.statusTrue" },
-      { id: "0", name: "common.enums.statusFalse" },
-    ]}
-    resettable
-  />,
-];
-
-const SerialRuleItemList = () => {
-  const translate = useTranslate();
-  const [createDialog, setCreateDialog] = useState(false);
-  const [drawerVal, setDrawerVal] = useState(false);
-
-  const location = useLocation();
-  const queryParams = new URLSearchParams(location.search);
-  const ruleId = queryParams.get("ruleId");
-
-  return (
-    <>
-      {ruleId && <CustomerTopToolBar backPrevious={true} />}
-      <Box display="flex">
-        <List
-          sx={{
-            flexGrow: 1,
-            transition: (theme) =>
-              theme.transitions.create(["all"], {
-                duration: theme.transitions.duration.enteringScreen,
-              }),
-            marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
-          }}
-          title={"menu.serialRuleItem"}
-          empty={
-            <EmptyData
-              onClick={() => {
-                setCreateDialog(true);
-              }}
-            />
-          }
-          filters={filters}
-          filter={ruleId ? { ruleId } : undefined}
-          sort={{ field: "create_time", order: "desc" }}
-          actions={
-            <TopToolbar>
-              <FilterButton />
-              <MyCreateButton
-                onClick={() => {
-                  setCreateDialog(true);
-                }}
-              />
-              <SelectColumnsButton preferenceKey="serialRuleItem" />
-              <MyExportButton />
-            </TopToolbar>
-          }
-          perPage={DEFAULT_PAGE_SIZE}
-        >
-          <StyledDatagrid
-            preferenceKey="serialRuleItem"
-            bulkActionButtons={() => (
-              <BulkDeleteButton mutationMode={OPERATE_MODE} />
-            )}
-            rowClick={(id, resource, record) => false}
-            omit={["id", "createTime", "createBy", "memo"]}
-          >
-            <NumberField source="id" />
-            <NumberField
-              source="ruleId"
-              label="table.field.serialRuleItem.ruleId"
-            />
-            <TextField
-              source="wkType"
-              label="table.field.serialRuleItem.wkType"
-            />
-            <TextField
-              source="feildValue"
-              label="table.field.serialRuleItem.feildValue"
-            />
-            <NumberField source="len" label="table.field.serialRuleItem.len" />
-            <NumberField
-              source="lenStr"
-              label="table.field.serialRuleItem.lenStr"
-            />
-            <NumberField
-              source="sort"
-              label="table.field.serialRuleItem.sort"
-            />
-
-            <ReferenceField
-              source="updateBy"
-              label="common.field.updateBy"
-              reference="user"
-              link={false}
-              sortable={false}
-            >
-              <TextField source="nickname" />
-            </ReferenceField>
-            <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
-            />
-            <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">
-              <EditButton sx={{ padding: "1px", fontSize: ".75rem" }} />
-              <DeleteButton
-                sx={{ padding: "1px", fontSize: ".75rem" }}
-                mutationMode={OPERATE_MODE}
-              />
-            </WrapperField>
-          </StyledDatagrid>
-        </List>
-        <SerialRuleItemCreate open={createDialog} setOpen={setCreateDialog} />
-        <PageDrawer
-          title="SerialRuleItem Detail"
-          drawerVal={drawerVal}
-          setDrawerVal={setDrawerVal}
-        ></PageDrawer>
-      </Box>
-    </>
-  );
-};
-
-export default SerialRuleItemList;
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemPanel.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemPanel.jsx
deleted file mode 100644
index 47d94ce..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemPanel.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
-import {
-    useTranslate,
-    useRecordContext,
-} from 'react-admin';
-import PanelTypography from "../../components/PanelTypography";
-import * as Common from '@/utils/common'
-
-const SerialRuleItemPanel = () => {
-    const record = useRecordContext();
-    if (!record) return null;
-    const translate = useTranslate();
-    return (
-        <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.serialRuleItem.id'))}: {record.id}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.ruleId" 
-                                property={record.ruleId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.wkType" 
-                                property={record.wkType$}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.feildValue" 
-                                property={record.feildValue}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.len" 
-                                property={record.len}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.lenStr" 
-                                property={record.lenStr}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.sort" 
-                                property={record.sort}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default SerialRuleItemPanel;
diff --git a/rsf-admin/src/page/system/serialRuleItem/index.jsx b/rsf-admin/src/page/system/serialRuleItem/index.jsx
deleted file mode 100644
index d7a3bde..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import SerialRuleItemList from "./SerialRuleItemList";
-import SerialRuleItemEdit from "./SerialRuleItemEdit";
-
-export default {
-    list: SerialRuleItemList,
-    edit: SerialRuleItemEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
diff --git a/rsf-admin/src/page/taskLog/TaskItemLogList.jsx b/rsf-admin/src/page/taskLog/TaskItemLogList.jsx
index acf1ae7..8659c06 100644
--- a/rsf-admin/src/page/taskLog/TaskItemLogList.jsx
+++ b/rsf-admin/src/page/taskLog/TaskItemLogList.jsx
@@ -57,7 +57,6 @@
     <SearchInput source="condition" alwaysOn />,
     <DateInput label='common.time.after' source="timeStart" alwaysOn />,
     <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
-
     <NumberInput source="taskItemId" label="table.field.taskItemLog.taskItemId" />,
     <NumberInput source="taskId" label="table.field.taskItemLog.taskId" />,
     <NumberInput source="orderId" label="table.field.taskItemLog.orderId" />,
diff --git a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
index 21bc154..b1a0a68 100644
--- a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
+++ b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
@@ -127,13 +127,13 @@
                     preferenceKey='warehouseAreasItem'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                     rowClick={(id, resource, record) => false}
-                    omit={['id', 'createTime', 'createBy', 'memo', 'areaId', 'matnrId']}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'areaId', 'matnrId', 'batch', 'shipperId', 'splrId']}
                 >
                     <NumberField source="id" />
                     <NumberField source="areaId" label="table.field.warehouseAreasItem.areaId" />
                     <TextField source="areaName" label="table.field.warehouseAreasItem.areaName" />
                     <NumberField source="matnrId" label="table.field.warehouseAreasItem.matnrId" />
-                    <TextField source="matnrName" label="table.field.warehouseAreasItem.matnrName" />
+                    <TextField source="maktx" label="table.field.warehouseAreasItem.matnrName" />
                     <TextField source="matnrCode" label="table.field.warehouseAreasItem.matnrCode" />
                     <TextField source="trackCode" label="table.field.warehouseAreasItem.barcode" />
                     <NumberField source="anfme" label="table.field.warehouseAreasItem.anfme" />
@@ -148,14 +148,9 @@
                     <NumberField source="weight" label="table.field.warehouseAreasItem.weight" />
                     <TextField source="prodTime" label="table.field.warehouseAreasItem.prodTime" />
                     <TextField source="splrBtch" label="table.field.warehouseAreasItem.splrBtch" />
-
-                    <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>
+                    <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} />
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java
index 43131e0..5f6e0c4 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java
@@ -14,6 +14,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -44,7 +45,7 @@
     }
 
     public static <T> Workbook create(List<T> list, Class<T> clz, boolean flagTemplate) {
-        HSSFWorkbook workbook = new HSSFWorkbook();
+        XSSFWorkbook workbook = new XSSFWorkbook();
         Sheet sheet = workbook.createSheet(clz.getSimpleName());
 
         Row header = sheet.createRow(0);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
index 2e9e296..b6458c5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -13,6 +13,7 @@
 import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
 import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
 import com.vincent.rsf.server.manager.entity.AsnOrder;
+import com.vincent.rsf.server.manager.entity.Matnr;
 import com.vincent.rsf.server.manager.service.AsnOrderService;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.controller.BaseController;
@@ -121,7 +122,13 @@
     @PostMapping("/asnOrder/export")
     @ApiOperation("瀵煎嚭")
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
-        ExcelUtil.build(ExcelUtil.create(asnOrderService.list(), AsnOrder.class), response);
+        List<AsnOrder> orders = new ArrayList<>();
+        if (!Objects.isNull(map.get("ids"))) {
+            orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, map.get("ids")).eq(AsnOrder::getStatus, 1));
+        } else {
+            orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().last("limit 1"));
+        }
+        ExcelUtil.build(ExcelUtil.create(orders, AsnOrder.class), response);
     }
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
index c04887e..267ca22 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -118,10 +118,17 @@
     @PostMapping("/asnOrderItem/export")
     @ApiOperation("瀵煎嚭鏀惰揣閫氱煡鍗曟槑缁�")
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
-        AsnOrderTemplate template = ExcelUtil.mockData(AsnOrderTemplate.class);
-        List<AsnOrderTemplate> list = new ArrayList<>();
-        list.add(template);
-        ExcelUtil.build(ExcelUtil.create(list, AsnOrderTemplate.class, true), response);
+//        AsnOrderTemplate template = ExcelUtil.mockData(AsnOrderTemplate.class);
+//        List<AsnOrderTemplate> list = new ArrayList<>();
+//        list.add(template);
+        List<AsnOrderItem> orderItems = new ArrayList<>();
+        if (!Objects.isNull(map.get("ids"))) {
+            orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getId, map.get("ids")).eq(AsnOrderItem::getStatus, 1));
+        } else {
+            orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().last("limit 1"));
+        }
+
+        ExcelUtil.build(ExcelUtil.create(orderItems, AsnOrderItem.class, true), response);
     }
 
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java
index 346f37e..38b863f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java
@@ -1,7 +1,12 @@
 package com.vincent.rsf.server.manager.entity;
 
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.vincent.rsf.server.system.constant.DictTypeCode;
+import com.vincent.rsf.server.system.entity.DictData;
+import com.vincent.rsf.server.system.service.DictDataService;
 import org.springframework.format.annotation.DateTimeFormat;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import java.text.SimpleDateFormat;
@@ -206,6 +211,42 @@
 //            null    // 澶囨敞
 //    );
 
+    public String getExceStatus$() {
+        if (Cools.isEmpty(this.exceStatus)){
+            return "";
+        }
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.DICT_ASN_EXCE_STATUS).eq(DictData::getValue, this.exceStatus));
+        if (Objects.isNull(dictData)) {
+            return null;
+        }
+        return dictData.getLabel();
+    }
+
+    public String getType$(){
+        if (Cools.isEmpty(this.type)){
+            return "";
+        }
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_ORDER_TYPE).eq(DictData::getValue, this.type));
+        if (Objects.isNull(dictData)) {
+            return null;
+        }
+        return dictData.getLabel();
+    }
+
+    public String getWkType$(){
+        if (Cools.isEmpty(this.wkType)){
+            return "";
+        }
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_BUSINESS_TYPE).eq(DictData::getValue, this.wkType));
+        if (Objects.isNull(dictData)) {
+            return null;
+        }
+        return dictData.getLabel();
+    }
+
     public String getArrTime$(){
         if (Cools.isEmpty(this.arrTime)){
             return "";
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
index b348367..ec26c9b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
@@ -1,8 +1,12 @@
 package com.vincent.rsf.server.manager.entity;
 
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.vincent.rsf.server.system.constant.DictTypeCode;
+import com.vincent.rsf.server.system.entity.DictData;
+import com.vincent.rsf.server.system.service.DictDataService;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.text.SimpleDateFormat;
@@ -222,6 +226,20 @@
 //            null    // 澶囨敞
 //    );
 
+    public String getType$() {
+        if (Cools.isEmpty(this.type)) {
+            return "";
+        }
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
+                .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_ORDER_TYPE)
+                .eq(DictData::getValue, this.type));
+        if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) {
+            return null;
+        }
+        return dictDatas.getLabel();
+    }
+
     public String getPreArr$(){
         if (Cools.isEmpty(this.preArr)){
             return "";
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
index b2ee5fa..6c91462 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -238,11 +238,6 @@
         if (Objects.isNull(order)) {
             throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
         }
-        order.setExceStatus(Short.parseShort(AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE.val));
-
-        if (!this.updateById(order)) {
-            throw new CoolException("鍗曟嵁鍏抽棴澶辫触锛侊紒");
-        }
         try {
             operateOrderLogs(order);
         } catch (Exception e) {
@@ -263,6 +258,15 @@
         if (Objects.isNull(asrder) || Objects.isNull(asrder.getId())) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
+        asrder.setExceStatus(Short.parseShort(AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE.val));
+
+        if (!this.updateById(asrder)) {
+            throw new CoolException("鍗曟嵁鍏抽棴澶辫触锛侊紒");
+        }
+        List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, asrder.getId()));
+        if (orderItems.isEmpty()) {
+            throw new CoolException("鏀惰揣鏄庣粏涓虹┖锛侊紒");
+        }
         if (Objects.isNull(asrder.getAnfme()) || asrder.getAnfme().compareTo(0.00) == 0) {
             throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
         }
diff --git a/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml
index 15f722f..aa6bbcf 100644
--- a/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml
+++ b/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml
@@ -18,6 +18,7 @@
             stock_unit,
             pur_qty,
             pur_unit,
+            prod_time,
             qty,
             splr_code,
             splr_batch,

--
Gitblit v1.9.1