From 496c047fdb5b1637f5bd8ac92dcbeb5f8f6d27d4 Mon Sep 17 00:00:00 2001 From: verou <857149855@qq.com> Date: 星期一, 31 三月 2025 10:39:03 +0800 Subject: [PATCH] feat:质检单 --- rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx | 183 +++++++++++++++++++++--------------- rsf-admin/src/page/qlyInspect/QlyInspectList.jsx | 87 +++++++++++++++++ rsf-admin/src/i18n/zh.js | 3 rsf-admin/src/i18n/en.js | 3 rsf-admin/.env | 3 5 files changed, 201 insertions(+), 78 deletions(-) diff --git a/rsf-admin/.env b/rsf-admin/.env new file mode 100644 index 0000000..a8ce658 --- /dev/null +++ b/rsf-admin/.env @@ -0,0 +1,3 @@ +VITE_BASE_IP=192.168.4.24 +# VITE_BASE_IP=47.76.147.249 +VITE_BASE_PORT=8080 diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index dd973ab..7e0e0da 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -756,6 +756,9 @@ batchWarehouseAreas: "batchWarehouseAreas", batchLocType: "batchLocType", batchPrint: "batch print", + quality: "quality", + complete: "complete", + close: "close", }, }; diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index b33bf85..52ad769 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -769,6 +769,9 @@ batchWarehouseAreas: "鎵归噺搴撳尯", batchLocType: "鎵归噺搴撲綅绫诲瀷", batchPrint: "鎵归噺鎵撳嵃", + quality: "璐ㄦ", + complete: "瀹屾垚", + close: "鍏抽棴", }, }; diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx index 7da510e..3bc69b4 100644 --- a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx +++ b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx @@ -31,6 +31,8 @@ ReferenceArrayInput, AutocompleteInput, DeleteButton, + Button, + useRefresh, } from 'react-admin'; import { Box, Typography, Card, Stack } from '@mui/material'; import { styled } from '@mui/material/styles'; @@ -43,6 +45,10 @@ import MyField from "../components/MyField"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import * as Common from '@/utils/common'; +import ConstructionIcon from "@mui/icons-material/Construction"; +import CloseIcon from "@mui/icons-material/Close"; +import TaskIcon from '@mui/icons-material/Task'; +import request from '@/utils/request'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -113,7 +119,7 @@ > <StyledDatagrid preferenceKey='qlyInspect' - bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + bulkActionButtons={<BulkDeleteButton mutationMode={OPERATE_MODE} />} rowClick={(id, resource, record) => false} expand={() => <QlyInspectPanel />} expandSingle={true} @@ -139,7 +145,10 @@ <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} /> */} + <InspectionButton /> + <CompleteButton /> + <CloseButton /> </WrapperField> </StyledDatagrid> </List> @@ -158,3 +167,77 @@ } export default QlyInspectList; + +const InspectionButton = () => { + const record = useRecordContext(); + const notify = useNotify(); + const refresh = useRefresh(); + const inspection = () => { + // requestInspect([record]) + }; + + // const requestInspect = async (rows) => { + // const { data: { code, data, msg } } = await request.post(`/asnOrder/inspect`, rows); + + // if (code === 200) { + // notify(msg); + // refresh() + // } else { + // notify(msg); + // } + // } + + + return ( + <Button onClick={inspection} label={"toolbar.quality"}> + <ConstructionIcon /> + </Button> + ) +} + +const CompleteButton = () => { + const record = useRecordContext(); + const notify = useNotify(); + const refresh = useRefresh(); + const requestComplete = async () => { + const { data: { code, data, msg } } = await request.post(`/qlyInspect/update`, { ...record, code: '222222' }); + + if (code === 200) { + notify(msg); + refresh() + } else { + notify(msg); + } + } + + + return ( + <Button onClick={requestComplete} label={"toolbar.complete"}> + <TaskIcon /> + </Button> + ) +} + +const CloseButton = () => { + const record = useRecordContext(); + const notify = useNotify(); + const refresh = useRefresh(); + + const requestClose = async () => { + const { data: { code, data, msg } } = await request.post(`/qlyInspect/update`, { ...record, code: '222222' }); + + if (code === 200) { + notify(msg); + refresh() + } else { + notify(msg); + } + } + + + return ( + <Button onClick={requestClose} label={"toolbar.close"}> + <CloseIcon /> + </Button> + ) +} diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx index 6d78dcc..8f56bfa 100644 --- a/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx +++ b/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx @@ -1,92 +1,123 @@ import React, { useState, useRef, useEffect, useMemo } from "react"; -import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +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'; const QlyInspectPanel = () => { 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.qlyInspect.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}> </Box> - <Grid container spacing={2}> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.asnItemId" - property={record.asnItemId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.code" - property={record.code} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.wkType" - property={record.wkType} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.safeQty" - property={record.safeQty} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.dlyQty" - property={record.dlyQty} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.rcptQty" - property={record.rcptQty} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.qlyInspect.isptQty" - property={record.isptQty} - /> - </Grid> + const notify = useNotify(); + const [rows, setRows] = useState([]); + const [maktx, setMaktx] = useState(''); + const ispectId = record.id; - </Grid> - </CardContent> - </Card > - </> + useEffect(() => { + debouncedHttp({ maktx }); + }, [ispectId, maktx]); + + + const http = async (parmas) => { + const res = await request.post('/qlyIsptItem/page', { ...parmas, ispectId }); + if (res?.data?.code === 200) { + setRows(res.data.data.records) + } else { + notify(res.data.msg); + } + } + + const debouncedHttp = useMemo(() => debounce(http, 300), []); + + const columns = [ + { + field: 'ispectId', + headerName: translate('table.field.qlyIsptItem.ispectId') + }, + { + field: 'matnrCode', + headerName: translate('table.field.qlyIsptItem.matnrCode') + }, + { + field: 'maktx', + headerName: translate('table.field.qlyIsptItem.maktx') + }, + { + field: 'label', + headerName: translate('table.field.qlyIsptItem.label') + }, + { + field: 'splrName', + headerName: translate('table.field.qlyIsptItem.splrName') + }, + { + field: 'splrBatch', + headerName: translate('table.field.qlyIsptItem.splrBatch') + }, + { + field: 'stockBatch', + headerName: translate('table.field.qlyIsptItem.stockBatch') + }, + { + field: 'rcptQty', + headerName: translate('table.field.qlyIsptItem.rcptQty') + }, + { + field: 'dlyQty', + headerName: translate('table.field.qlyIsptItem.dlyQty') + }, + { + field: 'disQty', + headerName: translate('table.field.qlyIsptItem.disQty') + }, + { + field: 'safeQty', + headerName: translate('table.field.qlyIsptItem.safeQty') + }, + { + field: 'picPath', + headerName: translate('table.field.qlyIsptItem.picPath') + } + ]; + + 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="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} /> + + <div style={{ display: 'flex', gap: '10px' }}> + </div> + </div> + + + <DataGrid + size="small" + rows={rows} + columns={columns} + disableRowSelectionOnClick + disableColumnMenu={true} + disableColumnSorting + disableMultipleColumnsSorting + /> + </Box > ); }; -- Gitblit v1.9.1