From 4496b9019ba423dd1c51c719bcc0a5938d90fff9 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期二, 22 四月 2025 17:33:18 +0800 Subject: [PATCH] #修改优化 1. DO单明细编码优化 2. DO单明细新增优化 3. 出库单新增单据增加新单据功能 --- rsf-admin/src/page/orders/delivery/DeliveryCreate.jsx | 2 rsf-admin/src/page/orders/outStock/OutOrderItemCreate.jsx | 72 ++--- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java | 11 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java | 2 rsf-admin/src/page/orders/outStock/OutOrderItemEdit.jsx | 36 +- /dev/null | 310 ------------------------- rsf-admin/src/page/orders/outStock/OutOrderModal.jsx | 167 +++++++++++++ rsf-admin/src/page/orders/delivery/DeliveryItemList.jsx | 7 rsf-admin/src/i18n/zh.js | 2 rsf-admin/src/page/orders/outStock/OutOrderList.jsx | 31 + rsf-admin/src/i18n/en.js | 2 rsf-admin/src/page/orders/delivery/DeliveryItemCreate.jsx | 60 +--- rsf-admin/src/page/orders/delivery/DeliveryEdit.jsx | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java | 9 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/DeliveryItem.java | 3 15 files changed, 286 insertions(+), 430 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index c248085..eb60a5f 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -939,7 +939,7 @@ quality: "quality", complete: "complete", close: "close", - asnCreate: "asnCreate", + asnCreate: "Create By Order", createTask: "createTask", recover: "recover", order: 'Orders', diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 710f535..b0c673a 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -988,7 +988,7 @@ quality: "璐ㄦ", complete: "瀹屾垚", close: "鍏抽棴", - asnCreate: "閫氳繃ASN鍒涘缓", + asnCreate: "閫氳繃鍗曟嵁鍒涘缓", createTask: "鐢熸垚浠诲姟", recover: "缁х画鏀惰揣", }, diff --git a/rsf-admin/src/page/orders/delivery/DeliveryCreate.jsx b/rsf-admin/src/page/orders/delivery/DeliveryCreate.jsx index eb55fcb..6f78fbe 100644 --- a/rsf-admin/src/page/orders/delivery/DeliveryCreate.jsx +++ b/rsf-admin/src/page/orders/delivery/DeliveryCreate.jsx @@ -124,12 +124,10 @@ <NumberInput label="table.field.delivery.qty" source="qty" - validate={required()} /> <NumberInput label="table.field.delivery.workQty" source="workQty" - validate={required()} /> <TextInput label="table.field.delivery.platCode" diff --git a/rsf-admin/src/page/orders/delivery/DeliveryEdit.jsx b/rsf-admin/src/page/orders/delivery/DeliveryEdit.jsx index 0f80dae..49867b9 100644 --- a/rsf-admin/src/page/orders/delivery/DeliveryEdit.jsx +++ b/rsf-admin/src/page/orders/delivery/DeliveryEdit.jsx @@ -111,12 +111,10 @@ <NumberInput label="table.field.delivery.qty" source="qty" - validate={required()} /> <NumberInput label="table.field.delivery.workQty" source="workQty" - validate={required()} /> <TextInput label="table.field.delivery.platCode" diff --git a/rsf-admin/src/page/orders/delivery/DeliveryItemCreate.jsx b/rsf-admin/src/page/orders/delivery/DeliveryItemCreate.jsx index c9c4eb4..7d1c567 100644 --- a/rsf-admin/src/page/orders/delivery/DeliveryItemCreate.jsx +++ b/rsf-admin/src/page/orders/delivery/DeliveryItemCreate.jsx @@ -17,6 +17,7 @@ useNotify, Form, useCreateController, + ReferenceField, } from 'react-admin'; import { Dialog, @@ -26,6 +27,7 @@ Stack, Grid, Box, + TextField, } from '@mui/material'; import DialogCloseButton from "../../components/DialogCloseButton"; import StatusSelectInput from "../../components/StatusSelectInput"; @@ -55,6 +57,7 @@ return ( <> <CreateBase + resource="deliveryItem" record={{}} transform={(data) => { return data; @@ -84,99 +87,70 @@ </DialogTitle> <DialogContent sx={{ mt: 2 }}> <Grid container rowSpacing={2} columnSpacing={2}> - <Grid item xs={6} display="flex" gap={1} sx={{display : "none"}}> - <NumberInput + <Grid item xs={6} display="flex" gap={1} sx={{ display: "none" }}> + <NumberInput label="table.field.deliveryItem.deliveryId" source="deliveryId" defaultValue={record?.id} readOnly /> </Grid> - <Grid item xs={6} display="flex" gap={1}> + <Grid item xs={12} display="flex" gap={1}> <TextInput label="table.field.deliveryItem.platItemId" source="platItemId" parse={v => v} /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.deliveryItem.matnrCode" source="matnrCode" parse={v => v} /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.deliveryItem.matnrName" source="matnrName" parse={v => v} /> </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.deliveryItem.fieldsIndex" - source="fieldsIndex" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> + <Grid item xs={12} display="flex" gap={1}> <TextInput label="table.field.deliveryItem.unit" source="unit" parse={v => v} /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.deliveryItem.anfme" source="anfme" validate={required()} /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.deliveryItem.qty" source="qty" - validate={required()} /> </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.deliveryItem.nromQty" - source="nromQty" - validate={required()} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> + <Grid item xs={12} display="flex" gap={1}> <NumberInput label="table.field.deliveryItem.printQty" source="printQty" - validate={required()} /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.deliveryItem.splrName" - source="splrName" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput + <ReferenceInput source="splrName" reference="companys" label="table.field.deliveryItem.splrName" queryOptions={{ type: 'supplier' }}> + <AutocompleteInput + label="table.field.deliveryItem.splrName" + optionText="name" + source="splrCode" + /> + </ReferenceInput> + {/* <TextInput label="table.field.deliveryItem.splrCode" source="splrCode" parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> + /> */} <TextInput label="table.field.deliveryItem.splrBatch" source="splrBatch" parse={v => v} /> </Grid> - <Grid item xs={6} display="flex" gap={1}> <StatusSelectInput /> </Grid> diff --git a/rsf-admin/src/page/orders/delivery/DeliveryItemList.jsx b/rsf-admin/src/page/orders/delivery/DeliveryItemList.jsx index 3cfd440..3116dd7 100644 --- a/rsf-admin/src/page/orders/delivery/DeliveryItemList.jsx +++ b/rsf-admin/src/page/orders/delivery/DeliveryItemList.jsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; -import { useNavigate } from 'react-router-dom'; +import { useLocation, useNavigate } from 'react-router-dom'; import { List, DatagridConfigurable, @@ -97,6 +97,7 @@ const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); const [editDialog, setEditDialog] = useState(false); + const location = useLocation(); const [select, setSelect] = useState({}); const { data: dicts, isPending, error } = useGetOne('delivery', { id: doId }); return ( @@ -112,7 +113,7 @@ marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} title={"menu.deliveryItem"} - empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + empty={false} filters={filters} filter={{deliveryId: doId}} sort={{ field: "create_time", order: "desc" }} @@ -158,7 +159,7 @@ <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"> - <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> + <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} redirect={location.pathname + '/' + doId} /> </WrapperField> </StyledDatagrid> </List> diff --git a/rsf-admin/src/page/orders/outStock/AsnOrderModal.jsx b/rsf-admin/src/page/orders/outStock/AsnOrderModal.jsx deleted file mode 100644 index 6c2dc38..0000000 --- a/rsf-admin/src/page/orders/outStock/AsnOrderModal.jsx +++ /dev/null @@ -1,643 +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, - useListContext, - useRefresh, -} from 'react-admin'; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Stack, - Grid, - TextField, - Box, - Button, - Paper, - TableContainer, - Table, - TableHead, - TableBody, - TableRow, - TableCell, - Tooltip, - IconButton, - styled, - Select, - MenuItem - - -} from '@mui/material'; -import DialogCloseButton from "../../components/DialogCloseButton"; -import StatusSelectInput from "../../components/StatusSelectInput"; -import ConfirmButton from "../../components/ConfirmButton"; -import AsnWareModal from "./AsnWareModal"; -import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; -import SaveIcon from '@mui/icons-material/Save'; -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 DictionarySelect from "../../components/DictionarySelect"; -import DictSelect from "../../components/DictSelect"; -import "./asnOrder.css"; - -const AsnOrderModal = (props) => { - const { open, setOpen, asnId, billReload } = props; - - const translate = useTranslate(); - const notify = useNotify(); - const refresh = useRefresh(); - const [disabled, setDisabled] = useState(false) - - const [createDialog, setCreateDialog] = useState(false); - - const tableRef = useRef(); - - useEffect(() => { - if (open && asnId !== 0) { - requestGetHead() - requestGetBody() - } - setDisabled(false) - }, [open]) - - const handleClose = (event, reason) => { - if (reason !== "backdropClick") { - setOpen(false); - refresh(); - setFormData({ type: '', wkType: '' }) - setTableData([]) - } - }; - - const [formData, setFormData] = useState({ - type: '', - wkType: '', - poCode: '', - logisNo: '', - arrTime: '' - }); - - const [tabelData, setTableData] = useState([]); - - - const handleChange = (value, name) => { - setFormData((prevData) => ({ - ...prevData, - [name]: value - })); - console.log(formData); - }; - - const resetData = () => { - setFormData({ - type: '', - wkType: '', - poCode: '', - logisNo: '', - arrTime: '' - }) - setTableData([]) - } - - const setFinally = () => { - const rows = tableRef.current.state.editRows; - for (const key in rows) { - const find = tabelData.find(item => item.matnrId === +key); - find.anfme = rows[key].anfme.value; - } - setTableData([...tabelData]); - } - - const handleSubmit = async () => { - setFinally() - setDisabled(true) - - if (asnId === 0) { - const parmas = { - "orders": formData, - "items": tabelData, - } - - const res = await request.post(`/asnOrder/items/save`, parmas); - if (res?.data?.code === 200) { - setOpen(false); - refresh(); - billReload?.current() - resetData() - } else { - notify(res.data.msg); - } - } else { - const parmas = { - "orders": formData, - "items": tabelData, - } - const res = await request.post(`/asnOrder/items/update`, parmas); - if (res?.data?.code === 200) { - setOpen(false); - refresh(); - billReload?.current() - resetData() - } else { - notify(res.data.msg); - } - } - setDisabled(false) - - }; - - - const handleDelete = async () => { - const res = await request.post(`/asnOrder/remove/${asnId}`); - if (res?.data?.code === 200) { - setOpen(false); - refresh(); - } else { - notify(res.data.msg); - } - }; - - const requestGetHead = async () => { - const res = await request.get(`/asnOrder/${asnId}`); - if (res?.data?.code === 200) { - setFormData(res.data.data) - } else { - notify(res.data.msg); - } - } - - const requestGetBody = async () => { - const res = await request.post(`/asnOrderItem/page`, { asnId }); - if (res?.data?.code === 200) { - setTableData(res.data.data.records) - } else { - notify(res.data.msg); - } - } - - const [selectedRows, setSelectedRows] = useState([]); - - - - const handleDeleteItem = () => { - const newTableData = _.filter(tabelData, (item) => !selectedRows.includes(item.matnrId)); - setTableData(newTableData); - } - - return ( - <> - <Dialog - open={open} - onClose={handleClose} - aria-labelledby="form-dialog-title" - aria-hidden - fullWidth - disableRestoreFocus - maxWidth="lg" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' - > - <DialogTitle id="form-dialog-title" sx={{ - position: 'sticky', - top: 0, - backgroundColor: 'background.paper', - zIndex: 1000 - }}> - {translate('create.title')} - <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> - <DialogCloseButton onClose={handleClose} /> - </Box> - </DialogTitle> - <DialogContent sx={{ mt: 2 }}> - <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> - <Form defaultValues={formData}> - <Grid container spacing={2}> - <Grid item md={3}> - <DictSelect - label={translate("table.field.asnOrder.type")} - value={formData.type} - onChange={(e) => handleChange(e.target.value, 'type')} - dictTypeCode="sys_order_type" - required - /> - </Grid> - <Grid item md={3}> - <DictSelect - label={translate("table.field.asnOrder.wkType")} - value={formData.wkType} - onChange={(e) => handleChange(e.target.value, 'wkType')} - dictTypeCode="sys_business_type" - required - /> - </Grid> - <Grid item md={3}> - <TextField - label={translate("table.field.asnOrder.poCode")} - value={formData.poCode} - onChange={(e) => handleChange(e.target.value, 'poCode')} - /> - </Grid> - <Grid item md={3}> - <TextField - label={translate("table.field.asnOrder.logisNo")} - value={formData.logisNo} - 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> - </Box> - - <Box sx={{ mt: 2 }}> - <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} /> - </Stack> - </Box> - <Box sx={{ mt: 2 }}> - <AsnOrderModalTable tabelData={tabelData} setTableData={setTableData} asnId={asnId} selectedRows={selectedRows} setSelectedRows={setSelectedRows} tableRef={tableRef}></AsnOrderModalTable> - </Box> - </DialogContent> - <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> - <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > - <Button disabled={disabled} onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}> - {translate('toolbar.confirm')} - </Button> - </Toolbar> - </DialogActions> - - </Dialog> - - <AsnWareModal - open={createDialog} - setOpen={setCreateDialog} - data={tabelData} - setData={setTableData} - /> - </> - ) -} - -export default AsnOrderModal; - -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); - - // 濡傛灉鎵惧埌瀵瑰簲鐨勪緵搴斿晢璁板綍锛屽悓鏃舵洿鏂皊plrCode瀛楁 - 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 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); - - // 濡傛灉鎵惧埌瀵瑰簲鐨勪緵搴斿晢璁板綍锛屽悓鏃舵洿鏂皊plrCode瀛楁 - 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'), - width: 130, - editable: false, - }, - { - field: 'anfme', - headerName: translate('table.field.asnOrderItem.anfme')+"*", - type: 'number', - minWidth: 100, - flex: 1, - editable: true, - valueFormatter: (val) => val < 0 ? 0 : val, - headerClassName: "custom", - }, - { - field: 'splrCode', - headerName: translate('table.field.asnOrderItem.splrCode')+"*", - minWidth: 100, - flex: 1, - editable: true, - renderEditCell: (params) => ( - <SelectInputSplrCodeEditCell {...params} /> - ), - headerClassName: "custom", - }, - { - field: 'splrName', - headerName: translate('table.field.asnOrderItem.splrName')+"*", - minWidth: 100, - flex: 1, - editable: true, - renderEditCell: (params) => ( - <SelectInputSplrNameEditCell {...params} /> - ), - headerClassName: "custom", - }, - // { - // field: 'packName', - // headerName: translate('table.field.asnOrderItem.packName'), - // minWidth: 100, - // flex: 1, - // editable: true, - // }, - // { - // field: 'poDetlId', - // headerName: translate('table.field.asnOrderItem.poDetlId'), - // minWidth: 100, - // flex: 1, - // }, - { - field: 'poCode', - headerName: translate('table.field.asnOrderItem.poDetlCode')+"*", - minWidth: 100, - flex: 1, - editable: true, - headerClassName: "custom", - }, - - { - field: 'stockUnit', - headerName: translate('table.field.asnOrderItem.stockUnit'), - minWidth: 100, - flex: 1, - editable: false, - }, - // { - // 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, - }, - - - - ]) - - const action = { - field: 'action', - headerName: '鎿嶄綔', - width: 70, - lockPosition: 'left', - renderCell: (params) => ( - <Tooltip title="Delete"> - <IconButton onClick={() => handleDelete(params.row)}> - <Delete /> - </IconButton> - </Tooltip> - ), - - } - - let cdata = useRef([]); - - - useEffect(() => { - getDynamicFields(); - }, []); - - useEffect(() => { - cdata.current = tabelData - }, [tabelData]); - - - const getDynamicFields = async () => { - const { - data: { code, data, msg }, - } = await request.get("/fields/enable/list"); - if (code === 200) { - const cols = data.map(el => ({ - field: el.fields, - headerName: el.fieldsAlise, - minWidth: 100, - flex: 1, - editable: false - })) - setColumns([...columns, ...cols, action]) - } else { - notify(msg); - } - } - - - - const handleDelete = (row) => { - const newData = _.filter(cdata.current, (item) => item.matnrId !== row.matnrId); - setTableData(newData); - }; - - - const processRowUpdate = (newRow, oldRow) => { - const rows = tabelData.map((r) => - r.matnrId === newRow.matnrId ? { ...newRow } : r - ) - setTableData(rows) - // setTableData((prevData) => - // prevData.map((r) => - // r.matnrId === newRow.matnrId ? { ...newRow } : r - // ) - - // ); - - return newRow; - }; - - - - const handleSelectionChange = (ids) => { - setSelectedRows(ids) - - }; - - tableRef.current = useGridApiRef(); - - - return ( - <div style={{ height: 400, width: '100%' }}> - <DataGrid - apiRef={tableRef} - rows={tabelData} - columns={columns} - disableRowSelectionOnClick - getRowId={(row) => row.matnrId} - disableColumnFilter - disableColumnSelector - disableColumnSorting - disableMultipleColumnsSorting - processRowUpdate={processRowUpdate} - initialState={{ - pagination: { - paginationModel: { - pageSize: 25, - }, - }, - }} - pageSizeOptions={[10, 25, 50, 100]} - editMode="row" - checkboxSelection - onRowSelectionModelChange={handleSelectionChange} - selectionModel={selectedRows} - sx={{ - '& .MuiDataGrid-cell input': { - border: '1px solid #ccc' - }, - }} - /> - </div> - ); -}; - diff --git a/rsf-admin/src/page/orders/outStock/AsnOrderPanel.jsx b/rsf-admin/src/page/orders/outStock/AsnOrderPanel.jsx deleted file mode 100644 index 4649e7f..0000000 --- a/rsf-admin/src/page/orders/outStock/AsnOrderPanel.jsx +++ /dev/null @@ -1,239 +0,0 @@ -import React, { useState, useRef, useEffect, useMemo } from "react"; -import { Box, Card, CardContent, Grid, Typography, Button, TextField, Tooltip, Paper, TableContainer, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material'; -import { - useTranslate, - useRecordContext, - useNotify, - useRefresh, - useListContext, -} from 'react-admin'; -import PanelTypography from "../../components/PanelTypography"; -import * as Common from '@/utils/common' -import { styled } from "@mui/material/styles"; -import request from '@/utils/request'; -import debounce from 'lodash/debounce'; -import { DataGrid } from '@mui/x-data-grid'; -import PrintModal from './PrintModal'; -import PrintIcon from '@mui/icons-material/Print'; -const AsnOrderPanel = ({ billReload }) => { - const record = useRecordContext(); - if (!record) return null; - const translate = useTranslate(); - const notify = useNotify(); - const [rows, setRows] = useState([]); - const [maktx, setMaktx] = useState(''); - const asnId = record.id; - - useEffect(() => { - debouncedHttp({ maktx }); - }, [asnId, maktx]); - - const http = async (parmas) => { - const res = await request.post('/asnOrderItem/page', { ...parmas, asnId }); - if (res?.data?.code === 200) { - setRows(res.data.data.records) - } else { - notify(res.data.msg); - } - } - - - useEffect(() => { - billReload.current = http - }, []); - - - const debouncedHttp = useMemo(() => debounce(http, 300), []); - - const columns = [ - { - field: 'asnId', - headerName: translate('table.field.asnOrderItem.asnId') - }, - { - field: 'asnCode', - headerName: translate('table.field.asnOrderItem.asnCode'), - width: 150, - }, - // { - // field: 'poDetlId', - // headerName: translate('table.field.asnOrderItem.poDetlId') - // }, - { - field: 'poCode', - headerName: translate('table.field.asnOrderItem.poDetlCode') - }, - { - field: 'matnrCode', - headerName: translate('table.field.asnOrderItem.matnrCode'), - width: 150, - }, - { - field: 'maktx', - headerName: translate('table.field.asnOrderItem.maktx'), - width: 200, - }, - { - field: 'anfme', - headerName: translate('table.field.asnOrderItem.purQty') - }, - { - field: 'stockUnit', - headerName: translate('table.field.asnOrderItem.stockUnit') - }, - // { - // field: 'purQty', - // headerName: translate('table.field.asnOrderItem.purQty') - // }, - { - field: 'purUnit', - headerName: translate('table.field.asnOrderItem.purUnit') - }, - { - field: 'qty', - headerName: translate('table.field.asnOrderItem.qty') - }, - { - field: 'splrBatch', - headerName: translate('table.field.asnOrderItem.splrBatch') - }, - { - field: 'splrCode', - headerName: translate('table.field.asnOrderItem.splrCode') - }, - { - field: 'splrName', - headerName: translate('table.field.asnOrderItem.splrName') - }, - { - field: 'trackCode', - headerName: translate('table.field.asnOrderItem.barcode'), - width: 150 - }, - { - field: 'prodTime', - headerName: translate('table.field.asnOrderItem.prodTime') - }, - { - field: 'packName', - headerName: translate('table.field.asnOrderItem.packName') - }, - { - field: 'action', - headerName: '鎿嶄綔', - width: 70, - lockPosition: 'left', - renderCell: (params) => ( - <PrintButton rows={[params.row.id]} /> - ), - - },] - - const [selectedRows, setSelectedRows] = useState([]); - - const handleSelectionChange = (ids) => { - setSelectedRows(ids) - - }; - const maktxChange = (value) => { - setMaktx(value) - } - - - return ( - <Box sx={{ - position: 'relative', - padding: '5px 10px' - }}> - <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}> - <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" sx={{ width: '300px' }} size="small" /> - - <div style={{ display: 'flex', gap: '10px' }}> - <PrintsButton rows={selectedRows} /> - </div> - </div> - - - <DataGrid - sx={{ width: 'calc(100vw - 280px)' }} - size="small" - rows={rows} - columns={columns} - disableRowSelectionOnClick - checkboxSelection - onRowSelectionModelChange={handleSelectionChange} - selectionModel={selectedRows} - disableColumnMenu={true} - disableColumnSorting - disableMultipleColumnsSorting - columnHeaderHeight={40} - rowHeight={42} - initialState={{ - pagination: { - paginationModel: { - pageSize: 10, - }, - }, - }} - pageSizeOptions={[10, 25, 50]} - /> - </Box > - - ); -}; - -export default AsnOrderPanel; - -const PrintsButton = ({ rows }) => { - const record = useRecordContext(); - const { resource, selectedIds } = useListContext(); - const notify = useNotify(); - const refresh = useRefresh(); - const translate = useTranslate(); - - const [createDialog, setCreateDialog] = useState(false); - - const modalChange = () => { - if (rows?.length === 0) { - notify('璇烽�夋嫨鐗╂枡'); - return; - } else { - setCreateDialog(true) - } - - } - - return ( - <> - <Button size="small" color="secondary" onClick={modalChange} startIcon={<PrintIcon />}>{translate("toolbar.batchPrint")}</Button> - - <PrintModal - open={createDialog} - setOpen={setCreateDialog} - rows={rows} - /> - </> - ) -} - -const PrintButton = ({ rows }) => { - const record = useRecordContext(); - - const notify = useNotify(); - const refresh = useRefresh(); - - const [createDialog, setCreateDialog] = useState(false); - const translate = useTranslate(); - - return ( - <> - <Button size="small" color="secondary" onClick={() => setCreateDialog(true)} startIcon={<PrintIcon />}>{translate("toolbar.print")}</Button> - - <PrintModal - open={createDialog} - setOpen={setCreateDialog} - rows={rows} - /> - </> - ) -} diff --git a/rsf-admin/src/page/orders/outStock/AsnWareModal.jsx b/rsf-admin/src/page/orders/outStock/AsnWareModal.jsx deleted file mode 100644 index 8f3788b..0000000 --- a/rsf-admin/src/page/orders/outStock/AsnWareModal.jsx +++ /dev/null @@ -1,249 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Stack, - Grid, - TextField, - Box, - Button, - Paper, - styled -} from '@mui/material'; -import DialogCloseButton from "../../components/DialogCloseButton"; -import { useTranslate, useNotify, useRefresh } from 'react-admin'; -import request from '@/utils/request'; -import { DataGrid } from '@mui/x-data-grid'; -import SaveIcon from '@mui/icons-material/Save'; -import TreeSelectInput from "@/page/components/TreeSelectInput"; -const AsnWareModal = (props) => { - const { open, setOpen, data, setData } = props; - - const translate = useTranslate(); - const notify = useNotify(); - const refresh = useRefresh(); - - const handleClose = (event, reason) => { - if (reason !== "backdropClick") { - setOpen(false); - } - }; - - const [formData, setFormData] = useState({}); - const [tableData, setTableData] = useState([]); - const [dyFields, setDyFields] = useState([]); - const [selectedRows, setSelectedRows] = useState([]); - - const handleChange = (e) => { - const { name, value } = e.target; - setFormData(() => ({ - [name]: value - })); - }; - - const reset = () => { - setFormData({ - name: '', - code: '', - groupId: 0 - }) - } - - const handleSubmit = () => { - const hasarr = data.map(el => +el.matnrId) - const selectedData = selectedRows.filter(item => !hasarr.includes(item)).map(id => (tableData.find(row => row.id === id))); - const value = selectedData.map((el => { - const dynamicFields = dyFields.reduce((acc, item) => { - acc[item.fields] = el['extendFields']?.[item.fields] || ''; - return acc; - }, {}); - return { - matnrId: el.id, - maktx: el.name, - matnrCode: el.code, - stockUnit: el.stockUnit || '', - purUnit: el.purchaseUnit || '', - ...dynamicFields - } - })) - setData([...data, ...value]); - setOpen(false); - reset(); - }; - - const getData = async () => { - const res = await request.post(`/matnr/page`, { - ...formData, - current: 1, - pageSize: 100, - orderBy: "create_time desc" - }); - if (res?.data?.code === 200) { - setTableData(res.data.data.records); - } else { - notify(res.data.msg); - } - }; - - useEffect(() => { - getData(); - }, [open]); - - const handleSearch = () => { - getData() - }; - - return ( - <Dialog - open={open} - onClose={handleClose} - aria-labelledby="form-dialog-title" - fullWidth - disableRestoreFocus - maxWidth="lg" - > - <DialogTitle id="form-dialog-title" sx={{ - position: 'sticky', - top: 0, - backgroundColor: 'background.paper', - zIndex: 1000 - }}> - 閫夋嫨鐗╂枡 - <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> - <DialogCloseButton onClose={handleClose} /> - </Box> - </DialogTitle> - <DialogContent sx={{ mt: 2 }}> - <Box component="form" onSubmit={handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> - <Grid container spacing={2}> - <Grid item md={4}> - <TextField - label={translate('table.field.matnr.name')} - name="name" - value={formData.name} - onChange={handleChange} - size="small" - /> - </Grid> - <Grid item md={4}> - <TextField - label={translate('table.field.matnr.code')} - name="code" - value={formData.code} - onChange={handleChange} - size="small" - /> - </Grid> - <Grid item md={4}> - <TreeSelectInput - label="table.field.matnr.groupId" - value={formData.groupId} - resource={'matnrGroup'} - source="groupId" - name="groupId" - onChange={handleChange} - /> - </Grid> - </Grid> - </Box> - <Box sx={{ mt: 2 }}> - <Stack direction="row" spacing={2}> - <Button variant="contained" onClick={handleSearch}>鎼滅储</Button> - </Stack> - </Box> - <Box sx={{ mt: 2, height: 400, width: '100%' }}> - <AsnWareModalTable - tableData={tableData} - setTableData={setTableData} - dyFields={dyFields} - setDyFields={setDyFields} - selectedRows={selectedRows} - setSelectedRows={setSelectedRows} - /> - </Box> - </DialogContent> - <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> - <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}> - <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}> - {translate('toolbar.confirm')} - </Button> - </Box> - </DialogActions> - </Dialog> - ); -}; - -export default AsnWareModal; - -const AsnWareModalTable = ({ tableData, setTableData, selectedRows, setSelectedRows, dyFields, setDyFields }) => { - const translate = useTranslate(); - const notify = useNotify(); - - const [columns, setColumns] = useState([ - // { field: 'id', headerName: 'ID', width: 100 }, - { field: 'name', headerName: translate('table.field.matnr.name'), width: 300 }, - { field: 'code', headerName: translate('table.field.matnr.code'), width: 200 }, - { field: 'groupId$', headerName: translate('table.field.matnr.groupId'), width: 100 }, - { field: 'spec', headerName: translate('table.field.matnr.spec'), width: 100 }, - { field: 'model', headerName: translate('table.field.matnr.model'), width: 100 }, - { field: 'weight', headerName: translate('table.field.matnr.weight'), width: 100 }, - - { field: 'describle', headerName: translate('table.field.matnr.describle'), width: 100 }, - { field: 'nromNum', headerName: translate('table.field.matnr.nromNum'), width: 100 }, - { field: 'unit', headerName: translate('table.field.matnr.unit'), width: 100 }, - { field: 'purchaseUnit', headerName: translate('table.field.matnr.purUnit'), width: 100 }, - { field: 'stockUnit', headerName: translate('table.field.matnr.stockUnit'), width: 100 }, - { field: 'stockLeval$', headerName: translate('table.field.matnr.stockLevel'), width: 100, sortable: false }, - ]) - - - - const handleSelectionChange = (ids) => { - setSelectedRows(ids) - - }; - - useEffect(() => { - getDynamicFields(); - }, []); - - const getDynamicFields = async () => { - const { - data: { code, data, msg }, - } = await request.get("/fields/enable/list"); - if (code === 200) { - const cols = data.map(el => ({ - field: el.fields, - headerName: el.fieldsAlise, - minWidth: 100, - flex: 1, - editable: el.unique, - valueGetter: (value, row) => { - return row.extendFields?.[el.fields] || ''; - }, - })) - setDyFields(data) - setColumns([...columns, ...cols]) - } else { - notify(msg); - } - } - - return ( - <div style={{ height: 400, width: '100%' }}> - <DataGrid - size="small" - rows={tableData} - columns={columns} - checkboxSelection - onRowSelectionModelChange={handleSelectionChange} - selectionModel={selectedRows} - disableColumnMenu={true} - disableColumnSorting - disableMultipleColumnsSorting - /> - </div> - ); -}; \ No newline at end of file diff --git a/rsf-admin/src/page/orders/outStock/OutOrderItemCreate.jsx b/rsf-admin/src/page/orders/outStock/OutOrderItemCreate.jsx index e9a378d..213cfde 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderItemCreate.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderItemCreate.jsx @@ -53,7 +53,7 @@ return ( <> <CreateBase - resource="asnOrderItem" + resource="outStockItem" record={{}} transform={(data) => { return data; @@ -85,105 +85,99 @@ <Grid> <Grid item xs={6} display="flex" gap={2}> <NumberInput - label="table.field.asnOrderItem.asnId" + label="table.field.outStockItem.asnId" source="asnId" readOnly hidden defaultValue={record?.id} /> <TextInput - label="table.field.asnOrderItem.asnCode" + label="table.field.outStockItem.asnCode" source="asnCode" readOnly defaultValue={record?.code} parse={v => v} /> - </Grid> - <Grid item xs={6} display="flex" gap={2}> <TextInput - label="table.field.asnOrderItem.poDetlId" + label="table.field.outStockItem.poDetlId" source="poDetlId" - parse={v => v} - /> - <TextInput - label="table.field.asnOrderItem.poDetlCode" - source="poDetlCode" - parse={v => v} - /> - <TextInput - label="table.field.asnOrderItem.matnrId" - source="matnrId" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput - label="table.field.asnOrderItem.maktx" + label="table.field.outStockItem.matnrId" + source="matnrId" + parse={v => v} + /> + <TextInput + label="table.field.outStockItem.maktx" source="maktx" parse={v => v} /> <NumberInput - label="table.field.asnOrderItem.anfme" + label="table.field.outStockItem.anfme" source="anfme" validate={required()} /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> <TextInput - label="table.field.asnOrderItem.stockUnit" + label="table.field.outStockItem.stockUnit" source="stockUnit" parse={v => v} /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> <NumberInput - label="table.field.asnOrderItem.purQty" + label="table.field.outStockItem.purQty" source="purQty" validate={required()} /> <TextInput - label="table.field.asnOrderItem.purUnit" + label="table.field.outStockItem.purUnit" source="purUnit" parse={v => v} /> - <NumberInput - label="table.field.asnOrderItem.qty" - source="qty" - /> </Grid> <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.outStockItem.qty" + source="qty" + /> <TextInput - label="table.field.asnOrderItem.splrCode" + label="table.field.outStockItem.splrCode" source="splrCode" parse={v => v} /> <TextInput - label="table.field.asnOrderItem.splrName" + label="table.field.outStockItem.splrName" source="splrName" parse={v => v} /> - <TextInput - label="table.field.asnOrderItem.qrcode" - source="qrcode" - parse={v => v} - /> + </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput - label="table.field.asnOrderItem.barcode" + label="table.field.outStockItem.qrcode" + source="qrcode" + parse={v => v} + /> + <TextInput + label="table.field.outStockItem.barcode" source="barcode" parse={v => v} /> <TextInput - label="table.field.asnOrderItem.packName" + label="table.field.outStockItem.packName" source="packName" parse={v => v} /> </Grid> - <Grid item xs={6} display="flex" gap={1}> + <Grid item xs={4} display="flex" gap={1}> <StatusSelectInput /> </Grid> - <Grid item xs={12} display="flex" gap={1}> - <Stack direction="column" spacing={1} width={'100%'}> + <Grid item xs={4} display="flex" gap={1}> + <Stack direction="column" spacing={1}> <MemoInput /> </Stack> </Grid> diff --git a/rsf-admin/src/page/orders/outStock/OutOrderItemEdit.jsx b/rsf-admin/src/page/orders/outStock/OutOrderItemEdit.jsx index 800b76b..28d2342 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderItemEdit.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderItemEdit.jsx @@ -52,7 +52,7 @@ setOpen(false); } }; - const { data, isPending, } = useGetOne('asnOrderItem', { id: record?.id }); + const { data, isPending, } = useGetOne('outStockItem', { id: record?.id }); if (data == null || data == undefined) { return } return ( @@ -79,7 +79,7 @@ <DialogContent sx={{ mt: 2 }}> <EditBase id={record?.id} - resource="asnOrderItem" + resource="outStockItem" mutationMode={EDIT_MODE} actions={<CustomerTopToolBar />} > @@ -93,83 +93,83 @@ <Grid item xs={24} md={14}> <Stack direction='row' gap={2}> <NumberInput - label="table.field.asnOrderItem.asnId" + label="table.field.outStockItem.asnId" source="asnId" readOnly /> <TextInput - label="table.field.asnOrderItem.asnCode" + label="table.field.outStockItem.asnCode" source="asnCode" readOnly parse={v => v} /> <TextInput - label="table.field.asnOrderItem.poDetlId" + label="table.field.outStockItem.poDetlId" source="poDetlId" parse={v => v} /> <TextInput - label="table.field.asnOrderItem.poDetlCode" + label="table.field.outStockItem.poDetlCode" source="poDetlCode" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput - label="table.field.asnOrderItem.matnrId" + label="table.field.outStockItem.matnrId" source="matnrId" parse={v => v} /> <TextInput - label="table.field.asnOrderItem.maktx" + label="table.field.outStockItem.maktx" source="maktx" parse={v => v} /> <NumberInput - label="table.field.asnOrderItem.anfme" + label="table.field.outStockItem.anfme" source="anfme" validate={required()} /> <TextInput - label="table.field.asnOrderItem.stockUnit" + label="table.field.outStockItem.stockUnit" source="stockUnit" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <NumberInput - label="table.field.asnOrderItem.purQty" + label="table.field.outStockItem.purQty" source="purQty" validate={required()} /> <TextInput - label="table.field.asnOrderItem.purUnit" + label="table.field.outStockItem.purUnit" source="purUnit" parse={v => v} /> <NumberInput - label="table.field.asnOrderItem.qty" + label="table.field.outStockItem.qty" source="qty" readOnly /> - <ReferenceInput source="splrName" label="table.field.asnOrderItem.splrName" reference="companys" filter={{type: 'supplier'}}> - <AutocompleteInput optionText="name" label="table.field.asnOrderItem.splrName" /> + <ReferenceInput source="splrName" label="table.field.outStockItem.splrName" reference="companys" filter={{type: 'supplier'}}> + <AutocompleteInput optionText="name" label="table.field.outStockItem.splrName" /> </ReferenceInput> </Stack> <Stack direction='row' gap={2}> <TextInput - label="table.field.asnOrderItem.qrcode" + label="table.field.outStockItem.qrcode" source="qrcode" parse={v => v} /> <TextInput - label="table.field.asnOrderItem.barcode" + label="table.field.outStockItem.barcode" source="trackCode" parse={v => v} readOnly /> <TextInput - label="table.field.asnOrderItem.packName" + label="table.field.outStockItem.packName" source="packName" parse={v => v} /> diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx index f20cf78..489b6d2 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx @@ -39,7 +39,6 @@ } from 'react-admin'; import { Box, Typography, Card, Stack } from '@mui/material'; import { styled } from '@mui/material/styles'; -import AsnOrderModal from "./AsnOrderModal"; import EmptyData from "../../components/EmptyData"; import MyCreateButton from "../../components/MyCreateButton"; import MyExportButton from '../../components/MyExportButton'; @@ -54,6 +53,9 @@ import DetailsIcon from '@mui/icons-material/Details'; import CancelIcon from '@mui/icons-material/Cancel'; import OutOrderCreate from "./OutOrderCreate"; +import AddIcon from '@mui/icons-material/Add'; +import OutOrderModal from "./OutOrderModal"; + const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { height: '.9em' @@ -136,6 +138,7 @@ actions={( <TopToolbar> <FilterButton /> + <CreateByOrderButton setCreateDialog={setCreateDialog}/> <MyCreateButton onClick={() => { setManualDialog(true) }} /> <SelectColumnsButton preferenceKey='outStock' /> <ImportButton value={'asnOrderItem'} /> @@ -175,17 +178,15 @@ <TextField source="memo" label="common.field.memo" sortable={false} /> <WrapperField cellClassName="opt" label="common.field.opt" > <EditButton label="toolbar.detail" icon={(<DetailsIcon />)}></EditButton> - <MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} /> + {/* <MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} /> */} <CancelButton></CancelButton> </WrapperField> </StyledDatagrid> </List> <OutOrderCreate open={manualDialog} setOpen={setManualDialog} /> - <AsnOrderModal + <OutOrderModal open={createDialog} setOpen={setCreateDialog} - asnId={modalType} - billReload={billReload} /> <PageDrawer title='AsnOrder Detail' @@ -205,7 +206,6 @@ const id = record.id; setmodalType(id); setCreateDialog(true); - }; return ( <Button @@ -219,14 +219,29 @@ ) } +const CreateByOrderButton = ({setCreateDialog}) => { + const record = useRecordContext(); + const notify = useNotify(); + const refresh = useRefresh(); + + const createByOrder = async (event) => { + event.stopPropagation(); + setCreateDialog(true); + } + + return ( + <Button onClick={createByOrder} label={'toolbar.asnCreate'}> <AddIcon /> </Button> + ) + +} + const CancelButton = () => { const record = useRecordContext(); const notify = useNotify(); const refresh = useRefresh(); console.log(record); - + const cancelOrder = async () => { - console.log(event); const { data: { code, data, msg } } = await request.get(`/outStock/cancel/${record?.id}`); if (code === 200) { notify(msg); diff --git a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx new file mode 100644 index 0000000..d793c99 --- /dev/null +++ b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx @@ -0,0 +1,167 @@ +import { Dialog, DialogActions, DialogContent, DialogTitle, Box } from "@mui/material"; +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + Button, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + Toolbar, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, +} from 'react-admin'; +import DialogCloseButton from "../../components/DialogCloseButton"; +import { styled } from '@mui/material/styles'; +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: 220 + }, + '& .wkType': { + width: 110 + }, + '& .status': { + width: 90 + }, +})); +const filters = [ + <SearchInput source="condition" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" />, + <DateInput label='common.time.before' source="timeEnd" />, + <TextInput source="code" label="table.field.delivery.code" />, + <TextInput source="platId" label="table.field.delivery.platId" />, + <TextInput source="type" label="table.field.delivery.type" />, + <TextInput source="wkType" label="table.field.delivery.wkType" />, + <TextInput source="source" label="table.field.delivery.source" />, + <SelectInput + label="common.field.status" + source="status" + choices={[ + { id: '1', name: 'common.enums.statusTrue' }, + { id: '0', name: 'common.enums.statusFalse' }, + ]} + resettable + />, +] + +const OutOrderModal = (props) => { + const { open, setOpen, record } = props; + const translate = useTranslate(); + const [drawerVal, setDrawerVal] = useState(false); + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + return ( + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + aria-hidden + fullWidth + disableRestoreFocus + maxWidth="lg" + > + <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> + <List + resource="deliveryItem" + storeKey='selectDelivery' + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.delivery"} + empty={false} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <></> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='deliveryItem' + bulkActionButtons={() => <></>} + rowClick={(id, resource, record) => false} + expand={false} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo', 'workQty', 'startTime', 'endTime', 'updateBy', 'createTime']} + > + <NumberField source="id" /> + <TextField source="matnrCode" label="table.field.deliveryItem.matnrCode" /> + <TextField source="matnrName" label="table.field.deliveryItem.matnrName" /> + <TextField source="unit" label="table.field.deliveryItem.unit" /> + <NumberField source="anfme" label="table.field.deliveryItem.anfme" /> + <TextField source="splrName" label="table.field.deliveryItem.splrName" /> + <TextField source="splrBatch" label="table.field.deliveryItem.splrBatch" /> + <TextField source="updateBy$" label="common.field.updateBy" /> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <TextField source="createBy$" label="common.field.createBy" /> + <DateField source="createTime" label="common.field.createTime" showTime /> + <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + </StyledDatagrid> + </List> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + {/* <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <Button disabled={disabled} onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}> + {translate('toolbar.confirm')} + </Button> + </Toolbar> */} + </DialogActions> + </Dialog> + ) +} + +export default OutOrderModal; diff --git a/rsf-admin/src/page/orders/outStock/PrintModal.jsx b/rsf-admin/src/page/orders/outStock/PrintModal.jsx deleted file mode 100644 index 2ad47fd..0000000 --- a/rsf-admin/src/page/orders/outStock/PrintModal.jsx +++ /dev/null @@ -1,310 +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, - useListContext, - useRefresh, -} from 'react-admin'; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Grid, - TextField, - Box, - Button, - Radio, - RadioGroup, - FormControlLabel, - FormControl, - FormLabel, - TableRow, - TableCell, - Tooltip, - IconButton, - styled - - -} from '@mui/material'; -import DialogCloseButton from "@/page/components/DialogCloseButton"; -import DictionarySelect from "@/page/components/DictionarySelect"; -import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; -import SaveIcon from '@mui/icons-material/Save'; -import request from '@/utils/request'; -import { Add, Edit, Delete } from '@mui/icons-material'; -import _ from 'lodash'; -import { DataGrid } from '@mui/x-data-grid'; -import StatusSelectInput from "@/page/components/StatusSelectInput"; - -import { useReactToPrint } from "react-to-print"; -import jsbarcode from 'jsbarcode' -import { el } from "date-fns/locale"; - -const PrintModal = ({ open, setOpen, rows }) => { - const refresh = useRefresh(); - const translate = useTranslate(); - const notify = useNotify(); - const contentRef = useRef(null); - const reactToPrintFn = useReactToPrint({ contentRef }); - - const handleClose = (event, reason) => { - if (reason !== "backdropClick") { - setOpen(false); - } - }; - - const [value, setValue] = useState('temp1'); - - const handleChange = (event) => { - setValue(event.target.value); - }; - - const handlePrint = () => { - // handleClose() - reactToPrintFn() - }; - - return ( - <Dialog open={open} maxWidth="sm" fullWidth> - <DialogCloseButton onClose={handleClose} /> - <DialogTitle>{translate('toolbar.print')}</DialogTitle> - <DialogContent > - <FormControl > - <RadioGroup - row - aria-labelledby="demo-controlled-radio-buttons-group" - name="controlled-radio-buttons-group" - value={value} - onChange={handleChange} - size="small" - sx={{ justifyContent: 'center' }} - > - <FormControlLabel value="temp1" control={<Radio />} label="妯℃澘1" size="small" /> - </RadioGroup> - </FormControl> - - <Box> - <div style={{ textAlign: 'center', display: 'flex', justifyContent: 'center' }}> - <table - className="contain" - style={{ - overflow: 'hidden', - fontSize: 'small', - tableLayout: 'fixed', - width: '280px', - borderCollapse: 'collapse', // 鍚堝苟杈规 - border: '1px solid black' // 璁剧疆琛ㄦ牸鏁翠綋杈规 - }} - > - <tbody> - <tr style={{ height: '74px' }}> - <td - align="center" - colSpan={3} - style={{ border: '1px solid black' }} // 璁剧疆鍗曞厓鏍艰竟妗� - > - 鍟嗗搧缂栫爜 - </td> - <td - align="center" - className="barcode" - colSpan={9} - style={{ border: '1px solid black' }} - > - <img className="template-code" src={'/img/barcode.jpeg'} style={{ width: '90%' }} alt="Barcode" /> - <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}> - <span>{'xxxxxx'}</span> - </div> - </td> - </tr> - <tr style={{ height: '74px' }}> - <td - align="center" - colSpan={3} - style={{ border: '1px solid black' }} - > - 鍟嗗搧 - </td> - <td - align="center" - colSpan={5} - style={{ - overflow: 'hidden', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - border: '1px solid black' - }} - > - {'xxxxxxxx'} - </td> - <td - align="center" - colSpan={2} - style={{ border: '1px solid black' }} - > - 澶囨敞 - </td> - <td - align="center" - colSpan={2} - style={{ border: '1px solid black' }} - > - {'xx'} - </td> - </tr> - </tbody> - </table> - </div> - <style>{` - @media print { - .print-content { - display: block!important; - } - }`} </style> - <div ref={contentRef} className="print-content" style={{ textAlign: 'center', display: 'none' }}> - <PrintTemp key={'bb'} rows={rows} /> - </div> - </Box> - </DialogContent> - <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> - <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}> - <Button onClick={handlePrint} variant="contained" startIcon={<SaveIcon />}> - {translate('toolbar.confirm')} - </Button> - </Box> - </DialogActions> - </Dialog > - ); -} - -export default PrintModal; - -const PrintTemp = ({ rows }) => { - const notify = useNotify(); - const [data, setData] = useState([]); - const http = async () => { - const res = await request.post(`/asnOrderItem/many/${rows?.join()}`); - if (res?.data?.code === 200) { - let val = res.data.data.map((el => { - return { - barcode: '/img/barcode.jpeg', - code: el.trackCode, - name: el.maktx, - memo: el.memo || '' - } - })) - setData(val) - setTimeout(() => { - val.forEach((el) => { - jsbarcode(`#barcode${el.code}`, el.code, { height: 30 }); - }); - }, 10); - - } else { - notify(res.data.msg); - } - } - - useEffect(() => { - if (rows?.length > 0) { - http(); - } - - }, [rows]); - - - return ( - <> - {data.map((item, index) => ( - <table - key={index} - className="contain" - style={{ - overflow: 'hidden', - fontSize: 'small', - tableLayout: 'fixed', - width: '520px', - borderCollapse: 'collapse', - borderSpacing: 0, - margin: '0 auto', - marginTop: '10px', - }} - > - <tbody> - <tr style={{ height: '74px' }}> - <td align="center" colSpan={3} style={{ border: '1px solid black' }} > - 鍟嗗搧缂栫爜 - </td> - <td - align="center" - className="barcode" - colSpan={9} - style={{ border: '1px solid black' }} - > - <img id={"barcode" + item.code} style={{ width: '70%', verticalAlign: 'middle' }} /> - {/* <img className="template-code" src={item.barcode} style={{ width: '90%', verticalAlign: 'middle' }} alt="Barcode" /> */} - {/* <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}> - <span>{item.code}</span> - </div> */} - </td> - </tr> - <tr style={{ height: '74px' }}> - <td - align="center" - colSpan={3} - style={{ border: '1px solid black' }} - > - 鍟嗗搧 - </td> - <td - align="center" - colSpan={5} - style={{ - overflow: 'hidden', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - border: '1px solid black' - }} - > - {item.name} - </td> - <td - align="center" - colSpan={2} - style={{ border: '1px solid black' }} - > - 澶囨敞 - </td> - <td - align="center" - colSpan={2} - style={{ border: '1px solid black' }} - > - {item.memo} - </td> - </tr> - </tbody> - </table> - ))} - - </> - ) -} - - diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java index 0df7a00..04abb82 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java @@ -10,6 +10,7 @@ import com.vincent.rsf.server.common.domain.KeyValVo; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.entity.Delivery; +import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.DeliveryService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.controller.BaseController; @@ -28,7 +29,6 @@ @Autowired private DeliveryService deliveryService; - @PreAuthorize("hasAuthority('manager:delivery:list')") @PostMapping("/delivery/page") @@ -81,6 +81,13 @@ public R update(@RequestBody Delivery delivery) { delivery.setUpdateBy(getLoginUserId()); delivery.setUpdateTime(new Date()); + if (Objects.isNull(delivery.getCode()) || StringUtils.isBlank(delivery.getCode())) { + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_DELIVERY_RULE_CODE, delivery); + if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) { + return R.error("缂栫爜瑙勫垯閿欒锛氱紪鐮併�孲YS_DELIVERY_RULE_CODE銆嶆槸鏈缃垚鍔燂紒锛�"); + } + delivery.setCode(ruleCode); + } if (!deliveryService.updateById(delivery)) { return R.error("Update Fail"); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java index d0ab07b..e4a9178 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java @@ -9,9 +9,12 @@ import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.KeyValVo; import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.manager.entity.Companys; import com.vincent.rsf.server.manager.entity.DeliveryItem; +import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.DeliveryItemService; import com.vincent.rsf.server.system.controller.BaseController; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -24,6 +27,10 @@ @Autowired private DeliveryItemService deliveryItemService; + + + @Autowired + private CompanysService companysService; @PreAuthorize("hasAuthority('manager:deliveryItem:list')") @PostMapping("/deliveryItem/page") @@ -59,6 +66,10 @@ deliveryItem.setCreateTime(new Date()); deliveryItem.setUpdateBy(getLoginUserId()); deliveryItem.setUpdateTime(new Date()); + if (StringUtils.isNotBlank(deliveryItem.getSplrName())) { + Companys companys = companysService.getById(deliveryItem.getSplrName()); + deliveryItem.setSplrName(companys.getName()).setSplrCode(companys.getCode()); + } if (!deliveryItemService.save(deliveryItem)) { return R.error("Save Fail"); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java index d6642a3..b442995 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java @@ -17,8 +17,6 @@ import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate; import com.vincent.rsf.server.manager.enums.AsnExceStatus; -import com.vincent.rsf.server.manager.service.AsnOrderItemService; -import com.vincent.rsf.server.manager.service.AsnOrderService; import com.vincent.rsf.server.manager.service.OutStockItemService; import com.vincent.rsf.server.manager.service.OutStockService; import com.vincent.rsf.server.system.constant.SerialRuleCode; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/DeliveryItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/DeliveryItem.java index 05b6fc6..d3148b5 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/DeliveryItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/DeliveryItem.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; import java.util.Date; + +import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -22,6 +24,7 @@ import java.util.Date; @Data +@Accessors(chain = true) @TableName("man_delivery_item") public class DeliveryItem implements Serializable { -- Gitblit v1.9.1