From af7a0d4a3991165c4dab36d4eff57d87fa67496e Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期一, 03 三月 2025 17:04:09 +0800 Subject: [PATCH] #新增 1. 新增ASN单据 2. 新增PO单据 3. 修改文件上传模板功能 --- rsf-server/src/main/java/asnOrder.sql | 32 rsf-admin/src/page/asnOrder/index.jsx | 18 rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml | 5 rsf-admin/src/page/asnOrderItem/AsnOrderItemPanel.jsx | 147 + rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java | 6 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java | 301 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java | 110 + rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java | 283 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderItemMapper.java | 12 rsf-server/src/main/java/purchase.sql | 33 rsf-admin/src/page/asnOrderItem/AsnOrderItemEdit.jsx | 193 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java | 110 + rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java | 296 +++ rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx | 117 + rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx | 201 ++ rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml | 5 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java | 8 rsf-server/src/main/resources/mapper/manager/PurchaseItemMapper.xml | 5 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java | 12 rsf-admin/src/page/purchase/PurchaseList.jsx | 174 ++ rsf-admin/src/page/asnOrder/AsnOrderEdit.jsx | 164 ++ rsf-admin/src/page/asnOrderItem/AsnOrderItemCreate.jsx | 221 ++ rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx | 182 ++ rsf-admin/src/page/components/ImportModal.jsx | 3 rsf-server/src/main/java/asnOrderItem.sql | 37 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java | 11 rsf-admin/src/page/asnOrder/AsnOrderCreate.jsx | 191 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseMapper.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseItemMapper.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java | 110 + rsf-admin/src/page/purchaseItem/PurchaseItemEdit.jsx | 173 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java | 8 rsf-server/src/main/resources/application.yml | 2 rsf-admin/src/page/purchaseItem/index.jsx | 18 rsf-admin/src/page/asnOrder/AsnOrderList.jsx | 177 ++ rsf-admin/src/page/purchase/PurchasePanel.jsx | 123 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java | 4 rsf-admin/src/page/purchase/index.jsx | 18 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java | 110 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java | 22 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java | 274 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java | 8 rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml | 5 rsf-admin/src/page/purchase/PurchaseEdit.jsx | 166 ++ rsf-admin/src/page/asnOrderItem/index.jsx | 18 rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java | 94 + rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx | 176 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java | 12 rsf-server/src/main/java/purchaseItem.sql | 34 rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx | 129 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java | 8 rsf-admin/src/page/purchase/PurchaseCreate.jsx | 194 ++ 55 files changed, 4,808 insertions(+), 12 deletions(-) diff --git a/rsf-admin/src/page/asnOrder/AsnOrderCreate.jsx b/rsf-admin/src/page/asnOrder/AsnOrderCreate.jsx new file mode 100644 index 0000000..bfe5038 --- /dev/null +++ b/rsf-admin/src/page/asnOrder/AsnOrderCreate.jsx @@ -0,0 +1,191 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + CreateBase, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SaveButton, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + Toolbar, + required, + useDataProvider, + useNotify, + Form, + useCreateController, +} from 'react-admin'; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Stack, + Grid, + Box, +} from '@mui/material'; +import DialogCloseButton from "../components/DialogCloseButton"; +import StatusSelectInput from "../components/StatusSelectInput"; +import MemoInput from "../components/MemoInput"; + +const AsnOrderCreate = (props) => { + const { open, setOpen } = props; + + const translate = useTranslate(); + const notify = useNotify(); + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + + const handleSuccess = async (data) => { + setOpen(false); + notify('common.response.success'); + }; + + const handleError = async (error) => { + notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); + }; + + return ( + <> + <CreateBase + record={{}} + transform={(data) => { + return data; + }} + mutationOptions={{ onSuccess: handleSuccess, onError: handleError }} + > + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + fullWidth + disableRestoreFocus + maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' + > + <Form> + <DialogTitle id="form-dialog-title" sx={{ + position: 'sticky', + top: 0, + backgroundColor: 'background.paper', + zIndex: 1000 + }} + > + {translate('create.title')} + <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> + <DialogCloseButton onClose={handleClose} /> + </Box> + </DialogTitle> + <DialogContent sx={{ mt: 2 }}> + <Grid container rowSpacing={2} columnSpacing={2}> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrder.code" + source="code" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrder.poCode" + source="poCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrder.poId" + source="poId" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrder.type" + source="type" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrder.wkType" + source="wkType" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrder.anfme" + source="anfme" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrder.qty" + source="qty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrder.logisNo" + source="logisNo" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <DateInput + label="table.field.asnOrder.arrTime" + source="arrTime" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <SelectInput + label="table.field.asnOrder.rleStatus" + source="rleStatus" + choices={[ + { id: 0, name: ' 姝e父' }, + { id: 1, name: ' 宸查噴鏀�' }, + ]} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrder.name" + source="name" + parse={v => v} + /> + </Grid> + + <Grid item xs={6} display="flex" gap={1}> + <StatusSelectInput /> + </Grid> + <Grid item xs={12} display="flex" gap={1}> + <Stack direction="column" spacing={1} width={'100%'}> + <MemoInput /> + </Stack> + </Grid> + </Grid> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <SaveButton /> + </Toolbar> + </DialogActions> + </Form> + </Dialog> + </CreateBase> + </> + ) +} + +export default AsnOrderCreate; diff --git a/rsf-admin/src/page/asnOrder/AsnOrderEdit.jsx b/rsf-admin/src/page/asnOrder/AsnOrderEdit.jsx new file mode 100644 index 0000000..64e542c --- /dev/null +++ b/rsf-admin/src/page/asnOrder/AsnOrderEdit.jsx @@ -0,0 +1,164 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + Edit, + SimpleForm, + FormDataConsumer, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + SaveButton, + Toolbar, + Labeled, + NumberField, + required, + useRecordContext, + DeleteButton, +} from 'react-admin'; +import { useWatch, useFormContext } from "react-hook-form"; +import { Stack, Grid, Box, Typography } from '@mui/material'; +import * as Common from '@/utils/common'; +import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; +import EditBaseAside from "../components/EditBaseAside"; +import CustomerTopToolBar from "../components/EditTopToolBar"; +import MemoInput from "../components/MemoInput"; +import StatusSelectInput from "../components/StatusSelectInput"; + +const FormToolbar = () => { + const { getValues } = useFormContext(); + + return ( + <Toolbar sx={{ justifyContent: 'space-between' }}> + <SaveButton /> + <DeleteButton mutationMode="optimistic" /> + </Toolbar> + ) +} + +const AsnOrderEdit = () => { + const translate = useTranslate(); + + return ( + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} + > + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + // validate={(values) => { }} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={12} md={8}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrder.code" + source="code" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrder.poCode" + source="poCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrder.poId" + source="poId" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrder.type" + source="type" + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrder.wkType" + source="wkType" + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrder.anfme" + source="anfme" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrder.qty" + source="qty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrder.logisNo" + source="logisNo" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <DateInput + label="table.field.asnOrder.arrTime" + source="arrTime" + /> + </Stack> + <Stack direction='row' gap={2}> + <SelectInput + label="table.field.asnOrder.rleStatus" + source="rleStatus" + choices={[ + { id: 0, name: ' 姝e父' }, + { id: 1, name: ' 宸查噴鏀�' }, + ]} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrder.name" + source="name" + parse={v => v} + /> + </Stack> + + </Grid> + <Grid item xs={12} md={4}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.common')} + </Typography> + <StatusSelectInput /> + <Box mt="2em" /> + <MemoInput /> + </Grid> + </Grid> + </SimpleForm> + </Edit > + ) +} + +export default AsnOrderEdit; diff --git a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx new file mode 100644 index 0000000..88ca09f --- /dev/null +++ b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx @@ -0,0 +1,177 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, +} from 'react-admin'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import AsnOrderCreate from "./AsnOrderCreate"; +import AsnOrderPanel from "./AsnOrderPanel"; +import EmptyData from "../components/EmptyData"; +import MyCreateButton from "../components/MyCreateButton"; +import MyExportButton from '../components/MyExportButton'; +import PageDrawer from "../components/PageDrawer"; +import MyField from "../components/MyField"; +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import * as Common from '@/utils/common'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + '& .column-name': { + }, + '& .opt': { + width: 200 + }, +})); + +const filters = [ + <SearchInput source="condition" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" alwaysOn />, + <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + + <TextInput source="code" label="table.field.asnOrder.code" />, + <TextInput source="poCode" label="table.field.asnOrder.poCode" />, + <NumberInput source="poId" label="table.field.asnOrder.poId" />, + <TextInput source="type" label="table.field.asnOrder.type" />, + <TextInput source="wkType" label="table.field.asnOrder.wkType" />, + <NumberInput source="anfme" label="table.field.asnOrder.anfme" />, + <NumberInput source="qty" label="table.field.asnOrder.qty" />, + <TextInput source="logisNo" label="table.field.asnOrder.logisNo" />, + <DateInput source="arrTime" label="table.field.asnOrder.arrTime" />, + <SelectInput source="rleStatus" label="table.field.asnOrder.rleStatus" + choices={[ + { id: 0, name: ' 姝e父' }, + { id: 1, name: ' 宸查噴鏀�' }, + ]} + />, + <TextInput source="name" label="table.field.asnOrder.name" />, + + <TextInput label="common.field.memo" source="memo" />, + <SelectInput + label="common.field.status" + source="status" + choices={[ + { id: '1', name: 'common.enums.statusTrue' }, + { id: '0', name: 'common.enums.statusFalse' }, + ]} + resettable + />, +] + +const AsnOrderList = () => { + const translate = useTranslate(); + + const [createDialog, setCreateDialog] = useState(false); + const [drawerVal, setDrawerVal] = useState(false); + + return ( + <Box display="flex"> + <List + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.asnOrder"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='asnOrder' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='asnOrder' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <AsnOrderPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="code" label="table.field.asnOrder.code" /> + <TextField source="poCode" label="table.field.asnOrder.poCode" /> + <NumberField source="poId" label="table.field.asnOrder.poId" /> + <TextField source="type" label="table.field.asnOrder.type" /> + <TextField source="wkType" label="table.field.asnOrder.wkType" /> + <NumberField source="anfme" label="table.field.asnOrder.anfme" /> + <NumberField source="qty" label="table.field.asnOrder.qty" /> + <TextField source="logisNo" label="table.field.asnOrder.logisNo" /> + <DateField source="arrTime" label="table.field.asnOrder.arrTime" showTime /> + <TextField source="rleStatus$" label="table.field.asnOrder.rleStatus" sortable={false} /> + <TextField source="name" label="table.field.asnOrder.name" /> + + <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="createTime" label="common.field.createTime" showTime /> + <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + <WrapperField cellClassName="opt" label="common.field.opt"> + <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> + <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> + </WrapperField> + </StyledDatagrid> + </List> + <AsnOrderCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='AsnOrder Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default AsnOrderList; diff --git a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx new file mode 100644 index 0000000..b9814df --- /dev/null +++ b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx @@ -0,0 +1,117 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +import { + useTranslate, + useRecordContext, +} from 'react-admin'; +import PanelTypography from "../components/PanelTypography"; +import * as Common from '@/utils/common' + +const AsnOrderPanel = () => { + const record = useRecordContext(); + if (!record) return null; + const translate = useTranslate(); + return ( + <> + <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}> + <CardContent> + <Grid container spacing={2}> + <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}> + <Typography variant="h6" gutterBottom align="left" sx={{ + maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' }, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }}> + {Common.camelToPascalWithSpaces(translate('table.field.asnOrder.name'))}: {record.name} + </Typography> + {/* inherit, primary, secondary, textPrimary, textSecondary, error */} + <Typography variant="h6" gutterBottom align="right" > + ID: {record.id} + </Typography> + </Grid> + </Grid> + <Grid container spacing={2}> + <Grid item xs={12} container alignContent="flex-end"> + <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> + {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} + </Typography> + </Grid> + </Grid> + <Box height={20}> </Box> + <Grid container spacing={2}> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.code" + property={record.code} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.poCode" + property={record.poCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.poId" + property={record.poId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.type" + property={record.type} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.wkType" + property={record.wkType} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.anfme" + property={record.anfme} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.qty" + property={record.qty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.logisNo" + property={record.logisNo} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.arrTime" + property={record.arrTime$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.rleStatus" + property={record.rleStatus$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrder.name" + property={record.name} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default AsnOrderPanel; diff --git a/rsf-admin/src/page/asnOrder/index.jsx b/rsf-admin/src/page/asnOrder/index.jsx new file mode 100644 index 0000000..efc23bb --- /dev/null +++ b/rsf-admin/src/page/asnOrder/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import AsnOrderList from "./AsnOrderList"; +import AsnOrderEdit from "./AsnOrderEdit"; + +export default { + list: AsnOrderList, + edit: AsnOrderEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.name}` + } +}; diff --git a/rsf-admin/src/page/asnOrderItem/AsnOrderItemCreate.jsx b/rsf-admin/src/page/asnOrderItem/AsnOrderItemCreate.jsx new file mode 100644 index 0000000..45e40f2 --- /dev/null +++ b/rsf-admin/src/page/asnOrderItem/AsnOrderItemCreate.jsx @@ -0,0 +1,221 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + CreateBase, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SaveButton, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + Toolbar, + required, + useDataProvider, + useNotify, + Form, + useCreateController, +} from 'react-admin'; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Stack, + Grid, + Box, +} from '@mui/material'; +import DialogCloseButton from "../components/DialogCloseButton"; +import StatusSelectInput from "../components/StatusSelectInput"; +import MemoInput from "../components/MemoInput"; + +const AsnOrderItemCreate = (props) => { + const { open, setOpen } = props; + + const translate = useTranslate(); + const notify = useNotify(); + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + + const handleSuccess = async (data) => { + setOpen(false); + notify('common.response.success'); + }; + + const handleError = async (error) => { + notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); + }; + + return ( + <> + <CreateBase + record={{}} + transform={(data) => { + return data; + }} + mutationOptions={{ onSuccess: handleSuccess, onError: handleError }} + > + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + fullWidth + disableRestoreFocus + maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' + > + <Form> + <DialogTitle id="form-dialog-title" sx={{ + position: 'sticky', + top: 0, + backgroundColor: 'background.paper', + zIndex: 1000 + }} + > + {translate('create.title')} + <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> + <DialogCloseButton onClose={handleClose} /> + </Box> + </DialogTitle> + <DialogContent sx={{ mt: 2 }}> + <Grid container rowSpacing={2} columnSpacing={2}> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrderItem.asnId" + source="asnId" + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.asnCode" + source="asnCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.poDetlId" + source="poDetlId" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.poDetlCode" + source="poDetlCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.matnrId" + source="matnrId" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.matnk" + source="matnk" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrderItem.anfme" + source="anfme" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.stockUnit" + source="stockUnit" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrderItem.purQty" + source="purQty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.purUnit" + source="purUnit" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.asnOrderItem.qty" + source="qty" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.splrCode" + source="splrCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.splrName" + source="splrName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.qrcode" + source="qrcode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.barcode" + source="barcode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.asnOrderItem.packName" + source="packName" + parse={v => v} + /> + </Grid> + + <Grid item xs={6} display="flex" gap={1}> + <StatusSelectInput /> + </Grid> + <Grid item xs={12} display="flex" gap={1}> + <Stack direction="column" spacing={1} width={'100%'}> + <MemoInput /> + </Stack> + </Grid> + </Grid> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <SaveButton /> + </Toolbar> + </DialogActions> + </Form> + </Dialog> + </CreateBase> + </> + ) +} + +export default AsnOrderItemCreate; diff --git a/rsf-admin/src/page/asnOrderItem/AsnOrderItemEdit.jsx b/rsf-admin/src/page/asnOrderItem/AsnOrderItemEdit.jsx new file mode 100644 index 0000000..2d2d159 --- /dev/null +++ b/rsf-admin/src/page/asnOrderItem/AsnOrderItemEdit.jsx @@ -0,0 +1,193 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + Edit, + SimpleForm, + FormDataConsumer, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + SaveButton, + Toolbar, + Labeled, + NumberField, + required, + useRecordContext, + DeleteButton, +} from 'react-admin'; +import { useWatch, useFormContext } from "react-hook-form"; +import { Stack, Grid, Box, Typography } from '@mui/material'; +import * as Common from '@/utils/common'; +import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; +import EditBaseAside from "../components/EditBaseAside"; +import CustomerTopToolBar from "../components/EditTopToolBar"; +import MemoInput from "../components/MemoInput"; +import StatusSelectInput from "../components/StatusSelectInput"; + +const FormToolbar = () => { + const { getValues } = useFormContext(); + + return ( + <Toolbar sx={{ justifyContent: 'space-between' }}> + <SaveButton /> + <DeleteButton mutationMode="optimistic" /> + </Toolbar> + ) +} + +const AsnOrderItemEdit = () => { + const translate = useTranslate(); + + return ( + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} + > + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + // validate={(values) => { }} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={12} md={8}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrderItem.asnId" + source="asnId" + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.asnCode" + source="asnCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.poDetlId" + source="poDetlId" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.poDetlCode" + source="poDetlCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.matnrId" + source="matnrId" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.matnk" + source="matnk" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrderItem.anfme" + source="anfme" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.stockUnit" + source="stockUnit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrderItem.purQty" + source="purQty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.purUnit" + source="purUnit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrderItem.qty" + source="qty" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.splrCode" + source="splrCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.splrName" + source="splrName" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.qrcode" + source="qrcode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.barcode" + source="barcode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.asnOrderItem.packName" + source="packName" + parse={v => v} + /> + </Stack> + + </Grid> + <Grid item xs={12} md={4}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.common')} + </Typography> + <StatusSelectInput /> + <Box mt="2em" /> + <MemoInput /> + </Grid> + </Grid> + </SimpleForm> + </Edit > + ) +} + +export default AsnOrderItemEdit; diff --git a/rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx b/rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx new file mode 100644 index 0000000..5ddf5ee --- /dev/null +++ b/rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx @@ -0,0 +1,182 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, +} from 'react-admin'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import AsnOrderItemCreate from "./AsnOrderItemCreate"; +import AsnOrderItemPanel from "./AsnOrderItemPanel"; +import EmptyData from "../components/EmptyData"; +import MyCreateButton from "../components/MyCreateButton"; +import MyExportButton from '../components/MyExportButton'; +import PageDrawer from "../components/PageDrawer"; +import MyField from "../components/MyField"; +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import * as Common from '@/utils/common'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + '& .column-name': { + }, + '& .opt': { + width: 200 + }, +})); + +const filters = [ + <SearchInput source="condition" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" alwaysOn />, + <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + + <NumberInput source="asnId" label="table.field.asnOrderItem.asnId" />, + <TextInput source="asnCode" label="table.field.asnOrderItem.asnCode" />, + <TextInput source="poDetlId" label="table.field.asnOrderItem.poDetlId" />, + <TextInput source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />, + <TextInput source="matnrId" label="table.field.asnOrderItem.matnrId" />, + <TextInput source="matnk" label="table.field.asnOrderItem.matnk" />, + <NumberInput source="anfme" label="table.field.asnOrderItem.anfme" />, + <TextInput source="stockUnit" label="table.field.asnOrderItem.stockUnit" />, + <NumberInput source="purQty" label="table.field.asnOrderItem.purQty" />, + <TextInput source="purUnit" label="table.field.asnOrderItem.purUnit" />, + <NumberInput source="qty" label="table.field.asnOrderItem.qty" />, + <TextInput source="splrCode" label="table.field.asnOrderItem.splrCode" />, + <TextInput source="splrName" label="table.field.asnOrderItem.splrName" />, + <TextInput source="qrcode" label="table.field.asnOrderItem.qrcode" />, + <TextInput source="barcode" label="table.field.asnOrderItem.barcode" />, + <TextInput source="packName" label="table.field.asnOrderItem.packName" />, + + <TextInput label="common.field.memo" source="memo" />, + <SelectInput + label="common.field.status" + source="status" + choices={[ + { id: '1', name: 'common.enums.statusTrue' }, + { id: '0', name: 'common.enums.statusFalse' }, + ]} + resettable + />, +] + +const AsnOrderItemList = () => { + const translate = useTranslate(); + + const [createDialog, setCreateDialog] = useState(false); + const [drawerVal, setDrawerVal] = useState(false); + + return ( + <Box display="flex"> + <List + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.asnOrderItem"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='asnOrderItem' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='asnOrderItem' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <AsnOrderItemPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <NumberField source="asnId" label="table.field.asnOrderItem.asnId" /> + <TextField source="asnCode" label="table.field.asnOrderItem.asnCode" /> + <TextField source="poDetlId" label="table.field.asnOrderItem.poDetlId" /> + <TextField source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" /> + <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" /> + <TextField source="matnk" label="table.field.asnOrderItem.matnk" /> + <NumberField source="anfme" label="table.field.asnOrderItem.anfme" /> + <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" /> + <NumberField source="purQty" label="table.field.asnOrderItem.purQty" /> + <TextField source="purUnit" label="table.field.asnOrderItem.purUnit" /> + <NumberField source="qty" label="table.field.asnOrderItem.qty" /> + <TextField source="splrCode" label="table.field.asnOrderItem.splrCode" /> + <TextField source="splrName" label="table.field.asnOrderItem.splrName" /> + <TextField source="qrcode" label="table.field.asnOrderItem.qrcode" /> + <TextField source="barcode" label="table.field.asnOrderItem.barcode" /> + <TextField source="packName" label="table.field.asnOrderItem.packName" /> + + <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="createTime" label="common.field.createTime" showTime /> + <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + <WrapperField cellClassName="opt" label="common.field.opt"> + <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> + <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> + </WrapperField> + </StyledDatagrid> + </List> + <AsnOrderItemCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='AsnOrderItem Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default AsnOrderItemList; diff --git a/rsf-admin/src/page/asnOrderItem/AsnOrderItemPanel.jsx b/rsf-admin/src/page/asnOrderItem/AsnOrderItemPanel.jsx new file mode 100644 index 0000000..d9336fb --- /dev/null +++ b/rsf-admin/src/page/asnOrderItem/AsnOrderItemPanel.jsx @@ -0,0 +1,147 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +import { + useTranslate, + useRecordContext, +} from 'react-admin'; +import PanelTypography from "../components/PanelTypography"; +import * as Common from '@/utils/common' + +const AsnOrderItemPanel = () => { + const record = useRecordContext(); + if (!record) return null; + const translate = useTranslate(); + return ( + <> + <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}> + <CardContent> + <Grid container spacing={2}> + <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}> + <Typography variant="h6" gutterBottom align="left" sx={{ + maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' }, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }}> + {Common.camelToPascalWithSpaces(translate('table.field.asnOrderItem.id'))}: {record.id} + </Typography> + {/* inherit, primary, secondary, textPrimary, textSecondary, error */} + <Typography variant="h6" gutterBottom align="right" > + ID: {record.id} + </Typography> + </Grid> + </Grid> + <Grid container spacing={2}> + <Grid item xs={12} container alignContent="flex-end"> + <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> + {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} + </Typography> + </Grid> + </Grid> + <Box height={20}> </Box> + <Grid container spacing={2}> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.asnId" + property={record.asnId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.asnCode" + property={record.asnCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.poDetlId" + property={record.poDetlId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.poDetlCode" + property={record.poDetlCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.matnrId" + property={record.matnrId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.matnk" + property={record.matnk} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.anfme" + property={record.anfme} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.stockUnit" + property={record.stockUnit} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.purQty" + property={record.purQty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.purUnit" + property={record.purUnit} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.qty" + property={record.qty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.splrCode" + property={record.splrCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.splrName" + property={record.splrName} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.qrcode" + property={record.qrcode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.barcode" + property={record.barcode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.asnOrderItem.packName" + property={record.packName} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default AsnOrderItemPanel; diff --git a/rsf-admin/src/page/asnOrderItem/index.jsx b/rsf-admin/src/page/asnOrderItem/index.jsx new file mode 100644 index 0000000..274df6c --- /dev/null +++ b/rsf-admin/src/page/asnOrderItem/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import AsnOrderItemList from "./AsnOrderItemList"; +import AsnOrderItemEdit from "./AsnOrderItemEdit"; + +export default { + list: AsnOrderItemList, + edit: AsnOrderItemEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-admin/src/page/components/ImportModal.jsx b/rsf-admin/src/page/components/ImportModal.jsx index 3775169..1461531 100644 --- a/rsf-admin/src/page/components/ImportModal.jsx +++ b/rsf-admin/src/page/components/ImportModal.jsx @@ -46,8 +46,9 @@ if (!file) { return; } + console.log(file); + //TODO 娣诲姞涓婃枃浠朵笂浼犳帴鍙� - parseCsv(file); }; const handleClose = () => { diff --git a/rsf-admin/src/page/purchase/PurchaseCreate.jsx b/rsf-admin/src/page/purchase/PurchaseCreate.jsx new file mode 100644 index 0000000..ca7ced5 --- /dev/null +++ b/rsf-admin/src/page/purchase/PurchaseCreate.jsx @@ -0,0 +1,194 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + CreateBase, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SaveButton, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + Toolbar, + required, + useDataProvider, + useNotify, + Form, + useCreateController, +} from 'react-admin'; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Stack, + Grid, + Box, +} from '@mui/material'; +import DialogCloseButton from "../components/DialogCloseButton"; +import StatusSelectInput from "../components/StatusSelectInput"; +import MemoInput from "../components/MemoInput"; + +const PurchaseCreate = (props) => { + const { open, setOpen } = props; + + const translate = useTranslate(); + const notify = useNotify(); + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + + const handleSuccess = async (data) => { + setOpen(false); + notify('common.response.success'); + }; + + const handleError = async (error) => { + notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); + }; + + return ( + <> + <CreateBase + record={{}} + transform={(data) => { + return data; + }} + mutationOptions={{ onSuccess: handleSuccess, onError: handleError }} + > + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + fullWidth + disableRestoreFocus + maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' + > + <Form> + <DialogTitle id="form-dialog-title" sx={{ + position: 'sticky', + top: 0, + backgroundColor: 'background.paper', + zIndex: 1000 + }} + > + {translate('create.title')} + <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> + <DialogCloseButton onClose={handleClose} /> + </Box> + </DialogTitle> + <DialogContent sx={{ mt: 2 }}> + <Grid container rowSpacing={2} columnSpacing={2}> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchase.code" + source="code" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchase.type" + source="type" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchase.from" + source="from" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <DateInput + label="table.field.purchase.preArr" + source="preArr" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchase.anfme" + source="anfme" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchase.qty" + source="qty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchase.workQty" + source="workQty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchase.channel" + source="channel" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchase.erpCode" + source="erpCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <DateInput + label="table.field.purchase.startTime" + source="startTime" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <DateInput + label="table.field.purchase.endTime" + source="endTime" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchase.project" + source="project" + parse={v => v} + /> + </Grid> + + <Grid item xs={6} display="flex" gap={1}> + <StatusSelectInput /> + </Grid> + <Grid item xs={12} display="flex" gap={1}> + <Stack direction="column" spacing={1} width={'100%'}> + <MemoInput /> + </Stack> + </Grid> + </Grid> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <SaveButton /> + </Toolbar> + </DialogActions> + </Form> + </Dialog> + </CreateBase> + </> + ) +} + +export default PurchaseCreate; diff --git a/rsf-admin/src/page/purchase/PurchaseEdit.jsx b/rsf-admin/src/page/purchase/PurchaseEdit.jsx new file mode 100644 index 0000000..08cb3aa --- /dev/null +++ b/rsf-admin/src/page/purchase/PurchaseEdit.jsx @@ -0,0 +1,166 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + Edit, + SimpleForm, + FormDataConsumer, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + SaveButton, + Toolbar, + Labeled, + NumberField, + required, + useRecordContext, + DeleteButton, +} from 'react-admin'; +import { useWatch, useFormContext } from "react-hook-form"; +import { Stack, Grid, Box, Typography } from '@mui/material'; +import * as Common from '@/utils/common'; +import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; +import EditBaseAside from "../components/EditBaseAside"; +import CustomerTopToolBar from "../components/EditTopToolBar"; +import MemoInput from "../components/MemoInput"; +import StatusSelectInput from "../components/StatusSelectInput"; + +const FormToolbar = () => { + const { getValues } = useFormContext(); + + return ( + <Toolbar sx={{ justifyContent: 'space-between' }}> + <SaveButton /> + <DeleteButton mutationMode="optimistic" /> + </Toolbar> + ) +} + +const PurchaseEdit = () => { + const translate = useTranslate(); + + return ( + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} + > + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + // validate={(values) => { }} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={12} md={8}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchase.code" + source="code" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchase.type" + source="type" + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchase.from" + source="from" + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <DateInput + label="table.field.purchase.preArr" + source="preArr" + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchase.anfme" + source="anfme" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchase.qty" + source="qty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchase.workQty" + source="workQty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchase.channel" + source="channel" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchase.erpCode" + source="erpCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <DateInput + label="table.field.purchase.startTime" + source="startTime" + /> + </Stack> + <Stack direction='row' gap={2}> + <DateInput + label="table.field.purchase.endTime" + source="endTime" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchase.project" + source="project" + parse={v => v} + /> + </Stack> + + </Grid> + <Grid item xs={12} md={4}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.common')} + </Typography> + <StatusSelectInput /> + <Box mt="2em" /> + <MemoInput /> + </Grid> + </Grid> + </SimpleForm> + </Edit > + ) +} + +export default PurchaseEdit; diff --git a/rsf-admin/src/page/purchase/PurchaseList.jsx b/rsf-admin/src/page/purchase/PurchaseList.jsx new file mode 100644 index 0000000..199a877 --- /dev/null +++ b/rsf-admin/src/page/purchase/PurchaseList.jsx @@ -0,0 +1,174 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, +} from 'react-admin'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import PurchaseCreate from "./PurchaseCreate"; +import PurchasePanel from "./PurchasePanel"; +import EmptyData from "../components/EmptyData"; +import MyCreateButton from "../components/MyCreateButton"; +import MyExportButton from '../components/MyExportButton'; +import PageDrawer from "../components/PageDrawer"; +import MyField from "../components/MyField"; +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import * as Common from '@/utils/common'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + '& .column-name': { + }, + '& .opt': { + width: 200 + }, +})); + +const filters = [ + <SearchInput source="condition" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" alwaysOn />, + <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + + <TextInput source="code" label="table.field.purchase.code" />, + <TextInput source="type" label="table.field.purchase.type" />, + <TextInput source="from" label="table.field.purchase.from" />, + <DateInput source="preArr" label="table.field.purchase.preArr" />, + <NumberInput source="anfme" label="table.field.purchase.anfme" />, + <NumberInput source="qty" label="table.field.purchase.qty" />, + <NumberInput source="workQty" label="table.field.purchase.workQty" />, + <TextInput source="channel" label="table.field.purchase.channel" />, + <TextInput source="erpCode" label="table.field.purchase.erpCode" />, + <DateInput source="startTime" label="table.field.purchase.startTime" />, + <DateInput source="endTime" label="table.field.purchase.endTime" />, + <TextInput source="project" label="table.field.purchase.project" />, + + <TextInput label="common.field.memo" source="memo" />, + <SelectInput + label="common.field.status" + source="status" + choices={[ + { id: '1', name: 'common.enums.statusTrue' }, + { id: '0', name: 'common.enums.statusFalse' }, + ]} + resettable + />, +] + +const PurchaseList = () => { + const translate = useTranslate(); + + const [createDialog, setCreateDialog] = useState(false); + const [drawerVal, setDrawerVal] = useState(false); + + return ( + <Box display="flex"> + <List + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.purchase"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='purchase' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='purchase' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <PurchasePanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="code" label="table.field.purchase.code" /> + <TextField source="type" label="table.field.purchase.type" /> + <TextField source="from" label="table.field.purchase.from" /> + <DateField source="preArr" label="table.field.purchase.preArr" showTime /> + <NumberField source="anfme" label="table.field.purchase.anfme" /> + <NumberField source="qty" label="table.field.purchase.qty" /> + <NumberField source="workQty" label="table.field.purchase.workQty" /> + <TextField source="channel" label="table.field.purchase.channel" /> + <TextField source="erpCode" label="table.field.purchase.erpCode" /> + <DateField source="startTime" label="table.field.purchase.startTime" showTime /> + <DateField source="endTime" label="table.field.purchase.endTime" showTime /> + <TextField source="project" label="table.field.purchase.project" /> + + <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="createTime" label="common.field.createTime" showTime /> + <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + <WrapperField cellClassName="opt" label="common.field.opt"> + <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> + <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> + </WrapperField> + </StyledDatagrid> + </List> + <PurchaseCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='Purchase Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default PurchaseList; diff --git a/rsf-admin/src/page/purchase/PurchasePanel.jsx b/rsf-admin/src/page/purchase/PurchasePanel.jsx new file mode 100644 index 0000000..0712c0d --- /dev/null +++ b/rsf-admin/src/page/purchase/PurchasePanel.jsx @@ -0,0 +1,123 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +import { + useTranslate, + useRecordContext, +} from 'react-admin'; +import PanelTypography from "../components/PanelTypography"; +import * as Common from '@/utils/common' + +const PurchasePanel = () => { + const record = useRecordContext(); + if (!record) return null; + const translate = useTranslate(); + return ( + <> + <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}> + <CardContent> + <Grid container spacing={2}> + <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}> + <Typography variant="h6" gutterBottom align="left" sx={{ + maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' }, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }}> + {Common.camelToPascalWithSpaces(translate('table.field.purchase.id'))}: {record.id} + </Typography> + {/* inherit, primary, secondary, textPrimary, textSecondary, error */} + <Typography variant="h6" gutterBottom align="right" > + ID: {record.id} + </Typography> + </Grid> + </Grid> + <Grid container spacing={2}> + <Grid item xs={12} container alignContent="flex-end"> + <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> + {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} + </Typography> + </Grid> + </Grid> + <Box height={20}> </Box> + <Grid container spacing={2}> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.code" + property={record.code} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.type" + property={record.type} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.from" + property={record.from} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.preArr" + property={record.preArr$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.anfme" + property={record.anfme} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.qty" + property={record.qty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.workQty" + property={record.workQty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.channel" + property={record.channel} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.erpCode" + property={record.erpCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.startTime" + property={record.startTime$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.endTime" + property={record.endTime$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchase.project" + property={record.project} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default PurchasePanel; diff --git a/rsf-admin/src/page/purchase/index.jsx b/rsf-admin/src/page/purchase/index.jsx new file mode 100644 index 0000000..a03738a --- /dev/null +++ b/rsf-admin/src/page/purchase/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import PurchaseList from "./PurchaseList"; +import PurchaseEdit from "./PurchaseEdit"; + +export default { + list: PurchaseList, + edit: PurchaseEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx b/rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx new file mode 100644 index 0000000..6c463ce --- /dev/null +++ b/rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx @@ -0,0 +1,201 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + CreateBase, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SaveButton, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + Toolbar, + required, + useDataProvider, + useNotify, + Form, + useCreateController, +} from 'react-admin'; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Stack, + Grid, + Box, +} from '@mui/material'; +import DialogCloseButton from "../components/DialogCloseButton"; +import StatusSelectInput from "../components/StatusSelectInput"; +import MemoInput from "../components/MemoInput"; + +const PurchaseItemCreate = (props) => { + const { open, setOpen } = props; + + const translate = useTranslate(); + const notify = useNotify(); + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + + const handleSuccess = async (data) => { + setOpen(false); + notify('common.response.success'); + }; + + const handleError = async (error) => { + notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); + }; + + return ( + <> + <CreateBase + record={{}} + transform={(data) => { + return data; + }} + mutationOptions={{ onSuccess: handleSuccess, onError: handleError }} + > + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + fullWidth + disableRestoreFocus + maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' + > + <Form> + <DialogTitle id="form-dialog-title" sx={{ + position: 'sticky', + top: 0, + backgroundColor: 'background.paper', + zIndex: 1000 + }} + > + {translate('create.title')} + <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> + <DialogCloseButton onClose={handleClose} /> + </Box> + </DialogTitle> + <DialogContent sx={{ mt: 2 }}> + <Grid container rowSpacing={2} columnSpacing={2}> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchaseItem.purchaseId" + source="purchaseId" + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.erpId" + source="erpId" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.matnrCode" + source="matnrCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.matnrName" + source="matnrName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.unit" + source="unit" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchaseItem.anfme" + source="anfme" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchaseItem.qty" + source="qty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchaseItem.nomQty" + source="nomQty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchaseItem.asnQty" + source="asnQty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.purchaseItem.printQty" + source="printQty" + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.pulrName" + source="pulrName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.pulrCode" + source="pulrCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.purchaseItem.pulrBatch" + source="pulrBatch" + parse={v => v} + /> + </Grid> + + <Grid item xs={6} display="flex" gap={1}> + <StatusSelectInput /> + </Grid> + <Grid item xs={12} display="flex" gap={1}> + <Stack direction="column" spacing={1} width={'100%'}> + <MemoInput /> + </Stack> + </Grid> + </Grid> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <SaveButton /> + </Toolbar> + </DialogActions> + </Form> + </Dialog> + </CreateBase> + </> + ) +} + +export default PurchaseItemCreate; diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemEdit.jsx b/rsf-admin/src/page/purchaseItem/PurchaseItemEdit.jsx new file mode 100644 index 0000000..22a190a --- /dev/null +++ b/rsf-admin/src/page/purchaseItem/PurchaseItemEdit.jsx @@ -0,0 +1,173 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + Edit, + SimpleForm, + FormDataConsumer, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + SaveButton, + Toolbar, + Labeled, + NumberField, + required, + useRecordContext, + DeleteButton, +} from 'react-admin'; +import { useWatch, useFormContext } from "react-hook-form"; +import { Stack, Grid, Box, Typography } from '@mui/material'; +import * as Common from '@/utils/common'; +import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; +import EditBaseAside from "../components/EditBaseAside"; +import CustomerTopToolBar from "../components/EditTopToolBar"; +import MemoInput from "../components/MemoInput"; +import StatusSelectInput from "../components/StatusSelectInput"; + +const FormToolbar = () => { + const { getValues } = useFormContext(); + + return ( + <Toolbar sx={{ justifyContent: 'space-between' }}> + <SaveButton /> + <DeleteButton mutationMode="optimistic" /> + </Toolbar> + ) +} + +const PurchaseItemEdit = () => { + const translate = useTranslate(); + + return ( + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} + > + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + // validate={(values) => { }} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={12} md={8}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchaseItem.purchaseId" + source="purchaseId" + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.erpId" + source="erpId" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.matnrCode" + source="matnrCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.matnrName" + source="matnrName" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.unit" + source="unit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchaseItem.anfme" + source="anfme" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchaseItem.qty" + source="qty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchaseItem.nomQty" + source="nomQty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchaseItem.asnQty" + source="asnQty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.purchaseItem.printQty" + source="printQty" + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.pulrName" + source="pulrName" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.pulrCode" + source="pulrCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.purchaseItem.pulrBatch" + source="pulrBatch" + parse={v => v} + /> + </Stack> + + </Grid> + <Grid item xs={12} md={4}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.common')} + </Typography> + <StatusSelectInput /> + <Box mt="2em" /> + <MemoInput /> + </Grid> + </Grid> + </SimpleForm> + </Edit > + ) +} + +export default PurchaseItemEdit; diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx b/rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx new file mode 100644 index 0000000..3fba64e --- /dev/null +++ b/rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx @@ -0,0 +1,176 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, +} from 'react-admin'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import PurchaseItemCreate from "./PurchaseItemCreate"; +import PurchaseItemPanel from "./PurchaseItemPanel"; +import EmptyData from "../components/EmptyData"; +import MyCreateButton from "../components/MyCreateButton"; +import MyExportButton from '../components/MyExportButton'; +import PageDrawer from "../components/PageDrawer"; +import MyField from "../components/MyField"; +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import * as Common from '@/utils/common'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + '& .column-name': { + }, + '& .opt': { + width: 200 + }, +})); + +const filters = [ + <SearchInput source="condition" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" alwaysOn />, + <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + + <NumberInput source="purchaseId" label="table.field.purchaseItem.purchaseId" />, + <TextInput source="erpId" label="table.field.purchaseItem.erpId" />, + <TextInput source="matnrCode" label="table.field.purchaseItem.matnrCode" />, + <TextInput source="matnrName" label="table.field.purchaseItem.matnrName" />, + <TextInput source="unit" label="table.field.purchaseItem.unit" />, + <NumberInput source="anfme" label="table.field.purchaseItem.anfme" />, + <NumberInput source="qty" label="table.field.purchaseItem.qty" />, + <NumberInput source="nomQty" label="table.field.purchaseItem.nomQty" />, + <NumberInput source="asnQty" label="table.field.purchaseItem.asnQty" />, + <NumberInput source="printQty" label="table.field.purchaseItem.printQty" />, + <TextInput source="pulrName" label="table.field.purchaseItem.pulrName" />, + <TextInput source="pulrCode" label="table.field.purchaseItem.pulrCode" />, + <TextInput source="pulrBatch" label="table.field.purchaseItem.pulrBatch" />, + + <TextInput label="common.field.memo" source="memo" />, + <SelectInput + label="common.field.status" + source="status" + choices={[ + { id: '1', name: 'common.enums.statusTrue' }, + { id: '0', name: 'common.enums.statusFalse' }, + ]} + resettable + />, +] + +const PurchaseItemList = () => { + const translate = useTranslate(); + + const [createDialog, setCreateDialog] = useState(false); + const [drawerVal, setDrawerVal] = useState(false); + + return ( + <Box display="flex"> + <List + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.purchaseItem"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='purchaseItem' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='purchaseItem' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <PurchaseItemPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" /> + <TextField source="erpId" label="table.field.purchaseItem.erpId" /> + <TextField source="matnrCode" label="table.field.purchaseItem.matnrCode" /> + <TextField source="matnrName" label="table.field.purchaseItem.matnrName" /> + <TextField source="unit" label="table.field.purchaseItem.unit" /> + <NumberField source="anfme" label="table.field.purchaseItem.anfme" /> + <NumberField source="qty" label="table.field.purchaseItem.qty" /> + <NumberField source="nomQty" label="table.field.purchaseItem.nomQty" /> + <NumberField source="asnQty" label="table.field.purchaseItem.asnQty" /> + <NumberField source="printQty" label="table.field.purchaseItem.printQty" /> + <TextField source="pulrName" label="table.field.purchaseItem.pulrName" /> + <TextField source="pulrCode" label="table.field.purchaseItem.pulrCode" /> + <TextField source="pulrBatch" label="table.field.purchaseItem.pulrBatch" /> + + <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="createTime" label="common.field.createTime" showTime /> + <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + <WrapperField cellClassName="opt" label="common.field.opt"> + <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> + <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> + </WrapperField> + </StyledDatagrid> + </List> + <PurchaseItemCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='PurchaseItem Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default PurchaseItemList; diff --git a/rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx b/rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx new file mode 100644 index 0000000..e6fe7cd --- /dev/null +++ b/rsf-admin/src/page/purchaseItem/PurchaseItemPanel.jsx @@ -0,0 +1,129 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +import { + useTranslate, + useRecordContext, +} from 'react-admin'; +import PanelTypography from "../components/PanelTypography"; +import * as Common from '@/utils/common' + +const PurchaseItemPanel = () => { + const record = useRecordContext(); + if (!record) return null; + const translate = useTranslate(); + return ( + <> + <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}> + <CardContent> + <Grid container spacing={2}> + <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}> + <Typography variant="h6" gutterBottom align="left" sx={{ + maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' }, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }}> + {Common.camelToPascalWithSpaces(translate('table.field.purchaseItem.id'))}: {record.id} + </Typography> + {/* inherit, primary, secondary, textPrimary, textSecondary, error */} + <Typography variant="h6" gutterBottom align="right" > + ID: {record.id} + </Typography> + </Grid> + </Grid> + <Grid container spacing={2}> + <Grid item xs={12} container alignContent="flex-end"> + <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> + {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} + </Typography> + </Grid> + </Grid> + <Box height={20}> </Box> + <Grid container spacing={2}> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.purchaseId" + property={record.purchaseId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.erpId" + property={record.erpId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.matnrCode" + property={record.matnrCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.matnrName" + property={record.matnrName} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.unit" + property={record.unit} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.anfme" + property={record.anfme} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.qty" + property={record.qty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.nomQty" + property={record.nomQty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.asnQty" + property={record.asnQty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.printQty" + property={record.printQty} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.pulrName" + property={record.pulrName} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.pulrCode" + property={record.pulrCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.purchaseItem.pulrBatch" + property={record.pulrBatch} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default PurchaseItemPanel; diff --git a/rsf-admin/src/page/purchaseItem/index.jsx b/rsf-admin/src/page/purchaseItem/index.jsx new file mode 100644 index 0000000..022b7ea --- /dev/null +++ b/rsf-admin/src/page/purchaseItem/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import PurchaseItemList from "./PurchaseItemList"; +import PurchaseItemEdit from "./PurchaseItemEdit"; + +export default { + list: PurchaseItemList, + edit: PurchaseItemEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-server/src/main/java/asnOrder.sql b/rsf-server/src/main/java/asnOrder.sql new file mode 100644 index 0000000..d073bf2 --- /dev/null +++ b/rsf-server/src/main/java/asnOrder.sql @@ -0,0 +1,32 @@ +-- save asnOrder record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.asnOrder', '0', '/manager/asnOrder', 'asnOrder', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query ASN鍗曟嵁', '', '1', 'manager:asnOrder:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create ASN鍗曟嵁', '', '1', 'manager:asnOrder:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update ASN鍗曟嵁', '', '1', 'manager:asnOrder:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete ASN鍗曟嵁', '', '1', 'manager:asnOrder:remove', '3', '1', '1'); + +-- locale menu name +asnOrder: 'AsnOrder', + +-- locale field +asnOrder: { + code: "code", + poCode: "poCode", + poId: "poId", + type: "type", + wkType: "wkType", + anfme: "anfme", + qty: "qty", + logisNo: "logisNo", + arrTime: "arrTime", + rleStatus: "rleStatus", + name: "name", +}, + +-- ResourceContent +import asnOrder from './asnOrder'; + +case 'asnOrder': + return asnOrder; diff --git a/rsf-server/src/main/java/asnOrderItem.sql b/rsf-server/src/main/java/asnOrderItem.sql new file mode 100644 index 0000000..7c92e02 --- /dev/null +++ b/rsf-server/src/main/java/asnOrderItem.sql @@ -0,0 +1,37 @@ +-- save asnOrderItem record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.asnOrderItem', '0', '/manager/asnOrderItem', 'asnOrderItem', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query ASN鍗曟嵁', '', '1', 'manager:asnOrderItem:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create ASN鍗曟嵁', '', '1', 'manager:asnOrderItem:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update ASN鍗曟嵁', '', '1', 'manager:asnOrderItem:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete ASN鍗曟嵁', '', '1', 'manager:asnOrderItem:remove', '3', '1', '1'); + +-- locale menu name +asnOrderItem: 'AsnOrderItem', + +-- locale field +asnOrderItem: { + asnId: "asnId", + asnCode: "asnCode", + poDetlId: "poDetlId", + poDetlCode: "poDetlCode", + matnrId: "matnrId", + matnk: "matnk", + anfme: "anfme", + stockUnit: "stockUnit", + purQty: "purQty", + purUnit: "purUnit", + qty: "qty", + splrCode: "splrCode", + splrName: "splrName", + qrcode: "qrcode", + barcode: "barcode", + packName: "packName", +}, + +-- ResourceContent +import asnOrderItem from './asnOrderItem'; + +case 'asnOrderItem': + return asnOrderItem; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java index 381ca3c..f118786 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java @@ -22,9 +22,9 @@ // generator.username="sa"; // generator.password="Zoneyung@zy56$"; - generator.table="sys_serial_rule_item"; - generator.tableDesc="缂栫爜瑙勫垯瀛愯〃"; - generator.packagePath="com.vincent.rsf.server.system"; + generator.table="man_asn_order_item"; + generator.tableDesc="ASN鍗曟嵁"; + generator.packagePath="com.vincent.rsf.server.manager"; generator.build(); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java new file mode 100644 index 0000000..03d44a6 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java @@ -0,0 +1,110 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.common.annotation.OperationLog; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.KeyValVo; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.manager.entity.AsnOrder; +import com.vincent.rsf.server.manager.service.AsnOrderService; +import com.vincent.rsf.server.system.controller.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@RestController +public class AsnOrderController extends BaseController { + + @Autowired + private AsnOrderService asnOrderService; + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + @PostMapping("/asnOrder/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<AsnOrder, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrder.class); + return R.ok().add(asnOrderService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + @PostMapping("/asnOrder/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(asnOrderService.list()); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + @PostMapping({"/asnOrder/many/{ids}", "/asnOrders/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(asnOrderService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + @GetMapping("/asnOrder/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(asnOrderService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:save')") + @OperationLog("Create ASN鍗曟嵁") + @PostMapping("/asnOrder/save") + public R save(@RequestBody AsnOrder asnOrder) { + asnOrder.setCreateBy(getLoginUserId()); + asnOrder.setCreateTime(new Date()); + asnOrder.setUpdateBy(getLoginUserId()); + asnOrder.setUpdateTime(new Date()); + if (!asnOrderService.save(asnOrder)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(asnOrder); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:update')") + @OperationLog("Update ASN鍗曟嵁") + @PostMapping("/asnOrder/update") + public R update(@RequestBody AsnOrder asnOrder) { + asnOrder.setUpdateBy(getLoginUserId()); + asnOrder.setUpdateTime(new Date()); + if (!asnOrderService.updateById(asnOrder)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(asnOrder); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:remove')") + @OperationLog("Delete ASN鍗曟嵁") + @PostMapping("/asnOrder/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!asnOrderService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + @PostMapping("/asnOrder/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<AsnOrder> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(AsnOrder::getName, condition); + } + asnOrderService.page(new Page<>(1, 30), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getName())) + ); + return R.ok().add(vos); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + @PostMapping("/asnOrder/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(asnOrderService.list(), AsnOrder.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java new file mode 100644 index 0000000..118c505 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java @@ -0,0 +1,110 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.common.annotation.OperationLog; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.KeyValVo; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.vincent.rsf.server.manager.service.AsnOrderItemService; +import com.vincent.rsf.server.system.controller.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@RestController +public class AsnOrderItemController extends BaseController { + + @Autowired + private AsnOrderItemService asnOrderItemService; + + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @PostMapping("/asnOrderItem/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class); + return R.ok().add(asnOrderItemService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @PostMapping("/asnOrderItem/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(asnOrderItemService.list()); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @PostMapping({"/asnOrderItem/many/{ids}", "/asnOrderItems/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(asnOrderItemService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @GetMapping("/asnOrderItem/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(asnOrderItemService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:save')") + @OperationLog("Create ASN鍗曟嵁") + @PostMapping("/asnOrderItem/save") + public R save(@RequestBody AsnOrderItem asnOrderItem) { + asnOrderItem.setCreateBy(getLoginUserId()); + asnOrderItem.setCreateTime(new Date()); + asnOrderItem.setUpdateBy(getLoginUserId()); + asnOrderItem.setUpdateTime(new Date()); + if (!asnOrderItemService.save(asnOrderItem)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(asnOrderItem); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:update')") + @OperationLog("Update ASN鍗曟嵁") + @PostMapping("/asnOrderItem/update") + public R update(@RequestBody AsnOrderItem asnOrderItem) { + asnOrderItem.setUpdateBy(getLoginUserId()); + asnOrderItem.setUpdateTime(new Date()); + if (!asnOrderItemService.updateById(asnOrderItem)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(asnOrderItem); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:remove')") + @OperationLog("Delete ASN鍗曟嵁") + @PostMapping("/asnOrderItem/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!asnOrderItemService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @PostMapping("/asnOrderItem/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<AsnOrderItem> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(AsnOrderItem::getId, condition); + } + asnOrderItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getId())) + ); + return R.ok().add(vos); + } + + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @PostMapping("/asnOrderItem/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(asnOrderItemService.list(), AsnOrderItem.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java index df029e2..6dd9f72 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java @@ -132,8 +132,6 @@ return R.ok(new PageResult().setRecords(matnrPage.getRecords()).setTotal(matnrPage.getTotal())); } - - @PreAuthorize("hasAuthority('manager:matnr:list')") @PostMapping("/matnr/export") public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { @@ -143,12 +141,11 @@ @PreAuthorize("hasAuthority('manager:matnr:save')") @ApiOperation(value = "excel琛ㄦ牸瀵煎叆鐗╂枡淇℃伅") @PostMapping("/matnr/import") - public R listImport(MultipartFile file) { - try { - ExcelImportResult<Matnr> objectExcelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), Matnr.class, ExcelUtil.getDefaultImportParams()); - } catch (Exception e) { - throw new RuntimeException(e); + public R listImport(@RequestParam MultipartFile file) throws Exception { + if (Objects.isNull(file)) { + throw new CoolException("鏂囦欢涓嶈兘涓虹┖锛侊紒"); } + matnrService.importExcels(file); return R.ok(); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java new file mode 100644 index 0000000..946f56a --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java @@ -0,0 +1,110 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.common.annotation.OperationLog; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.KeyValVo; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.manager.entity.Purchase; +import com.vincent.rsf.server.manager.service.PurchaseService; +import com.vincent.rsf.server.system.controller.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@RestController +public class PurchaseController extends BaseController { + + @Autowired + private PurchaseService purchaseService; + + @PreAuthorize("hasAuthority('manager:purchase:list')") + @PostMapping("/purchase/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<Purchase, BaseParam> pageParam = new PageParam<>(baseParam, Purchase.class); + return R.ok().add(purchaseService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:purchase:list')") + @PostMapping("/purchase/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(purchaseService.list()); + } + + @PreAuthorize("hasAuthority('manager:purchase:list')") + @PostMapping({"/purchase/many/{ids}", "/purchases/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(purchaseService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:purchase:list')") + @GetMapping("/purchase/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(purchaseService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:purchase:save')") + @OperationLog("Create ERP閲囪喘鍗�") + @PostMapping("/purchase/save") + public R save(@RequestBody Purchase purchase) { + purchase.setCreateBy(getLoginUserId()); + purchase.setCreateTime(new Date()); + purchase.setUpdateBy(getLoginUserId()); + purchase.setUpdateTime(new Date()); + if (!purchaseService.save(purchase)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(purchase); + } + + @PreAuthorize("hasAuthority('manager:purchase:update')") + @OperationLog("Update ERP閲囪喘鍗�") + @PostMapping("/purchase/update") + public R update(@RequestBody Purchase purchase) { + purchase.setUpdateBy(getLoginUserId()); + purchase.setUpdateTime(new Date()); + if (!purchaseService.updateById(purchase)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(purchase); + } + + @PreAuthorize("hasAuthority('manager:purchase:remove')") + @OperationLog("Delete ERP閲囪喘鍗�") + @PostMapping("/purchase/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!purchaseService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:purchase:list')") + @PostMapping("/purchase/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<Purchase> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(Purchase::getId, condition); + } + purchaseService.page(new Page<>(1, 30), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getId())) + ); + return R.ok().add(vos); + } + + @PreAuthorize("hasAuthority('manager:purchase:list')") + @PostMapping("/purchase/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(purchaseService.list(), Purchase.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java new file mode 100644 index 0000000..8cdfc2d --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java @@ -0,0 +1,110 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.common.annotation.OperationLog; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.KeyValVo; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.manager.entity.PurchaseItem; +import com.vincent.rsf.server.manager.service.PurchaseItemService; +import com.vincent.rsf.server.system.controller.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@RestController +public class PurchaseItemController extends BaseController { + + @Autowired + private PurchaseItemService purchaseItemService; + + @PreAuthorize("hasAuthority('manager:purchaseItem:list')") + @PostMapping("/purchaseItem/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<PurchaseItem, BaseParam> pageParam = new PageParam<>(baseParam, PurchaseItem.class); + return R.ok().add(purchaseItemService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:list')") + @PostMapping("/purchaseItem/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(purchaseItemService.list()); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:list')") + @PostMapping({"/purchaseItem/many/{ids}", "/purchaseItems/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(purchaseItemService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:list')") + @GetMapping("/purchaseItem/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(purchaseItemService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:save')") + @OperationLog("Create ERP閲囪喘鍗�") + @PostMapping("/purchaseItem/save") + public R save(@RequestBody PurchaseItem purchaseItem) { + purchaseItem.setCreateBy(getLoginUserId()); + purchaseItem.setCreateTime(new Date()); + purchaseItem.setUpdateBy(getLoginUserId()); + purchaseItem.setUpdateTime(new Date()); + if (!purchaseItemService.save(purchaseItem)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(purchaseItem); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:update')") + @OperationLog("Update ERP閲囪喘鍗�") + @PostMapping("/purchaseItem/update") + public R update(@RequestBody PurchaseItem purchaseItem) { + purchaseItem.setUpdateBy(getLoginUserId()); + purchaseItem.setUpdateTime(new Date()); + if (!purchaseItemService.updateById(purchaseItem)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(purchaseItem); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:remove')") + @OperationLog("Delete ERP閲囪喘鍗�") + @PostMapping("/purchaseItem/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!purchaseItemService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:list')") + @PostMapping("/purchaseItem/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<PurchaseItem> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(PurchaseItem::getId, condition); + } + purchaseItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getId())) + ); + return R.ok().add(vos); + } + + @PreAuthorize("hasAuthority('manager:purchaseItem:list')") + @PostMapping("/purchaseItem/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(purchaseItemService.list(), PurchaseItem.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java new file mode 100644 index 0000000..e07af37 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java @@ -0,0 +1,283 @@ +package com.vincent.rsf.server.manager.entity; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.server.system.service.UserService; +import com.vincent.rsf.server.system.entity.User; +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@TableName("man_asn_order") +public class AsnOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 缂栧彿 + */ + @ApiModelProperty(value= "缂栧彿") + private String code; + + /** + * PO鍗曞彿 + */ + @ApiModelProperty(value= "PO鍗曞彿") + private String poCode; + + /** + * PO鍗曟嵁鏍囪瘑 + */ + @ApiModelProperty(value= "PO鍗曟嵁鏍囪瘑") + private Long poId; + + /** + * 鍗曟嵁绫诲瀷 + */ + @ApiModelProperty(value= "鍗曟嵁绫诲瀷") + private String type; + + /** + * 涓氬姟绫诲瀷 + */ + @ApiModelProperty(value= "涓氬姟绫诲瀷") + private String wkType; + + /** + * 閫佽揣鏁伴噺 + */ + @ApiModelProperty(value= "閫佽揣鏁伴噺") + private Double anfme; + + /** + * 宸叉敹鏁伴噺 + */ + @ApiModelProperty(value= "宸叉敹鏁伴噺") + private Double qty; + + /** + * 鐗╂祦鍗曞彿 + */ + @ApiModelProperty(value= "鐗╂祦鍗曞彿") + private String logisNo; + + /** + * 棰勮鍒拌揪鏃堕棿 + */ + @ApiModelProperty(value= "棰勮鍒拌揪鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date arrTime; + + /** + * 閲婃斁鐘舵�� 0: 姝e父 1: 宸查噴鏀� + */ + @ApiModelProperty(value= "閲婃斁鐘舵�� 0: 姝e父 1: 宸查噴鏀� ") + private Short rleStatus; + + /** + * 鍚嶇О + */ + @ApiModelProperty(value= "鍚嶇О") + private String name; + + /** + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") + private Integer status; + + /** + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + */ + @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") + @TableLogic + private Integer deleted; + + /** + * 绉熸埛 + */ + @ApiModelProperty(value= "绉熸埛") + private Integer tenantId; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + public AsnOrder() {} + + public AsnOrder(String code,String poCode,Long poId,String type,String wkType,Double anfme,Double qty,String logisNo,Date arrTime,Short rleStatus,String name,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.code = code; + this.poCode = poCode; + this.poId = poId; + this.type = type; + this.wkType = wkType; + this.anfme = anfme; + this.qty = qty; + this.logisNo = logisNo; + this.arrTime = arrTime; + this.rleStatus = rleStatus; + this.name = name; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// AsnOrder asnOrder = new AsnOrder( +// null, // 缂栧彿 +// null, // PO鍗曞彿 +// null, // PO鍗曟嵁鏍囪瘑 +// null, // 鍗曟嵁绫诲瀷[闈炵┖] +// null, // 涓氬姟绫诲瀷[闈炵┖] +// null, // 閫佽揣鏁伴噺[闈炵┖] +// null, // 宸叉敹鏁伴噺[闈炵┖] +// null, // 鐗╂祦鍗曞彿 +// null, // 棰勮鍒拌揪鏃堕棿 +// null, // 閲婃斁鐘舵�乕闈炵┖] +// null, // 鍚嶇О +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿[闈炵┖] +// null // 澶囨敞 +// ); + + public String getArrTime$(){ + if (Cools.isEmpty(this.arrTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.arrTime); + } + + public String getRleStatus$(){ + if (null == this.rleStatus){ return null; } + switch (this.rleStatus){ + case 0: + return " 姝e父"; + case 1: + return " 宸查噴鏀�"; + default: + return String.valueOf(this.rleStatus); + } + } + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "鍐荤粨"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + + + public Boolean getStatusBool(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return true; + case 0: + return false; + default: + return null; + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java new file mode 100644 index 0000000..126d6ce --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java @@ -0,0 +1,301 @@ +package com.vincent.rsf.server.manager.entity; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; + +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.server.system.service.UserService; +import com.vincent.rsf.server.system.entity.User; +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@TableName("man_asn_order_item") +public class AsnOrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * ASN涓诲崟鏍囪瘑 + */ + @ApiModelProperty(value= "ASN涓诲崟鏍囪瘑") + private Long asnId; + + /** + * ASN鍗曞彿 + */ + @ApiModelProperty(value= "ASN鍗曞彿") + private String asnCode; + + /** + * PO鍗曟槑缁嗘爣璇� + */ + @ApiModelProperty(value= "PO鍗曟槑缁嗘爣璇�") + private String poDetlId; + + /** + * PO鍗曟槑缁嗙紪鐮� + */ + @ApiModelProperty(value= "PO鍗曟槑缁嗙紪鐮�") + private String poDetlCode; + + /** + * 鐗╂枡鏍囪瘑 + */ + @ApiModelProperty(value= "鐗╂枡鏍囪瘑") + private String matnrId; + + /** + * 鐗╂枡鍚嶇О + */ + @ApiModelProperty(value= "鐗╂枡鍚嶇О") + private String matnk; + + /** + * 閫佽揣鏁伴噺 + */ + @ApiModelProperty(value= "閫佽揣鏁伴噺") + private Double anfme; + + /** + * 搴撳瓨鍗曚綅 + */ + @ApiModelProperty(value= "搴撳瓨鍗曚綅") + private String stockUnit; + + /** + * 閲囪喘鏁伴噺 + */ + @ApiModelProperty(value= "閲囪喘鏁伴噺") + private Double purQty; + + /** + * 閲囪喘鍗曚綅 + */ + @ApiModelProperty(value= "閲囪喘鍗曚綅") + private String purUnit; + + /** + * 宸叉敹鏁伴噺 + */ + @ApiModelProperty(value= "宸叉敹鏁伴噺") + private Double qty; + + /** + * 渚涘簲鍟嗙紪鐮� + */ + @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�") + private String splrCode; + + /** + * 渚涘簲鍟嗗悕绉� + */ + @ApiModelProperty(value= "渚涘簲鍟嗗悕绉�") + private String splrName; + + /** + * 浜岀淮鐮� + */ + @ApiModelProperty(value= "浜岀淮鐮�") + private String qrcode; + + /** + * 鏉″舰鐮� + */ + @ApiModelProperty(value= "鏉″舰鐮�") + private String barcode; + + /** + * 鍖呰鍚嶇О + */ + @ApiModelProperty(value= "鍖呰鍚嶇О") + private String packName; + + /** + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") + private Integer status; + + /** + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + */ + @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") + @TableLogic + private Integer deleted; + + /** + * 绉熸埛 + */ + @ApiModelProperty(value= "绉熸埛") + private Integer tenantId; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + public AsnOrderItem() {} + + public AsnOrderItem(Long asnId,String asnCode,String poDetlId,String poDetlCode,String matnrId,String matnk,Double anfme,String stockUnit,Double purQty,String purUnit,Double qty,String splrCode,String splrName,String qrcode,String barcode,String packName,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.asnId = asnId; + this.asnCode = asnCode; + this.poDetlId = poDetlId; + this.poDetlCode = poDetlCode; + this.matnrId = matnrId; + this.matnk = matnk; + this.anfme = anfme; + this.stockUnit = stockUnit; + this.purQty = purQty; + this.purUnit = purUnit; + this.qty = qty; + this.splrCode = splrCode; + this.splrName = splrName; + this.qrcode = qrcode; + this.barcode = barcode; + this.packName = packName; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// AsnOrderItem asnOrderItem = new AsnOrderItem( +// null, // ASN涓诲崟鏍囪瘑 +// null, // ASN鍗曞彿 +// null, // PO鍗曟槑缁嗘爣璇� +// null, // PO鍗曟槑缁嗙紪鐮� +// null, // 鐗╂枡鏍囪瘑 +// null, // 鐗╂枡鍚嶇О +// null, // 閫佽揣鏁伴噺[闈炵┖] +// null, // 搴撳瓨鍗曚綅 +// null, // 閲囪喘鏁伴噺[闈炵┖] +// null, // 閲囪喘鍗曚綅 +// null, // 宸叉敹鏁伴噺 +// null, // 渚涘簲鍟嗙紪鐮� +// null, // 渚涘簲鍟嗗悕绉� +// null, // 浜岀淮鐮� +// null, // 鏉″舰鐮� +// null, // 鍖呰鍚嶇О +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿[闈炵┖] +// null // 澶囨敞 +// ); + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "鍐荤粨"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + + + public Boolean getStatusBool(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return true; + case 0: + return false; + default: + return null; + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java new file mode 100644 index 0000000..2f55f31 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java @@ -0,0 +1,296 @@ +package com.vincent.rsf.server.manager.entity; + +import java.text.SimpleDateFormat; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.text.SimpleDateFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.server.system.service.UserService; +import com.vincent.rsf.server.system.entity.User; +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("man_purchase") +public class Purchase implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 閲囪喘鍗曞彿 + */ + @ApiModelProperty(value= "閲囪喘鍗曞彿") + private String code; + + /** + * 鍗曟嵁绫诲瀷 + */ + @ApiModelProperty(value= "鍗曟嵁绫诲瀷") + private String type; + + /** + * 鍗曟嵁鏉ユ簮 + */ + @ApiModelProperty(value= "鍗曟嵁鏉ユ簮") + private String from; + + /** + * 棰勮鍒拌揪鏃堕棿 + */ + @ApiModelProperty(value= "棰勮鍒拌揪鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date preArr; + + /** + * 闇�姹傛暟閲� + */ + @ApiModelProperty(value= "闇�姹傛暟閲�") + private Double anfme; + + /** + * 宸叉敹璐ф暟閲� + */ + @ApiModelProperty(value= "宸叉敹璐ф暟閲�") + private Double qty; + + /** + * 宸叉敹璐ф暟閲� + */ + @ApiModelProperty(value= "宸叉敹璐ф暟閲�") + private Double workQty; + + /** + * 鏀惰揣閬撳彛 + */ + @ApiModelProperty(value= "鏀惰揣閬撳彛") + private String channel; + + /** + * erp鍗曞彿 + */ + @ApiModelProperty(value= "erp鍗曞彿") + private String erpCode; + + /** + * 璁″垝鏀惰揣鏃堕棿 + */ + @ApiModelProperty(value= "璁″垝鏀惰揣鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date startTime; + + /** + * 璁″垝鏀惰揣缁撴潫鏃堕棿 + */ + @ApiModelProperty(value= "璁″垝鏀惰揣缁撴潫鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date endTime; + + /** + * 椤圭洰缂栫爜 + */ + @ApiModelProperty(value= "椤圭洰缂栫爜") + private String project; + + /** + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") + private Integer status; + + /** + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + */ + @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") + @TableLogic + private Integer deleted; + + /** + * 绉熸埛 + */ + @ApiModelProperty(value= "绉熸埛") + private Integer tenantId; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + public Purchase() {} + + public Purchase(String code,String type,String from,Date preArr,Double anfme,Double qty,Double workQty,String channel,String erpCode,Date startTime,Date endTime,String project,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.code = code; + this.type = type; + this.from = from; + this.preArr = preArr; + this.anfme = anfme; + this.qty = qty; + this.workQty = workQty; + this.channel = channel; + this.erpCode = erpCode; + this.startTime = startTime; + this.endTime = endTime; + this.project = project; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// Purchase purchase = new Purchase( +// null, // 閲囪喘鍗曞彿 +// null, // 鍗曟嵁绫诲瀷[闈炵┖] +// null, // 鍗曟嵁鏉ユ簮[闈炵┖] +// null, // 棰勮鍒拌揪鏃堕棿 +// null, // 闇�姹傛暟閲廩闈炵┖] +// null, // 宸叉敹璐ф暟閲廩闈炵┖] +// null, // 宸叉敹璐ф暟閲廩闈炵┖] +// null, // 鏀惰揣閬撳彛 +// null, // erp鍗曞彿 +// null, // 璁″垝鏀惰揣鏃堕棿 +// null, // 璁″垝鏀惰揣缁撴潫鏃堕棿 +// null, // 椤圭洰缂栫爜 +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿[闈炵┖] +// null // 澶囨敞 +// ); + + public String getPreArr$(){ + if (Cools.isEmpty(this.preArr)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.preArr); + } + + public String getStartTime$(){ + if (Cools.isEmpty(this.startTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime); + } + + public String getEndTime$(){ + if (Cools.isEmpty(this.endTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime); + } + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "鍐荤粨"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + + + public Boolean getStatusBool(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return true; + case 0: + return false; + default: + return null; + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java new file mode 100644 index 0000000..5d54e83 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java @@ -0,0 +1,274 @@ +package com.vincent.rsf.server.manager.entity; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.server.system.service.UserService; +import com.vincent.rsf.server.system.entity.User; +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("man_purchase_item") +public class PurchaseItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 涓诲崟鏍囪瘑 + */ + @ApiModelProperty(value= "涓诲崟鏍囪瘑") + private Long purchaseId; + + /** + * erp琛屽彿 + */ + @ApiModelProperty(value= "erp琛屽彿") + private String erpId; + + /** + * 鐗╂枡缂栫爜 + */ + @ApiModelProperty(value= "鐗╂枡缂栫爜") + private String matnrCode; + + /** + * 鐗╂枡鍚嶇О + */ + @ApiModelProperty(value= "鐗╂枡鍚嶇О") + private String matnrName; + + /** + * 鍗曚綅 + */ + @ApiModelProperty(value= "鍗曚綅") + private String unit; + + /** + * 鏁伴噺 + */ + @ApiModelProperty(value= "鏁伴噺") + private Double anfme; + + /** + * 宸叉敹鏁伴噺 + */ + @ApiModelProperty(value= "宸叉敹鏁伴噺") + private Double qty; + + /** + * 鏍囧噯鍖呰 + */ + @ApiModelProperty(value= "鏍囧噯鍖呰") + private Double nomQty; + + /** + * ASN鍗曟嵁鏁伴噺 + */ + @ApiModelProperty(value= "ASN鍗曟嵁鏁伴噺") + private Double asnQty; + + /** + * 鏉$爜鎵撳嵃鏁伴噺 + */ + @ApiModelProperty(value= "鏉$爜鎵撳嵃鏁伴噺") + private Double printQty; + + /** + * 渚涘簲鍟嗗悕绉� + */ + @ApiModelProperty(value= "渚涘簲鍟嗗悕绉�") + private String pulrName; + + /** + * 渚涘簲鍟嗙紪鐮� + */ + @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�") + private String pulrCode; + + /** + * 渚涘簲鍟嗘壒娆� + */ + @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�") + private String pulrBatch; + + /** + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") + private Integer status; + + /** + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + */ + @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") + @TableLogic + private Integer deleted; + + /** + * 绉熸埛 + */ + @ApiModelProperty(value= "绉熸埛") + private Integer tenantId; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + public PurchaseItem() {} + + public PurchaseItem(Long purchaseId,String erpId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Double nomQty,Double asnQty,Double printQty,String pulrName,String pulrCode,String pulrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.purchaseId = purchaseId; + this.erpId = erpId; + this.matnrCode = matnrCode; + this.matnrName = matnrName; + this.unit = unit; + this.anfme = anfme; + this.qty = qty; + this.nomQty = nomQty; + this.asnQty = asnQty; + this.printQty = printQty; + this.pulrName = pulrName; + this.pulrCode = pulrCode; + this.pulrBatch = pulrBatch; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// PurchaseItem purchaseItem = new PurchaseItem( +// null, // 涓诲崟鏍囪瘑 +// null, // erp琛屽彿 +// null, // 鐗╂枡缂栫爜 +// null, // 鐗╂枡鍚嶇О +// null, // 鍗曚綅 +// null, // 鏁伴噺[闈炵┖] +// null, // 宸叉敹鏁伴噺[闈炵┖] +// null, // 鏍囧噯鍖呰[闈炵┖] +// null, // ASN鍗曟嵁鏁伴噺[闈炵┖] +// null, // 鏉$爜鎵撳嵃鏁伴噺[闈炵┖] +// null, // 渚涘簲鍟嗗悕绉� +// null, // 渚涘簲鍟嗙紪鐮� +// null, // 渚涘簲鍟嗘壒娆� +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿[闈炵┖] +// null // 澶囨敞 +// ); + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "鍐荤粨"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + + + public Boolean getStatusBool(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return true; + case 0: + return false; + default: + return null; + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderItemMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderItemMapper.java new file mode 100644 index 0000000..48b4de4 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderItemMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface AsnOrderItemMapper extends BaseMapper<AsnOrderItem> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java new file mode 100644 index 0000000..7c93cec --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.AsnOrder; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface AsnOrderMapper extends BaseMapper<AsnOrder> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseItemMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseItemMapper.java new file mode 100644 index 0000000..bf84152 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseItemMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.PurchaseItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface PurchaseItemMapper extends BaseMapper<PurchaseItem> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseMapper.java new file mode 100644 index 0000000..7a4c6ef --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/PurchaseMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.Purchase; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface PurchaseMapper extends BaseMapper<Purchase> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java new file mode 100644 index 0000000..0dbfd56 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java @@ -0,0 +1,8 @@ +package com.vincent.rsf.server.manager.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; + +public interface AsnOrderItemService extends IService<AsnOrderItem> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java new file mode 100644 index 0000000..54b0fe9 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java @@ -0,0 +1,8 @@ +package com.vincent.rsf.server.manager.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.server.manager.entity.AsnOrder; + +public interface AsnOrderService extends IService<AsnOrder> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java index df3fa5e..d17885a 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java @@ -2,7 +2,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.server.manager.entity.Matnr; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; public interface MatnrService extends IService<Matnr> { + void importExcels(MultipartFile file) throws Exception; } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java new file mode 100644 index 0000000..4a9042d --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java @@ -0,0 +1,8 @@ +package com.vincent.rsf.server.manager.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.server.manager.entity.PurchaseItem; + +public interface PurchaseItemService extends IService<PurchaseItem> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java new file mode 100644 index 0000000..a9ed4df --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java @@ -0,0 +1,8 @@ +package com.vincent.rsf.server.manager.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.server.manager.entity.Purchase; + +public interface PurchaseService extends IService<Purchase> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java new file mode 100644 index 0000000..4c611fe --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.vincent.rsf.server.manager.service.AsnOrderItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("asnOrderItemService") +public class AsnOrderItemServiceImpl extends ServiceImpl<AsnOrderItemMapper, AsnOrderItem> implements AsnOrderItemService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java new file mode 100644 index 0000000..8906fbf --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.AsnOrderMapper; +import com.vincent.rsf.server.manager.entity.AsnOrder; +import com.vincent.rsf.server.manager.service.AsnOrderService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("asnOrderService") +public class AsnOrderServiceImpl extends ServiceImpl<AsnOrderMapper, AsnOrder> implements AsnOrderService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java index e52ff03..8ffcc4f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java @@ -1,12 +1,34 @@ package com.vincent.rsf.server.manager.service.impl; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.manager.entity.excel.MatnrsTemplate; import com.vincent.rsf.server.manager.mapper.MatnrMapper; import com.vincent.rsf.server.manager.entity.Matnr; import com.vincent.rsf.server.manager.service.MatnrService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; @Service("matnrService") public class MatnrServiceImpl extends ServiceImpl<MatnrMapper, Matnr> implements MatnrService { + /** + * @author Ryan + * @description 鐗╂枡鏁版嵁瀵煎叆鎺ュ鐞嗗疄鐜� + * @throws + * @return + * @time 2025/3/3 13:08 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void importExcels(MultipartFile file) throws Exception { + //璇诲彇涓婁紶鏂囦欢鍐呭 + ExcelImportResult<MatnrsTemplate> result = ExcelImportUtil.importExcelMore(file.getInputStream(), MatnrsTemplate.class, ExcelUtil.getDefaultImportParams()); + //TODO 鐗╂枡鍐欏叆澶勭悊 + } } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java new file mode 100644 index 0000000..6b36072 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.PurchaseItemMapper; +import com.vincent.rsf.server.manager.entity.PurchaseItem; +import com.vincent.rsf.server.manager.service.PurchaseItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("purchaseItemService") +public class PurchaseItemServiceImpl extends ServiceImpl<PurchaseItemMapper, PurchaseItem> implements PurchaseItemService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java new file mode 100644 index 0000000..3a5edea --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.PurchaseMapper; +import com.vincent.rsf.server.manager.entity.Purchase; +import com.vincent.rsf.server.manager.service.PurchaseService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("purchaseService") +public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements PurchaseService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java new file mode 100644 index 0000000..dedd1a5 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java @@ -0,0 +1,94 @@ +package com.vincent.rsf.server.manager.utils; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.manager.entity.*; +import com.vincent.rsf.server.manager.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * @author Ryan + * @version 1.0 + * @title ScheduleJobs + * @description + * @create 2025/3/3 15:38 + */ +public class ScheduleJobs { + + @Autowired + private PurchaseService purchaseService; + @Autowired + private PurchaseItemService purchaseItemService; + + @Autowired + private AsnOrderService asnOrderService; + + @Autowired + private MatnrService matnrService; + + @Autowired + private AsnOrderItemService asnOrderItemService; + /** + * @author Ryan + * @description 鏍规嵁PO鍗曟嵁鐢熸垚ASN鍗� + * @throws + * @return + * @time 2025/3/3 15:44 + */ + @Scheduled(cron = "0/10 * * * * ? ") + @Transactional(rollbackFor = Exception.class) + public void genAsnOrder() { + //鑾峰彇鏈敓鎴怉SN鍗曟嵁 + List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().eq(Purchase::getStatus, 2)); + //閲囪喘鍗曚负绌猴紝鐩存帴璺冲嚭褰撳墠浠诲姟 + if (purchases.isEmpty()) { + return; + } + //鐢熸垚ASN鍗曟嵁 + purchases.forEach(purchase -> { + List<PurchaseItem> items = purchaseItemService.list(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getPurchaseId, purchase.getId())); + //瀛愬垪琛ㄤ负绌烘暟鎹紝鐩存帴璺冲嚭 + if (items.isEmpty()) { + return; + } + AsnOrder order = new AsnOrder(); + order.setAnfme(purchase.getAnfme()) + .setArrTime(purchase.getPreArr()) + .setQty(purchase.getQty()) + .setPoId(purchase.getId()) + .setPoCode(purchase.getCode()); + if (!asnOrderService.save(order)) { + throw new CoolException("ASN鍗曟嵁淇濆瓨澶辫触锛侊紒"); + } + List<AsnOrderItem> orderItems = new ArrayList<>(); + items.forEach(item -> { + AsnOrderItem orderItem = new AsnOrderItem(); + Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getId, item.getMatnrCode())); + orderItem.setAnfme(item.getAnfme()) + .setAsnId(purchase.getId()) + .setQty(item.getQty()) + .setSplrName(item.getPulrName()) + .setSplrCode(item.getPulrCode()) + .setMatnk(item.getMatnrName()) + .setPoDetlId(item.getId() + "") + .setPurQty(item.getAnfme()) + .setPurUnit(item.getUnit()) + .setMatnk(matnr.getName()) + .setMatnrId(matnr.getId() + ""); + orderItems.add(orderItem); + }); + if (!asnOrderItemService.saveBatch(orderItems)) { + throw new CoolException(("Asn鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒")); + } + + }); + } + +} diff --git a/rsf-server/src/main/java/purchase.sql b/rsf-server/src/main/java/purchase.sql new file mode 100644 index 0000000..6b17750 --- /dev/null +++ b/rsf-server/src/main/java/purchase.sql @@ -0,0 +1,33 @@ +-- save purchase record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.purchase', '0', '/manager/purchase', 'purchase', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query ERP閲囪喘鍗�', '', '1', 'manager:purchase:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create ERP閲囪喘鍗�', '', '1', 'manager:purchase:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update ERP閲囪喘鍗�', '', '1', 'manager:purchase:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete ERP閲囪喘鍗�', '', '1', 'manager:purchase:remove', '3', '1', '1'); + +-- locale menu name +purchase: 'Purchase', + +-- locale field +purchase: { + code: "code", + type: "type", + from: "from", + preArr: "preArr", + anfme: "anfme", + qty: "qty", + workQty: "workQty", + channel: "channel", + erpCode: "erpCode", + startTime: "startTime", + endTime: "endTime", + project: "project", +}, + +-- ResourceContent +import purchase from './purchase'; + +case 'purchase': + return purchase; diff --git a/rsf-server/src/main/java/purchaseItem.sql b/rsf-server/src/main/java/purchaseItem.sql new file mode 100644 index 0000000..25a5cc5 --- /dev/null +++ b/rsf-server/src/main/java/purchaseItem.sql @@ -0,0 +1,34 @@ +-- save purchaseItem record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.purchaseItem', '0', '/manager/purchaseItem', 'purchaseItem', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query ERP閲囪喘鍗�', '', '1', 'manager:purchaseItem:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create ERP閲囪喘鍗�', '', '1', 'manager:purchaseItem:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update ERP閲囪喘鍗�', '', '1', 'manager:purchaseItem:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete ERP閲囪喘鍗�', '', '1', 'manager:purchaseItem:remove', '3', '1', '1'); + +-- locale menu name +purchaseItem: 'PurchaseItem', + +-- locale field +purchaseItem: { + purchaseId: "purchaseId", + erpId: "erpId", + matnrCode: "matnrCode", + matnrName: "matnrName", + unit: "unit", + anfme: "anfme", + qty: "qty", + nomQty: "nomQty", + asnQty: "asnQty", + printQty: "printQty", + pulrName: "pulrName", + pulrCode: "pulrCode", + pulrBatch: "pulrBatch", +}, + +-- ResourceContent +import purchaseItem from './purchaseItem'; + +case 'purchaseItem': + return purchaseItem; diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml index f186121..d56421e 100644 --- a/rsf-server/src/main/resources/application.yml +++ b/rsf-server/src/main/resources/application.yml @@ -23,7 +23,7 @@ # global-config: # field-strategy: 0 configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true cache-enabled: true global-config: diff --git a/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml new file mode 100644 index 0000000..8aced59 --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/AsnOrderItemMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper"> + +</mapper> diff --git a/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml b/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml new file mode 100644 index 0000000..fac628a --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.AsnOrderMapper"> + +</mapper> diff --git a/rsf-server/src/main/resources/mapper/manager/PurchaseItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/PurchaseItemMapper.xml new file mode 100644 index 0000000..0da268d --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/PurchaseItemMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.PurchaseItemMapper"> + +</mapper> diff --git a/rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml b/rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml new file mode 100644 index 0000000..b1c92ce --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.PurchaseMapper"> + +</mapper> -- Gitblit v1.9.1