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