From 5c372e346df385e4ca4600e0bd3c3f2e143ead7e Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期一, 28 七月 2025 15:55:34 +0800 Subject: [PATCH] 调拔单功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferOrder.java | 32 +++ rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java | 8 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java | 1 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java | 9 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java | 8 rsf-admin/src/page/orders/transfer/TransferList.jsx | 12 rsf-admin/src/page/components/DictSelect.jsx | 1 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java | 51 ++++ rsf-admin/src/page/orders/transfer/TransferPanel.jsx | 183 +++++++---------- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java | 14 + rsf-admin/src/page/orders/transfer/ManualCreate.jsx | 91 ++++++-- rsf-admin/src/i18n/zh.js | 1 rsf-admin/src/page/components/WarehouseSelect.jsx | 64 ++++++ rsf-admin/src/page/orders/transfer/TransferEdit.jsx | 39 +++ rsf-admin/src/page/orders/transfer/TransferItemList.jsx | 44 +-- rsf-server/src/main/resources/mapper/manager/TransferMapper.xml | 25 ++ 17 files changed, 402 insertions(+), 183 deletions(-) diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 4b086a3..a2ba6d0 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -217,6 +217,7 @@ checkOrder: '鐩樼偣鍗�', checkDiff: '鐩樼偣宸紓鍗�', transfer: '璋冩嫈鍗�', + transferItem: '璋冩嫈鍗曟槑缁�' }, table: { field: { diff --git a/rsf-admin/src/page/components/DictSelect.jsx b/rsf-admin/src/page/components/DictSelect.jsx index 77292f9..df17b17 100644 --- a/rsf-admin/src/page/components/DictSelect.jsx +++ b/rsf-admin/src/page/components/DictSelect.jsx @@ -47,7 +47,6 @@ variant="filled" onChange={handleChange} size='small' - > {list.map((item) => ( <MenuItem key={item.value} value={item.value}> diff --git a/rsf-admin/src/page/components/WarehouseSelect.jsx b/rsf-admin/src/page/components/WarehouseSelect.jsx new file mode 100644 index 0000000..54a9613 --- /dev/null +++ b/rsf-admin/src/page/components/WarehouseSelect.jsx @@ -0,0 +1,64 @@ +import { useState, useEffect } from 'react'; +import { + useTranslate, useNotify, required +} from 'react-admin'; +import request from '@/utils/request'; +import { Select, MenuItem, FormControl, InputLabel } from '@mui/material'; + +const WarehouseSelect = (props) => { + const { dictTypeCode, label, value, onChange, ...params } = props; + const translate = useTranslate(); + const notify = useNotify(); + const [list, setList] = useState([]); + + useEffect(() => { + http(); + }, [dictTypeCode]); + + const http = async () => { + const res = await request.post('/warehouseAreas/page', {}); + if (res?.data?.code === 200) { + setList(res.data.data.records.map((item) => { + return { + id: item.id, + name: item.name + }; + })); + } else { + notify(res.data.msg); + } + }; + + const handleChange = (event) => { + const selectedValue = event.target.value; + console.log(event); + if (onChange) { + onChange(event); + } + }; + + const validValue = list.some(item => item.id === value) ? value : ''; + + return ( + <FormControl fullWidth> + <InputLabel id="demo-select-small-label">{label}</InputLabel> + <Select + labelId="demo-select-small-label" + value={validValue} + variant="filled" + onChange={handleChange} + size='small' + > + {list.map((item) => ( + <MenuItem + key={item.id} + value={item.id}> + {item.name} + </MenuItem> + ))} + </Select> + </FormControl> + ); +}; + +export default WarehouseSelect; \ No newline at end of file diff --git a/rsf-admin/src/page/orders/transfer/ManualCreate.jsx b/rsf-admin/src/page/orders/transfer/ManualCreate.jsx index ada8d0f..3d6f07e 100644 --- a/rsf-admin/src/page/orders/transfer/ManualCreate.jsx +++ b/rsf-admin/src/page/orders/transfer/ManualCreate.jsx @@ -17,6 +17,7 @@ useNotify, Form, useCreateController, + SimpleForm, } from 'react-admin'; import { Dialog, @@ -35,11 +36,13 @@ } from '@mui/material'; import ConfirmationNumberIcon from '@mui/icons-material/ConfirmationNumber'; import DialogCloseButton from "../../components/DialogCloseButton.jsx"; +import WarehouseSelect from "../../components/WarehouseSelect.jsx"; import { DataGrid, useGridApiRef } from '@mui/x-data-grid'; import ConfirmButton from "../../components/ConfirmButton"; import CreateBySelectMats from "./CreateBySelectMats.jsx"; import { Add, Edit, Delete } from '@mui/icons-material'; import DictSelect from "../../components/DictSelect"; +import { useFormContext, useWatch } from "react-hook-form"; import { minHeight, padding } from "@mui/system"; import SaveIcon from '@mui/icons-material/Save'; import request from '@/utils/request'; @@ -54,6 +57,8 @@ const [selectedRows, setSelectedRows] = useState([]); const [createDialog, setCreateDialog] = useState(false); const [formData, setFormData] = useState({}); + const [list, setList] = useState([]); + const handleClose = (event, reason) => { if (reason !== "backdropClick") { setOpen(false); @@ -69,15 +74,17 @@ setTableData([...tabelData]); } + const handleSubmit = async () => { setFinally() setDisabled(true) - if (orderId === 0) { + if (orderId == null || orderId == undefined) { const parmas = { - "orders": formData, + "transfer": formData, "items": tabelData, } + const res = await request.post(`/transfer/items/save`, parmas); if (res?.data?.code === 200) { setOpen(false); @@ -88,7 +95,7 @@ } } else { const parmas = { - "orders": formData, + "transfer": formData, "items": tabelData, } const res = await request.post(`/transfer/items/update`, parmas); @@ -117,43 +124,69 @@ notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); }; + const getWarehouse = async () => { + const res = await request.post('/warehouseAreas/page'); + if (res?.data?.code === 200) { + setList(res.data.data.records.map((item) => { + return { + id: item.id, + name: item.name + }; + })); + } else { + notify(res.data.msg); + } + } + const handleChange = (value, name) => { + console.log(name); + console.log(value); setFormData((prevData) => ({ ...prevData, [name]: value })); + + console.log(formData); + }; return ( <> <Box sx={{ padding: 1 }}> - <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> - <Form defaultValues={formData}> - <Grid container spacing={2}> - <Grid item md={2}> - <DictSelect - label={translate("table.field.transfer.type")} - value={formData.type} - variant="filled" - onChange={(e) => handleChange(e.target.value, 'type')} - dictTypeCode="sys_transfer_type" - required - /> - </Grid> - <Grid item md={2}> - <ReferenceInput reference="warehouseAreas" source="orgAreaName"> - <AutocompleteInput optionText="name" label="table.field.transfer.orgAreaName" /> - </ReferenceInput> - </Grid> - <Grid item md={2}> - <ReferenceInput reference="warehouseAreas" source="tarAreaName"> - <AutocompleteInput optionText="name" label="table.field.transfer.tarAreaName" /> - </ReferenceInput> - </Grid> + <SimpleForm toolbar={false}> + <Grid container spacing={2}> + <Grid item md={2}> + <DictSelect + label={translate("table.field.transfer.type")} + value={formData.type} + variant="filled" + onChange={(e) => handleChange(e.target.value, 'type')} + dictTypeCode="sys_transfer_type" + required + /> </Grid> - </Form> - </Box> + <Grid item md={2}> + <WarehouseSelect + value={formData.orgAreaId} + variant="filled" + dictTypeCode="warehouse" + required + onChange={(e) => handleChange(e.target.value, 'orgAreaId')} + label={translate("table.field.transfer.orgAreaName")} /> + </Grid> + <Grid item md={2}> + <WarehouseSelect + label={translate("table.field.transfer.tarAreaName")} + value={formData.tarAreaId} + dictTypeCode="warehouse" + variant="filled" + required + onChange={(e) => handleChange(e.target.value, 'tarAreaId')} + /> + </Grid> + </Grid> + </SimpleForm> <Box sx={{ mt: 2 }}> <Stack direction="row" spacing={2} sx={{ justifyContent: "flex-end" }}> <Button variant="contained" onClick={() => setCreateDialog(true)} > @@ -461,7 +494,7 @@ onRowSelectionModelChange={handleSelectionChange} selectionModel={selectedRows} sx={{ - height: 610, + height: 580, '& .MuiDataGrid-cell input': { border: '1px solid #ccc' }, diff --git a/rsf-admin/src/page/orders/transfer/TransferEdit.jsx b/rsf-admin/src/page/orders/transfer/TransferEdit.jsx index fedacf5..bc709f9 100644 --- a/rsf-admin/src/page/orders/transfer/TransferEdit.jsx +++ b/rsf-admin/src/page/orders/transfer/TransferEdit.jsx @@ -34,7 +34,7 @@ const { getValues } = useFormContext(); return ( - <Toolbar sx={{ justifyContent: "space-between" }}> + <Toolbar sx={{ justifyContent: "flex-end" }}> <SaveButton /> <DeleteButton mutationMode="optimistic" /> </Toolbar> @@ -53,20 +53,34 @@ aside={<EditBaseAside />} > <SimpleForm + sx={{ + "& .MuiFormLabel-root.MuiInputLabel-root.Mui-disabled": { + bgcolor: 'white', + WebkitTextFillColor: "rgba(0, 0, 0)" + }, + + "& .MuiInputBase-input.MuiFilledInput-input.Mui-disabled": { + bgcolor: 'white', + WebkitTextFillColor: "rgba(0, 0, 0)" + }, + + "& .MuiFilledInput-root.MuiInputBase-sizeSmall": { + bgcolor: 'white', + } + }} shouldUnregister warnWhenUnsavedChanges - toolbar={<FormToolbar />} + toolbar={false} mode="onTouched" defaultValues={{}} - // validate={(values) => { }} > <Grid container - width={{ xs: "100%", xl: "80%" }} + width={{ xs: "100%", xl: "90%", }} rowSpacing={3} columnSpacing={3} > - <Grid item xs={12} md={8}> + <Grid item xs={24} md={16}> <Typography variant="h6" gutterBottom> {translate("common.edit.title.main")} </Typography> @@ -76,13 +90,13 @@ source="code" parse={(v) => v} autoFocus + readOnly /> - </Stack> - <Stack direction="row" gap={2}> - <NumberInput label="table.field.transfer.type" source="type" /> + <NumberInput label="table.field.transfer.type" source="type" readOnly/> <SelectInput label="table.field.transfer.source" source="source" + readOnly choices={[ { id: 1, name: "ERP绯荤粺" }, { id: 2, name: "WMS绯荤粺鐢熸垚" }, @@ -93,6 +107,7 @@ <SelectInput label="table.field.transfer.exceStatus" source="exceStatus" + readOnly choices={[ { id: 0, name: "鏈墽琛�" }, { id: 1, name: "鎵ц涓�" }, @@ -104,19 +119,23 @@ <NumberInput label="table.field.transfer.orgWareId" source="orgWareId" + readOnly /> <TextInput label="table.field.transfer.orgWareName" source="orgWareName" + readOnly parse={(v) => v} /> <NumberInput label="table.field.transfer.tarWareId" source="tarWareId" + readOnly /> <TextInput label="table.field.transfer.tarWareName" source="tarWareName" + readOnly parse={(v) => v} /> </Stack> @@ -124,19 +143,23 @@ <NumberInput label="table.field.transfer.orgAreaId" source="orgAreaId" + readOnly /> <TextInput label="table.field.transfer.orgAreaName" source="orgAreaName" + readOnly parse={(v) => v} /> <NumberInput label="table.field.transfer.tarAreaId" source="tarAreaId" + readOnly /> <TextInput label="table.field.transfer.tarAreaName" source="tarAreaName" + readOnly parse={(v) => v} /> </Stack> diff --git a/rsf-admin/src/page/orders/transfer/TransferItemList.jsx b/rsf-admin/src/page/orders/transfer/TransferItemList.jsx index db16ab8..2423f10 100644 --- a/rsf-admin/src/page/orders/transfer/TransferItemList.jsx +++ b/rsf-admin/src/page/orders/transfer/TransferItemList.jsx @@ -91,77 +91,65 @@ const TransferItemList = () => { const translate = useTranslate(); - - const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); + const [createDialog, setCreateDialog] = useState(false); return ( <Box display="flex"> <List + resource="transferItem" 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) }} />} + title={false} + empty={false} 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} />} + bulkActionButtons={false} rowClick={(id, resource, record) => false} expand={false} expandSingle={false} - omit={['id', 'createTime', 'createBy', 'memo']} + omit={['id', 'transferId', 'matnrId', 'createTime', 'createBy', 'memo', 'platItemId', 'splrId', 'fieldsIndex', 'platOrderCode', 'platWorkCode', 'projectCode']} > <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="maktx" label="table.field.transferItem.maktx" /> <TextField source="spec" label="table.field.transferItem.spec" /> <TextField source="model" label="table.field.transferItem.model" /> + <TextField source="batch" label="table.field.transferItem.batch" /> + <TextField source="unit" label="table.field.transferItem.unit" /> + <NumberField source="anfme" label="table.field.transferItem.anfme" /> + <NumberField source="workQty" label="table.field.transferItem.workQty" /> + <NumberField source="qty" label="table.field.transferItem.qty" /> + <NumberField source="splrId" label="table.field.transferItem.splrId" /> <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> + <TextField source="updateBy$" label="common.field.updateBy" /> <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> + <TextField source="createBy$" label="common.field.createBy" /> <DateField source="createTime" label="common.field.createTime" showTime /> - <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + {/* <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 diff --git a/rsf-admin/src/page/orders/transfer/TransferList.jsx b/rsf-admin/src/page/orders/transfer/TransferList.jsx index 3e6b4fa..8bce57d 100644 --- a/rsf-admin/src/page/orders/transfer/TransferList.jsx +++ b/rsf-admin/src/page/orders/transfer/TransferList.jsx @@ -32,12 +32,11 @@ AutocompleteInput, DeleteButton, } from 'react-admin'; -import { Box, Typography, Card, Stack } from '@mui/material'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting.js'; - import MyCreateButton from "../../components/MyCreateButton.jsx"; import MyExportButton from '../../components/MyExportButton.jsx'; import PageEditDrawer from "../../components/PageEditDrawer"; +import { Box, Typography, Card, Stack } from '@mui/material'; import PageDrawer from "../../components/PageDrawer.jsx"; import EmptyData from "../../components/EmptyData.jsx"; import MyField from "../../components/MyField.jsx"; @@ -138,13 +137,12 @@ rowClick={(id, resource, record) => false} expand={() => <TransferPanel />} expandSingle={true} - omit={['id', 'createTime', 'createBy$', 'memo']} + omit={['id', 'createTime', 'createBy$', 'memo', 'orgWareId', 'tarWareId', 'orgAreaId', 'tarAreaId']} > <NumberField source="id" /> <TextField source="code" label="table.field.transfer.code" /> - <NumberField source="type" label="table.field.transfer.type" /> + <NumberField source="type$" label="table.field.transfer.type" /> <TextField source="source$" label="table.field.transfer.source" sortable={false} /> - <TextField source="exceStatus$" label="table.field.transfer.exceStatus" sortable={false} /> <NumberField source="orgWareId" label="table.field.transfer.orgWareId" /> <TextField source="orgWareName" label="table.field.transfer.orgWareName" /> <NumberField source="tarWareId" label="table.field.transfer.tarWareId" /> @@ -153,11 +151,11 @@ <TextField source="orgAreaName" label="table.field.transfer.orgAreaName" /> <NumberField source="tarAreaId" label="table.field.transfer.tarAreaId" /> <TextField source="tarAreaName" label="table.field.transfer.tarAreaName" /> + <TextField source="exceStatus$" label="table.field.transfer.exceStatus" sortable={false} /> <TextField source="updateBy$" label="common.field.updateBy" /> <DateField source="updateTime" label="common.field.updateTime" showTime /> <TextField source="createBy$" label="common.field.createBy" /> <DateField source="createTime" label="common.field.createTime" showTime /> - <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' }} /> @@ -170,7 +168,7 @@ drawerVal={createDialog} setDrawerVal={setCreateDialog} > - <ManualCreate /> + <ManualCreate setOpen={setCreateDialog} /> </PageEditDrawer> </Box> ) diff --git a/rsf-admin/src/page/orders/transfer/TransferPanel.jsx b/rsf-admin/src/page/orders/transfer/TransferPanel.jsx index 4bcb9e6..5d3abe4 100644 --- a/rsf-admin/src/page/orders/transfer/TransferPanel.jsx +++ b/rsf-admin/src/page/orders/transfer/TransferPanel.jsx @@ -1,11 +1,43 @@ import React, { useState, useRef, useEffect, useMemo } from "react"; import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; import { + List, + DateField, + TextField, + TopToolbar, + FilterButton, + NumberField, useTranslate, + WrapperField, useRecordContext, + DatagridConfigurable, } from 'react-admin'; -import PanelTypography from "../../components/PanelTypography.jsx"; -import * as Common from '@/utils/common.js' + +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting.js'; +import BillStatusField from '../../components/BillStatusField'; +import { styled } from '@mui/material/styles'; +import * as Common from '@/utils/common.js'; + + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + '& .column-name': { + }, + '& .opt': { + width: 220 + }, + '& .wkType': { + width: 110 + }, + '& .status': { + width: 90 + }, +})); const TransferPanel = () => { const record = useRecordContext(); @@ -13,108 +45,51 @@ 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.transfer.id'))}: {record.id} - </Typography> - {/* inherit, primary, secondary, textPrimary, textSecondary, error */} - <Typography variant="h6" gutterBottom align="right" > - ID: {record.id} - </Typography> - </Grid> - </Grid> - <Grid container spacing={2}> - <Grid item xs={12} container alignContent="flex-end"> - <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> - {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} - </Typography> - </Grid> - </Grid> - <Box height={20}> </Box> - <Grid container spacing={2}> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.code" - property={record.code} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.type" - property={record.type} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.source" - property={record.source$} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.exceStatus" - property={record.exceStatus$} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.orgWareId" - property={record.orgWareId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.orgWareName" - property={record.orgWareName} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.tarWareId" - property={record.tarWareId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.tarWareName" - property={record.tarWareName} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.orgAreaId" - property={record.orgAreaId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.orgAreaName" - property={record.orgAreaName} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.tarAreaId" - property={record.tarAreaId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.transfer.tarAreaName" - property={record.tarAreaName} - /> - </Grid> - - </Grid> - </CardContent> + <Card sx={{ margin: 'auto' }}> + <List + resource="transfer/orders" + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + }} + title={false} + empty={false} + pagination={false} + filters={false} + filter={{ id: record?.id }} + sort={{ field: "create_time", order: "desc" }} + actions={false} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + sx={{ width: '100%' }} + preferenceKey='outStock' + bulkActionButtons={false} + rowClick={false} + expandSingle={true} + omit={['id', 'createTime', 'createBy$', 'memo', 'rleStatus$']} + > + <NumberField source="id" /> + <TextField source="code" label="table.field.outStock.code" /> + <TextField source="poCode" label="table.field.outStock.poCode" /> + <TextField source="type$" label="table.field.outStock.type" /> + <TextField cellClassName="wkType" source="wkType$" label="table.field.outStock.wkType" /> + <NumberField source="anfme" label="table.field.outStock.anfme" /> + <NumberField source="workQty" label="table.field.outStock.workQty" /> + <NumberField source="qty" label="table.field.outStock.qty" /> + <TextField source="logisNo" label="table.field.outStock.logisNo" /> + <TextField source="rleStatus$" label="table.field.outStock.rleStatus" sortable={false} /> + <TextField source="updateBy$" label="common.field.updateBy" /> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <TextField source="createBy$" label="common.field.createBy" /> + <DateField source="createTime" label="common.field.createTime" showTime /> + <BillStatusField cellClassName="status" source="exceStatus" label="table.field.outStock.exceStatus" /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + </StyledDatagrid> + </List> </Card > </> ); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java index 9767a12..fd23a4e 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java @@ -42,6 +42,14 @@ } @PreAuthorize("hasAuthority('manager:transfer:list')") + @PostMapping("/transfer/orders/page") + public R getTransferInfo(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<Transfer, BaseParam> pageParam = new PageParam<>(baseParam, Transfer.class); + return R.ok().add(transferService.transfersPage(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:transfer:list')") @PostMapping("/transfer/list") public R list(@RequestBody Map<String, Object> map) { return R.ok().add(transferService.list()); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java index 1d64745..29b290c 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java @@ -230,13 +230,25 @@ } } + public String getType$() { + if (null == this.type){ return null; } + DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); + DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>() + .eq(DictData::getDictTypeCode, DictTypeCode.SYS_TRANSFER_TYPE) + .eq(DictData::getValue, this.type)); + if (Objects.isNull(dictData)) { + return null; + } + return dictData.getLabel(); + } + public String getExceStatus$() { if (Cools.isEmpty(this.exceStatus)){ return ""; } DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>() - .eq(DictData::getDictTypeCode, DictTypeCode.SYS_ORDER_SOURCE) + .eq(DictData::getDictTypeCode, DictTypeCode.SYS_WAVE_EXCE_STATUS) .eq(DictData::getValue, this.exceStatus)); if (Objects.isNull(dictData)) { return null; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferOrder.java new file mode 100644 index 0000000..d853eff --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferOrder.java @@ -0,0 +1,32 @@ +package com.vincent.rsf.server.manager.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@Accessors +@TableName("man_transfer_order") +public class TransferOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("璋冩嫈鍗旾D") + private Long transferId; + + @ApiModelProperty("璁㈠崟ID") + private Long orderId; + + @ApiModelProperty("鎵ц鐘舵��") + private Integer exceStatus; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java index dbe0b9d..b35985b 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java @@ -1,12 +1,20 @@ package com.vincent.rsf.server.manager.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.entity.Transfer; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.vincent.rsf.server.manager.entity.WkOrder; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; + +import java.util.List; @Mapper @Repository public interface TransferMapper extends BaseMapper<Transfer> { + IPage<WkOrder> transfersPage(PageParam<Transfer, BaseParam> pageParam, @Param("transferId") Long transferId); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java index 640cd5f..07d37f4 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java @@ -1,14 +1,23 @@ package com.vincent.rsf.server.manager.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.controller.params.TransferItemParams; import com.vincent.rsf.server.manager.entity.Transfer; +import com.vincent.rsf.server.manager.entity.WkOrder; + +import java.util.List; public interface TransferService extends IService<Transfer> { R saveTransfer(TransferItemParams params, Long loginUserId); R updateTransfer(TransferItemParams params, Long loginUserId); + + IPage<WkOrder> transfersPage(PageParam<Transfer, BaseParam> pageParam, QueryWrapper<Transfer> transferQueryWrapper); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java index b0631b0..0a56217 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java @@ -6,7 +6,6 @@ import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.utils.FieldsUtils; import com.vincent.rsf.server.manager.entity.Companys; -import com.vincent.rsf.server.manager.entity.WkOrderItem; import com.vincent.rsf.server.manager.enums.CompanysType; import com.vincent.rsf.server.manager.mapper.TransferItemMapper; import com.vincent.rsf.server.manager.entity.TransferItem; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java index cf840e9..e31cddf 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java @@ -1,22 +1,25 @@ package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.common.domain.PageResult; import com.vincent.rsf.server.manager.controller.params.TransferItemParams; -import com.vincent.rsf.server.manager.entity.TransferItem; -import com.vincent.rsf.server.manager.entity.WkOrder; -import com.vincent.rsf.server.manager.entity.WkOrderItem; +import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.enums.CheckExceStatus; import com.vincent.rsf.server.manager.enums.OrderSourceType; import com.vincent.rsf.server.manager.enums.OrderType; import com.vincent.rsf.server.manager.mapper.TransferMapper; -import com.vincent.rsf.server.manager.entity.Transfer; import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.vincent.rsf.server.manager.service.TransferItemService; import com.vincent.rsf.server.manager.service.TransferService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vincent.rsf.server.manager.service.WarehouseAreasService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; @@ -24,6 +27,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Date; import java.util.List; import java.util.Objects; @@ -32,6 +36,9 @@ @Autowired private TransferItemService transferItemService; + + @Autowired + private WarehouseAreasService warehouseAreasService; /** * @author Ryan @@ -54,9 +61,30 @@ if (StringUtils.isBlank(ruleCode)) { throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌ャ�孲YS_TRANSFER_ORDER_CODE銆嶆槸鍚﹁缃纭紒锛�"); } + + WarehouseAreas orgWarehosue = warehouseAreasService.getById(transfer.getOrgAreaId()); + if (Objects.isNull(orgWarehosue)) { + throw new CoolException("鎵�閫夊師搴撳尯涓嶅瓨鍦紒锛�"); + } + + WarehouseAreas tarWarehouse = warehouseAreasService.getById(transfer.getTarAreaId()); + if (Objects.isNull(tarWarehouse)) { + throw new CoolException("鎵�閫夌洰鏍囧簱鍖轰笉瀛樺湪锛侊紒"); + } + transfer.setCode(ruleCode) .setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_UN_EXCE.val) .setSource(OrderSourceType.ORDER_SOURCE_TYPE_SYSTEM.val) + .setOrgAreaId(orgWarehosue.getId()) + .setOrgAreaName(orgWarehosue.getName()) + .setOrgWareId(orgWarehosue.getWarehouseId()) + .setOrgWareName(orgWarehosue.getWarehouseId$()) + .setTarAreaId(tarWarehouse.getId()) + .setTarWareId(tarWarehouse.getWarehouseId()) + .setTarAreaName(tarWarehouse.getName()) + .setTarWareName(tarWarehouse.getWarehouseId$()) + .setUpdateTime(new Date()) + .setCreateTime(new Date()) .setUpdateBy(loginUserId) .setCreateBy(loginUserId); if (!this.save(transfer)) { @@ -128,4 +156,19 @@ return R.ok("淇敼瀹屾垚锛侊紒"); } + + /** + * @author Ryan + * @date 2025/7/28 + * @description: 鑾峰彇璋冩嫈鍗曞叧鑱旇鍗� + * @version 1.0 + */ + @Override + public IPage<WkOrder> transfersPage(PageParam<Transfer, BaseParam> pageParam, QueryWrapper<Transfer> transferQueryWrapper) { + Transfer one = this.getOne(transferQueryWrapper); + if (Objects.isNull(one)) { + throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�"); + } + return this.baseMapper.transfersPage(pageParam, one.getId()); + } } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java index 43d2e0e..30ad054 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java @@ -94,4 +94,6 @@ /**鍗曟嵁鏉ユ簮*/ public final static String SYS_ORDER_SOURCE = "sys_order_source"; + + public final static String SYS_TRANSFER_TYPE = "sys_transfer_type"; } diff --git a/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml b/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml index 113eacc..09c532e 100644 --- a/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml +++ b/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml @@ -2,4 +2,29 @@ <!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.TransferMapper"> + <select id="transfersPage" resultType="com.vincent.rsf.server.manager.entity.WkOrder"> + SELECT + id, + `code`, + `type`, + `wk_type`, + `anfme`, + `qty`, + `work_qty`, + `warehouse_id`, + `ware_area_id`, + `wave_id`, + `exce_status` + FROM + man_asn_order + WHERE + id IN ( + SELECT + order_id + FROM + man_transfer_order + WHERE + transfer_id = #{transferId} + ) + </select> </mapper> -- Gitblit v1.9.1