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