skyouc
3 天以前 ed08477d187fe143566c9baeeef365b1eacbdfd4
新增调拔单明细功能
4个文件已修改
10个文件已添加
1251 ■■■■ 已修改文件
rsf-admin/src/i18n/en.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferEdit.jsx 291 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferItemEdit.jsx 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferItemList.jsx 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferItemController.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferItemMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferItemService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/transfer.sql 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/transferItem.sql 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/mapper/manager/TransferItemMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -670,6 +670,27 @@
                tarAreaName: "tarAreaName",
            },
            transferItem: {
                transferId: "transferId",
                transferCode: "transferCode",
                matnrId: "matnrId",
                maktx: "maktx",
                matnrCode: "matnrCode",
                unit: "unit",
                anfme: "anfme",
                qty: "qty",
                workQty: "workQty",
                batch: "batch",
                splrId: "splrId",
                spec: "spec",
                model: "model",
                fieldsIndex: "fieldsIndex",
                platItemId: "platItemId",
                platOrderCode: "platOrderCode",
                platWorkCode: "platWorkCode",
                projectCode: "projectCode",
            },
            checkDiffItem: {
                checkId: "checkId",
                orderCode: "orderCode",
rsf-admin/src/i18n/zh.js
@@ -700,6 +700,28 @@
                tarAreaId: "目标库区",
                tarAreaName: "目标库区",
            },
            transferItem: {
                transferId: "调拔单ID",
                transferCode: "调拔单",
                matnrId: "物料ID",
                maktx: "物料名称",
                matnrCode: "物料编码",
                unit: "单位",
                anfme: "数量",
                qty: "完成数量",
                workQty: "执行数量",
                batch: "批次",
                splrId: "供应商",
                spec: "规格",
                model: "型号",
                fieldsIndex: "字段索引",
                platOrderCode: "客单号",
                platWorkCode: "工单号",
                projectCode: "项目单号",
            },
            checkDiffItem: {
                checkId: "盘点单ID",
                orderCode: "盘点单号",
rsf-admin/src/page/orders/transfer/TransferEdit.jsx
@@ -1,171 +1,152 @@
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';
  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.js';
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting.js';
import { Stack, Grid, Box, Typography } from "@mui/material";
import * as Common from "@/utils/common.js";
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from "@/config/setting.js";
import EditBaseAside from "../../components/EditBaseAside.jsx";
import CustomerTopToolBar from "../../components/EditTopToolBar.jsx";
import MemoInput from "../../components/MemoInput.jsx";
import StatusSelectInput from "../../components/StatusSelectInput.jsx";
import TransferItemList from "./TransferItemList.jsx";
const FormToolbar = () => {
    const { getValues } = useFormContext();
  const { getValues } = useFormContext();
    return (
        <Toolbar sx={{ justifyContent: 'space-between' }}>
            <SaveButton />
            <DeleteButton mutationMode="optimistic" />
        </Toolbar>
    )
}
  return (
    <Toolbar sx={{ justifyContent: "space-between" }}>
      <SaveButton />
      <DeleteButton mutationMode="optimistic" />
    </Toolbar>
  );
};
const TransferEdit = () => {
    const translate = useTranslate();
  const translate = useTranslate();
    return (
        <Edit
            redirect="list"
            mutationMode={EDIT_MODE}
            actions={<CustomerTopToolBar />}
            aside={<EditBaseAside />}
  return (
    <>
      <Edit
        redirect="list"
        mutationMode={EDIT_MODE}
        actions={<CustomerTopToolBar />}
        aside={<EditBaseAside />}
      >
        <SimpleForm
          shouldUnregister
          warnWhenUnsavedChanges
          toolbar={<FormToolbar />}
          mode="onTouched"
          defaultValues={{}}
          // validate={(values) => { }}
        >
            <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.transfer.code"
                                source="code"
                                parse={v => v}
                                autoFocus
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transfer.type"
                                source="type"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <SelectInput
                                label="table.field.transfer.source"
                                source="source"
                                choices={[
                                    { id: 1, name: 'ERP系统' },
                                    { id:  2, name: 'WMS系统生成' },
                                    { id:  3, name: 'EXCEL导入 ' },
                                    { id:  4, name: 'QMS系统' },
                                ]}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <SelectInput
                                label="table.field.transfer.exceStatus"
                                source="exceStatus"
                                choices={[
                                    { id: 0, name: '未执行' },
                                    { id:  1, name: '执行中' },
                                    { id:  2, name: '执行完成' },
                                ]}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transfer.orgWareId"
                                source="orgWareId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transfer.orgWareName"
                                source="orgWareName"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transfer.tarWareId"
                                source="tarWareId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transfer.tarWareName"
                                source="tarWareName"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transfer.orgAreaId"
                                source="orgAreaId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transfer.orgAreaName"
                                source="orgAreaName"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transfer.tarAreaId"
                                source="tarAreaId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transfer.tarAreaName"
                                source="tarAreaName"
                                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 >
    )
}
          <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.transfer.code"
                  source="code"
                  parse={(v) => v}
                  autoFocus
                />
              </Stack>
              <Stack direction="row" gap={2}>
                <NumberInput label="table.field.transfer.type" source="type" />
                <SelectInput
                  label="table.field.transfer.source"
                  source="source"
                  choices={[
                    { id: 1, name: "ERP系统" },
                    { id: 2, name: "WMS系统生成" },
                    { id: 3, name: "EXCEL导入 " },
                    { id: 4, name: "QMS系统" },
                  ]}
                />
                <SelectInput
                  label="table.field.transfer.exceStatus"
                  source="exceStatus"
                  choices={[
                    { id: 0, name: "未执行" },
                    { id: 1, name: "执行中" },
                    { id: 2, name: "执行完成" },
                  ]}
                />
              </Stack>
              <Stack direction="row" gap={2}>
                <NumberInput
                  label="table.field.transfer.orgWareId"
                  source="orgWareId"
                />
                <TextInput
                  label="table.field.transfer.orgWareName"
                  source="orgWareName"
                  parse={(v) => v}
                />
                <NumberInput
                  label="table.field.transfer.tarWareId"
                  source="tarWareId"
                />
                <TextInput
                  label="table.field.transfer.tarWareName"
                  source="tarWareName"
                  parse={(v) => v}
                />
              </Stack>
              <Stack direction="row" gap={2}>
                <NumberInput
                  label="table.field.transfer.orgAreaId"
                  source="orgAreaId"
                />
                <TextInput
                  label="table.field.transfer.orgAreaName"
                  source="orgAreaName"
                  parse={(v) => v}
                />
                <NumberInput
                  label="table.field.transfer.tarAreaId"
                  source="tarAreaId"
                />
                <TextInput
                  label="table.field.transfer.tarAreaName"
                  source="tarAreaName"
                  parse={(v) => v}
                />
              </Stack>
            </Grid>
          </Grid>
        </SimpleForm>
      </Edit>
      <TransferItemList />
    </>
  );
};
export default TransferEdit;
rsf-admin/src/page/orders/transfer/TransferItemEdit.jsx
New file
@@ -0,0 +1,203 @@
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 TransferItemEdit = () => {
    const translate = useTranslate();
    return (
        <Edit
            redirect="list"
            mutationMode={EDIT_MODE}
            actions={<CustomerTopToolBar />}
            aside={<EditBaseAside />}
        >
            <SimpleForm
                shouldUnregister
                warnWhenUnsavedChanges
                toolbar={<FormToolbar />}
                mode="onTouched"
                defaultValues={{}}
            // validate={(values) => { }}
            >
                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
                    <Grid item xs={12} md={8}>
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.main')}
                        </Typography>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transferItem.transferId"
                                source="transferId"
                                autoFocus
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.transferCode"
                                source="transferCode"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transferItem.matnrId"
                                source="matnrId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.maktx"
                                source="maktx"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.matnrCode"
                                source="matnrCode"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.unit"
                                source="unit"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transferItem.anfme"
                                source="anfme"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transferItem.qty"
                                source="qty"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transferItem.workQty"
                                source="workQty"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.batch"
                                source="batch"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.transferItem.splrId"
                                source="splrId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.spec"
                                source="spec"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.model"
                                source="model"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.fieldsIndex"
                                source="fieldsIndex"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.platItemId"
                                source="platItemId"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.platOrderCode"
                                source="platOrderCode"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.platWorkCode"
                                source="platWorkCode"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.transferItem.projectCode"
                                source="projectCode"
                                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 TransferItemEdit;
rsf-admin/src/page/orders/transfer/TransferItemList.jsx
New file
@@ -0,0 +1,177 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import EmptyData from "../../components/EmptyData";
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
import PageDrawer from "../../components/PageDrawer";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
    <NumberInput source="transferId" label="table.field.transferItem.transferId" />,
    <TextInput source="transferCode" label="table.field.transferItem.transferCode" />,
    <NumberInput source="matnrId" label="table.field.transferItem.matnrId" />,
    <TextInput source="maktx" label="table.field.transferItem.maktx" />,
    <TextInput source="matnrCode" label="table.field.transferItem.matnrCode" />,
    <TextInput source="unit" label="table.field.transferItem.unit" />,
    <NumberInput source="anfme" label="table.field.transferItem.anfme" />,
    <NumberInput source="qty" label="table.field.transferItem.qty" />,
    <NumberInput source="workQty" label="table.field.transferItem.workQty" />,
    <TextInput source="batch" label="table.field.transferItem.batch" />,
    <NumberInput source="splrId" label="table.field.transferItem.splrId" />,
    <TextInput source="spec" label="table.field.transferItem.spec" />,
    <TextInput source="model" label="table.field.transferItem.model" />,
    <TextInput source="fieldsIndex" label="table.field.transferItem.fieldsIndex" />,
    <TextInput source="platItemId" label="table.field.transferItem.platItemId" />,
    <TextInput source="platOrderCode" label="table.field.transferItem.platOrderCode" />,
    <TextInput source="platWorkCode" label="table.field.transferItem.platWorkCode" />,
    <TextInput source="projectCode" label="table.field.transferItem.projectCode" />,
    <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 TransferItemList = () => {
    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.transferItem"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='transferItem' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='transferItem'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={false}
                    expandSingle={false}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    <NumberField source="transferId" label="table.field.transferItem.transferId" />
                    <TextField source="transferCode" label="table.field.transferItem.transferCode" />
                    <NumberField source="matnrId" label="table.field.transferItem.matnrId" />
                    <TextField source="maktx" label="table.field.transferItem.maktx" />
                    <TextField source="matnrCode" label="table.field.transferItem.matnrCode" />
                    <TextField source="unit" label="table.field.transferItem.unit" />
                    <NumberField source="anfme" label="table.field.transferItem.anfme" />
                    <NumberField source="qty" label="table.field.transferItem.qty" />
                    <NumberField source="workQty" label="table.field.transferItem.workQty" />
                    <TextField source="batch" label="table.field.transferItem.batch" />
                    <NumberField source="splrId" label="table.field.transferItem.splrId" />
                    <TextField source="spec" label="table.field.transferItem.spec" />
                    <TextField source="model" label="table.field.transferItem.model" />
                    <TextField source="fieldsIndex" label="table.field.transferItem.fieldsIndex" />
                    <TextField source="platItemId" label="table.field.transferItem.platItemId" />
                    <TextField source="platOrderCode" label="table.field.transferItem.platOrderCode" />
                    <TextField source="platWorkCode" label="table.field.transferItem.platWorkCode" />
                    <TextField source="projectCode" label="table.field.transferItem.projectCode" />
                    <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>
            <PageDrawer
                title='TransferItem Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
export default TransferItemList;
rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -22,8 +22,8 @@
//        generator.username="sa";
//        generator.password="Zoneyung@zy56$";
        generator.table = "man_transfer";
        generator.tableDesc = "调拔单";
        generator.table = "man_transfer_item";
        generator.tableDesc = "调拔单明细";
        generator.packagePath = "com.vincent.rsf.server.manager";
        generator.build();
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferItemController.java
New file
@@ -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.TransferItem;
import com.vincent.rsf.server.manager.service.TransferItemService;
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 TransferItemController extends BaseController {
    @Autowired
    private TransferItemService transferItemService;
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @PostMapping("/transferItem/page")
    public R page(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<TransferItem, BaseParam> pageParam = new PageParam<>(baseParam, TransferItem.class);
        return R.ok().add(transferItemService.page(pageParam, pageParam.buildWrapper(true)));
    }
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @PostMapping("/transferItem/list")
    public R list(@RequestBody Map<String, Object> map) {
        return R.ok().add(transferItemService.list());
    }
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @PostMapping({"/transferItem/many/{ids}", "/transferItems/many/{ids}"})
    public R many(@PathVariable Long[] ids) {
        return R.ok().add(transferItemService.listByIds(Arrays.asList(ids)));
    }
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @GetMapping("/transferItem/{id}")
    public R get(@PathVariable("id") Long id) {
        return R.ok().add(transferItemService.getById(id));
    }
    @PreAuthorize("hasAuthority('manager:transfer:save')")
    @OperationLog("Create 调拔单明细")
    @PostMapping("/transferItem/save")
    public R save(@RequestBody TransferItem transferItem) {
        transferItem.setCreateBy(getLoginUserId());
        transferItem.setCreateTime(new Date());
        transferItem.setUpdateBy(getLoginUserId());
        transferItem.setUpdateTime(new Date());
        if (!transferItemService.save(transferItem)) {
            return R.error("Save Fail");
        }
        return R.ok("Save Success").add(transferItem);
    }
    @PreAuthorize("hasAuthority('manager:transfer:update')")
    @OperationLog("Update 调拔单明细")
    @PostMapping("/transferItem/update")
    public R update(@RequestBody TransferItem transferItem) {
        transferItem.setUpdateBy(getLoginUserId());
        transferItem.setUpdateTime(new Date());
        if (!transferItemService.updateById(transferItem)) {
            return R.error("Update Fail");
        }
        return R.ok("Update Success").add(transferItem);
    }
    @PreAuthorize("hasAuthority('manager:transfer:remove')")
    @OperationLog("Delete 调拔单明细")
    @PostMapping("/transferItem/remove/{ids}")
    public R remove(@PathVariable Long[] ids) {
        if (!transferItemService.removeByIds(Arrays.asList(ids))) {
            return R.error("Delete Fail");
        }
        return R.ok("Delete Success").add(ids);
    }
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @PostMapping("/transferItem/query")
    public R query(@RequestParam(required = false) String condition) {
        List<KeyValVo> vos = new ArrayList<>();
        LambdaQueryWrapper<TransferItem> wrapper = new LambdaQueryWrapper<>();
        if (!Cools.isEmpty(condition)) {
            wrapper.like(TransferItem::getId, condition);
        }
        transferItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
        );
        return R.ok().add(vos);
    }
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @PostMapping("/transferItem/export")
    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(transferItemService.list(), TransferItem.class), response);
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java
New file
@@ -0,0 +1,314 @@
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_transfer_item")
public class TransferItem implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 调拔单ID
     */
    @ApiModelProperty(value= "调拔单ID")
    private Long transferId;
    /**
     * 调拔单号
     */
    @ApiModelProperty(value= "调拔单号")
    private String transferCode;
    /**
     * 物料ID
     */
    @ApiModelProperty(value= "物料ID")
    private Long matnrId;
    /**
     * 物料名称
     */
    @ApiModelProperty(value= "物料名称")
    private String maktx;
    /**
     * 物料编码
     */
    @ApiModelProperty(value= "物料编码")
    private String matnrCode;
    /**
     * 库存单位
     */
    @ApiModelProperty(value= "库存单位")
    private String unit;
    /**
     * 数量
     */
    @ApiModelProperty(value= "数量")
    private Double anfme;
    /**
     * 完成数量
     */
    @ApiModelProperty(value= "完成数量")
    private Double qty;
    /**
     * 执行数量
     */
    @ApiModelProperty(value= "执行数量 ")
    private Double workQty;
    /**
     * 供应商批次
     */
    @ApiModelProperty(value= "供应商批次")
    private String batch;
    /**
     * 供应商ID
     */
    @ApiModelProperty(value= "供应商ID")
    private Long splrId;
    /**
     * 规格
     */
    @ApiModelProperty(value= "规格")
    private String spec;
    /**
     * 型号
     */
    @ApiModelProperty(value= "型号")
    private String model;
    /**
     * 字段索引
     */
    @ApiModelProperty(value= "字段索引")
    private String fieldsIndex;
    /**
     * 平台ID(行号)
     */
    @ApiModelProperty(value= "平台ID(行号)")
    private String platItemId;
    /**
     * 客户订单号
     */
    @ApiModelProperty(value= "客户订单号")
    private String platOrderCode;
    /**
     * 工单号
     */
    @ApiModelProperty(value= "工单号")
    private String platWorkCode;
    /**
     * 项目号
     */
    @ApiModelProperty(value= "项目号")
    private String projectCode;
    /**
     * 状态 1: 正常  0: 冻结
     */
    @ApiModelProperty(value= "状态 1: 正常  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 TransferItem() {}
    public TransferItem(Long transferId,String transferCode,Long matnrId,String maktx,String matnrCode,String unit,Double anfme,Double qty,Double workQty,String batch,Long splrId,String spec,String model,String fieldsIndex,String platItemId,String platOrderCode,String platWorkCode,String projectCode,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.transferId = transferId;
        this.transferCode = transferCode;
        this.matnrId = matnrId;
        this.maktx = maktx;
        this.matnrCode = matnrCode;
        this.unit = unit;
        this.anfme = anfme;
        this.qty = qty;
        this.workQty = workQty;
        this.batch = batch;
        this.splrId = splrId;
        this.spec = spec;
        this.model = model;
        this.fieldsIndex = fieldsIndex;
        this.platItemId = platItemId;
        this.platOrderCode = platOrderCode;
        this.platWorkCode = platWorkCode;
        this.projectCode = projectCode;
        this.status = status;
        this.deleted = deleted;
        this.tenantId = tenantId;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
//    TransferItem transferItem = new TransferItem(
//            null,    // 调拔单ID
//            null,    // 调拔单号
//            null,    // 物料ID
//            null,    // 物料名称
//            null,    // 物料编码
//            null,    // 库存单位
//            null,    // 数量
//            null,    // 完成数量
//            null,    // 执行数量
//            null,    // 供应商批次
//            null,    // 供应商ID
//            null,    // 规格
//            null,    // 型号
//            null,    // 字段索引
//            null,    // 平台ID(行号)
//            null,    // 客户订单号
//            null,    // 工单号
//            null,    // 项目号
//            null,    // 状态[非空]
//            null,    // 是否删除[非空]
//            null,    // 租户
//            null,    // 添加人员
//            null,    // 添加时间[非空]
//            null,    // 修改人员
//            null,    // 修改时间[非空]
//            null    // 备注
//    );
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            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;
        }
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferItemMapper.java
New file
@@ -0,0 +1,12 @@
package com.vincent.rsf.server.manager.mapper;
import com.vincent.rsf.server.manager.entity.TransferItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface TransferItemMapper extends BaseMapper<TransferItem> {
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferItemService.java
New file
@@ -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.TransferItem;
public interface TransferItemService extends IService<TransferItem> {
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.vincent.rsf.server.manager.service.impl;
import com.vincent.rsf.server.manager.mapper.TransferItemMapper;
import com.vincent.rsf.server.manager.entity.TransferItem;
import com.vincent.rsf.server.manager.service.TransferItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("transferItemService")
public class TransferItemServiceImpl extends ServiceImpl<TransferItemMapper, TransferItem> implements TransferItemService {
}
rsf-server/src/main/java/transfer.sql
New file
@@ -0,0 +1,33 @@
-- save transfer record
-- mysql
insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.transfer', '0', '/manager/transfer', 'transfer', '0' , '0', '1' , '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 调拔单', '', '1', 'manager:transfer:list', '0', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 调拔单', '', '1', 'manager:transfer:save', '1', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 调拔单', '', '1', 'manager:transfer:update', '2', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 调拔单', '', '1', 'manager:transfer:remove', '3', '1', '1');
-- locale menu name
transfer: 'Transfer',
-- locale field
transfer: {
    code: "code",
    type: "type",
    source: "source",
    exceStatus: "exceStatus",
    orgWareId: "orgWareId",
    orgWareName: "orgWareName",
    tarWareId: "tarWareId",
    tarWareName: "tarWareName",
    orgAreaId: "orgAreaId",
    orgAreaName: "orgAreaName",
    tarAreaId: "tarAreaId",
    tarAreaName: "tarAreaName",
},
-- ResourceContent
import transfer from './transfer';
case 'transfer':
    return transfer;
rsf-server/src/main/java/transferItem.sql
New file
@@ -0,0 +1,39 @@
-- save transferItem record
-- mysql
insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.transferItem', '0', '/manager/transferItem', 'transferItem', '0' , '0', '1' , '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 调拔单明细', '', '1', 'manager:transferItem:list', '0', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 调拔单明细', '', '1', 'manager:transferItem:save', '1', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 调拔单明细', '', '1', 'manager:transferItem:update', '2', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 调拔单明细', '', '1', 'manager:transferItem:remove', '3', '1', '1');
-- locale menu name
transferItem: 'TransferItem',
-- locale field
transferItem: {
    transferId: "transferId",
    transferCode: "transferCode",
    matnrId: "matnrId",
    maktx: "maktx",
    matnrCode: "matnrCode",
    unit: "unit",
    anfme: "anfme",
    qty: "qty",
    workQty: "workQty",
    batch: "batch",
    splrId: "splrId",
    spec: "spec",
    model: "model",
    fieldsIndex: "fieldsIndex",
    platItemId: "platItemId",
    platOrderCode: "platOrderCode",
    platWorkCode: "platWorkCode",
    projectCode: "projectCode",
},
-- ResourceContent
import transferItem from './transferItem';
case 'transferItem':
    return transferItem;
rsf-server/src/main/resources/mapper/manager/TransferItemMapper.xml
New file
@@ -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.TransferItemMapper">
</mapper>