From 141f60bd32ea2027665a0495b6d9f538e8b7dad0 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期四, 10 四月 2025 14:19:04 +0800
Subject: [PATCH] #修改 1. 修改收货单历史档显示 2. 修改采购PO单显示问题

---
 /dev/null                                                                       |   18 -
 rsf-admin/src/page/purchase/PurchaseItemList.jsx                                |  169 ++++++++++++
 rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx                              |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java |   43 +++
 rsf-admin/src/page/taskLog/TaskItemLogList.jsx                                  |    1 
 rsf-admin/src/page/purchase/PurchaseItemCreate.jsx                              |  201 ++++++++++++++
 rsf-admin/src/page/purchase/PurchaseItemEdit.jsx                                |  173 ++++++++++++
 rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx                              |    2 
 rsf-admin/src/page/purchase/PurchaseEdit.jsx                                    |  201 ++++++-------
 rsf-admin/src/page/purchase/PurchaseList.jsx                                    |    7 
 10 files changed, 687 insertions(+), 135 deletions(-)

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..a1c2e7c 100644
--- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
+++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
@@ -28,7 +28,7 @@
 import CustomerTopToolBar from "../components/EditTopToolBar";
 import MemoInput from "../components/MemoInput";
 import StatusSelectInput from "../components/StatusSelectInput";
-// import AsnOrderItemLogList from "./AsnOrderItemLogList"
+import AsnOrderItemLogList from "./AsnOrderItemLogList"
 const FormToolbar = () => {
     const { getValues } = useFormContext();
 
diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx
index 29c4a09..1478e38 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,7 +127,7 @@
             >
                 <StyledDatagrid
                     preferenceKey='asnOrderLog'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    bulkActionButtons={false}
                     rowClick={'edit'}
                     expand={false}
                     expandSingle={true}
@@ -138,8 +137,8 @@
                     <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" />
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/purchase/PurchaseItemCreate.jsx b/rsf-admin/src/page/purchase/PurchaseItemCreate.jsx
new file mode 100644
index 0000000..abc53cc
--- /dev/null
+++ b/rsf-admin/src/page/purchase/PurchaseItemCreate.jsx
@@ -0,0 +1,201 @@
+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 PurchaseItemCreate = (props) => {
+    const { open, setOpen, row } = 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.purchaseItem.purchaseId"
+                                        source="purchaseId"
+                                        defaultValue={row.poId}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.platItemId"
+                                        source="platItemId"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.matnrCode"
+                                        source="matnrCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.matnrName"
+                                        source="matnrName"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.unit"
+                                        source="unit"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.purchaseItem.anfme"
+                                        source="anfme"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.purchaseItem.qty"
+                                        source="qty"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.purchaseItem.nromQty"
+                                        source="nromQty"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.purchaseItem.asnQty"
+                                        source="asnQty"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.purchaseItem.printQty"
+                                        source="printQty"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.splrName"
+                                        source="splrName"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.splrCode"
+                                        source="splrCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.purchaseItem.splrBatch"
+                                        source="splrBatch"
+                                        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 PurchaseItemCreate;
diff --git a/rsf-admin/src/page/purchase/PurchaseItemEdit.jsx b/rsf-admin/src/page/purchase/PurchaseItemEdit.jsx
new file mode 100644
index 0000000..f7103d7
--- /dev/null
+++ b/rsf-admin/src/page/purchase/PurchaseItemEdit.jsx
@@ -0,0 +1,173 @@
+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 PurchaseItemEdit = () => {
+    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.purchaseItem.purchaseId"
+                                source="purchaseId"
+                                autoFocus
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.platItemId"
+                                source="platItemId"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.matnrCode"
+                                source="matnrCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.matnrName"
+                                source="matnrName"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.unit"
+                                source="unit"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.purchaseItem.anfme"
+                                source="anfme"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.purchaseItem.qty"
+                                source="qty"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.purchaseItem.nromQty"
+                                source="nromQty"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.purchaseItem.asnQty"
+                                source="asnQty"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.purchaseItem.printQty"
+                                source="printQty"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.splrName"
+                                source="splrName"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.splrCode"
+                                source="splrCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.purchaseItem.splrBatch"
+                                source="splrBatch"
+                                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 PurchaseItemEdit;
diff --git a/rsf-admin/src/page/purchase/PurchaseItemList.jsx b/rsf-admin/src/page/purchase/PurchaseItemList.jsx
new file mode 100644
index 0000000..970263d
--- /dev/null
+++ b/rsf-admin/src/page/purchase/PurchaseItemList.jsx
@@ -0,0 +1,169 @@
+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,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import PurchaseItemCreate from "./PurchaseItemCreate";
+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';
+
+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="purchaseId" label="table.field.purchaseItem.purchaseId" />,
+  <TextInput source="platItemId" label="table.field.purchaseItem.platItemId" />,
+  <TextInput source="matnrCode" label="table.field.purchaseItem.matnrCode" />,
+  <TextInput source="matnrName" label="table.field.purchaseItem.matnrName" />,
+  <TextInput source="unit" label="table.field.purchaseItem.unit" />,
+  <NumberInput source="anfme" label="table.field.purchaseItem.anfme" />,
+  <NumberInput source="qty" label="table.field.purchaseItem.qty" />,
+  <NumberInput source="nromQty" label="table.field.purchaseItem.nromQty" />,
+  <NumberInput source="asnQty" label="table.field.purchaseItem.asnQty" />,
+  <NumberInput source="printQty" label="table.field.purchaseItem.printQty" />,
+  <TextInput source="splrName" label="table.field.purchaseItem.splrName" />,
+  <TextInput source="splrCode" label="table.field.purchaseItem.splrCode" />,
+  <TextInput source="splrBatch" label="table.field.purchaseItem.splrBatch" />,
+
+  <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 PurchaseItemList = () => {
+  const translate = useTranslate();
+  const [createDialog, setCreateDialog] = useState(false);
+  const [drawerVal, setDrawerVal] = useState(false);
+  const poId = useGetRecordId();
+
+  return (
+    <>
+      <Box display="flex">
+        <List
+          resource="purchaseItem"
+          sx={{
+            flexGrow: 1,
+            transition: (theme) =>
+              theme.transitions.create(['all'], {
+                duration: theme.transitions.duration.enteringScreen,
+              }),
+            marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+          }}
+          title={"menu.purchaseItem"}
+          empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+          filters={filters}
+          filter={{ purchaseId: poId }}
+          sort={{ field: "create_time", order: "desc" }}
+          actions={(
+            <TopToolbar>
+              <FilterButton />
+              <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+              <SelectColumnsButton preferenceKey='purchaseItem' />
+              <MyExportButton />
+            </TopToolbar>
+          )}
+          perPage={DEFAULT_PAGE_SIZE}
+        >
+          <StyledDatagrid
+            preferenceKey='purchaseItem'
+            bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+            rowClick={(id, resource, record) => false}
+            omit={['id', 'createTime','purchaseId', 'platItemId', 'createBy', 'memo']}
+          >
+            <NumberField source="id" />
+            <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" />
+            <TextField source="platItemId" label="table.field.purchaseItem.platItemId" />
+            <TextField source="matnrCode" label="table.field.purchaseItem.matnrCode" />
+            <TextField source="matnrName" label="table.field.purchaseItem.matnrName" />
+            <TextField source="unit" label="table.field.purchaseItem.unit" />
+            <NumberField source="anfme" label="table.field.purchaseItem.anfme" />
+            <NumberField source="qty" label="table.field.purchaseItem.qty" />
+            <NumberField source="nromQty" label="table.field.purchaseItem.nromQty" />
+            <NumberField source="asnQty" label="table.field.purchaseItem.asnQty" />
+            <NumberField source="printQty" label="table.field.purchaseItem.printQty" />
+            <TextField source="splrName" label="table.field.purchaseItem.splrName" />
+            <TextField source="splrCode" label="table.field.purchaseItem.splrCode" />
+            <TextField source="splrBatch" label="table.field.purchaseItem.splrBatch" />
+            <TextField source="updateBy$" label="common.field.updateBy" reference="user" />
+            <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' }} />
+              <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+            </WrapperField>
+          </StyledDatagrid>
+        </List>
+        <PurchaseItemCreate
+          open={createDialog}
+          setOpen={setCreateDialog}
+          row={{ poId }}
+        />
+        <PageDrawer
+          title='PurchaseItem Detail'
+          drawerVal={drawerVal}
+          setDrawerVal={setDrawerVal}
+        >
+        </PageDrawer>
+      </Box></>
+  )
+}
+
+export default PurchaseItemList;
diff --git a/rsf-admin/src/page/purchase/PurchaseList.jsx b/rsf-admin/src/page/purchase/PurchaseList.jsx
index ffdb648..4a67361 100644
--- a/rsf-admin/src/page/purchase/PurchaseList.jsx
+++ b/rsf-admin/src/page/purchase/PurchaseList.jsx
@@ -124,19 +124,20 @@
           preferenceKey='purchase'
           bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
           rowClick={'edit'}
-          expand={() => <PurchasePanel />}
+          expand={false}
           expandSingle={true}
           omit={['id', 'createTime', 'createBy', 'memo']}
         >
           <NumberField source="id" />
-          <MyField
+          {/* <MyField
             source="code"
             label="table.field.purchase.code"
             onClick={(event, record, val) => {
               event.stopPropagation();
               assign(record);
             }}
-          />
+          /> */}
+          <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 />
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-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 "";

--
Gitblit v1.9.1