skyouc
2025-05-20 e5d2c6f2eb8cc33675308d7d33fd4029d5fd2e34
rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx
@@ -39,8 +39,9 @@
    TableCell,
    Tooltip,
    IconButton,
    styled
    styled,
    Select,
    MenuItem
} from '@mui/material';
import DialogCloseButton from "../../components/DialogCloseButton";
@@ -52,9 +53,15 @@
import request from '@/utils/request';
import { Add, Edit, Delete } from '@mui/icons-material';
import _, { set } from 'lodash';
import { DataGrid, useGridApiRef } from '@mui/x-data-grid';
import { DataGrid, useGridApiRef, GRID_DATE_COL_DEF,  GRID_DATETIME_COL_DEF,  getGridDateOperators, useGridApiContext } from '@mui/x-data-grid';
import { LocalizationProvider, DatePicker, DateTimePicker } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import DictionarySelect from "../../components/DictionarySelect";
import DictSelect from "../../components/DictSelect";
import "./asnOrder.css";
import { 'zhCN' as locale } from 'date-fns/locale';
import { format, } from 'date-fns';
import { DemoContainer } from '@mui/x-date-pickers/internals/demo';
const AsnOrderModal = (props) => {
    const { open, setOpen, asnId, billReload } = props;
@@ -63,9 +70,7 @@
    const notify = useNotify();
    const refresh = useRefresh();
    const [disabled, setDisabled] = useState(false)
    const [createDialog, setCreateDialog] = useState(false);
    const tableRef = useRef();
    useEffect(() => {
@@ -101,6 +106,7 @@
            ...prevData,
            [name]: value
        }));
        console.log(formData);
    };
    const resetData = () => {
@@ -117,7 +123,7 @@
    const setFinally = () => {
        const rows = tableRef.current.state.editRows;
        for (const key in rows) {
            const find = tabelData.find(item => item.matnrId === +key);
            const find = tabelData.find(item => item.id === +key);
            find.anfme = rows[key].anfme.value;
        }
        setTableData([...tabelData]);
@@ -195,7 +201,7 @@
    const handleDeleteItem = () => {
        const newTableData = _.filter(tabelData, (item) => !selectedRows.includes(item.matnrId));
        const newTableData = _.filter(tabelData, (item) => !selectedRows.includes(item.id));
        setTableData(newTableData);
    }
@@ -208,7 +214,7 @@
                aria-hidden
                fullWidth
                disableRestoreFocus
                maxWidth="lg"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
                maxWidth="xl"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
            >
                <DialogTitle id="form-dialog-title" sx={{
                    position: 'sticky',
@@ -223,7 +229,7 @@
                </DialogTitle>
                <DialogContent sx={{ mt: 2 }}>
                    <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
                        <Form>
                        <Form defaultValues={formData}>
                            <Grid container spacing={2}>
                                <Grid item md={3}>
                                    <DictSelect
@@ -231,6 +237,7 @@
                                        value={formData.type}
                                        onChange={(e) => handleChange(e.target.value, 'type')}
                                        dictTypeCode="sys_order_type"
                                        group='1'
                                        required
                                    />
                                </Grid>
@@ -238,39 +245,35 @@
                                    <DictSelect
                                        label={translate("table.field.asnOrder.wkType")}
                                        value={formData.wkType}
                                        group='1'
                                        onChange={(e) => handleChange(e.target.value, 'wkType')}
                                        dictTypeCode="sys_business_type"
                                        required
                                    />
                                </Grid>
                                <Grid item md={3}>
                                <Grid item md={2}>
                                    <TextField
                                        label={translate("table.field.asnOrder.poCode")}
                                        value={formData.poCode}
                                        variant="filled"
                                        onChange={(e) => handleChange(e.target.value, 'poCode')}
                                    />
                                </Grid>
                                <Grid item md={3}>
                                <Grid item md={2}>
                                    <TextField
                                        label={translate("table.field.asnOrder.logisNo")}
                                        value={formData.logisNo}
                                        variant="filled"
                                        onChange={(e) => handleChange(e.target.value, 'logisNo')}
                                    />
                                </Grid>
                                <Grid item md={3}>
                                    {/* <TextField
                                        label={translate("table.field.asnOrder.arrTime")}
                                        value={formData.arrTime}
                                        onChange={(e) => handleChange(e.target.value, 'arrTime')}
                                    /> */}
                                    <DateInput
                                        source="arrTime"
                                        label="table.field.asnOrder.arrTime"
                                        value={formData.arrTime}
                                        onChange={(e) => handleChange(e.target.value, 'arrTime')}
                                    />
                                </Grid>
                            </Grid>
                        </Form>
@@ -280,11 +283,9 @@
                        <Stack direction="row" spacing={2}>
                            <Button variant="contained" onClick={() => setCreateDialog(true)}>新增物料</Button>
                            {/* {asnId !== '' && <ConfirmButton label={'删除'} variant="outlined" color="error" onConfirm={handleDelete} />} */}
                            <ConfirmButton label={'删除'} variant="outlined" color="error" onConfirm={handleDeleteItem} />
                            <ConfirmButton label={'ra.action.delete'} variant="outlined" color="error" onConfirm={handleDeleteItem} />
                        </Stack>
                    </Box>
                    <Box sx={{ mt: 2 }}>
                        <AsnOrderModalTable tabelData={tabelData} setTableData={setTableData} asnId={asnId} selectedRows={selectedRows} setSelectedRows={setSelectedRows} tableRef={tableRef}></AsnOrderModalTable>
                    </Box>
@@ -296,9 +297,7 @@
                        </Button>
                    </Toolbar>
                </DialogActions>
            </Dialog>
            <AsnWareModal
                open={createDialog}
                setOpen={setCreateDialog}
@@ -311,18 +310,193 @@
export default AsnOrderModal;
const dateColumnType = {
    ...GRID_DATE_COL_DEF,
    resizable: false,
    renderEditCell: (params) => {
        return <GridEditDateCell {...params} />;
    },
    // filterOperators: getGridDateOperators(false).map((item) => ({
    //     ...item,
    //     InputComponent: GridFilterDateInput,
    //     InputComponentProps: { showTime: false },
    // })),
    // valueFormatter: (value) => {
    //     if (value) {
    //         return format(value, 'yyyy-MM-dd', { locale });
    //     }
    //     return '';
    // },
}
const SelectInputSplrNameEditCell = (params) => {
    const [formData, setFormData] = useState([{}])
    useEffect(() => {
        getOptions();
    }, []);
    const getOptions = async () => {
        const parmas = {
            "type": "supplier"
        }
        const {
            data: { code, data, msg },
        } = await request.post("companys/page", parmas);
        if (code === 200) {
            setFormData(data.records)
            console.log(data.records)
        } else {
            notify(msg);
        }
    }
    return (
        <Select
            value={params.value}
            onChange={(e) => {
                params.api.setEditCellValue({
                    id: params.id,
                    field: params.field,
                    value: e.target.value,
                })
                // 找到选中的供应商记录
                const selectedSupplier = formData.find(supplier => supplier.name === e.target.value);
                // 如果找到对应的供应商记录,同时更新splrCode字段
                if (selectedSupplier) {
                    params.api.setEditCellValue({
                        id: params.id,
                        field: 'splrCode',
                        value: selectedSupplier.id,
                    });
                }
            }
            }
            fullWidth
        >
            {formData.map(e => {
                return (
                    <MenuItem value={e.name} children={e.name} key={e.id} />
                );
            })}
        </Select>
    );
};
const GridEditDateCell = ({ id, field, value, colDef, hasFocus }) => {
    const apiRef = useGridApiContext();
    const inputRef = React.useRef(null);
    const Component = colDef.type === 'dateTime' ? DateTimePicker : DatePicker;
    const handleChange = (newValue) => {
        apiRef.current.setEditCellValue({ id, field, value: newValue });
    };
    // useEnhancedEffect(() => {
    //     if (hasFocus) {
    //         inputRef.current.focus();
    //     }
    // }, [hasFocus]);
    return (
        <LocalizationProvider dateAdapter={AdapterDayjs}>
            <DemoContainer components={['DatePicker']}>
                <DatePicker label="Basic date picker" />
            </DemoContainer>
        </LocalizationProvider>
        // <Component
        //     value={value}
        //     autoFocus
        //     onChange={handleChange}
        //     slotProps={{
        //         textField: {
        //             inputRef,
        //             variant: 'standard',
        //             fullWidth: true,
        //             sx: {
        //                 padding: '0 9px',
        //                 justifyContent: 'center',
        //             },
        //             InputProps: {
        //                 disableUnderline: true,
        //                 sx: { fontSize: 'inherit' },
        //             },
        //         },
        //     }}
        // />
    );
}
const SelectInputSplrCodeEditCell = (params) => {
    const [formData, setFormData] = useState([{}])
    useEffect(() => {
        getOptions();
    }, []);
    const getOptions = async () => {
        const parmas = {
            "type": "supplier"
        }
        const {
            data: { code, data, msg },
        } = await request.post("companys/page", parmas);
        if (code === 200) {
            setFormData(data.records)
            console.log(data.records)
        } else {
            notify(msg);
        }
    }
    return (
        <Select
            value={params.value}
            onChange={(e) => {
                params.api.setEditCellValue({
                    id: params.id,
                    field: params.field,
                    value: e.target.value,
                })
                const selectedSupplier = formData.find(supplier => supplier.id === e.target.value);
                // 如果找到对应的供应商记录,同时更新splrCode字段
                if (selectedSupplier) {
                    params.api.setEditCellValue({
                        id: params.id,
                        field: 'splrName',
                        value: selectedSupplier.name,
                    });
                }
            }
            }
            fullWidth
        >
            {formData.map(e => {
                return (
                    <MenuItem value={e.id} children={e.name} key={e.id} />
                );
            })}
        </Select>
    );
};
const AsnOrderModalTable = ({ tabelData, setTableData, asnId, selectedRows, setSelectedRows, tableRef }) => {
    const translate = useTranslate();
    const notify = useNotify();
    const [columns, setColumns] = useState([
        {
            field: 'maktx',
            headerName: translate('table.field.asnOrderItem.maktx'),
            width: 250,
            editable: false,
        },
        {
            field: 'matnrCode',
            headerName: translate('table.field.asnOrderItem.matnrCode'),
@@ -330,48 +504,69 @@
            editable: false,
        },
        {
            field: 'maktx',
            headerName: translate('table.field.asnOrderItem.maktx'),
            width: 250,
            editable: false,
        },
        {
            field: 'anfme',
            headerName: translate('table.field.asnOrderItem.purQty'),
            headerName: translate('table.field.asnOrderItem.anfme') + "*",
            type: 'number',
            minWidth: 100,
            flex: 1,
            editable: true,
            valueFormatter: (val) => val < 0 ? 0 : val
        },
        {
            field: 'splrCode',
            headerName: translate('table.field.asnOrderItem.splrCode'),
            minWidth: 100,
            flex: 1,
            editable: true,
        },
        {
            field: 'splrName',
            headerName: translate('table.field.asnOrderItem.splrName'),
            minWidth: 100,
            flex: 1,
            editable: true,
            valueFormatter: (val) => val < 0 ? 0 : val,
            headerClassName: "custom",
        },
        // {
        //     field: 'packName',
        //     headerName: translate('table.field.asnOrderItem.packName'),
        //     field: 'splrCode',
        //     headerName: translate('table.field.asnOrderItem.splrCode') + "*",
        //     minWidth: 100,
        //     flex: 1,
        //     editable: true,
        // },
        // {
        //     field: 'poDetlId',
        //     headerName: translate('table.field.asnOrderItem.poDetlId'),
        //     minWidth: 100,
        //     flex: 1,
        //     renderEditCell: (params) => (
        //         <SelectInputSplrCodeEditCell {...params} />
        //     ),
        //     headerClassName: "custom",
        // },
        {
            field: 'poCode',
            headerName: translate('table.field.asnOrderItem.poDetlCode'),
            field: 'splrName',
            headerName: translate('table.field.asnOrderItem.splrName') + "*",
            minWidth: 100,
            flex: 1,
            editable: true,
            renderEditCell: (params) => (
                <SelectInputSplrNameEditCell {...params} />
            ),
            headerClassName: "custom",
        },
        {
            field: 'platItemId',
            headerName: translate('table.field.asnOrderItem.platItemId') + "*",
            minWidth: 100,
            flex: 1,
            editable: true,
            headerClassName: "custom",
        },
        {
            field: 'splrBatch',
            headerName: translate('table.field.asnOrderItem.splrBatch'),
            minWidth: 100,
            flex: 1,
            editable: true,
            headerClassName: "custom",
        },
        // {
        //     field: 'poCode',
        //     headerName: translate('table.field.asnOrderItem.poDetlCode') + "*",
        //     minWidth: 100,
        //     flex: 1,
        //     editable: true,
        //     headerClassName: "custom",
        // },
        {
            field: 'stockUnit',
@@ -381,22 +576,28 @@
            editable: false,
        },
        // {
        //     field: 'prodTime',
        //     headerName: translate('table.field.asnOrderItem.prodTime'),
        //     minWidth: 200,
        //     flex: 1,
        //     ...dateColumnType,
        //     editable: true,
        //     headerClassName: "custom",
        // },
        // {
        //     field: 'purQty',
        //     headerName: translate('table.field.asnOrderItem.purQty'),
        //     minWidth: 100,
        //     flex: 1,
        //     editable: true,
        // },
        {
            field: 'purUnit',
            headerName: translate('table.field.asnOrderItem.purUnit'),
            minWidth: 100,
            flex: 1,
            editable: false,
        },
        // {
        //     field: 'purUnit',
        //     headerName: translate('table.field.asnOrderItem.purUnit'),
        //     minWidth: 100,
        //     flex: 1,
        //     editable: false,
        // },
    ])
    const action = {
@@ -411,7 +612,6 @@
                </IconButton>
            </Tooltip>
        ),
    }
    let cdata = useRef([]);
@@ -432,11 +632,21 @@
        } = await request.get("/fields/enable/list");
        if (code === 200) {
            const cols = data.map(el => ({
                field: el.fields,
                field:  el.fields,
                valueGetter: (value, row) => {
                    if (value != null && value != undefined) {
                        return value;
                    }
                    if (row.extendFields == null  ||row.extendFields[el.fields] == null) {
                        return ''
                    } else {
                        return `${row.extendFields[el.fields] == null ? '' : row.extendFields[el.fields]}`;
                    }
                },
                headerName: el.fieldsAlise,
                minWidth: 100,
                flex: 1,
                editable: false
                editable: true
            }))
            setColumns([...columns, ...cols, action])
        } else {
@@ -444,17 +654,15 @@
        }
    }
    const handleDelete = (row) => {
        const newData = _.filter(cdata.current, (item) => item.matnrId !== row.matnrId);
        const newData = _.filter(cdata.current, (item) => item.id !== row.id);
        setTableData(newData);
    };
    const processRowUpdate = (newRow, oldRow) => {
        const rows = tabelData.map((r) =>
            r.matnrId === newRow.matnrId ? { ...newRow } : r
            r.id === newRow.id ? { ...newRow } : r
        )
        setTableData(rows)
        // setTableData((prevData) =>
@@ -468,8 +676,9 @@
    };
    const handleSelectionChange = (ids) => {
        console.log(ids);
        setSelectedRows(ids)
    };
@@ -484,7 +693,7 @@
                rows={tabelData}
                columns={columns}
                disableRowSelectionOnClick
                getRowId={(row) => row.matnrId}
                getRowId={(row) => row.id}
                disableColumnFilter
                disableColumnSelector
                disableColumnSorting