From 5ca031f91c59152392ee69974f2d986cd1e88fdb Mon Sep 17 00:00:00 2001 From: whycq <913841844@qq.com> Date: 星期一, 17 二月 2025 14:07:23 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- rsf-admin/src/page/matnr/MatnrEdit.jsx | 228 +++ rsf-admin/src/page/shipper/index.jsx | 18 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrGroupServiceImpl.java | 12 rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx | 75 + rsf-admin/src/page/shipper/ShipperPanel.jsx | 63 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/ShipperMapper.java | 12 rsf-server/src/main/java/shipper.sql | 23 rsf-server/src/main/resources/mapper/manager/MatnrGroupMapper.xml | 5 rsf-admin/src/page/matnrGroup/index.jsx | 18 rsf-admin/src/page/customer/CustomerList.jsx | 154 ++ rsf-admin/src/page/matnr/index.jsx | 18 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java | 6 rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx | 140 ++ rsf-admin/src/page/matnr/MatnrCreate.jsx | 252 +++ rsf-admin/src/page/matnr/MatnrPanel.jsx | 159 ++ rsf-admin/src/i18n/en.js | 36 rsf-admin/src/page/ResourceContent.js | 13 rsf-framework/src/main/java/com/vincent/rsf/framework/generators/ReactGenerator.java | 5 rsf-server/src/main/java/matnrGroup.sql | 24 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java | 110 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrGroupService.java | 8 rsf-admin/src/page/matnr/MatnrList.jsx | 205 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java | 360 +++++ rsf-server/src/main/resources/mapper/manager/MatnrMapper.xml | 5 rsf-admin/src/page/customer/CustomerPanel.jsx | 63 rsf-server/src/main/java/matnr.sql | 38 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CustomerMapper.java | 12 rsf-admin/src/page/customer/CustomerEdit.jsx | 97 + rsf-server/src/main/resources/mapper/manager/ShipperMapper.xml | 5 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Customer.java | 186 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CustomerController.java | 110 + rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java | 110 + rsf-server/src/main/java/customer.sql | 23 rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx | 112 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ShipperService.java | 8 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CustomerService.java | 8 rsf-admin/src/page/shipper/ShipperCreate.jsx | 125 + rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx | 158 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Shipper.java | 186 ++ rsf-admin/src/i18n/zh.js | 38 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ShipperServiceImpl.java | 12 rsf-server/src/main/resources/mapper/manager/CustomerMapper.xml | 5 rsf-admin/src/page/shipper/ShipperEdit.jsx | 97 + rsf-server/src/main/resources/application-dev.yml | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrMapper.java | 12 rsf-admin/src/page/customer/CustomerCreate.jsx | 125 + rsf-admin/src/page/customer/index.jsx | 18 rsf-admin/src/page/shipper/ShipperList.jsx | 154 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java | 8 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrGroupMapper.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java | 202 +++ rsf-server/src/main/resources/application-prod.yml | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CustomerServiceImpl.java | 12 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ShipperController.java | 110 + 55 files changed, 4,006 insertions(+), 7 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index c520538..4288984 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -120,6 +120,9 @@ config: 'Config', tenant: 'Tenant', userLogin: 'Token', + customer: 'Customer', + shipper: 'shipper', + matnr: 'Matnr', }, table: { field: { @@ -220,6 +223,39 @@ result: "result", userId: "user", }, + customer: { + uuid: "uuid", + name: "name", + }, + shipper: { + uuid: "uuid", + name: "name", + }, + matnr: { + uuid: "uuid", + shipperId: "shipperId", + name: "name", + code: "code", + groupId: "groupId", + erpCode: "erpCode", + spec: "spec", + model: "model", + weight: "weight", + color: "color", + size: "size", + desc: "desc", + nromNum: "nromNum", + unit: "unit", + purchaseUnit: "purchaseUnit", + stockUnit: "stockUnit", + stockLeval: "stockLeval", + isLabelMange: "isLabelMange", + }, + matnrGroup: { + name: "name", + code: "code", + parentId: "parentId", + }, } }, page: { diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 600b2a5..bc97763 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -120,6 +120,11 @@ config: '閰嶇疆鍙傛暟', tenant: '绉熸埛绠$悊', userLogin: '鐧诲綍鏃ュ織', + customer: '瀹㈡埛琛�', + shipper: '璐т富淇℃伅', + matnr: '鐗╂枡琛�', + matnrGroup: '鐗╂枡鍒嗙粍', + }, table: { field: { @@ -220,6 +225,39 @@ result: "result", userId: "鎿嶄綔鐢ㄦ埛", }, + customer: { + uuid: "缂栧彿", + name: "瀹㈡埛鍚�", + }, + shipper: { + uuid: "缂栫爜", + name: "鍚嶇О", + }, + matnr: { + uuid: "缂栫爜", + shipperId: "璐т富ID", + name: "鍚嶇О", + code: "鐗╂枡缂栫爜", + groupId: "鍒嗙被鏍囪瘑", + erpCode: "ERP缂栫爜", + spec: "瑙勬牸", + model: "鍨嬪彿", + weight: "閲嶉噺", + color: "棰滆壊", + size: "灏哄", + desc: "鎻忚堪", + nromNum: "鏍囧寘鏁伴噺", + unit: "鍗曚綅", + purchaseUnit: "閲囪喘鍗曚綅", + stockUnit: "搴撳瓨鍗曚綅", + stockLeval: "ABC鍒嗙被", + isLabelMange: "鏄惁鏍囩绠$悊", + }, + matnrGroup: { + name: "鍚嶇О", + code: "缂栫爜", + parentId: "鐖剁被鏍囪瘑", + }, } }, page: { diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js index 6718b19..0f54345 100644 --- a/rsf-admin/src/page/ResourceContent.js +++ b/rsf-admin/src/page/ResourceContent.js @@ -13,6 +13,11 @@ import menu from './system/menu' import user from './system/user'; import operationRecord from './system/operationRecord'; +import customer from './customer'; +import shipper from './shipper'; +import matnr from './matnr'; +import matnrGroup from './matnrGroup'; + const ResourceContent = (node) => { switch (node.component) { @@ -34,6 +39,14 @@ return user; case 'operationRecord': return operationRecord; + case 'customer': + return customer; + case 'shipper': + return shipper; + case 'matnr': + return matnr; + case 'matnrGroup': + return matnrGroup; default: return { list: ListGuesser, diff --git a/rsf-admin/src/page/customer/CustomerCreate.jsx b/rsf-admin/src/page/customer/CustomerCreate.jsx new file mode 100644 index 0000000..2d82ef9 --- /dev/null +++ b/rsf-admin/src/page/customer/CustomerCreate.jsx @@ -0,0 +1,125 @@ +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 CustomerCreate = (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.customer.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.customer.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 CustomerCreate; diff --git a/rsf-admin/src/page/customer/CustomerEdit.jsx b/rsf-admin/src/page/customer/CustomerEdit.jsx new file mode 100644 index 0000000..1419e8f --- /dev/null +++ b/rsf-admin/src/page/customer/CustomerEdit.jsx @@ -0,0 +1,97 @@ +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 CustomerEdit = () => { + 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.customer.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.customer.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 CustomerEdit; diff --git a/rsf-admin/src/page/customer/CustomerList.jsx b/rsf-admin/src/page/customer/CustomerList.jsx new file mode 100644 index 0000000..6973f5f --- /dev/null +++ b/rsf-admin/src/page/customer/CustomerList.jsx @@ -0,0 +1,154 @@ +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 CustomerCreate from "./CustomerCreate"; +import CustomerPanel from "./CustomerPanel"; +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="uuid" label="table.field.customer.uuid" />, + <TextInput source="name" label="table.field.customer.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 CustomerList = () => { + 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.customer"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='customer' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='customer' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <CustomerPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="uuid" label="table.field.customer.uuid" /> + <TextField source="name" label="table.field.customer.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> + <CustomerCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='Customer Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default CustomerList; diff --git a/rsf-admin/src/page/customer/CustomerPanel.jsx b/rsf-admin/src/page/customer/CustomerPanel.jsx new file mode 100644 index 0000000..d03f129 --- /dev/null +++ b/rsf-admin/src/page/customer/CustomerPanel.jsx @@ -0,0 +1,63 @@ +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 CustomerPanel = () => { + 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.customer.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.customer.uuid" + property={record.uuid} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.customer.name" + property={record.name} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default CustomerPanel; diff --git a/rsf-admin/src/page/customer/index.jsx b/rsf-admin/src/page/customer/index.jsx new file mode 100644 index 0000000..6ffbc95 --- /dev/null +++ b/rsf-admin/src/page/customer/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import CustomerList from "./CustomerList"; +import CustomerEdit from "./CustomerEdit"; + +export default { + list: CustomerList, + edit: CustomerEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.name}` + } +}; diff --git a/rsf-admin/src/page/matnr/MatnrCreate.jsx b/rsf-admin/src/page/matnr/MatnrCreate.jsx new file mode 100644 index 0000000..1c09682 --- /dev/null +++ b/rsf-admin/src/page/matnr/MatnrCreate.jsx @@ -0,0 +1,252 @@ +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 MatnrCreate = (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.matnr.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <ReferenceInput + source="shipperId" + reference="shipper" + > + <AutocompleteInput + label="table.field.matnr.shipperId" + optionText="name" + filterToQuery={(val) => ({ name: val })} + /> + </ReferenceInput> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.name" + source="name" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.code" + source="code" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <ReferenceInput + source="groupId" + reference="matnrGroup" + > + <AutocompleteInput + label="table.field.matnr.groupId" + optionText="code" + filterToQuery={(val) => ({ code: val })} + /> + </ReferenceInput> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.erpCode" + source="erpCode" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.spec" + source="spec" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.model" + source="model" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.matnr.weight" + source="weight" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.color" + source="color" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.size" + source="size" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.desc" + source="desc" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.matnr.nromNum" + source="nromNum" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.unit" + source="unit" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.purchaseUnit" + source="purchaseUnit" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnr.stockUnit" + source="stockUnit" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <SelectInput + label="table.field.matnr.stockLeval" + source="stockLeval" + choices={[ + { id: 0, name: ' A' }, + { id: 1, name: ' B' }, + { id: 2, name: 'C' }, + ]} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <SelectInput + label="table.field.matnr.isLabelMange" + source="isLabelMange" + choices={[ + { id: 0, name: ' 鍚�' }, + { id: 1, name: ' 鏄�' }, + ]} + /> + </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 MatnrCreate; diff --git a/rsf-admin/src/page/matnr/MatnrEdit.jsx b/rsf-admin/src/page/matnr/MatnrEdit.jsx new file mode 100644 index 0000000..12a61f2 --- /dev/null +++ b/rsf-admin/src/page/matnr/MatnrEdit.jsx @@ -0,0 +1,228 @@ +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 MatnrEdit = () => { + 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.matnr.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <ReferenceInput + source="shipperId" + reference="shipper" + perPage={REFERENCE_INPUT_PAGESIZE} + > + <AutocompleteInput + label="table.field.matnr.shipperId" + optionText="name" + filterToQuery={(val) => ({ name: val })} + /> + </ReferenceInput> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.name" + source="name" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.code" + source="code" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <ReferenceInput + source="groupId" + reference="matnrGroup" + perPage={REFERENCE_INPUT_PAGESIZE} + > + <AutocompleteInput + label="table.field.matnr.groupId" + optionText="code" + filterToQuery={(val) => ({ code: val })} + /> + </ReferenceInput> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.erpCode" + source="erpCode" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.spec" + source="spec" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.model" + source="model" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.matnr.weight" + source="weight" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.color" + source="color" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.size" + source="size" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.desc" + source="desc" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.matnr.nromNum" + source="nromNum" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.unit" + source="unit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.purchaseUnit" + source="purchaseUnit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnr.stockUnit" + source="stockUnit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <SelectInput + label="table.field.matnr.stockLeval" + source="stockLeval" + choices={[ + { id: 0, name: ' A' }, + { id: 1, name: ' B' }, + { id: 2, name: 'C' }, + ]} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <SelectInput + label="table.field.matnr.isLabelMange" + source="isLabelMange" + choices={[ + { id: 0, name: ' 鍚�' }, + { id: 1, name: ' 鏄�' }, + ]} + validate={required()} + /> + </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 MatnrEdit; diff --git a/rsf-admin/src/page/matnr/MatnrList.jsx b/rsf-admin/src/page/matnr/MatnrList.jsx new file mode 100644 index 0000000..fd4ef7b --- /dev/null +++ b/rsf-admin/src/page/matnr/MatnrList.jsx @@ -0,0 +1,205 @@ +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 MatnrCreate from "./MatnrCreate"; +import MatnrPanel from "./MatnrPanel"; +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="uuid" label="table.field.matnr.uuid" />, + <ReferenceInput source="shipperId" label="table.field.matnr.shipperId" reference="shipper"> + <AutocompleteInput label="table.field.matnr.shipperId" optionText="name" filterToQuery={(val) => ({ name: val })} /> + </ReferenceInput>, + <TextInput source="name" label="table.field.matnr.name" />, + <TextInput source="code" label="table.field.matnr.code" />, + <ReferenceInput source="groupId" label="table.field.matnr.groupId" reference="matnrGroup"> + <AutocompleteInput label="table.field.matnr.groupId" optionText="code" filterToQuery={(val) => ({ code: val })} /> + </ReferenceInput>, + <TextInput source="erpCode" label="table.field.matnr.erpCode" />, + <TextInput source="spec" label="table.field.matnr.spec" />, + <TextInput source="model" label="table.field.matnr.model" />, + <NumberInput source="weight" label="table.field.matnr.weight" />, + <TextInput source="color" label="table.field.matnr.color" />, + <TextInput source="size" label="table.field.matnr.size" />, + <TextInput source="desc" label="table.field.matnr.desc" />, + <NumberInput source="nromNum" label="table.field.matnr.nromNum" />, + <TextInput source="unit" label="table.field.matnr.unit" />, + <TextInput source="purchaseUnit" label="table.field.matnr.purchaseUnit" />, + <TextInput source="stockUnit" label="table.field.matnr.stockUnit" />, + <SelectInput source="stockLeval" label="table.field.matnr.stockLeval" + choices={[ + { id: 0, name: ' A' }, + { id: 1, name: ' B' }, + { id: 2, name: 'C' }, + ]} + />, + <SelectInput source="isLabelMange" label="table.field.matnr.isLabelMange" + choices={[ + { id: 0, name: ' 鍚�' }, + { id: 1, 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 MatnrList = () => { + 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.matnr"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='matnr' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='matnr' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <MatnrPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="uuid" label="table.field.matnr.uuid" /> + <ReferenceField source="shipperId" label="table.field.matnr.shipperId" reference="shipper" link={false} sortable={false}> + <TextField source="name" /> + </ReferenceField> + <TextField source="name" label="table.field.matnr.name" /> + <TextField source="code" label="table.field.matnr.code" /> + <ReferenceField source="groupId" label="table.field.matnr.groupId" reference="matnrGroup" link={false} sortable={false}> + <TextField source="code" /> + </ReferenceField> + <TextField source="erpCode" label="table.field.matnr.erpCode" /> + <TextField source="spec" label="table.field.matnr.spec" /> + <TextField source="model" label="table.field.matnr.model" /> + <NumberField source="weight" label="table.field.matnr.weight" /> + <TextField source="color" label="table.field.matnr.color" /> + <TextField source="size" label="table.field.matnr.size" /> + <TextField source="desc" label="table.field.matnr.desc" /> + <NumberField source="nromNum" label="table.field.matnr.nromNum" /> + <TextField source="unit" label="table.field.matnr.unit" /> + <TextField source="purchaseUnit" label="table.field.matnr.purchaseUnit" /> + <TextField source="stockUnit" label="table.field.matnr.stockUnit" /> + <TextField source="stockLeval$" label="table.field.matnr.stockLeval" sortable={false} /> + <TextField source="isLabelMange$" label="table.field.matnr.isLabelMange" sortable={false} /> + + <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> + <MatnrCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='Matnr Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default MatnrList; diff --git a/rsf-admin/src/page/matnr/MatnrPanel.jsx b/rsf-admin/src/page/matnr/MatnrPanel.jsx new file mode 100644 index 0000000..ead25e8 --- /dev/null +++ b/rsf-admin/src/page/matnr/MatnrPanel.jsx @@ -0,0 +1,159 @@ +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 MatnrPanel = () => { + 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.matnr.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.matnr.uuid" + property={record.uuid} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.shipperId" + property={record.shipperId$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.name" + property={record.name} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.code" + property={record.code} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.groupId" + property={record.groupId$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.erpCode" + property={record.erpCode} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.spec" + property={record.spec} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.model" + property={record.model} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.weight" + property={record.weight} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.color" + property={record.color} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.size" + property={record.size} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.desc" + property={record.desc} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.nromNum" + property={record.nromNum} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.unit" + property={record.unit} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.purchaseUnit" + property={record.purchaseUnit} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.stockUnit" + property={record.stockUnit} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.stockLeval" + property={record.stockLeval$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnr.isLabelMange" + property={record.isLabelMange$} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default MatnrPanel; diff --git a/rsf-admin/src/page/matnr/index.jsx b/rsf-admin/src/page/matnr/index.jsx new file mode 100644 index 0000000..e8fd238 --- /dev/null +++ b/rsf-admin/src/page/matnr/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import MatnrList from "./MatnrList"; +import MatnrEdit from "./MatnrEdit"; + +export default { + list: MatnrList, + edit: MatnrEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.name}` + } +}; diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx b/rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx new file mode 100644 index 0000000..a6f572a --- /dev/null +++ b/rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx @@ -0,0 +1,140 @@ +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 MatnrGroupCreate = (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.matnrGroup.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnrGroup.name" + source="name" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.matnrGroup.code" + source="code" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.matnrGroup.parentId" + source="parentId" + /> + </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 MatnrGroupCreate; diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx b/rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx new file mode 100644 index 0000000..d1e5ae5 --- /dev/null +++ b/rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx @@ -0,0 +1,112 @@ +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 MatnrGroupEdit = () => { + 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.matnrGroup.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnrGroup.name" + source="name" + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.matnrGroup.code" + source="code" + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.matnrGroup.parentId" + source="parentId" + /> + </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 MatnrGroupEdit; diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx b/rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx new file mode 100644 index 0000000..e103c74 --- /dev/null +++ b/rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx @@ -0,0 +1,158 @@ +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 MatnrGroupCreate from "./MatnrGroupCreate"; +import MatnrGroupPanel from "./MatnrGroupPanel"; +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="uuid" label="table.field.matnrGroup.uuid" />, + <TextInput source="name" label="table.field.matnrGroup.name" />, + <TextInput source="code" label="table.field.matnrGroup.code" />, + <NumberInput source="parentId" label="table.field.matnrGroup.parentId" />, + + <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 MatnrGroupList = () => { + 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.matnrGroup"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='matnrGroup' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='matnrGroup' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <MatnrGroupPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="uuid" label="table.field.matnrGroup.uuid" /> + <TextField source="name" label="table.field.matnrGroup.name" /> + <TextField source="code" label="table.field.matnrGroup.code" /> + <NumberField source="parentId" label="table.field.matnrGroup.parentId" /> + + <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> + <MatnrGroupCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='MatnrGroup Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default MatnrGroupList; diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx b/rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx new file mode 100644 index 0000000..20ca0d4 --- /dev/null +++ b/rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx @@ -0,0 +1,75 @@ +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 MatnrGroupPanel = () => { + 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.matnrGroup.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.matnrGroup.uuid" + property={record.uuid} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnrGroup.name" + property={record.name} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnrGroup.code" + property={record.code} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.matnrGroup.parentId" + property={record.parentId} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default MatnrGroupPanel; diff --git a/rsf-admin/src/page/matnrGroup/index.jsx b/rsf-admin/src/page/matnrGroup/index.jsx new file mode 100644 index 0000000..2c2d8ee --- /dev/null +++ b/rsf-admin/src/page/matnrGroup/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import MatnrGroupList from "./MatnrGroupList"; +import MatnrGroupEdit from "./MatnrGroupEdit"; + +export default { + list: MatnrGroupList, + edit: MatnrGroupEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.name}` + } +}; diff --git a/rsf-admin/src/page/shipper/ShipperCreate.jsx b/rsf-admin/src/page/shipper/ShipperCreate.jsx new file mode 100644 index 0000000..d4e07fd --- /dev/null +++ b/rsf-admin/src/page/shipper/ShipperCreate.jsx @@ -0,0 +1,125 @@ +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 ShipperCreate = (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.shipper.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.shipper.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 ShipperCreate; diff --git a/rsf-admin/src/page/shipper/ShipperEdit.jsx b/rsf-admin/src/page/shipper/ShipperEdit.jsx new file mode 100644 index 0000000..7b6b543 --- /dev/null +++ b/rsf-admin/src/page/shipper/ShipperEdit.jsx @@ -0,0 +1,97 @@ +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 ShipperEdit = () => { + 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.shipper.uuid" + source="uuid" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.shipper.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 ShipperEdit; diff --git a/rsf-admin/src/page/shipper/ShipperList.jsx b/rsf-admin/src/page/shipper/ShipperList.jsx new file mode 100644 index 0000000..f97ca55 --- /dev/null +++ b/rsf-admin/src/page/shipper/ShipperList.jsx @@ -0,0 +1,154 @@ +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 ShipperCreate from "./ShipperCreate"; +import ShipperPanel from "./ShipperPanel"; +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="uuid" label="table.field.shipper.uuid" />, + <TextInput source="name" label="table.field.shipper.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 ShipperList = () => { + 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.shipper"} + empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='shipper' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='shipper' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <ShipperPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="uuid" label="table.field.shipper.uuid" /> + <TextField source="name" label="table.field.shipper.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> + <ShipperCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='Shipper Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default ShipperList; diff --git a/rsf-admin/src/page/shipper/ShipperPanel.jsx b/rsf-admin/src/page/shipper/ShipperPanel.jsx new file mode 100644 index 0000000..1f57cf0 --- /dev/null +++ b/rsf-admin/src/page/shipper/ShipperPanel.jsx @@ -0,0 +1,63 @@ +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 ShipperPanel = () => { + 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.shipper.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.shipper.uuid" + property={record.uuid} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.shipper.name" + property={record.name} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default ShipperPanel; diff --git a/rsf-admin/src/page/shipper/index.jsx b/rsf-admin/src/page/shipper/index.jsx new file mode 100644 index 0000000..27015aa --- /dev/null +++ b/rsf-admin/src/page/shipper/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import ShipperList from "./ShipperList"; +import ShipperEdit from "./ShipperEdit"; + +export default { + list: ShipperList, + edit: ShipperEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.name}` + } +}; diff --git a/rsf-framework/src/main/java/com/vincent/rsf/framework/generators/ReactGenerator.java b/rsf-framework/src/main/java/com/vincent/rsf/framework/generators/ReactGenerator.java index d182491..ab7132d 100644 --- a/rsf-framework/src/main/java/com/vincent/rsf/framework/generators/ReactGenerator.java +++ b/rsf-framework/src/main/java/com/vincent/rsf/framework/generators/ReactGenerator.java @@ -259,7 +259,7 @@ switch (this.sqlOsType) { case MYSQL: Class.forName("com.mysql.jdbc.Driver").newInstance(); - conn = DriverManager.getConnection("jdbc:mysql://"+url+"?useUnicode=true&characterEncoding=UTF-8&useSSL=false", username, password); + conn = DriverManager.getConnection("jdbc:mysql://"+url, username, password); this.columns = getMysqlColumns(conn, table, true, sqlOsType); break; case SQL_SERVER: @@ -387,6 +387,9 @@ boolean setTableId = true; boolean setDateTimeFormat = true; for (Column column : columns){ +// System.out.println("------==========>"); +// System.out.println(column.getName()); +// System.out.println(column.getType()); if (column.getType().equals("Date")){ entityIm.append("import java.text.SimpleDateFormat;\n") .append("import java.util.Date;\n"); 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 db45876..78fd8e2 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 @@ -17,13 +17,13 @@ generator.sqlOsType = SqlOsType.MYSQL; generator.url="127.0.0.1:3306/rsf"; generator.username="root"; - generator.password="xltys1995"; + generator.password="34821015"; // generator.url="47.97.1.152:51433;databasename=jkasrs"; // generator.username="sa"; // generator.password="Zoneyung@zy56$"; - generator.table="man_customer"; - generator.tableDesc="Customer"; + generator.table="man_matnr_group"; + generator.tableDesc="鐗╂枡鍒嗙被琛�"; generator.packagePath="com.vincent.rsf.server.manager"; generator.build(); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CustomerController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CustomerController.java new file mode 100644 index 0000000..8359c27 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CustomerController.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.Customer; +import com.vincent.rsf.server.manager.service.CustomerService; +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 CustomerController extends BaseController { + + @Autowired + private CustomerService customerService; + + @PreAuthorize("hasAuthority('manager:customer:list')") + @PostMapping("/customer/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<Customer, BaseParam> pageParam = new PageParam<>(baseParam, Customer.class); + return R.ok().add(customerService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:customer:list')") + @PostMapping("/customer/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(customerService.list()); + } + + @PreAuthorize("hasAuthority('manager:customer:list')") + @PostMapping({"/customer/many/{ids}", "/customers/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(customerService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:customer:list')") + @GetMapping("/customer/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(customerService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:customer:save')") + @OperationLog("Create Customer") + @PostMapping("/customer/save") + public R save(@RequestBody Customer customer) { + customer.setCreateBy(getLoginUserId()); + customer.setCreateTime(new Date()); + customer.setUpdateBy(getLoginUserId()); + customer.setUpdateTime(new Date()); + if (!customerService.save(customer)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(customer); + } + + @PreAuthorize("hasAuthority('manager:customer:update')") + @OperationLog("Update Customer") + @PostMapping("/customer/update") + public R update(@RequestBody Customer customer) { + customer.setUpdateBy(getLoginUserId()); + customer.setUpdateTime(new Date()); + if (!customerService.updateById(customer)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(customer); + } + + @PreAuthorize("hasAuthority('manager:customer:remove')") + @OperationLog("Delete Customer") + @PostMapping("/customer/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!customerService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:customer:list')") + @PostMapping("/customer/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<Customer> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(Customer::getName, condition); + } + customerService.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:customer:list')") + @PostMapping("/customer/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(customerService.list(), Customer.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 new file mode 100644 index 0000000..24e5621 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.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.Matnr; +import com.vincent.rsf.server.manager.service.MatnrService; +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 MatnrController extends BaseController { + + @Autowired + private MatnrService matnrService; + + @PreAuthorize("hasAuthority('manager:matnr:list')") + @PostMapping("/matnr/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<Matnr, BaseParam> pageParam = new PageParam<>(baseParam, Matnr.class); + return R.ok().add(matnrService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:matnr:list')") + @PostMapping("/matnr/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(matnrService.list()); + } + + @PreAuthorize("hasAuthority('manager:matnr:list')") + @PostMapping({"/matnr/many/{ids}", "/matnrs/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(matnrService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:matnr:list')") + @GetMapping("/matnr/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(matnrService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:matnr:save')") + @OperationLog("Create 鐗╂枡琛�") + @PostMapping("/matnr/save") + public R save(@RequestBody Matnr matnr) { + matnr.setCreateBy(getLoginUserId()); + matnr.setCreateTime(new Date()); + matnr.setUpdateBy(getLoginUserId()); + matnr.setUpdateTime(new Date()); + if (!matnrService.save(matnr)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(matnr); + } + + @PreAuthorize("hasAuthority('manager:matnr:update')") + @OperationLog("Update 鐗╂枡琛�") + @PostMapping("/matnr/update") + public R update(@RequestBody Matnr matnr) { + matnr.setUpdateBy(getLoginUserId()); + matnr.setUpdateTime(new Date()); + if (!matnrService.updateById(matnr)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(matnr); + } + + @PreAuthorize("hasAuthority('manager:matnr:remove')") + @OperationLog("Delete 鐗╂枡琛�") + @PostMapping("/matnr/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!matnrService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:matnr:list')") + @PostMapping("/matnr/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<Matnr> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(Matnr::getName, condition); + } + matnrService.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:matnr:list')") + @PostMapping("/matnr/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(matnrService.list(), Matnr.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java new file mode 100644 index 0000000..85db6ef --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.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.MatnrGroup; +import com.vincent.rsf.server.manager.service.MatnrGroupService; +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 MatnrGroupController extends BaseController { + + @Autowired + private MatnrGroupService matnrGroupService; + + @PreAuthorize("hasAuthority('manager:matnrGroup:list')") + @PostMapping("/matnrGroup/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<MatnrGroup, BaseParam> pageParam = new PageParam<>(baseParam, MatnrGroup.class); + return R.ok().add(matnrGroupService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:list')") + @PostMapping("/matnrGroup/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(matnrGroupService.list()); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:list')") + @PostMapping({"/matnrGroup/many/{ids}", "/matnrGroups/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(matnrGroupService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:list')") + @GetMapping("/matnrGroup/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(matnrGroupService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:save')") + @OperationLog("Create 鐗╂枡鍒嗙被琛�") + @PostMapping("/matnrGroup/save") + public R save(@RequestBody MatnrGroup matnrGroup) { + matnrGroup.setCreateBy(getLoginUserId()); + matnrGroup.setCreateTime(new Date()); + matnrGroup.setUpdateBy(getLoginUserId()); + matnrGroup.setUpdateTime(new Date()); + if (!matnrGroupService.save(matnrGroup)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(matnrGroup); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:update')") + @OperationLog("Update 鐗╂枡鍒嗙被琛�") + @PostMapping("/matnrGroup/update") + public R update(@RequestBody MatnrGroup matnrGroup) { + matnrGroup.setUpdateBy(getLoginUserId()); + matnrGroup.setUpdateTime(new Date()); + if (!matnrGroupService.updateById(matnrGroup)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(matnrGroup); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:remove')") + @OperationLog("Delete 鐗╂枡鍒嗙被琛�") + @PostMapping("/matnrGroup/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!matnrGroupService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:matnrGroup:list')") + @PostMapping("/matnrGroup/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<MatnrGroup> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(MatnrGroup::getName, condition); + } + matnrGroupService.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:matnrGroup:list')") + @PostMapping("/matnrGroup/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(matnrGroupService.list(), MatnrGroup.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ShipperController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ShipperController.java new file mode 100644 index 0000000..1e140e1 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ShipperController.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.Shipper; +import com.vincent.rsf.server.manager.service.ShipperService; +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 ShipperController extends BaseController { + + @Autowired + private ShipperService shipperService; + + @PreAuthorize("hasAuthority('manager:shipper:list')") + @PostMapping("/shipper/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<Shipper, BaseParam> pageParam = new PageParam<>(baseParam, Shipper.class); + return R.ok().add(shipperService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:shipper:list')") + @PostMapping("/shipper/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(shipperService.list()); + } + + @PreAuthorize("hasAuthority('manager:shipper:list')") + @PostMapping({"/shipper/many/{ids}", "/shippers/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(shipperService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:shipper:list')") + @GetMapping("/shipper/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(shipperService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:shipper:save')") + @OperationLog("Create 璐т富淇℃伅琛�") + @PostMapping("/shipper/save") + public R save(@RequestBody Shipper shipper) { + shipper.setCreateBy(getLoginUserId()); + shipper.setCreateTime(new Date()); + shipper.setUpdateBy(getLoginUserId()); + shipper.setUpdateTime(new Date()); + if (!shipperService.save(shipper)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(shipper); + } + + @PreAuthorize("hasAuthority('manager:shipper:update')") + @OperationLog("Update 璐т富淇℃伅琛�") + @PostMapping("/shipper/update") + public R update(@RequestBody Shipper shipper) { + shipper.setUpdateBy(getLoginUserId()); + shipper.setUpdateTime(new Date()); + if (!shipperService.updateById(shipper)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(shipper); + } + + @PreAuthorize("hasAuthority('manager:shipper:remove')") + @OperationLog("Delete 璐т富淇℃伅琛�") + @PostMapping("/shipper/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!shipperService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:shipper:list')") + @PostMapping("/shipper/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<Shipper> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(Shipper::getName, condition); + } + shipperService.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:shipper:list')") + @PostMapping("/shipper/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(shipperService.list(), Shipper.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Customer.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Customer.java new file mode 100644 index 0000000..4e2bfda --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Customer.java @@ -0,0 +1,186 @@ +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_customer") +public class Customer 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 uuid; + + /** + * 鍚嶇О + */ + @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 Customer() {} + + public Customer(String uuid,String name,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.uuid = uuid; + 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; + } + +// Customer customer = new Customer( +// 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/Matnr.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java new file mode 100644 index 0000000..4d61ab1 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java @@ -0,0 +1,360 @@ +package com.vincent.rsf.server.manager.entity; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.vincent.rsf.server.manager.service.ShipperService; +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_matnr") +public class Matnr 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 uuid; + + /** + * 璐т富ID + */ + @ApiModelProperty(value= "璐т富ID") + private Long shipperId; + + /** + * 鍚嶇О + */ + @ApiModelProperty(value= "鍚嶇О") + private String name; + + /** + * 缂栫爜 + */ + @ApiModelProperty(value= "缂栫爜") + private String code; + + /** + * 鍒嗙粍ID + */ + @ApiModelProperty(value= "鍒嗙粍ID") + private Long groupId; + + /** + * ERP缂栫爜 + */ + @ApiModelProperty(value= "ERP缂栫爜") + private String erpCode; + + /** + * 瑙勬牸 + */ + @ApiModelProperty(value= "瑙勬牸") + private String spec; + + /** + * 鍨嬪彿 + */ + @ApiModelProperty(value= "鍨嬪彿") + private String model; + + /** + * 閲嶉噺 鍗曚綅榛樿kg + */ + @ApiModelProperty(value= "閲嶉噺 鍗曚綅榛樿kg") + private Double weight; + + /** + * 棰滆壊 + */ + @ApiModelProperty(value= "棰滆壊") + private String color; + + /** + * 闀�*瀹�*楂�(m) + */ + @ApiModelProperty(value= "闀�*瀹�*楂�(m)") + private String size; + + /** + * 鎻忚堪 + */ + @ApiModelProperty(value= "鎻忚堪") + private String desc; + + /** + * 鏍囧寘鏁伴噺 + */ + @ApiModelProperty(value= "鏍囧寘鏁伴噺") + private Integer nromNum; + + /** + * 鍗曚綅 + */ + @ApiModelProperty(value= "鍗曚綅") + private String unit; + + /** + * 閲囪喘鍗曚綅 + */ + @ApiModelProperty(value= "閲囪喘鍗曚綅") + private String purchaseUnit; + + /** + * 搴撲綅鍗曚綅 + */ + @ApiModelProperty(value= "搴撲綅鍗曚綅") + private String stockUnit; + + /** + * 鍑哄叆搴撲紭鍏堢骇鍒� 0: A 1: B 2: C + */ + @ApiModelProperty(value= "鍑哄叆搴撲紭鍏堢骇鍒� 0: A 1: B 2: C ") + private Short stockLeval; + + /** + * 鏄惁鏍囩绠$悊(*) 0: 鍚� 1: 鏄� + */ + @ApiModelProperty(value= "鏄惁鏍囩绠$悊(*) 0: 鍚� 1: 鏄� ") + private Short isLabelMange; + + /** + * 鐘舵�� 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 Matnr() {} + + public Matnr(String uuid,Long shipperId,String name,String code,Long groupId,String erpCode,String spec,String model,Double weight,String color,String size,String desc,Integer nromNum,String unit,String purchaseUnit,String stockUnit,Short stockLeval,Short isLabelMange,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.uuid = uuid; + this.shipperId = shipperId; + this.name = name; + this.code = code; + this.groupId = groupId; + this.erpCode = erpCode; + this.spec = spec; + this.model = model; + this.weight = weight; + this.color = color; + this.size = size; + this.desc = desc; + this.nromNum = nromNum; + this.unit = unit; + this.purchaseUnit = purchaseUnit; + this.stockUnit = stockUnit; + this.stockLeval = stockLeval; + this.isLabelMange = isLabelMange; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// Matnr matnr = new Matnr( +// null, // 鏍囪瘑 +// null, // 璐т富ID +// null, // 鍚嶇О +// null, // 缂栫爜 +// null, // 鍒嗙粍ID +// null, // ERP缂栫爜 +// null, // 瑙勬牸 +// null, // 鍨嬪彿 +// null, // 閲嶉噺 鍗曚綅榛樿kg +// null, // 棰滆壊 +// null, // 闀�*瀹�*楂�(m) +// null, // 鎻忚堪 +// null, // 鏍囧寘鏁伴噺 +// null, // 鍗曚綅 +// null, // 閲囪喘鍗曚綅 +// null, // 搴撲綅鍗曚綅 +// null, // 鍑哄叆搴撲紭鍏堢骇鍒玔闈炵┖] +// null, // 鏄惁鏍囩绠$悊(*)[闈炵┖] +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿 +// null // 澶囨敞 +// ); + + public String getShipperId$(){ + ShipperService service = SpringUtils.getBean(ShipperService.class); + Shipper shipper = service.getById(this.shipperId); + if (!Cools.isEmpty(shipper)){ + return String.valueOf(shipper.getName()); + } + return null; + } + +// public String getGroupId$(){ +// MatnrGroupService service = SpringUtils.getBean(MatnrGroupService.class); +// MatnrGroup matnrGroup = service.getById(this.groupId); +// if (!Cools.isEmpty(matnrGroup)){ +// return String.valueOf(matnrGroup.getCode()); +// } +// return null; +// } + + public String getStockLeval$(){ + if (null == this.stockLeval){ return null; } + switch (this.stockLeval){ + case 0: + return " A"; + case 1: + return " B"; + case 2: + return "C"; + default: + return String.valueOf(this.stockLeval); + } + } + + public String getIsLabelMange$(){ + if (null == this.isLabelMange){ return null; } + switch (this.isLabelMange){ + case 0: + return " 鍚�"; + case 1: + return " 鏄�"; + default: + return String.valueOf(this.isLabelMange); + } + } + + 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/MatnrGroup.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java new file mode 100644 index 0000000..5800467 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java @@ -0,0 +1,202 @@ +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_matnr_group") +public class MatnrGroup 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 uuid; + + /** + * 鍚嶇О + */ + @ApiModelProperty(value= "鍚嶇О") + private String name; + + /** + * 鐗╂枡缂栫爜 + */ + @ApiModelProperty(value= "鐗╂枡缂栫爜") + private String code; + + /** + * 涓婄骇鍒嗙被ID + */ + @ApiModelProperty(value= "涓婄骇鍒嗙被ID") + private Long parentId; + + /** + * 鐘舵�� 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 MatnrGroup() {} + + public MatnrGroup(String uuid,String name,String code,Long parentId,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.uuid = uuid; + this.name = name; + this.code = code; + this.parentId = parentId; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// MatnrGroup matnrGroup = new MatnrGroup( +// null, // 鏍囪瘑 +// null, // 鍚嶇О[闈炵┖] +// null, // 鐗╂枡缂栫爜[闈炵┖] +// null, // 涓婄骇鍒嗙被ID +// 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/Shipper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Shipper.java new file mode 100644 index 0000000..0dd968e --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Shipper.java @@ -0,0 +1,186 @@ +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_shipper") +public class Shipper 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 uuid; + + /** + * 鍚嶇О + */ + @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 Shipper() {} + + public Shipper(String uuid,String name,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.uuid = uuid; + 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; + } + +// Shipper shipper = new Shipper( +// 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/CustomerMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CustomerMapper.java new file mode 100644 index 0000000..b8d3a78 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CustomerMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.Customer; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface CustomerMapper extends BaseMapper<Customer> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrGroupMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrGroupMapper.java new file mode 100644 index 0000000..36325b2 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrGroupMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.MatnrGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface MatnrGroupMapper extends BaseMapper<MatnrGroup> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrMapper.java new file mode 100644 index 0000000..72b237c --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/MatnrMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.Matnr; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface MatnrMapper extends BaseMapper<Matnr> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/ShipperMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/ShipperMapper.java new file mode 100644 index 0000000..4e71b15 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/ShipperMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.Shipper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface ShipperMapper extends BaseMapper<Shipper> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CustomerService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CustomerService.java new file mode 100644 index 0000000..a596529 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CustomerService.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.Customer; + +public interface CustomerService extends IService<Customer> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrGroupService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrGroupService.java new file mode 100644 index 0000000..f399b9e --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrGroupService.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.MatnrGroup; + +public interface MatnrGroupService extends IService<MatnrGroup> { + +} 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 new file mode 100644 index 0000000..df3fa5e --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.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.Matnr; + +public interface MatnrService extends IService<Matnr> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ShipperService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ShipperService.java new file mode 100644 index 0000000..731324c --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ShipperService.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.Shipper; + +public interface ShipperService extends IService<Shipper> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CustomerServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CustomerServiceImpl.java new file mode 100644 index 0000000..9baee24 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CustomerServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.CustomerMapper; +import com.vincent.rsf.server.manager.entity.Customer; +import com.vincent.rsf.server.manager.service.CustomerService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("customerService") +public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements CustomerService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrGroupServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrGroupServiceImpl.java new file mode 100644 index 0000000..fb2b943 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrGroupServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.MatnrGroupMapper; +import com.vincent.rsf.server.manager.entity.MatnrGroup; +import com.vincent.rsf.server.manager.service.MatnrGroupService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("matnrGroupService") +public class MatnrGroupServiceImpl extends ServiceImpl<MatnrGroupMapper, MatnrGroup> implements MatnrGroupService { + +} 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 new file mode 100644 index 0000000..e52ff03 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +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; + +@Service("matnrService") +public class MatnrServiceImpl extends ServiceImpl<MatnrMapper, Matnr> implements MatnrService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ShipperServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ShipperServiceImpl.java new file mode 100644 index 0000000..949098d --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ShipperServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.ShipperMapper; +import com.vincent.rsf.server.manager.entity.Shipper; +import com.vincent.rsf.server.manager.service.ShipperService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("shipperService") +public class ShipperServiceImpl extends ServiceImpl<ShipperMapper, Shipper> implements ShipperService { + +} diff --git a/rsf-server/src/main/java/customer.sql b/rsf-server/src/main/java/customer.sql new file mode 100644 index 0000000..6cad221 --- /dev/null +++ b/rsf-server/src/main/java/customer.sql @@ -0,0 +1,23 @@ +-- save customer record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.customer', '0', '/manager/customer', 'customer', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀹㈡埛琛�', '47', '1', 'manager:customer:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀹㈡埛琛�', '47', '1', 'manager:customer:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀹㈡埛琛�', '47', '1', 'manager:customer:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀹㈡埛琛�', '47', '1', 'manager:customer:remove', '3', '1', '1'); + +-- locale menu name +customer: 'Customer', + +-- locale field +customer: { + uuid: "uuid", + name: "name", +}, + +-- ResourceContent +import customer from './customer'; + +case 'customer': + return customer; diff --git a/rsf-server/src/main/java/matnr.sql b/rsf-server/src/main/java/matnr.sql new file mode 100644 index 0000000..281034f --- /dev/null +++ b/rsf-server/src/main/java/matnr.sql @@ -0,0 +1,38 @@ +-- save matnr record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.matnr', '0', '/manager/matnr', 'matnr', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 鐗╂枡琛�', '57', '1', 'manager:matnr:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 鐗╂枡琛�', '57', '1', 'manager:matnr:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 鐗╂枡琛�', '57', '1', 'manager:matnr:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 鐗╂枡琛�', '57', '1', 'manager:matnr:remove', '3', '1', '1'); + +-- locale menu name +matnr: 'Matnr', + +-- locale field +matnr: { + shipperId: "shipperId", + name: "name", + code: "code", + groupId: "groupId", + erpCode: "erpCode", + spec: "spec", + model: "model", + weight: "weight", + color: "color", + size: "size", + desc: "desc", + nromNum: "nromNum", + unit: "unit", + purchaseUnit: "purchaseUnit", + stockUnit: "stockUnit", + stockLeval: "stockLeval", + isLabelMange: "isLabelMange", +}, + +-- ResourceContent +import matnr from './matnr'; + +case 'matnr': + return matnr; diff --git a/rsf-server/src/main/java/matnrGroup.sql b/rsf-server/src/main/java/matnrGroup.sql new file mode 100644 index 0000000..205fea2 --- /dev/null +++ b/rsf-server/src/main/java/matnrGroup.sql @@ -0,0 +1,24 @@ +-- save matnrGroup record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.matnrGroup', '0', '/manager/matnrGroup', 'matnrGroup', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 鐗╂枡鍒嗙被琛�', '62', '1', 'manager:matnrGroup:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 鐗╂枡鍒嗙被琛�', '62', '1', 'manager:matnrGroup:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 鐗╂枡鍒嗙被琛�', '62', '1', 'manager:matnrGroup:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 鐗╂枡鍒嗙被琛�', '62', '1', 'manager:matnrGroup:remove', '3', '1', '1'); + +-- locale menu name +matnrGroup: 'MatnrGroup', + +-- locale field +matnrGroup: { + name: "name", + code: "code", + parentId: "parentId", +}, + +-- ResourceContent +import matnrGroup from './matnrGroup'; + +case 'matnrGroup': + return matnrGroup; diff --git a/rsf-server/src/main/java/shipper.sql b/rsf-server/src/main/java/shipper.sql new file mode 100644 index 0000000..28b529c --- /dev/null +++ b/rsf-server/src/main/java/shipper.sql @@ -0,0 +1,23 @@ +-- save shipper record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.shipper', '0', '/manager/shipper', 'shipper', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 璐т富淇℃伅琛�', '52', '1', 'manager:shipper:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 璐т富淇℃伅琛�', '52', '1', 'manager:shipper:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 璐т富淇℃伅琛�', '52', '1', 'manager:shipper:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 璐т富淇℃伅琛�', '52', '1', 'manager:shipper:remove', '3', '1', '1'); + +-- locale menu name +shipper: 'Shipper', + +-- locale field +shipper: { + uuid: "uuid", + name: "name", +}, + +-- ResourceContent +import shipper from './shipper'; + +case 'shipper': + return shipper; diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml index 9259007..0ab8ed2 100644 --- a/rsf-server/src/main/resources/application-dev.yml +++ b/rsf-server/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: root - password: xltys1995 + password: 34821015 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 diff --git a/rsf-server/src/main/resources/application-prod.yml b/rsf-server/src/main/resources/application-prod.yml index 8ca151c..639421d 100644 --- a/rsf-server/src/main/resources/application-prod.yml +++ b/rsf-server/src/main/resources/application-prod.yml @@ -10,9 +10,9 @@ static-path-pattern: /** datasource: driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai + url: jdbc:mysql://127.0.0.1:3306/rsf username: root - password: xltys1995 + password: 34821015 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 diff --git a/rsf-server/src/main/resources/mapper/manager/CustomerMapper.xml b/rsf-server/src/main/resources/mapper/manager/CustomerMapper.xml new file mode 100644 index 0000000..47107c5 --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/CustomerMapper.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.CustomerMapper"> + +</mapper> diff --git a/rsf-server/src/main/resources/mapper/manager/MatnrGroupMapper.xml b/rsf-server/src/main/resources/mapper/manager/MatnrGroupMapper.xml new file mode 100644 index 0000000..ea5ae7a --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/MatnrGroupMapper.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.MatnrGroupMapper"> + +</mapper> diff --git a/rsf-server/src/main/resources/mapper/manager/MatnrMapper.xml b/rsf-server/src/main/resources/mapper/manager/MatnrMapper.xml new file mode 100644 index 0000000..2ff6899 --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/MatnrMapper.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.MatnrMapper"> + +</mapper> diff --git a/rsf-server/src/main/resources/mapper/manager/ShipperMapper.xml b/rsf-server/src/main/resources/mapper/manager/ShipperMapper.xml new file mode 100644 index 0000000..8e703b9 --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/ShipperMapper.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.ShipperMapper"> + +</mapper> -- Gitblit v1.9.1