From e0a98773c39183b3b07a6d290f7a636647fb56d5 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期一, 19 五月 2025 15:27:10 +0800
Subject: [PATCH] 语言国际化兼容性修改
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java | 7 +
rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx | 126 ++++++++++++++++++------
rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx | 63 ++++++++---
rsf-admin/src/i18n/zh.js | 3
rsf-admin/src/i18n/en.js | 30 ++++++
rsf-admin/src/App.jsx | 40 ++++---
rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx | 9 +
7 files changed, 203 insertions(+), 75 deletions(-)
diff --git a/rsf-admin/src/App.jsx b/rsf-admin/src/App.jsx
index 86babcc..d08adab 100644
--- a/rsf-admin/src/App.jsx
+++ b/rsf-admin/src/App.jsx
@@ -31,7 +31,19 @@
import { getSystemInfo, getSystemDicts, tenants } from "@/api/auth";
import chineseMessages from 'ra-language-chinese';
import { createTheme, ThemeProvider } from '@mui/material/styles';
-import { zhCN } from '@mui/material/locale';
+import { zhCN, frFR, enUS } from '@mui/material/locale';
+
+
+const getMaterialUILocale = (locale) => {
+ switch (locale) {
+ case 'en':
+ return enUS;
+ case 'fr':
+ return frFR;
+ default:
+ return zhCN;
+ }
+};
const i18nProvider = polyglotI18nProvider(
(locale) => {
@@ -49,7 +61,7 @@
{ locale: "ru", name: "Russian" },
{ locale: "lk", name: "袪褍褋褋泻懈泄" },
{ locale: "es", name: "Espa帽ola" },
-
+
],
{
// msg in console
@@ -58,21 +70,17 @@
);
-const theme = createTheme(
- {
- palette: { main: '#1976d2' },
- },
- zhCN
-)
-
-
const store = localStorageStore(SPA_VERSION, SPA_NAME);
const App = () => {
const [themeName] = useStore("themeName", DEFAULT_THEME_NAME);
const lightTheme = themes.find((theme) => theme.name === themeName)?.light;
const darkTheme = themes.find((theme) => theme.name === themeName)?.dark;
-
+ const [locale, setLocale] = useState('zh');
+ const theme = createTheme(
+ {
+ ...lightTheme
+ }, getMaterialUILocale(locale))
useEffect(() => {
getSystemInfo().then((data) => {
localStorage.setItem("system", JSON.stringify(data));
@@ -89,6 +97,7 @@
lightTheme={lightTheme}
darkTheme={darkTheme}
defaultTheme={DEFAULT_THEME_MODE}
+ theme={theme}
i18nProvider={i18nProvider}
dataProvider={DataProvider(DATA_PROVIDER_SPRING)}
loginPage={Login}
@@ -118,12 +127,9 @@
};
const AppWrapper = () => (
- <ThemeProvider theme={theme}>
- <StoreContextProvider value={store}>
- <App />
- </StoreContextProvider>
- </ThemeProvider>
-
+ <StoreContextProvider value={store}>
+ <App />
+ </StoreContextProvider>
);
export default AppWrapper;
\ No newline at end of file
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index b80aa4b..5c0819b 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -873,6 +873,36 @@
spec: "spec",
model: "model",
},
+ stock: {
+ code: "Code",
+ sourceCode: "Resource",
+ sourceId: "Resource ID",
+ type: "Order Type",
+ wkType: "Work Type",
+ anfme: "Qty",
+ },
+ stockItem: {
+ orderId: "Order ID",
+ orderCode: "Order Code",
+ sourceItemId: "Resource Item ID",
+ matnrId: "Mat ID",
+ matnrCode: "Mat Code",
+ maktx: "Maktx",
+ anfme: "Anfme",
+ stockUnit: "Unit",
+ workQty: "Work Qty",
+ purQty: "Purchase Qty",
+ purUnit: "Purchase Unit",
+ qty: "Qty",
+ splrCode: "Supplier Code",
+ batch: "Batch",
+ splrBatch: "Supplier Batch",
+ splrName: "Supplier Name",
+ trackCode: "Track Code",
+ barcode: "Bar Code",
+ prodTime: "Prod Time",
+ packName: "Pakcage",
+ },
taskItemLog: {
taskItemId: "taskItemId",
taskId: "taskId",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index f3bd509..167a92a 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -929,7 +929,7 @@
},
stockItem: {
orderId: "涓诲崟ID",
- orderCode: "鍗曟嵁缂栫爜",
+ orderCode: "鍗曞彿",
sourceItemId: "婧愭槑缁咺D",
matnrId: "鐗╂枡ID",
matnrCode: "鐗╂枡缂栫爜",
@@ -986,6 +986,7 @@
workQty: '鎵ц鏁�',
qty: '涓嶅彲鐢ㄥ簱瀛�',
splrId: '渚涘簲鍟�',
+ warehouse: '浠撳簱',
batch: "鎵规",
splrBatch: "鎵规",
spec: "瑙勬牸",
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx
index 4cc915a..eab020b 100644
--- a/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx
@@ -1,4 +1,4 @@
-import { Dialog, DialogActions, DialogContent, DialogTitle, Box } from "@mui/material";
+import { Dialog, DialogActions, DialogContent, DialogTitle, Box, LinearProgress } from "@mui/material";
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
List,
@@ -156,39 +156,7 @@
)}
perPage={DEFAULT_ITEM_PAGE_SIZE}
>
- <StyledDatagrid
- preferenceKey='stockHistories'
- bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
- rowClick={(id, resource, record) => false}
- expand={false}
- expandSingle={true}
- omit={['id', 'createTime', 'orderId', 'sourceItemId', 'matnrId', 'createBy', 'barcode', 'splrCode', 'splrBatch', 'updateBy$', 'createBy$', 'memo']}
- >
- <NumberField source="id" />
- <NumberField source="orderId" label="table.field.stockItem.orderId" />
- <TextField source="orderCode" label="table.field.stockItem.orderCode" />
- <TextField source="sourceItemId" label="table.field.stockItem.sourceItemId" />
- <TextField source="matnrId" label="table.field.stockItem.matnrId" />
- <TextField source="matnrCode" label="table.field.stockItem.matnrCode" />
- <TextField source="maktx" label="table.field.stockItem.maktx" />
- <NumberField source="anfme" label="table.field.stockItem.anfme" />
- <TextField source="stockUnit" label="table.field.stockItem.stockUnit" />
- <NumberField source="workQty" label="table.field.stockItem.workQty" />
- <NumberField source="qty" label="table.field.stockItem.qty" />
- <TextField source="splrCode" label="table.field.stockItem.splrCode" />
- <TextField source="batch" label="table.field.stockItem.batch" />
- <TextField source="splrBatch" label="table.field.stockItem.splrBatch" />
- <TextField source="splrName" label="table.field.stockItem.splrName" />
- <TextField source="trackCode" label="table.field.stockItem.trackCode" />
- <TextField source="barcode" label="table.field.stockItem.barcode" />
- <TextField source="prodTime" label="table.field.stockItem.prodTime" />
- <TextField source="packName" label="table.field.stockItem.packName" />
- <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 />
- <TextField source="memo" label="common.field.memo" sortable={false} />
- </StyledDatagrid>
+ <DynamicFields />
</List>
</Box>
</Grid>
@@ -215,3 +183,93 @@
<Button label={"toolbar.confirm"} variant="contained" color="primary" size="medium" startIcon={<SaveIcon />} onClick={confirmSelect} />
)
}
+
+
+const DynamicFields = (props) => {
+ const { setDrawerVal, setCreateDialog, setSelect, filters } = props
+ const translate = useTranslate();
+ const notify = useNotify();
+ const [columns, setColumns] = useState([]);
+ const { isLoading } = useListContext();
+ const refresh = useRefresh();
+ useEffect(() => {
+ getDynamicFields();
+ }, []);
+
+ const getDynamicFields = async () => {
+ const { data: { code, data, msg }, } = await request.get("/fields/enable/list");
+ if (code == 200) {
+ const arr = [
+ <NumberField source="id" />,
+ <NumberField source="orderId" label="table.field.stockItem.orderId" />,
+ <TextField source="orderCode" label="table.field.stockItem.orderCode" />,
+ <TextField source="sourceItemId" label="table.field.stockItem.sourceItemId" />,
+ <TextField source="matnrId" label="table.field.stockItem.matnrId" />,
+ <TextField source="matnrCode" label="table.field.stockItem.matnrCode" />,
+ <TextField source="maktx" label="table.field.stockItem.maktx" />,
+ <NumberField source="anfme" label="table.field.stockItem.anfme" />,
+ <TextField source="stockUnit" label="table.field.stockItem.stockUnit" />,
+ <NumberField source="workQty" label="table.field.stockItem.workQty" />,
+ <NumberField source="qty" label="table.field.stockItem.qty" />,
+ <TextField source="splrCode" label="table.field.stockItem.splrCode" />,
+ <TextField source="batch" label="table.field.stockItem.batch" />,
+ <TextField source="splrBatch" label="table.field.stockItem.splrBatch" />,
+ <TextField source="splrName" label="table.field.stockItem.splrName" />,
+ <TextField source="trackCode" label="table.field.stockItem.trackCode" />,
+ <TextField source="barcode" label="table.field.stockItem.barcode" />,
+ <TextField source="prodTime" label="table.field.stockItem.prodTime" />,
+ <TextField source="packName" label="table.field.stockItem.packName" />,
+ ]
+ const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
+ const lastArr = [
+ <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 />,
+ <TextField source="memo" label="common.field.memo" sortable={false} />,
+ ]
+ setColumns([...arr, ...fields, ...lastArr]);
+
+ data.map(el => {
+ var i = 0;
+ filters.map((item) => {
+ if (item.key === el.fields) {
+ i = 1;
+ }
+ })
+ i === 0 && filters.push(<TextInput key={el.fields} source={el.fields} label={el.fieldsAlise} />)
+ })
+ // setFilters([...filters, ...inputFields])
+
+ } else {
+ notify(msg);
+ }
+ }
+
+ return (
+ <Box sx={{ position: 'relative', minHeight: "60vh", }}>
+ {isLoading && (
+ <LinearProgress
+ sx={{
+ height: "2px",
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ }}
+ />
+ )}
+ {columns.length > 0 &&
+ <StyledDatagrid
+ preferenceKey='stockHistories'
+ bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+ rowClick={(id, resource, record) => false}
+ expand={false}
+ expandSingle={true}
+ omit={['id', 'createTime', 'orderId', 'sourceItemId', 'matnrId', 'createBy', 'barcode', 'splrCode', 'splrBatch', 'updateBy$', 'createBy$', 'memo']}
+ >
+ {columns.map((column) => column)}
+ </StyledDatagrid>}
+ </Box>
+ )
+}
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
index 703b950..cffae45 100644
--- a/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
@@ -64,16 +64,18 @@
const translate = useTranslate();
const notify = useNotify();
const refresh = useRefresh();
+ const [page, setPage] = useState(0);
+ const [pageSize, setPageSize] = useState(100);
+ const [totalRowCount, setTotalRowCount] = useState(0);
const [disabled, setDisabled] = useState(false)
+ const [loading, setLoading] = useState(false);
const [createDialog, setCreateDialog] = useState(false);
const tableRef = useRef();
useEffect(() => {
- if (open && record !== 0) {
- requestGetBody()
- }
- setDisabled(false)
- }, [open])
+ requestGetBody()
+ // setDisabled(false)
+ }, [open, page, pageSize])
const handleClose = (event, reason) => {
if (reason !== "backdropClick") {
@@ -119,12 +121,21 @@
};
const requestGetBody = async () => {
- const res = await request.post(`warehouse/stock/info`, { stock: record, aggType: record?.aggType });
- if (res?.data?.code === 200) {
- setTableData(res.data.data.records)
- } else {
- notify(res.data.msg);
+ setLoading(true);
+ try {
+ const res = await request.post(`warehouse/stock/info`, { page: page + 1, pageSize: pageSize, stock: record, aggType: record?.aggType });
+ if (res?.data?.code === 200) {
+ setTableData(res.data.data.records)
+ setTotalRowCount(res.data.data.total)
+ } else {
+ notify(res.data.msg);
+ }
+ } catch (error) {
+
+ } finally {
+ setLoading(false);
}
+
}
const [selectedRows, setSelectedRows] = useState([]);
@@ -154,9 +165,16 @@
<DialogContent sx={{ mt: 2 }}>
<Box></Box>
<Box sx={{ mt: 2 }}>
- <AsnOrderModalTable tabelData={tabelData}
+ <AsnOrderModalTable
+ tabelData={tabelData}
setTableData={setTableData}
record={record}
+ page={page}
+ pageSize={pageSize}
+ loading={loading}
+ setPage={setPage}
+ setPageSize={setPageSize}
+ totalRowCount={totalRowCount}
selectedRows={selectedRows}
setSelectedRows={setSelectedRows}
tableRef={tableRef} />
@@ -229,7 +247,7 @@
);
};
-const AsnOrderModalTable = ({ tabelData, setTableData, record, selectedRows, setSelectedRows, tableRef }) => {
+const AsnOrderModalTable = ({ tabelData, setTableData, record, selectedRows, setSelectedRows, tableRef, page, pageSize, totalRowCount, setPageSize, setPage, loading }) => {
const translate = useTranslate();
const notify = useNotify();
@@ -242,7 +260,7 @@
},
{
field: 'matnrCode',
- headerName: translate('table.field.asnOrderItem.matnrCode'),
+ headerName: translate('table.field.warehouseStock.matnrCode'),
width: 130,
editable: false,
},
@@ -264,7 +282,7 @@
},
{
field: 'batch',
- headerName: translate('table.field.warehouseStock.splrBatch'),
+ headerName: translate('table.field.warehouseStock.batch'),
minWidth: 100,
flex: 1,
editable: false,
@@ -352,16 +370,23 @@
return (
- <div style={{ height: 400, width: '100%' }}>
+ <div style={{ height: 500, width: '100%' }}>
<DataGrid
apiRef={tableRef}
rows={tabelData}
columns={columns}
disableRowSelectionOnClick
getRowId={(row) => row.id}
- disableColumnFilter
- disableColumnSelector
- disableColumnSorting
+ rowCount={totalRowCount}
+ paginationMode="server"
+ page={page}
+ pageSize={pageSize}
+ onPageChange={(newPage) => {
+ setPage(newPage)
+ }}
+ onPageSizeChange={(newPageSize) => {
+ setPageSize(newPageSize)
+ }}
disableMultipleColumnsSorting
processRowUpdate={processRowUpdate}
initialState={{
@@ -372,10 +397,10 @@
},
}}
pageSizeOptions={[10, 25, 50, 100]}
- editMode="row"
checkboxSelection
onRowSelectionModelChange={handleSelectionChange}
selectionModel={selectedRows}
+ loading={loading}
sx={{
'& .MuiDataGrid-cell input': {
border: '1px solid #ccc'
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx
index 3a463e3..dd6f42a 100644
--- a/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx
@@ -62,6 +62,8 @@
const WarehouseStockList = () => {
+ const dict = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_stock_summary_code')) || [];
+
const translate = useTranslate();
const [createDialog, setCreateDialog] = useState(false);
const [filters, setFilters] = useState([
@@ -69,9 +71,7 @@
<NumberInput source="locId" label="table.field.locItem.locId" />,
<TextInput source="locCode" label="table.field.locItem.locCode" />,
<TextInput source="type" label="table.field.locItem.type" />,
- <ReferenceInput source="aggType" reference="dictData" filter={{ dictTypeCode: 'sys_stock_summary_code' }} alwaysOn>
- <AutocompleteInput optionText='label' optionValue="value" label="table.field.locItem.aggType" />
- </ReferenceInput>,
+ <AutocompleteInput choices={dict} optionText='label' optionValue="value" source="aggType" label="table.field.locItem.aggType" />,
<NumberInput source="orderItemId" label="table.field.locItem.orderItemId" />,
<NumberInput source="wkType" label="table.field.locItem.wkType" />,
<NumberInput source="matnrId" label="table.field.locItem.matnrId" />,
@@ -98,6 +98,9 @@
duration: theme.transitions.duration.enteringScreen,
}),
marginRight: 0,
+ '& .RaAutocompleteInput-textField.MuiFormControl-root.MuiTextField-root': {
+ width: '200px'
+ }
}}
resource="warehouse/stock"
title={"common.button.detail"}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
index 58724db..983ac11 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
@@ -16,6 +16,7 @@
import com.vincent.rsf.server.manager.service.WarehouseStockService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
+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.PostMapping;
@@ -138,7 +139,11 @@
} else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_WAREHOUSE.val)) {
wrapper.eq(ViewStockManage::getWarehouse, stock.getWarehouse());
} else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_FIELDSINDEX.val)) {
- wrapper.eq(ViewStockManage::getFieldsIndex, stock.getFieldsIndex());
+ if (StringUtils.isBlank(stock.getFieldsIndex())) {
+ wrapper.isNull(ViewStockManage::getFieldsIndex);
+ } else {
+ wrapper.eq(ViewStockManage::getFieldsIndex, stock.getFieldsIndex());
+ }
} else {
wrapper.eq(ViewStockManage::getMatnrCode, stock.getMatnrCode());
}
--
Gitblit v1.9.1