From d40c85778470a7e8341f0fae023c41dec981f384 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 13 五月 2025 20:41:25 +0800
Subject: [PATCH] 新增PO单生成收货单功能
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java | 16 +
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java | 3
rsf-admin/src/page/orders/purchase/PurchaseList.jsx | 4
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx | 64 ++-
rsf-server/src/main/java/com/vincent/rsf/server/common/config/SysStockProperties.java | 2
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java | 1
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java | 6
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java | 5
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java | 13
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java | 8
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java | 105 +++++
rsf-admin/src/page/orders/asnOrder/AsnCreateByPoModal.jsx | 213 +++++++++++++
rsf-admin/src/page/orders/asnOrder/POItemModal.jsx | 405 +++++++++++++++++++++++++
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/POExceStatus.java | 19 +
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java | 8
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java | 12
rsf-admin/src/i18n/zh.js | 3
rsf-admin/src/i18n/en.js | 1
rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx | 14
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java | 5
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java | 1
rsf-server/src/main/resources/application-dev.yml | 2
22 files changed, 852 insertions(+), 58 deletions(-)
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 56e1ae1..ba2d163 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -1046,6 +1046,7 @@
complete: "complete",
close: "close",
asnCreate: "Create By Order",
+ poCreate: "Create By PO",
createTask: "createTask",
recover: "recover",
createWave: "Create Wave",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 1e4d55c..7991ead 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -596,7 +596,7 @@
spec: "瑙勬牸",
model: "鍨嬪彿",
matnrCode: "鐗╂枡缂栫爜",
- anfme: "璁″垝鏁�",
+ anfme: "璁″垝鏁伴噺",
stockUnit: "鍗曚綅",
isptResult: "璐ㄦ缁撴灉",
purQty: "閲囪喘閲�",
@@ -1079,6 +1079,7 @@
complete: "瀹岀粨",
close: "鍏抽棴",
asnCreate: "閫氳繃鍗曟嵁鍒涘缓",
+ poCreate: "閫氳繃PO鍗曞垱寤�",
orderPrint: '鎵撳嵃鍗曟嵁',
createTask: "涓嬪彂浠诲姟",
createWave: "鐢熸垚娉㈡",
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnCreateByPoModal.jsx b/rsf-admin/src/page/orders/asnOrder/AsnCreateByPoModal.jsx
new file mode 100644
index 0000000..5b99a52
--- /dev/null
+++ b/rsf-admin/src/page/orders/asnOrder/AsnCreateByPoModal.jsx
@@ -0,0 +1,213 @@
+import { Dialog, DialogActions, DialogContent, DialogTitle, Box } from "@mui/material";
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+ List,
+ DatagridConfigurable,
+ SearchInput,
+ TopToolbar,
+ Button,
+ SelectColumnsButton,
+ EditButton,
+ FilterButton,
+ CreateButton,
+ ExportButton,
+ BulkDeleteButton,
+ WrapperField,
+ Toolbar,
+ useRecordContext,
+ useTranslate,
+ useNotify,
+ useListContext,
+ FunctionField,
+ TextField,
+ NumberField,
+ DateField,
+ BooleanField,
+ ReferenceField,
+ TextInput,
+ DateTimeInput,
+ DateInput,
+ SelectInput,
+ NumberInput,
+ ReferenceInput,
+ ReferenceArrayInput,
+ AutocompleteInput,
+ DeleteButton,
+ Form,
+ SaveButton,
+ useRefresh,
+ useGetList,
+} from 'react-admin';
+import DialogCloseButton from "../../components/DialogCloseButton";
+import { styled } from '@mui/material/styles';
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import { Grid, Stack, width } from "@mui/system";
+import request from '@/utils/request';
+import SaveIcon from '@mui/icons-material/Save';
+import CheckCircleIcon from '@mui/icons-material/CheckCircle';
+import POItemModal from "./POItemModal";
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+ '& .css-1vooibu-MuiSvgIcon-root': {
+ height: '.9em'
+ },
+ '& .RaDatagrid-row': {
+ cursor: 'auto'
+ },
+ '& .status': {
+ width: 90
+ },
+}));
+
+const AsnCreateByPoModal = (props) => {
+ const { open, setOpen, record } = props;
+ const translate = useTranslate();
+ const [params, setParams] = useState({});
+ const [item, setItem] = useState({});
+ const [poItemDialog, setPoItemDialog] = useState(false);
+ const [drawerVal, setDrawerVal] = useState(false);
+ const refresh = useRefresh();
+
+ const handleClose = (event, reason) => {
+ if (reason !== "backdropClick") {
+ setOpen(false);
+ }
+ };
+ // const CustomFilter = () => {
+ // const { filterValues, setFilters, refetch } = useListContext('deliveryItem');
+ // const [formValues, setFormValues] = useState(filterValues);
+ // const handleChange = (event) => {
+ // if (event.target == undefined || event.target == null) { return }
+ // setFormValues(formValues => ({
+ // ...formValues,
+ // [event.target.name]: event.target.value
+ // }));
+ // };
+
+ // const handleSubmit = (event) => {
+ // setParams(formValues)
+ // };
+
+ // return (
+ // <Box sx={{ width: '100%', margin: 1, marginBottom: 8, "& .MuiDialogActions-root": { padding: 0 } }}>
+ // <Form>
+ // <Grid container rowSpacing={2} columnSpacing={2} sx={{ padding: 2 }}>
+ // <Stack>
+ // <TextInput
+ // source="condition"
+ // label="common.action.search"
+ // resettable
+ // defaultValue={params?.condition}
+ // onChange={handleChange} />
+ // </Stack>
+ // </Grid>
+ // <DialogActions>
+ // <Toolbar sx={{ width: '100%', justifyContent: 'end' }} >
+ // <SaveButton onClick={handleSubmit} label={"toolbar.query"} />
+ // </Toolbar>
+ // </DialogActions>
+ // </Form>
+ // </Box>
+ // );
+ // };
+ return (
+ <Box>
+ <Dialog
+ open={open}
+ onClose={handleClose}
+ aria-labelledby="form-dialog-title"
+ aria-hidden
+ fullWidth
+ disableRestoreFocus
+ maxWidth="lg"
+ >
+ <DialogTitle id="form-dialog-title" sx={{
+ position: 'sticky',
+ top: 0,
+ backgroundColor: 'background.paper',
+ zIndex: 1000
+ }}>
+ <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+ <DialogCloseButton onClose={handleClose} />
+ </Box>
+ </DialogTitle>
+ <Grid container rowSpacing={2} columnSpacing={2}>
+ <DialogContent>
+ <Grid item sx={24}>
+ <List
+ storeKey="selectPurchase"
+ resource="purchase/filters"
+ sx={{
+ flexGrow: 1,
+ marginTop: 8,
+ height: 500,
+ transition: (theme) =>
+ theme.transitions.create(['all'], {
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ marginRight: 0,
+ }}
+ // filters={<CustomFilter />}
+ queryOptions={{ meta: { ...params } }}
+ empty={false}
+ sort={{ field: "create_time", order: "desc" }}
+ actions={false}
+ perPage={DEFAULT_PAGE_SIZE}
+ >
+ <StyledDatagrid
+ preferenceKey='selectPurchase'
+ bulkActionButtons={
+ <>
+ <ConfirmSelectButton
+ setOpen={setOpen}
+ setPoItemDialog={setPoItemDialog}
+ setItem={setItem}
+ mutationMode="pessimistic" />
+ </>
+ }
+ rowClick={false}
+ expand={false}
+ expandSingle={true}
+ omit={['id', 'createTime', 'createBy', 'channel', 'platCode', 'memo', 'channel', 'startTime', 'workQty', 'endTime']}
+ >
+ <NumberField source="id" />
+ <TextField source="code" label="table.field.purchase.code" />
+ <TextField source="type$" label="table.field.purchase.type" />
+ <TextField source="wkType$" label="table.field.purchase.wkType" />
+ <TextField source="source" label="table.field.purchase.source" />
+ <NumberField source="anfme" label="table.field.purchase.anfme" />
+ <NumberField source="qty" label="table.field.purchase.qty" />
+ <TextField source="channel" label="table.field.purchase.channel" />
+ <TextField source="platCode" label="table.field.purchase.platCode" />
+ <DateField source="preArr" label="table.field.purchase.preArr" showTime />
+ <DateField source="startTime" label="table.field.purchase.startTime" showTime />
+ <DateField source="endTime" label="table.field.purchase.endTime" showTime />
+ <TextField source="project" label="table.field.purchase.project" />
+ <TextField source="memo" label="common.field.memo" sortable={false} />
+ </StyledDatagrid>
+ </List>
+ </Grid>
+ </DialogContent>
+ </Grid>
+ </Dialog >
+ <POItemModal open={poItemDialog} setOpen={setPoItemDialog} record={item} />
+ </Box>
+ )
+}
+
+export default AsnCreateByPoModal;
+
+
+const ConfirmSelectButton = ({ setOpen, setPoItemDialog, setItem }) => {
+ const { selectedIds, onUnselectItems } = useListContext();
+ const confirmSelect = async (event) => {
+ setItem(selectedIds[0])
+ onUnselectItems();
+ setPoItemDialog(true)
+ setOpen(false);
+ }
+
+ return (
+ <Button label={"toolbar.confirm"} variant="contained" color="primary" size="medium" startIcon={<SaveIcon />} onClick={confirmSelect} />
+ )
+}
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
index 063790b..4a6bec8 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -58,7 +58,8 @@
import ImportButton from "../../components/ImportButton";
import PrintOutlinedIcon from '@mui/icons-material/PrintOutlined';
import OrderPrintPreview from "./OrderPrintPreview";
-
+import CreateNewFolderOutlinedIcon from '@mui/icons-material/CreateNewFolderOutlined';
+import AsnCreateByPoModal from "./AsnCreateByPoModal";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
height: '.9em'
@@ -114,6 +115,7 @@
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
const [modalType, setmodalType] = useState(0);
+ const [poCreate, setPoCreate] = useState(false);
const [printOrder, setPrintOrder] = useState(false);
const [select, setSelect] = useState({});
const invoiceRef = useRef();
@@ -141,6 +143,7 @@
<TopToolbar>
<FilterButton />
<MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} />
+ <CreateByPoButton setPoCreate={setPoCreate}/>
<SelectColumnsButton preferenceKey='asnOrder' />
<ImportButton value={'asnOrderItem'} />
<MyExportButton />
@@ -186,8 +189,8 @@
<MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} />
<InspectionButton />
<CompleteButton />
- <ODeleteButton />
- <PrintButton setPrintOrder={setPrintOrder} setSelect={setSelect}/>
+ <ODeleteButton />
+ <PrintButton setPrintOrder={setPrintOrder} setSelect={setSelect} />
{/* <CloseButton /> */}
</WrapperField>
</StyledDatagrid>
@@ -198,10 +201,14 @@
asnId={modalType}
billReload={billReload}
/>
- <OrderPrintPreview
+ <OrderPrintPreview
open={printOrder}
setOpen={setPrintOrder}
record={select}
+ />
+ <AsnCreateByPoModal
+ open={poCreate}
+ setOpen={setPoCreate}
/>
<PageDrawer
title='AsnOrder Detail'
@@ -214,9 +221,24 @@
}
export default AsnOrderList;
+//鎸塒O鍗曟柊寤�
+const CreateByPoButton = ({setPoCreate}) => {
+ const record = useRecordContext();
+
+ const createEvent = (event) => {
+ event.stopPropagation();
+ setPoCreate(true)
+ }
+ return (
+ <Button label={"toolbar.poCreate"} onClick={createEvent}>
+ <CreateNewFolderOutlinedIcon />
+ </Button>
+ )
+}
+
//鎵撳嵃鎸夐挳
-const PrintButton = ({setPrintOrder, setSelect}) => {
+const PrintButton = ({ setPrintOrder, setSelect }) => {
const record = useRecordContext();
const printOrder = (event) => {
event.stopPropagation();
@@ -225,9 +247,9 @@
}
return (
- <Button label={"toolbar.print"} onClick={printOrder}>
- <PrintOutlinedIcon />
- </Button>
+ <Button label={"toolbar.print"} onClick={printOrder}>
+ <PrintOutlinedIcon />
+ </Button>
)
}
@@ -235,7 +257,7 @@
const ODeleteButton = () => {
const record = useRecordContext();
return (
- record.exceStatus === 0 ? <DeleteButton mutationMode="pessimistic"/> : <></>
+ record.exceStatus === 0 ? <DeleteButton mutationMode="pessimistic" /> : <></>
)
}
@@ -251,15 +273,15 @@
};
return (
record.exceStatus === 1 || record.exceStatus === 0 ?
- <Button
- color="primary"
- startIcon={<EditIcon />}
- onClick={(btn) => handleEditClick(btn)}
- sx={{ ml: 1 }}
- label={'ra.action.edit'}
- >
- </Button>
- : <></>
+ <Button
+ color="primary"
+ startIcon={<EditIcon />}
+ onClick={(btn) => handleEditClick(btn)}
+ sx={{ ml: 1 }}
+ label={'ra.action.edit'}
+ >
+ </Button>
+ : <></>
)
}
@@ -284,7 +306,7 @@
}
return (
- <ConfirmButton label={"toolbar.inspection"} color="secondary" startIcon={<ConstructionIcon />} onConfirm={inspection} />
+ <ConfirmButton label={"toolbar.inspection"} color="secondary" startIcon={<ConstructionIcon />} onConfirm={inspection} />
)
}
@@ -388,7 +410,7 @@
// record.exceStatus === 1 && (record.anfme === record.qty ? <Button onClick={requestComplete} label={"toolbar.complete"} color="secondary">
// <TaskIcon />
// </Button> : )
- record.exceStatus === 1 ? <ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskIcon />} onConfirm={requestComplete} /> : <></>
+ record.exceStatus === 1 ? <ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskIcon />} onConfirm={requestComplete} /> : <></>
)
@@ -410,6 +432,6 @@
}
return (
- <ConfirmButton label={"toolbar.close"} color="error" startIcon={<CloseIcon />} onConfirm={requestClose} />
+ <ConfirmButton label={"toolbar.close"} color="error" startIcon={<CloseIcon />} onConfirm={requestClose} />
)
}
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx
index 6899c39..d046fdd 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx
@@ -590,13 +590,13 @@
// flex: 1,
// editable: true,
// },
- {
- field: 'purUnit',
- headerName: translate('table.field.asnOrderItem.purUnit'),
- minWidth: 100,
- flex: 1,
- editable: false,
- },
+ // {
+ // field: 'purUnit',
+ // headerName: translate('table.field.asnOrderItem.purUnit'),
+ // minWidth: 100,
+ // flex: 1,
+ // editable: false,
+ // },
])
const action = {
diff --git a/rsf-admin/src/page/orders/asnOrder/POItemModal.jsx b/rsf-admin/src/page/orders/asnOrder/POItemModal.jsx
new file mode 100644
index 0000000..0e9ccc3
--- /dev/null
+++ b/rsf-admin/src/page/orders/asnOrder/POItemModal.jsx
@@ -0,0 +1,405 @@
+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,
+ useListContext,
+ useRefresh,
+} from 'react-admin';
+import {
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Stack,
+ Grid,
+ TextField,
+ Box,
+ Button,
+ Paper,
+ TableContainer,
+ Table,
+ TableHead,
+ TableBody,
+ TableRow,
+ TableCell,
+ Tooltip,
+ IconButton,
+ styled,
+ Select,
+ MenuItem
+
+} from '@mui/material';
+import DialogCloseButton from "../../components/DialogCloseButton";
+import StatusSelectInput from "../../components/StatusSelectInput";
+import AsnWareModal from "./AsnWareModal";
+import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
+import SaveIcon from '@mui/icons-material/Save';
+import request from '@/utils/request';
+import { Add, Edit, Delete } from '@mui/icons-material';
+import _, { set } from 'lodash';
+import { DataGrid, useGridApiRef, GRID_DATE_COL_DEF, GRID_DATETIME_COL_DEF, getGridDateOperators, useGridApiContext } from '@mui/x-data-grid';
+import { LocalizationProvider, DatePicker, DateTimePicker } from '@mui/x-date-pickers';
+import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
+import DictionarySelect from "../../components/DictionarySelect";
+import DictSelect from "../../components/DictSelect";
+import "./asnOrder.css";
+import { 'zhCN' as locale } from 'date-fns/locale';
+import { format, } from 'date-fns';
+import { DemoContainer } from '@mui/x-date-pickers/internals/demo';
+
+const POItemModal = (props) => {
+ const { open, setOpen, billReload, record } = props;
+ const translate = useTranslate();
+ const notify = useNotify();
+ const refresh = useRefresh();
+ const [disabled, setDisabled] = useState(false)
+ const [createDialog, setCreateDialog] = useState(false);
+ const tableRef = useRef();
+
+ useEffect(() => {
+ if (open && record !== 0) {
+ requestGetBody()
+ }
+ setDisabled(false)
+ }, [open])
+
+ const handleClose = (event, reason) => {
+ if (reason !== "backdropClick") {
+ setOpen(false);
+ refresh();
+ setTableData([])
+ }
+ };
+
+
+ const [tabelData, setTableData] = useState([]);
+
+ const resetData = () => {
+ setTableData([])
+ }
+
+ const setFinally = () => {
+ const rows = tableRef.current.state.editRows;
+ for (const key in rows) {
+ const find = tabelData.find(item => item.id === +key);
+ find.anfme = rows[key].anfme.value;
+ }
+ setTableData([...tabelData]);
+ }
+
+ const handleSubmit = async () => {
+ setFinally()
+ setDisabled(true)
+ setOpen(false)
+ const parmas = {
+ "purchaseId": record,
+ "items": tabelData,
+ }
+ console.log('--------->');
+ console.log(parmas);
+ // const res = await request.post(`/asnOrder/purchases/save`, parmas);
+ // if (res?.data?.code === 200) {
+ // setOpen(false);
+ // refresh();
+ // resetData()
+ // } else {
+ // notify(res.data.msg);
+ // }
+ setDisabled(false)
+ };
+
+ const requestGetBody = async () => {
+ const res = await request.post(`/purchaseItem/page`, { purchaseId: record });
+ if (res?.data?.code === 200) {
+ setTableData(res.data.data.records)
+ } else {
+ notify(res.data.msg);
+ }
+ }
+
+ const [selectedRows, setSelectedRows] = useState([]);
+
+ return (
+ <>
+ <Dialog
+ open={open}
+ onClose={handleClose}
+ aria-labelledby="form-dialog-title"
+ aria-hidden
+ fullWidth
+ disableRestoreFocus
+ maxWidth="xl" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+ >
+ <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 }}>
+ <Box sx={{ mt: 2 }}>
+ <AsnOrderModalTable tabelData={tabelData}
+ setTableData={setTableData}
+ record={record}
+ selectedRows={selectedRows}
+ setSelectedRows={setSelectedRows}
+ tableRef={tableRef} />
+ </Box>
+ </DialogContent>
+ <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+ <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} >
+ <Button disabled={disabled} onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}>
+ {translate('toolbar.confirm')}
+ </Button>
+ </Toolbar>
+ </DialogActions>
+ </Dialog>
+ </>
+ )
+}
+
+export default POItemModal;
+
+const SelectInputSplrNameEditCell = (params) => {
+ const [formData, setFormData] = useState([{}])
+ useEffect(() => {
+ getOptions();
+ }, []);
+ const getOptions = async () => {
+ const parmas = {
+ "type": "supplier"
+ }
+ const {
+ data: { code, data, msg },
+ } = await request.post("companys/page", parmas);
+ if (code === 200) {
+ setFormData(data.records)
+ } else {
+ notify(msg);
+ }
+ }
+
+ return (
+ <Select
+ value={params.value}
+ onChange={(e) => {
+ params.api.setEditCellValue({
+ id: params.id,
+ field: params.field,
+ value: e.target.value,
+ })
+ // 鎵惧埌閫変腑鐨勪緵搴斿晢璁板綍
+ const selectedSupplier = formData.find(supplier => supplier.name === e.target.value);
+
+ // 濡傛灉鎵惧埌瀵瑰簲鐨勪緵搴斿晢璁板綍锛屽悓鏃舵洿鏂皊plrCode瀛楁
+ if (selectedSupplier) {
+ params.api.setEditCellValue({
+ id: params.id,
+ field: 'splrCode',
+ value: selectedSupplier.id,
+ });
+ }
+ }
+
+ }
+ fullWidth
+
+ >
+ {formData.map(e => {
+ return (
+ <MenuItem value={e.name} children={e.name} key={e.id} />
+ );
+
+ })}
+
+ </Select>
+ );
+};
+
+const AsnOrderModalTable = ({ tabelData, setTableData, record, selectedRows, setSelectedRows, tableRef }) => {
+ const translate = useTranslate();
+ const notify = useNotify();
+
+ const [columns, setColumns] = useState([
+ {
+ field: 'matnrCode',
+ headerName: translate('table.field.asnOrderItem.matnrCode'),
+ width: 130,
+ editable: false,
+ },
+ {
+ field: 'matnrName',
+ headerName: translate('table.field.asnOrderItem.maktx'),
+ width: 250,
+ editable: false,
+ },
+ {
+ field: 'splrName',
+ headerName: translate('table.field.asnOrderItem.splrName') + "*",
+ minWidth: 150,
+ flex: 1,
+ editable: true,
+ renderEditCell: (params) => (
+ <SelectInputSplrNameEditCell {...params} />
+ ),
+ headerClassName: "custom",
+ },
+ {
+ field: 'platItemId',
+ headerName: translate('table.field.asnOrderItem.platItemId') + "*",
+ minWidth: 100,
+ flex: 1,
+ editable: true,
+ headerClassName: "custom",
+ },
+ {
+ field: 'anfme',
+ headerName: translate('table.field.asnOrderItem.anfme') + "*",
+ type: 'number',
+ minWidth: 100,
+ flex: 1,
+ editable: true,
+ valueFormatter: (val) => val < 0 ? 0 : val,
+ headerClassName: "custom",
+ },
+ {
+ field: 'unit',
+ headerName: translate('table.field.asnOrderItem.stockUnit'),
+ minWidth: 100,
+ flex: 1,
+ editable: false,
+ },
+ ])
+
+ const action = {
+ field: 'action',
+ headerName: '鎿嶄綔',
+ width: 70,
+ lockPosition: 'left',
+ renderCell: (params) => (
+ <Tooltip title="Delete">
+ <IconButton onClick={() => handleDelete(params.row)}>
+ <Delete />
+ </IconButton>
+ </Tooltip>
+ ),
+ }
+
+ let cdata = useRef([]);
+
+
+ useEffect(() => {
+ getDynamicFields();
+ }, []);
+
+ useEffect(() => {
+ cdata.current = tabelData
+ }, [tabelData]);
+
+
+ const getDynamicFields = async () => {
+ const {
+ data: { code, data, msg },
+ } = await request.get("/fields/enable/list");
+ if (code === 200) {
+ const cols = data.map(el => ({
+ field: el.fields,
+ valueGetter: (value, row) => {
+ if (value != null && value != undefined) {
+ return value;
+ }
+ if (row.extendFields == null || row.extendFields[el.fields] == null) {
+ return ''
+ } else {
+ return `${row.extendFields[el.fields] == null ? '' : row.extendFields[el.fields]}`;
+ }
+ },
+ headerName: el.fieldsAlise,
+ minWidth: 100,
+ flex: 1,
+ editable: true
+ }))
+ setColumns([...columns, ...cols, action])
+ } else {
+ notify(msg);
+ }
+ }
+
+ const handleDelete = (row) => {
+ const newData = _.filter(cdata.current, (item) => item.id !== row.id);
+ setTableData(newData);
+ };
+
+
+ const processRowUpdate = (newRow, oldRow) => {
+ const rows = tabelData.map((r) =>
+ r.id === newRow.id ? { ...newRow } : r
+ )
+ setTableData(rows)
+
+ return newRow;
+ };
+
+
+ const handleSelectionChange = (ids) => {
+ setSelectedRows(ids)
+ };
+
+ tableRef.current = useGridApiRef();
+
+
+ return (
+ <div style={{ height: 400, width: '100%' }}>
+ <DataGrid
+ apiRef={tableRef}
+ rows={tabelData}
+ columns={columns}
+ disableRowSelectionOnClick
+ getRowId={(row) => row.id}
+ disableColumnFilter
+ disableColumnSelector
+ disableColumnSorting
+ disableMultipleColumnsSorting
+ processRowUpdate={processRowUpdate}
+ initialState={{
+ pagination: {
+ paginationModel: {
+ pageSize: 25,
+ },
+ },
+ }}
+ pageSizeOptions={[10, 25, 50, 100]}
+ editMode="row"
+ checkboxSelection
+ onRowSelectionModelChange={handleSelectionChange}
+ selectionModel={selectedRows}
+ sx={{
+ '& .MuiDataGrid-cell input': {
+ border: '1px solid #ccc'
+ },
+ }}
+ />
+ </div>
+ );
+};
+
diff --git a/rsf-admin/src/page/orders/purchase/PurchaseList.jsx b/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
index 2a505de..fdfcc50 100644
--- a/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
+++ b/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
@@ -126,19 +126,19 @@
rowClick={'edit'}
expand={false}
expandSingle={true}
- omit={['id', 'createTime', 'createBy','channel', 'platCode', 'memo', 'preArr', 'channel','startTime','workQty', 'endTime']}
+ omit={['id', 'createTime', 'createBy','channel', 'platCode', 'memo', 'channel','startTime','workQty', 'endTime']}
>
<NumberField source="id" />
<TextField source="code" label="table.field.purchase.code" />
<TextField source="type$" label="table.field.purchase.type" />
<TextField source="wkType$" label="table.field.purchase.wkType" />
<TextField source="source" label="table.field.purchase.source" />
- <DateField source="preArr" label="table.field.purchase.preArr" showTime />
<NumberField source="anfme" label="table.field.purchase.anfme" />
<NumberField source="qty" label="table.field.purchase.qty" />
{/* <NumberField source="workQty" label="table.field.purchase.workQty" /> */}
<TextField source="channel" label="table.field.purchase.channel" />
<TextField source="platCode" label="table.field.purchase.platCode" />
+ <DateField source="preArr" label="table.field.purchase.preArr" showTime />
<DateField source="startTime" label="table.field.purchase.startTime" showTime />
<DateField source="endTime" label="table.field.purchase.endTime" showTime />
<TextField source="project" label="table.field.purchase.project" />
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/SysStockProperties.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/SysStockProperties.java
index 306fc3c..90bd960 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/SysStockProperties.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/SysStockProperties.java
@@ -15,8 +15,6 @@
@Configuration
@ConfigurationProperties(prefix = "stock")
public class SysStockProperties {
-
-
/**
* wms鏄惁鍏佽鎵撳嵃璐х墿鏍囩, 榛樿鍙墦鍗�
*/
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
index d3c112c..9e5bcfc 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -221,6 +221,22 @@
return asnOrderService.saveOrderAndItems(params, getLoginUserId());
}
+ @PostMapping("/asnOrder/purchases/save")
+ @ApiOperation("鏍规嵁PO鍗曟柊寤烘敹璐у崟")
+ @PreAuthorize("hasAuthority('manager:asnOrder:save')")
+ public R orderCreateByPo(@RequestBody Map<String, Object> params) {
+ if (Objects.isNull(params.get("ids"))) {
+ return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ String json = params.get("ids").toString();
+ List<Long> ids = JSONArray.parseArray(params.get("ids").toString(), Long.class);
+ if (ids.isEmpty()) {
+ return R.error("鍙傛暟涓嶈兘涓虹┖");
+ }
+ return asnOrderService.createByPo(ids);
+ }
+
+
@ApiOperation("鍗曟嵁淇℃伅淇敼")
@PostMapping("/asnOrder/items/update")
@PreAuthorize("hasAuthority('manager:asnOrder:update')")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
index a47d715..af7930d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
@@ -1,6 +1,7 @@
package com.vincent.rsf.server.manager.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
@@ -12,6 +13,7 @@
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.entity.Purchase;
import com.vincent.rsf.server.manager.entity.PurchaseItem;
+import com.vincent.rsf.server.manager.enums.POExceStatus;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.PurchaseItemService;
import com.vincent.rsf.server.manager.service.PurchaseService;
@@ -48,6 +50,17 @@
}
@PreAuthorize("hasAuthority('manager:purchase:list')")
+ @PostMapping("/purchase/filters/page")
+ public R filterPage(@RequestBody Map<String, Object> map) {
+ BaseParam baseParam = buildParam(map, BaseParam.class);
+ PageParam<Purchase, BaseParam> pageParam = new PageParam<>(baseParam, Purchase.class);
+ QueryWrapper<Purchase> wrapper = pageParam.buildWrapper(true);
+ wrapper.ne("exce_status", POExceStatus.PO_EXCE_STATUS_ALL_DONE.val);
+ return R.ok().add(purchaseService.page(pageParam, wrapper));
+ }
+
+
+ @PreAuthorize("hasAuthority('manager:purchase:list')")
@PostMapping("/purchase/list")
public R list(@RequestBody Map<String, Object> map) {
return R.ok().add(purchaseService.list());
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
index d9ba537..68331a1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
@@ -108,6 +108,9 @@
@ApiModelProperty(value = "鏀惰揣閬撳彛")
private String channel;
+ @ApiModelProperty("鎵ц鐘舵��")
+ private Short exceStatus;
+
/**
* erp鍗曞彿
*/
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
index aeaf704..975acfa 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
@@ -29,13 +29,13 @@
@Excel(name = "鍗曟嵁绫诲瀷")
@ApiModelProperty(value= "鍗曟嵁绫诲瀷")
- @ExcelComment(value = "type", example = "閲囪喘鍏ュ簱鍗�")
+ @ExcelComment(value = "type", example = "鍏ュ簱鍗�")
private String type;
@Excel(name = "涓氬姟绫诲瀷")
@ApiModelProperty(value= "涓氬姟绫诲瀷")
- @ExcelComment(value = "wkType", example = "澶栬喘鏀惰揣")
+ @ExcelComment(value = "wkType", example = "閲囪喘鍏ュ簱鍗�")
private String wkType;
@Excel(name = "椤圭洰鍚嶇О")
@@ -131,6 +131,7 @@
@ExcelComment(value = "splrBatch", example = "20250401")
private String splrBatch;
+
@Excel(name = "棰勮閫佽揪鏃堕棿")
@ApiModelProperty("棰勮閫佽揪鏃堕棿")
@ExcelComment(value = "arrTime", example = "2025-05-21")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java
index 5d43cc8..6566eb2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java
@@ -9,7 +9,7 @@
*/
public enum AsnExceStatus {
- //璐ㄦ鐘舵��
+ //ASN鎵ц鐘舵�佺姸鎬�
ASN_EXCE_STATUS_UN_EXCE("0", "鏈墽琛�"),
ASN_EXCE_STATUS_EXCE_ING("1", "鎵ц涓�"),
ASN_EXCE_STATUS_RECEIPT_DONE("2", "鏀惰揣瀹屾垚"),
@@ -17,6 +17,12 @@
ASN_EXCE_STATUS_TASK_CANCEL("4", "鍙栨秷"),
ASN_EXCE_STATUS_TASK_CLOSE("5", "宸插叧闂�"),
+ //PO鍗曟墽琛岀姸鎬�
+ PO_EXCE_STATUS_UN_EXCE("0", "鏈墽琛�"),
+ PO_EXCE_STATUS_EXCE_ING("1", "鎵ц涓�"),
+ PO_EXCE_STATUS_SECTION_DONE("3", "閮ㄥ垎瀹屾垚"),
+ PO_EXCE_STATUS_ALL_DONE("3", "宸插畬鎴�"),
+
OUT_STOCK_STATUS_TASK_INIT("11", "鍒濆鍖�"),
OUT_STOCK_STATUS_TASK_EXCE("12", "寰呭鐞�"),
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/POExceStatus.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/POExceStatus.java
new file mode 100644
index 0000000..318da31
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/POExceStatus.java
@@ -0,0 +1,19 @@
+package com.vincent.rsf.server.manager.enums;
+
+
+public enum POExceStatus {
+ PO_EXCE_STATUS_UN_EXCE("0", "鏈墽琛�"),
+ PO_EXCE_STATUS_EXCE_ING("1", "鎵ц涓�"),
+ PO_EXCE_STATUS_SECTION_DONE("3", "閮ㄥ垎瀹屾垚"),
+ PO_EXCE_STATUS_ALL_DONE("3", "宸插畬鎴�"),
+ ;
+
+ POExceStatus(String val, String desc) {
+ this.val = Short.parseShort(val);
+ this.desc = desc;
+ }
+
+ public Short val;
+ public String desc;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
index 626dbd8..a3ce17e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
@@ -11,6 +11,7 @@
import com.vincent.rsf.server.manager.controller.params.WarehouseAreaParam;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
+import com.vincent.rsf.server.manager.enums.POExceStatus;
import com.vincent.rsf.server.manager.enums.PakinIOStatus;
import com.vincent.rsf.server.manager.enums.WarehouseAreasType;
import com.vincent.rsf.server.manager.service.*;
@@ -203,7 +204,7 @@
return;
}
//鑾峰彇鏈敓鎴怉SN鍗曟嵁
- List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().eq(Purchase::getStatus, 0));
+ List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().eq(Purchase::getExceStatus, 0));
//PO鍗曚负绌猴紝鐩存帴璺冲嚭褰撳墠浠诲姟
if (purchases.isEmpty()) {
return;
@@ -266,7 +267,8 @@
}
//浠诲姟鎵ц瀹屾垚锛屼慨鏀瑰凡瀹屾垚鏁伴噺鍜孭O鍗曟墽琛岀姸鎬�
- purchase.setQty(purchase.getAnfme()).setStatus(1);
+ purchase.setQty(purchase.getAnfme())
+ .setExceStatus(POExceStatus.PO_EXCE_STATUS_EXCE_ING.val);
if (!purchaseService.saveOrUpdate(purchase)) {
throw new CoolException("PO鍗曟墽琛屽畬鎴愬悗锛屼繚瀛樺け璐ワ紒锛�");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
index 2132c30..060bd61 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
@@ -25,4 +25,5 @@
R closeOrder(Long id);
+ R createByPo(List<Long> ids);
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java
index a9ed4df..bdcb10e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseService.java
@@ -1,8 +1,13 @@
package com.vincent.rsf.server.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.api.entity.dto.PoItemsDto;
import com.vincent.rsf.server.manager.entity.Purchase;
+
+import java.util.List;
+import java.util.Set;
public interface PurchaseService extends IService<Purchase> {
+ List<PoItemsDto> poList(Set<Long> asnIds);
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
index 7ab439d..d1aa2c0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -8,19 +8,14 @@
import com.vincent.rsf.server.api.entity.dto.PoItemsDto;
import com.vincent.rsf.server.api.service.ReceiveMsgService;
import com.vincent.rsf.server.api.service.ReportMsgService;
+import com.vincent.rsf.server.common.utils.DateUtils;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
-import com.vincent.rsf.server.manager.entity.AsnOrderItem;
-import com.vincent.rsf.server.manager.entity.AsnOrderItemLog;
-import com.vincent.rsf.server.manager.entity.AsnOrderLog;
+import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
+import com.vincent.rsf.server.manager.enums.POExceStatus;
import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
-import com.vincent.rsf.server.manager.entity.AsnOrder;
-import com.vincent.rsf.server.manager.mapper.PurchaseMapper;
-import com.vincent.rsf.server.manager.service.AsnOrderItemLogService;
-import com.vincent.rsf.server.manager.service.AsnOrderItemService;
-import com.vincent.rsf.server.manager.service.AsnOrderLogService;
-import com.vincent.rsf.server.manager.service.AsnOrderService;
+import com.vincent.rsf.server.manager.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.mapper.SerialRuleMapper;
@@ -49,8 +44,7 @@
private ReceiveMsgService receiveMsgService;
@Autowired
private ReportMsgService reportMsgService;
- @Resource
- private PurchaseMapper purchaseMapper;
+
@Autowired
private AsnOrderItemService asnOrderItemService;
@Autowired
@@ -59,6 +53,12 @@
private AsnOrderItemLogService asnOrderItemLogService;
@Resource
private SerialRuleMapper serialRuleMapper;
+ @Autowired
+ private MatnrService matnrService;
+ @Autowired
+ private PurchaseService purchaseService;
+ @Autowired
+ private PurchaseItemService purchaseItemService;
@Override
public boolean notifyInspect(List<AsnOrder> orders) {
@@ -69,7 +69,7 @@
if (asnIds.isEmpty()) {
throw new CoolException("ASN鍗曟嵁涓嶈兘涓虹┖锛侊紒");
}
- List<PoItemsDto> items = purchaseMapper.poList(asnIds);
+ List<PoItemsDto> items = purchaseService.poList(asnIds);
if (items.isEmpty()) {
throw new CoolException("鐗╂枡鎵�灞為噰璐崟鎹笉瀛樺湪锛侊紒");
}
@@ -247,6 +247,87 @@
}
/**
+ * @author Ryan
+ * @date 2025/5/13
+ * @description: 鏍规嵁PO鍗曞垱寤篈SN鍗�
+ * @version 1.0
+ */
+ @Override
+ public R createByPo(List<Long> ids) {
+ //鑾峰彇鏈敓鎴怉SN鍗曟嵁
+ List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().in(Purchase::getId, ids));
+ //鐢熸垚ASN鍗曟嵁
+ purchases.forEach(purchase -> {
+ if (!Objects.isNull(purchase.getStartTime())) {
+ //鍒ゆ柇璧峰鏃堕棿鏄惁澶т簬褰撳墠鏃堕棿
+ if (DateUtils.compareDate(new Date(), purchase.getStartTime())) {
+ return;
+ }
+ }
+ List<PurchaseItem> items = purchaseItemService.list(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getPurchaseId, purchase.getId()));
+ if (items.isEmpty()) {
+ throw new CoolException("瀛愬垪琛ㄦ暟鎹负绌猴紝璇锋煡璇O鍗曟槸鍚︽纭綍鍏ワ紒锛�");
+ }
+ AsnOrder order = new AsnOrder();
+ //鏍规嵁缂栫爜瑙勫垯鐢熸垚ASN鍗曞彿
+ String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, purchase);
+ order.setAnfme(purchase.getAnfme())
+ .setCode(code)
+ .setArrTime(purchase.getPreArr())
+ .setQty(purchase.getQty())
+ .setPoId(purchase.getId())
+ .setPoCode(purchase.getCode());
+ if (!this.save(order)) {
+ throw new CoolException("ASN鍗曟嵁淇濆瓨澶辫触锛侊紒");
+ }
+ List<AsnOrderItem> orderItems = new ArrayList<>();
+ items.forEach(item -> {
+ AsnOrderItem orderItem = new AsnOrderItem();
+ Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, item.getMatnrCode()));
+ if (Objects.isNull(matnr)) {
+ throw new CoolException("鏁版嵁閿欒锛氬綋鍓嶇墿鏂欎笉瀛樺湪!!");
+ }
+ String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item);
+ if (StringUtils.isBlank(trackCode)) {
+ throw new CoolException("鍗曟嵁璺熻釜鐮佺敓鎴愬け璐ワ細璇锋鏌ャ�宻ys_asn_mantr_label銆嶆槸鍚﹂厤缃畬鎴愶紒锛�");
+ }
+// String barcode = code + matnr.getCode();
+ orderItem.setAnfme(item.getAnfme())
+ .setAsnId(order.getId())
+ .setQty(item.getAnfme())
+ .setSplrName(item.getSplrName())
+ .setAsnCode(code)
+ .setSplrBatch(item.getSplrBatch())
+ .setSplrCode(item.getSplrCode())
+ .setPoDetlId(item.getId())
+ .setPlatItemId(item.getPlatItemId())
+ .setTrackCode(trackCode)
+ .setPoCode(purchase.getCode())
+ .setPurQty(item.getAnfme())
+ .setPurUnit(item.getUnit())
+ .setMatnrCode(matnr.getCode())
+ .setMaktx(matnr.getName())
+ .setMatnrId(matnr.getId());
+ orderItems.add(orderItem);
+ });
+ if (!asnOrderItemService.saveBatch(orderItems)) {
+ throw new CoolException(("Asn鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒"));
+ }
+
+ //浠诲姟鎵ц瀹屾垚锛屼慨鏀瑰凡瀹屾垚鏁伴噺鍜孭O鍗曟墽琛岀姸鎬�
+ purchase.setQty(purchase.getAnfme())
+ .setExceStatus(POExceStatus.PO_EXCE_STATUS_EXCE_ING.val);
+
+ if (!purchaseService.saveOrUpdate(purchase)) {
+ throw new CoolException("PO鍗曟墽琛屽畬鎴愬悗锛屼繚瀛樺け璐ワ紒锛�");
+ }
+ });
+
+
+ return null;
+ }
+
+ /**
* @param
* @return
* @author Ryan
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
index 29370c0..f9b7e40 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
@@ -96,25 +96,25 @@
if (StringUtils.isBlank(purchaseTemplate.getMatnrCode())) {
throw new CoolException(purchaseTemplate.getPoCode() + "锛氱墿鏂欑紪鐮佷笉鑳戒负绌猴紒锛�");
}
- Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, template.getMatnrCode()));
+ Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, purchaseTemplate.getMatnrCode()));
if (Objects.isNull(matnr)) {
- throw new CoolException(template.getMatnrCode() + "鐗╂枡涓嶅瓨鍦紒锛�");
+ throw new CoolException(purchaseTemplate.getMatnrCode() + "鐗╂枡涓嶅瓨鍦紒锛�");
}
item.setMatnrName(matnr.getName())
.setMatnrCode(matnr.getCode())
- .setPlatItemId(template.getPlatItemId())
- .setAnfme(template.getAnfme())
+ .setPlatItemId(purchaseTemplate.getPlatItemId())
+ .setAnfme(purchaseTemplate.getAnfme())
.setPurchaseId(purchase.getId())
.setUnit(matnr.getUnit())
.setNromQty(matnr.getNromNum())
- .setSplrBatch(template.getSplrBatch())
+ .setSplrBatch(purchaseTemplate.getSplrBatch())
.setCreateBy(loginUserId)
.setUpdateBy(loginUserId);
if (StringUtils.isNotBlank(purchaseTemplate.getSplrCode())) {
Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>()
.eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val)
- .eq(Companys::getCode, template.getSplrCode()));
+ .eq(Companys::getCode, purchaseTemplate.getSplrCode()));
if (!Objects.isNull(companys)) {
item.setSplrCode(companys.getCode()).setSplrName(companys.getName());
} else {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java
index 3a5edea..9cadbf2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseServiceImpl.java
@@ -1,12 +1,20 @@
package com.vincent.rsf.server.manager.service.impl;
+import com.vincent.rsf.server.api.entity.dto.PoItemsDto;
import com.vincent.rsf.server.manager.mapper.PurchaseMapper;
import com.vincent.rsf.server.manager.entity.Purchase;
import com.vincent.rsf.server.manager.service.PurchaseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
+import java.util.List;
+import java.util.Set;
+
@Service("purchaseService")
public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements PurchaseService {
+ @Override
+ public List<PoItemsDto> poList(Set<Long> asnIds) {
+ return this.baseMapper.poList(asnIds);
+ }
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java
index 615ca93..129af7b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/GlobalConfigCode.java
@@ -8,7 +8,6 @@
*/
public class GlobalConfigCode {
-
public final static String EXECUTION = "Execution";
/**鐩存帴缁勬墭*/
diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml
index efd3d05..203032b 100644
--- a/rsf-server/src/main/resources/application-dev.yml
+++ b/rsf-server/src/main/resources/application-dev.yml
@@ -89,7 +89,7 @@
#鏄惁鍏佽鎵撳嵃璐х墿鏍囩锛� 榛樿鍏佽鎵撳嵃锛屼篃鍙敱渚涘簲鍟嗘彁渚涙爣绛�
flagPrinter: false
#鏄惁鑷姩鐢熸垚ASN鍗曪紙榛樿锛氭槸锛夛紝涓恒�庡惁銆忓垯寮�鍚疨O鍗曟墜鍔ㄧ敓鎴怉SN鍗曞姛鑳�
- flagAutoAsn: true
+ flagAutoAsn: false
#璐ㄦ鍔熻兘 鏄惁鏍¢獙涓婃灦锛堥粯璁わ細鏄級锛屾槸鍚︽牎楠屾敹璐э紙榛樿锛氬惁锛�
inspect:
#鍒ゆ柇鏄悗妫�楠屽悎鏍煎悗锛屾墠鍏佽涓婃灦
--
Gitblit v1.9.1