From 3e36f73770677e756826df1b5824c8e89769659c Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期三, 23 七月 2025 15:27:10 +0800
Subject: [PATCH] 盘点功能优化
---
rsf-admin/src/page/orders/check/SelectMatnrModal.jsx | 24 ++
rsf-admin/src/page/orders/check/CheckOrderPub.jsx | 192 -----------------------
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java | 2
rsf-admin/src/page/orders/check/CheckOrderModal.jsx | 2
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java | 10
rsf-admin/src/i18n/zh.js | 1
rsf-admin/src/i18n/en.js | 1
rsf-admin/src/page/orders/check/CheckPreviewTable.jsx | 204 +++++++++++++++++++++++++
rsf-admin/src/page/orders/check/CheckOrderList.jsx | 15 +
9 files changed, 246 insertions(+), 205 deletions(-)
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 0bc7bb3..e81adc6 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -1207,6 +1207,7 @@
check: 'Check',
confirm: 'confirm',
cancel: "cancel",
+ delete: 'Delete',
query: "Query",
bulkExport: "Bulk Export",
continue: 'Continue Receipt',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 6137fab..8aaa64e 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -1221,6 +1221,7 @@
selectSite: '閫夋嫨绔欑偣',
confirmSelect: '纭閫夋嫨',
cancel: "鍙栨秷",
+ delete: '鍒犻櫎',
query: "鏌ヨ",
top: "缃《",
resort: "鎺掑簭",
diff --git a/rsf-admin/src/page/orders/check/CheckOrderList.jsx b/rsf-admin/src/page/orders/check/CheckOrderList.jsx
index d6945e1..766d057 100644
--- a/rsf-admin/src/page/orders/check/CheckOrderList.jsx
+++ b/rsf-admin/src/page/orders/check/CheckOrderList.jsx
@@ -24,7 +24,7 @@
ReferenceInput,
AutocompleteInput,
Button,
- BulkDeleteButton,
+ BulkDeleteButton,
useRedirect,
} from 'react-admin';
import { styled } from '@mui/material/styles';
@@ -73,7 +73,7 @@
<AutocompleteInput label="table.field.checkOrder.type" optionValue="value" />
</ReferenceInput>,
<ReferenceInput source="wkType" reference="dictData" filter={{ dictTypeCode: 'sys_check_order_type' }} label="table.field.checkOrder.checkType" alwaysOn>
- <AutocompleteInput label="table.field.checkOrder.checkType" optionValue="value"/>
+ <AutocompleteInput label="table.field.checkOrder.checkType" optionValue="value" />
</ReferenceInput>,
<TextInput source="logisNo" label="table.field.checkOrder.logisNo" />,
<DateInput source="arrTime" label="table.field.checkOrder.arrTime" />,
@@ -141,15 +141,16 @@
>
<StyledDatagrid
preferenceKey='check'
- bulkActionButtons={() => <BulkDeleteButton mutationMode="pessimistic"/>}
+ bulkActionButtons={() => <BulkDeleteButton mutationMode="pessimistic" />}
rowClick={false}
expandSingle={true}
omit={['id', 'createTime', 'createBy', 'memo', 'rleStatus$']}
>
<NumberField source="id" />
<TextField source="code" label="table.field.checkOrder.code" />
- <TextField source="type$" label="table.field.checkOrder.type" />
- <TextField cellClassName="wkType" source="checkType$" label="table.field.checkOrder.checkType" />
+ {/* <TextField source="type$" label="table.field.checkOrder.type" /> */}
+ <TextField cellClassName="wkType" source="wkType$" label="table.field.checkOrder.type" />
+ <TextField source="checkType$" label="table.field.checkOrder.checkType" />
<NumberField source="anfme" label="table.field.checkOrder.anfme" />
<NumberField source="workQty" label="table.field.checkOrder.workQty" />
<NumberField source="qty" label="table.field.checkOrder.qty" />
@@ -181,8 +182,8 @@
drawerVal={drawerVal}
setDrawerVal={setDrawerVal}
>
- <CheckOrderPub record={select} open={drawerVal} setOpen={setDrawerVal} />
- </PageEditDrawer>
+ <CheckOrderPub record={select} open={drawerVal} setOpen={setDrawerVal} />
+ </PageEditDrawer>
</Box >
)
}
diff --git a/rsf-admin/src/page/orders/check/CheckOrderModal.jsx b/rsf-admin/src/page/orders/check/CheckOrderModal.jsx
index 2136fbb..98089a6 100644
--- a/rsf-admin/src/page/orders/check/CheckOrderModal.jsx
+++ b/rsf-admin/src/page/orders/check/CheckOrderModal.jsx
@@ -1,4 +1,4 @@
-import { Dialog, DialogActions, DialogContent, DialogTitle, Box, LinearProgress } from "@mui/material";
+import { Dialog, DialogActions, DialogContent, DialogTitle, Box, TextField ,LinearProgress } from "@mui/material";
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
List,
diff --git a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx
index 1a0c75a..1947840 100644
--- a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx
+++ b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx
@@ -15,6 +15,7 @@
Form,
useRefresh,
useRedirect,
+ TextInput,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting';
import { styled } from '@mui/material/styles';
@@ -25,7 +26,7 @@
import ConfirmButton from '../../components/ConfirmButton';
import { Delete, Edit, Add } from '@mui/icons-material';
import CheckOrderSiteDialog from "./CheckOrderSiteDialog";
-import { map } from "lodash";
+import CheckPreviewTable from "./CheckPreviewTable";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
@@ -37,12 +38,7 @@
'& .column-maktx': {
width: 200
},
-
mt: '60px'
- // '& .RaBulkActionsToolbar-toolbar': {
- // display: 'none'
- // }
-
}));
const CheckOrderPub = (props) => {
@@ -73,8 +69,6 @@
const getLocs = async (ids) => {
const { data: { code, data, msg } } = await request.post('/check/locs/' + ids);
if (code === 200) {
- console.log('----->');
- console.log(data);
setRows(data)
const matnrs = selectedMatnr.filter(item => data.some(bigData => bigData.matnrCode === item));
// setSelectedMatnr(matnrs)
@@ -213,7 +207,7 @@
<Grid item xl={6.3} gap={2}>
<Card sx={{ minHeight: 1050, height: 'calc(100% - 10px)', width: '100%' }}>
<Box>
- <PreviewTable
+ <CheckPreviewTable
rows={rows}
gridRef={gridRef}
setRows={setRows}
@@ -242,186 +236,6 @@
</>
);
}
-
-const PreviewTable = ({ rows, gridRef, setRows, record, selectedIds, setSelectedIds, setDialog, formData }) => {
- gridRef.current = useGridApiRef();
- const translate = useTranslate();
-
- useEffect(() => {
- if (selectedIds.length > 0) {
- console.log(selectedIds);
- }
- }, [selectedIds])
-
- const baseColumns = [
- { field: 'locCode', headerName: '搴撲綅', width: 110 },
- { field: 'barcode', headerName: '瀹瑰櫒', width: 120 },
- { field: 'matnrCode', headerName: '鐗╂枡缂栫爜', width: 120 },
- { field: 'batch', headerName: '鎵规', width: 90 },
- { field: 'unit', headerName: '鍗曚綅', width: 60 },
- {
- field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110,
- renderCell: (params) => (
- <OutStockAnfme value={params.value} />
- )
- },
- {
- field: 'siteNo',
- headerName: '鍑哄簱鍙�',
- width: 90,
- type: 'singleSelect',
- editable: true,
- renderCell: (params) => (
- <OutStockSiteNo value={params.value} />
- ),
- renderEditCell: (params) => (
- <OutStockSite {...params} />
- ),
- },
- ]
-
- const optAction = {
- field: 'actions',
- type: 'actions',
- headerName: translate('common.field.opt'),
- with: 120,
- getActions: (params) => [
- <GridActionsCellItem
- icon={<Delete />}
- label="Delete"
- onClick={() => handleDelete(params.row, rows, setRows)}
- />,
- ]
- }
-
- const columns = (formData.waveId == 15 || formData.waveId == 16) ? [...baseColumns] : [...baseColumns, optAction];
-
- /**
- * 鍒犻櫎浜嬩欢
- * @param {*} params
- */
- const handleDelete = (params, rows, setRows) => {
- const outRows = rows.filter(row => {
- return row.id !== params.id
- })
- setRows(outRows)
- }
-
- const OutStockAnfme = React.memo(function OutStockAnfme(props) {
- const { value } = props;
- return (
- value > 0 ?
- <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
- <span>{value}</span>
- </Box>
- :
- <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
- <span style={{ color: 'red' }}>{translate('common.edit.title.insuffInventory')}</span>
- </Box>
- );
- });
-
- const OutStockSiteNo = React.memo(function OutStockSiteNo(props) {
- const { value } = props;
- if (!value) {
- return null;
- }
- return (
- <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
- <span>{value}</span>
- </Box>
- );
- });
-
- const CustomToolBar = () => {
- const selectSiteNo = () => {
- setDialog(true)
- }
- return (
- <Box sx={{
- p: 1,
- display: 'flex',
- justifyContent: 'flex-end',
- borderTop: '1px solid rgba(224, 224, 224, 1)'
- }}>
- <Button
- onClick={selectSiteNo}
- variant="outlined"
- label="toolbar.modiftySite"
- size="medium"
- sx={{ mr: 1 }} />
- </Box>
- );
- }
-
- const OutStockSite = (params) => {
- const { id, field, siteNo, row: { staNos } } = params;
- const apiRef = useGridApiContext();
- const handleChange = async (event) => {
- await apiRef.current.setEditCellValue(
- { id, field, value: event.target.value },
- event,
- );
- apiRef.current.stopCellEditMode({ id, field });
- };
-
- const handleClose = (event, reason) => {
- if (reason === 'backdropClick') {
- apiRef.current.stopCellEditMode({ id, field });
- }
- };
-
- return (
- <Select
- value={siteNo}
- onChange={handleChange}
- MenuProps={{
- onClose: handleClose,
- }}
- sx={{
- height: '100%',
- '& .MuiSelect-select': {
- display: 'flex',
- alignItems: 'center',
- pl: 1,
- },
- }}
- autoFocus
- fullWidth
- open
- >
- {staNos.map((option) => {
- return (
- <MenuItem
- key={option}
- value={option.staNo}
- >
- <ListItemText sx={{ overflow: 'hidden' }} primary={option.staNo} />
- </MenuItem>
- );
- })}
- </Select >
- )
- }
-
- return (
- <DataGrid
- storeKey={"locItemPreview"}
- rows={rows}
- columns={columns}
- slots={{ toolbar: CustomToolBar }}
- apiRef={gridRef}
- checkboxSelection
- disableRowSelectionOnClick
- hideFooterPagination={true} // 闅愯棌鍒嗛〉鎺т欢
- hideFooter={false}
- onRowSelectionModelChange={(ids) => {
- setSelectedIds(ids)
- }}
- />
- )
-}
-
//鎻愪氦鎸夐挳
const SubmitButton = ({ selectedIds, setSelectedIds, rowSelectedIds, gridRef, record, setOpen, selectedMatnr }) => {
diff --git a/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx b/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx
new file mode 100644
index 0000000..3fee942
--- /dev/null
+++ b/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx
@@ -0,0 +1,204 @@
+
+import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText } from "@mui/material";
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid';
+import {
+ List,
+ Button,
+ useTranslate,
+ useNotify,
+ useListContext,
+ NumberField,
+ ReferenceInput,
+ AutocompleteInput,
+ required,
+ Form,
+ useRefresh,
+ useRedirect,
+ TextInput,
+} from 'react-admin';
+
+const CheckPreviewTable = (props) => {
+ const { rows, gridRef, setRows, record, selectedIds, setSelectedIds, setDialog, formData } = props;
+ // const translate = useTranslate();
+ // const refresh = useRefresh();
+ // const notify = useNotify();
+ gridRef.current = useGridApiRef();
+ const translate = useTranslate();
+
+ useEffect(() => {
+ if (selectedIds.length > 0) {
+ console.log(selectedIds);
+ }
+ }, [selectedIds])
+
+ const baseColumns = [
+ { field: 'locCode', headerName: '搴撲綅', width: 110 },
+ { field: 'barcode', headerName: '瀹瑰櫒', width: 120 },
+ { field: 'matnrCode', headerName: '鐗╂枡缂栫爜', width: 120 },
+ { field: 'batch', headerName: '鎵规', width: 90 },
+ { field: 'unit', headerName: '鍗曚綅', width: 60 },
+ {
+ field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110,
+ renderCell: (params) => (
+ <OutStockAnfme value={params.value} />
+ )
+ },
+ {
+ field: 'siteNo',
+ headerName: '鍑哄簱鍙�',
+ width: 90,
+ type: 'singleSelect',
+ editable: true,
+ renderCell: (params) => (
+ <OutStockSiteNo value={params.value} />
+ ),
+ renderEditCell: (params) => (
+ <OutStockSite {...params} />
+ ),
+ },
+ ]
+
+ const optAction = {
+ field: 'actions',
+ type: 'actions',
+ headerName: translate('common.field.opt'),
+ with: 120,
+ getActions: (params) => [
+ <GridActionsCellItem
+ icon={<Delete />}
+ label="Delete"
+ onClick={() => handleDelete(params.row, rows, setRows)}
+ />,
+ ]
+ }
+
+ const columns = (formData.waveId == 15 || formData.waveId == 16) ? [...baseColumns] : [...baseColumns, optAction];
+
+ /**
+ * 鍒犻櫎浜嬩欢
+ * @param {*} params
+ */
+ const handleDelete = (params, rows, setRows) => {
+ const outRows = rows.filter(row => {
+ return row.id !== params.id
+ })
+ setRows(outRows)
+ }
+
+ const OutStockAnfme = React.memo(function OutStockAnfme(props) {
+ const { value } = props;
+ return (
+ value > 0 ?
+ <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
+ <span>{value}</span>
+ </Box>
+ :
+ <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
+ <span style={{ color: 'red' }}>{translate('common.edit.title.insuffInventory')}</span>
+ </Box>
+ );
+ });
+
+ const OutStockSiteNo = React.memo(function OutStockSiteNo(props) {
+ const { value } = props;
+ if (!value) {
+ return null;
+ }
+ return (
+ <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
+ <span>{value}</span>
+ </Box>
+ );
+ });
+
+ const CustomToolBar = () => {
+ const selectSiteNo = () => {
+ setDialog(true)
+ }
+ return (
+ <Box sx={{
+ p: 1,
+ display: 'flex',
+ justifyContent: 'flex-end',
+ borderTop: '1px solid rgba(224, 224, 224, 1)'
+ }}>
+ <Button
+ onClick={selectSiteNo}
+ variant="outlined"
+ label="toolbar.modiftySite"
+ size="medium"
+ sx={{ mr: 1 }} />
+ </Box>
+ );
+ }
+
+ const OutStockSite = (params) => {
+ const { id, field, siteNo, row: { staNos } } = params;
+ const apiRef = useGridApiContext();
+ const handleChange = async (event) => {
+ await apiRef.current.setEditCellValue(
+ { id, field, value: event.target.value },
+ event,
+ );
+ apiRef.current.stopCellEditMode({ id, field });
+ };
+
+ const handleClose = (event, reason) => {
+ if (reason === 'backdropClick') {
+ apiRef.current.stopCellEditMode({ id, field });
+ }
+ };
+
+ return (
+ <Select
+ value={siteNo}
+ onChange={handleChange}
+ MenuProps={{
+ onClose: handleClose,
+ }}
+ sx={{
+ height: '100%',
+ '& .MuiSelect-select': {
+ display: 'flex',
+ alignItems: 'center',
+ pl: 1,
+ },
+ }}
+ autoFocus
+ fullWidth
+ open
+ >
+ {staNos.map((option) => {
+ return (
+ <MenuItem
+ key={option}
+ value={option.staNo}
+ >
+ <ListItemText sx={{ overflow: 'hidden' }} primary={option.staNo} />
+ </MenuItem>
+ );
+ })}
+ </Select >
+ )
+ }
+
+ return (
+ <DataGrid
+ storeKey={"locItemPreview"}
+ rows={rows}
+ columns={columns}
+ slots={{ toolbar: CustomToolBar }}
+ apiRef={gridRef}
+ checkboxSelection
+ disableRowSelectionOnClick
+ hideFooterPagination={true} // 闅愯棌鍒嗛〉鎺т欢
+ hideFooter={false}
+ onRowSelectionModelChange={(ids) => {
+ setSelectedIds(ids)
+ }}
+ />
+ )
+}
+
+export default CheckPreviewTable;
diff --git a/rsf-admin/src/page/orders/check/SelectMatnrModal.jsx b/rsf-admin/src/page/orders/check/SelectMatnrModal.jsx
index fae5476..b91f92f 100644
--- a/rsf-admin/src/page/orders/check/SelectMatnrModal.jsx
+++ b/rsf-admin/src/page/orders/check/SelectMatnrModal.jsx
@@ -83,7 +83,8 @@
const [formData, setFormData] = useState({
type: '',
- wkType: '',
+ wkType: '7',
+ checkType: '0',
poCode: '',
logisNo: '',
arrTime: ''
@@ -101,7 +102,8 @@
const resetData = () => {
setFormData({
type: '',
- wkType: '',
+ wkType: '7',
+ checkType: '0',
poCode: '',
logisNo: '',
arrTime: ''
@@ -217,11 +219,21 @@
<Grid container spacing={2}>
<Grid item md={2}>
<DictSelect
- label={translate("table.field.checkOrder.checkType")}
+ label={translate("table.field.checkOrder.type")}
value={formData.wkType}
variant="filled"
onChange={(e) => handleChange(e.target.value, 'wkType')}
dictTypeCode="sys_check_order_type"
+ required
+ />
+ </Grid>
+ <Grid item md={2}>
+ <DictSelect
+ label={translate("table.field.checkOrder.checkType")}
+ value={formData.checkType}
+ variant="filled"
+ onChange={(e) => handleChange(e.target.value, 'checkType')}
+ dictTypeCode="sys_check_type"
required
/>
</Grid>
@@ -240,8 +252,10 @@
</Box>
<Box sx={{ mt: 2 }}>
<Stack direction="row" spacing={2}>
- <Button variant="contained" onClick={() => setCreateDialog(true)}>鏂板鐗╂枡</Button>
- <ConfirmButton label={'鍒犻櫎'} variant="outlined" color="error" onConfirm={handleDeleteItem} />
+ <Button variant="contained" onClick={() => setCreateDialog(true)} >
+ {translate('common.action.newAddMats')}
+ </Button>
+ <ConfirmButton label={"toolbar.delete"} variant="outlined" color="error" onConfirm={handleDeleteItem} />
</Stack>
</Box>
<Box sx={{ mt: 2 }}>
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java
index 3da396a..6474f6e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java
@@ -231,11 +231,15 @@
}
public String getWkType$(){
+ String typeCode = DictTypeCode.DICT_SYS_BUSINESS_TYPE;
+ if (type.equals(OrderType.ORDER_CHECK.type)) {
+ typeCode = DictTypeCode.SYS_CHECK_ORDER_TYPE;
+ }
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));
+ DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, typeCode).eq(DictData::getValue, this.wkType));
if (Objects.isNull(dictData)) {
return null;
}
@@ -243,11 +247,11 @@
}
public String getCheckType$(){
- if (Cools.isEmpty(this.wkType)){
+ if (Cools.isEmpty(this.checkType)){
return "";
}
DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
- DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.SYS_CHECK_ORDER_TYPE).eq(DictData::getValue, this.wkType));
+ DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.SYS_CHECK_TYPE).eq(DictData::getValue, this.checkType));
if (Objects.isNull(dictData)) {
return null;
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java
index 4e51070..92ccf21 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java
@@ -89,4 +89,6 @@
public final static String SYS_CHECK_DIFF_EXCE_STATUS = "sys_check_diff_exce_status";
public final static String SYS_CHECK_DIFF_REASON = "sys_check_diff_reason";
+
+ public final static String SYS_CHECK_TYPE = "sys_check_type";
}
--
Gitblit v1.9.1