skyouc
4 天以前 e0a98773c39183b3b07a6d290f7a636647fb56d5
语言国际化兼容性修改
7个文件已修改
278 ■■■■ 已修改文件
rsf-admin/src/App.jsx 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
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",
rsf-admin/src/i18n/zh.js
@@ -929,7 +929,7 @@
            },
            stockItem: {
                orderId: "主单ID",
                orderCode: "单据编码",
                orderCode: "单号",
                sourceItemId: "源明细ID",
                matnrId: "物料ID",
                matnrCode: "物料编码",
@@ -986,6 +986,7 @@
                workQty: '执行数',
                qty: '不可用库存',
                splrId: '供应商',
                warehouse: '仓库',
                batch: "批次",
                splrBatch: "批次",
                spec: "规格",
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>
    )
}
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'
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"}
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());
       }