| | |
| | | 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) => { |
| | |
| | | ); |
| | | |
| | | |
| | | 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)); |
| | |
| | | lightTheme={lightTheme} |
| | | darkTheme={darkTheme} |
| | | defaultTheme={DEFAULT_THEME_MODE} |
| | | theme={theme} |
| | | i18nProvider={i18nProvider} |
| | | dataProvider={DataProvider(DATA_PROVIDER_SPRING)} |
| | | loginPage={Login} |
| | |
| | | }; |
| | | |
| | | const AppWrapper = () => ( |
| | | <ThemeProvider theme={theme}> |
| | | <StoreContextProvider value={store}> |
| | | <App /> |
| | | </StoreContextProvider> |
| | | </ThemeProvider> |
| | | |
| | | ); |
| | | |
| | | export default AppWrapper; |
| | |
| | | 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", |
| | |
| | | }, |
| | | stockItem: { |
| | | orderId: "主单ID", |
| | | orderCode: "单据编码", |
| | | orderCode: "单号", |
| | | sourceItemId: "源明细ID", |
| | | matnrId: "物料ID", |
| | | matnrCode: "物料编码", |
| | |
| | | workQty: '执行数', |
| | | qty: '不可用库存', |
| | | splrId: '供应商', |
| | | warehouse: '仓库', |
| | | batch: "批次", |
| | | splrBatch: "批次", |
| | | spec: "规格", |
| | |
| | | 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, |
| | |
| | | )} |
| | | 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> |
| | |
| | | <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> |
| | | ) |
| | | } |
| | |
| | | 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]) |
| | | // setDisabled(false) |
| | | }, [open, page, pageSize]) |
| | | |
| | | const handleClose = (event, reason) => { |
| | | if (reason !== "backdropClick") { |
| | |
| | | }; |
| | | |
| | | const requestGetBody = async () => { |
| | | const res = await request.post(`warehouse/stock/info`, { stock: record, aggType: record?.aggType }); |
| | | 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([]); |
| | |
| | | <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} /> |
| | |
| | | ); |
| | | }; |
| | | |
| | | 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(); |
| | | |
| | |
| | | }, |
| | | { |
| | | field: 'matnrCode', |
| | | headerName: translate('table.field.asnOrderItem.matnrCode'), |
| | | headerName: translate('table.field.warehouseStock.matnrCode'), |
| | | width: 130, |
| | | editable: false, |
| | | }, |
| | |
| | | }, |
| | | { |
| | | field: 'batch', |
| | | headerName: translate('table.field.warehouseStock.splrBatch'), |
| | | headerName: translate('table.field.warehouseStock.batch'), |
| | | minWidth: 100, |
| | | flex: 1, |
| | | editable: false, |
| | |
| | | |
| | | |
| | | 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={{ |
| | |
| | | }, |
| | | }} |
| | | pageSizeOptions={[10, 25, 50, 100]} |
| | | editMode="row" |
| | | checkboxSelection |
| | | onRowSelectionModelChange={handleSelectionChange} |
| | | selectionModel={selectedRows} |
| | | loading={loading} |
| | | sx={{ |
| | | '& .MuiDataGrid-cell input': { |
| | | border: '1px solid #ccc' |
| | |
| | | |
| | | |
| | | 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([ |
| | |
| | | <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" />, |
| | |
| | | duration: theme.transitions.duration.enteringScreen, |
| | | }), |
| | | marginRight: 0, |
| | | '& .RaAutocompleteInput-textField.MuiFormControl-root.MuiTextField-root': { |
| | | width: '200px' |
| | | } |
| | | }} |
| | | resource="warehouse/stock" |
| | | title={"common.button.detail"} |
| | |
| | | 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; |
| | |
| | | } 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)) { |
| | | if (StringUtils.isBlank(stock.getFieldsIndex())) { |
| | | wrapper.isNull(ViewStockManage::getFieldsIndex); |
| | | } else { |
| | | wrapper.eq(ViewStockManage::getFieldsIndex, stock.getFieldsIndex()); |
| | | } |
| | | } else { |
| | | wrapper.eq(ViewStockManage::getMatnrCode, stock.getMatnrCode()); |
| | | } |