From 273f2e5d3941b0e720e5eabd7dba9cfc042c3267 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 17 六月 2025 17:04:53 +0800
Subject: [PATCH] 出库单生成波次功能开发
---
rsf-admin/src/page/orders/wave/WaveEdit.jsx | 4
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 46 ++++---
rsf-admin/src/page/orders/wave/WaveList.jsx | 26 +--
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java | 16 ++
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx | 46 ++++---
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java | 10 +
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 1
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java | 9 +
rsf-admin/src/page/orders/wave/WaveItemList.jsx | 50 ++++++--
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java | 6
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java | 47 +++++++
rsf-admin/src/i18n/zh.js | 5
rsf-admin/src/page/orders/outStock/OutOrderList.jsx | 70 +++++++----
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java | 3
rsf-admin/src/i18n/en.js | 6 +
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java | 10 -
rsf-admin/.env | 2
17 files changed, 240 insertions(+), 117 deletions(-)
diff --git a/rsf-admin/.env b/rsf-admin/.env
index a3c69b2..a0bb09f 100644
--- a/rsf-admin/.env
+++ b/rsf-admin/.env
@@ -1,3 +1,3 @@
-VITE_BASE_IP=127.0.0.1
+VITE_BASE_IP=192.168.4.50
# VITE_BASE_IP=47.76.147.249
VITE_BASE_PORT=8080
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 1d4627b..b36ae34 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -837,6 +837,7 @@
type: "type",
exceStatus: "exceStatus",
anfme: "anfme",
+ groupQty: 'Group Qty',
qty: "qty",
orderNum: "orderNum",
},
@@ -1146,6 +1147,8 @@
selectSite: 'Select Site',
top: "top",
resort: "sort",
+ start: 'Start',
+ pause: 'Pause',
subzone: 'subzone',
bindmatnr: 'bind matnr',
bindloc: 'bind loc',
@@ -1160,6 +1163,7 @@
orderPrint: 'Orders Print',
quality: "quality",
complete: "complete",
+ allComfirm: 'All Comfirm',
verifyComfirm: 'Verify Comfirm',
close: "close",
asnCreate: "Create By Order",
@@ -1170,6 +1174,8 @@
createWave: "Create Wave",
order: 'Orders',
modiftySite: 'Modify SiteNo',
+ selectWave: 'Select Wave Rule',
+
},
request: {
error: {
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 6df53d7..f3070a7 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -867,6 +867,7 @@
type: "鍗曟嵁绫诲瀷",
exceStatus: "鐘舵��",
anfme: "鏁伴噺",
+ groupQty: '鍝佺被鏁�',
qty: "瀹屾垚鏁伴噺",
orderNum: "鍗曟嵁鏁�",
},
@@ -1140,6 +1141,8 @@
continue: '缁х画鏀惰揣',
batch: '鎵归噺鎿嶄綔',
confirm: '纭',
+ start: '寮�濮嬩笅鍙�',
+ pause: '鏆傚仠',
pick: '鎷f枡',
check: '鐩樼偣',
bulkExport: "鎵归噺瀵煎嚭",
@@ -1163,6 +1166,7 @@
batchLocType: "鎵归噺搴撲綅绫诲瀷",
batchPrint: "鎵归噺鎵撳嵃",
verifyComfirm: '瀹℃牳纭',
+ allComfirm: '鍏ㄩ儴鎻愪氦',
quality: "璐ㄦ",
complete: "瀹岀粨",
close: "鍏抽棴",
@@ -1174,6 +1178,7 @@
createWave: "鐢熸垚娉㈡",
recover: "缁х画鏀惰揣",
modiftySite: '淇敼搴撳彛',
+ selectWave: '娉㈡瑙勫垯',
},
request: {
error: {
diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
index 955b074..1181459 100644
--- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -39,26 +39,27 @@
useUnselectAll,
useRecordSelection,
} from 'react-admin';
-import { Box, Typography, Card, Stack, Drawer } from '@mui/material';
import { styled } from '@mui/material/styles';
-import MyCreateButton from "../../components/MyCreateButton";
-import BillStatusField from '../../components/BillStatusField';
-import ConfirmButton from '../../components/ConfirmButton';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import EditIcon from '@mui/icons-material/Edit';
-import request from '@/utils/request';
+import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
+import { Box, Typography, Card, Stack, Drawer } from '@mui/material';
import DictionarySelect from "../../components/DictionarySelect";
+import BillStatusField from '../../components/BillStatusField';
+import MyCreateButton from "../../components/MyCreateButton";
+import PageEditDrawer from "../../components/PageEditDrawer";
+import ConfirmButton from '../../components/ConfirmButton';
import ImportButton from "../../components/ImportButton";
import DetailsIcon from '@mui/icons-material/Details';
-import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
-import AddIcon from '@mui/icons-material/Add';
-import OutOrderModal from "./OutOrderModal";
+import AddTaskIcon from '@mui/icons-material/AddTask';
import PublicIcon from '@mui/icons-material/Public';
import SelectMatnrModal from "./SelectMatnrModal";
-import AddTaskIcon from '@mui/icons-material/AddTask';
-import PageEditDrawer from "../../components/PageEditDrawer";
-import OutStockPublic from "./OutStockPublic";
+import EditIcon from '@mui/icons-material/Edit';
import OutOrderPreview from "./OutOrderPreview";
+import AddIcon from '@mui/icons-material/Add';
+import OutStockPublic from "./OutStockPublic";
+import OutOrderModal from "./OutOrderModal";
+import request from '@/utils/request';
+import OutStockWaveDialog from "./OutStockWaveDialog";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
@@ -109,19 +110,38 @@
dictTypeCode="sys_asn_exce_status"
alwaysOn
/>,
-
]
const OutOrderList = (props) => {
const translate = useTranslate();
+ const refresh = useRefresh();
+
const [createDialog, setCreateDialog] = useState(false);
const [manualDialog, setManualDialog] = useState(false);
+ const [selectIds, setSelectIds] = useState([]);
const [preview, setPreview] = useState(false);
+ const [waveRule, setWaveRule] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
const [modalType, setmodalType] = useState(0);
const [select, setSelect] = useState(0);
const billReload = useRef();
const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || [];
+
+ //鑾峰彇娉㈡瑙勫垯
+ const closeDialog = async (value) => {
+ setWaveRule(false)
+ refresh()
+ console.log('=====>');
+ console.log(value);
+ console.log(selectIds);
+ // const res = await request.post(`/outStock/generate/wave`, { ids: selectIds });
+ // if (res?.data?.code === 200) {
+ // notify(res.data.msg);
+ // } else {
+ // notify(res.data.msg);
+ // }
+ }
+
return (
<Box display="flex">
<List
@@ -152,7 +172,7 @@
<StyledDatagrid
sx={{ width: '100%' }}
preferenceKey='outStock'
- bulkActionButtons={<PublicTaskButton />}
+ bulkActionButtons={<PublicTaskButton setWaveRule={setWaveRule} setSelectIds={setSelectIds} />}
rowClick={false}
expandSingle={true}
omit={['id', 'createTime', 'createBy', 'memo', 'rleStatus$']}
@@ -194,9 +214,10 @@
<OutOrderModal
open={createDialog}
setOpen={setCreateDialog}
- preview={preview}
+ preview={preview}
setPreview={setPreview}
/>
+ <OutStockWaveDialog open={waveRule} setOpen={setWaveRule} onClose={closeDialog} />
<OutOrderPreview open={preview} setOpen={setPreview} />
<PageEditDrawer
title={"toolbar.publicWorking"}
@@ -211,24 +232,16 @@
export default OutOrderList;
-const PublicTaskButton = () => {
+const PublicTaskButton = ({ setWaveRule, setSelectIds }) => {
const record = useRecordContext();
const { selectedIds, onUnselectItems } = useListContext();
const notify = useNotify();
- const refresh = useRefresh();
const redirect = useRedirect();
- const pubClick = async (event) => {
- event.stopPropagation();
+ const pubClick = async () => {
onUnselectItems();
- const res = await request.post(`/outStock/generate/wave`, { ids: selectedIds });
- if (res?.data?.code === 200) {
- notify(res.data.msg);
- redirect("/wave")
- } else {
- notify(res.data.msg);
- }
- refresh();
+ setWaveRule(true);
+ setSelectIds(selectedIds)
}
return (
@@ -236,7 +249,8 @@
onClick={pubClick}
label={"toolbar.createWave"}
startIcon={<PublicIcon />}
- />);
+ />
+ );
}
const MyButton = ({ setCreateDialog, setmodalType }) => {
diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
index 60c2172..ce732be 100644
--- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -58,9 +58,11 @@
'& .column-maktx': {
width: 200
},
- '& .RaBulkActionsToolbar-toolbar': {
- display: 'none'
- }
+
+ mt: '60px'
+ // '& .RaBulkActionsToolbar-toolbar': {
+ // display: 'none'
+ // }
}));
@@ -88,19 +90,20 @@
}, [selectedMatnr])
- const handleRowClick = (id, resource, record) => {
- setRowSelectedIds(prev =>
- prev.includes(id)
- ? prev.filter(item => item !== id) // 鍙栨秷閫夋嫨
- : [...prev, id] // 娣诲姞閫夋嫨
- );
+ const ComfirmButton = () => {
+ const { selectedIds, data } = useListContext();
+ const handleRowClick = () => {
+ const ids = data.filter(item => selectedIds.includes(item.id)).map(item => item.id);
+ setRowSelectedIds(ids);
+ const mas = data.filter(item => selectedIds.includes(item.id)).map(item => item.matnrCode);
+ //璁剧疆搴撲綅淇℃伅绛涢�夋潯浠�
+ setSelectedMatnr(mas);
+ }
- //璁剧疆搴撲綅淇℃伅绛涢�夋潯浠�
- setSelectedMatnr(prev =>
- prev.includes(record?.matnrCode)
- ? prev.filter(item => item !== record?.matnrCode) // 鍙栨秷閫夋嫨
- : [...prev, record?.matnrCode] // 娣诲姞閫夋嫨
- );
+ return (
+ <Button label="toolbar.confirm" size="medium" onClick={handleRowClick} />
+ )
+
};
const handleClickOpen = () => {
@@ -191,6 +194,7 @@
filter={{ asnId: record?.id, deleted: 0 }}
sort={{ field: "create_time", order: "desc" }}
actions={false}
+ pagination={false}
perPage={DEFAULT_ITEM_PAGE_SIZE}
>
<LinearProgress
@@ -199,9 +203,9 @@
<StyledDatagrid
storeKey={"outStockPublic"}
preferenceKey='outStockItem'
- bulkActionButtons={<></>}
- rowClick={handleRowClick}
- selectedIds={rowSelectedIds}
+ bulkActionButtons={<>
+ <ComfirmButton />
+ </>}
omit={['id', 'splrName', 'qty', 'poCode',]}
>
<NumberField source="id" />
@@ -269,7 +273,8 @@
{ field: 'batch', headerName: '鎵规', width: 90 },
{ field: 'unit', headerName: '鍗曚綅', width: 60 },
{ field: 'outQty', headerName: '鍑哄簱鏁伴噺', width: 110, },
- { field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110,
+ {
+ field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110,
renderCell: (params) => (
<OutStockAnfme value={params.value} />
)
@@ -449,11 +454,10 @@
}
return (
<ConfirmButton
- label="toolbar.confirm"
+ label="toolbar.allComfirm"
variant="contained"
size="medium"
onConfirm={submit}
- startIcon={<ConfirmationNumberOutlinedIcon />}
/>
)
}
diff --git a/rsf-admin/src/page/orders/wave/WaveEdit.jsx b/rsf-admin/src/page/orders/wave/WaveEdit.jsx
index 899a39f..689027f 100644
--- a/rsf-admin/src/page/orders/wave/WaveEdit.jsx
+++ b/rsf-admin/src/page/orders/wave/WaveEdit.jsx
@@ -55,7 +55,7 @@
<SimpleForm
shouldUnregister
warnWhenUnsavedChanges
- toolbar={<FormToolbar />}
+ toolbar={false}
mode="onTouched"
defaultValues={{}}
// validate={(values) => { }}
@@ -143,3 +143,5 @@
}
export default WaveEdit;
+
+
diff --git a/rsf-admin/src/page/orders/wave/WaveItemList.jsx b/rsf-admin/src/page/orders/wave/WaveItemList.jsx
index 6dc7a54..5f675d1 100644
--- a/rsf-admin/src/page/orders/wave/WaveItemList.jsx
+++ b/rsf-admin/src/page/orders/wave/WaveItemList.jsx
@@ -46,7 +46,8 @@
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import ContentCreate from '@mui/icons-material/Create';
-
+import PlayArrowOutlinedIcon from '@mui/icons-material/PlayArrowOutlined';
+import PauseCircleOutlineIcon from '@mui/icons-material/PauseCircleOutline';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
height: '.9em'
@@ -72,10 +73,7 @@
<TextInput source="matnrCode" label="table.field.waveItem.matnrCode" />,
<TextInput source="batch" label="table.field.waveItem.batch" />,
<TextInput source="splrBatch" label="table.field.waveItem.splrBatch" />,
- <TextInput source="orderCode" label="table.field.waveItem.orderCode" />,
- <NumberInput source="orderItemId" label="table.field.waveItem.orderItemId" />,
<TextInput source="unit" label="table.field.waveItem.unit" />,
- <TextInput source="trackCode" label="table.field.waveItem.trackCode" />,
<TextInput source="fieldsIndex" label="table.field.waveItem.fieldsIndex" />,
<NumberInput source="anfme" label="table.field.waveItem.anfme" />,
<NumberInput source="workQty" label="table.field.waveItem.workQty" />,
@@ -125,27 +123,29 @@
>
<StyledDatagrid
preferenceKey='waveItem'
- bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+ bulkActionButtons= {
+ <>
+ <BulkStartButton />
+ <BulkPauseButton />
+ </>
+ }
rowClick={(id, resource, record) => false}
expand={false}
expandSingle={false}
- omit={['id', 'createTime', 'matnrId', 'waveId', 'batch', 'orderItemId', 'batch', 'fieldsIndex', 'createBy', 'memo']}
+ omit={['id', 'createTime', 'matnrId', 'waveId', 'batch', 'orderItemId', 'fieldsIndex', 'createBy', 'memo']}
>
<NumberField source="id" />
<NumberField source="waveId" label="table.field.waveItem.waveId" />
<TextField source="waveCode" label="table.field.waveItem.waveCode" />
<NumberField source="matnrId" label="table.field.waveItem.matnrId" />
- <TextField source="maktx" label="table.field.waveItem.matnrName" />
<TextField source="matnrCode" label="table.field.waveItem.matnrCode" />
+ <TextField source="maktx" label="table.field.waveItem.matnrName" />
<TextField source="batch" label="table.field.waveItem.batch" />
<TextField source="splrBatch" label="table.field.waveItem.splrBatch" />
- <TextField source="orderCode" label="table.field.waveItem.orderCode" />
- <NumberField source="orderItemId" label="table.field.waveItem.orderItemId" />
- <TextField source="unit" label="table.field.waveItem.unit" />
- <TextField source="trackCode" label="table.field.waveItem.trackCode" />
- <TextField source="fieldsIndex" label="table.field.waveItem.fieldsIndex" />
<NumberField source="anfme" label="table.field.waveItem.anfme" />
+ <TextField source="fieldsIndex" label="table.field.waveItem.fieldsIndex" />
<NumberField source="workQty" label="table.field.waveItem.workQty" />
+ <TextField source="unit" label="table.field.waveItem.unit" />
<TextField source="updateBy$" label="common.field.updateBy" />
<DateField source="updateTime" label="common.field.updateTime" showTime />
<TextField source="createBy$" label="common.field.createBy" />
@@ -182,8 +182,30 @@
}
return (
- <Button label="ra.action.edit" onClick={editClick} startIcon={<ContentCreate />}/>
-
+ <Button label="ra.action.edit" onClick={editClick} startIcon={<ContentCreate />} />
)
}
+
+
+const BulkStartButton = () => {
+ const { data, selectedIds, onUnselectItems } = useListContext();
+
+ const startClick = () => {
+ onUnselectItems()
+ }
+ return (
+ <Button label="toolbar.start" onClick={startClick} startIcon={<PlayArrowOutlinedIcon />} variant="outlined" />
+ )
+}
+
+const BulkPauseButton = () => {
+ const { data, selectedIds, onUnselectItems } = useListContext();
+
+ const pauseClick = () => {
+ onUnselectItems()
+ }
+ return (
+ <Button label="toolbar.pause" onClick={pauseClick} startIcon={<PauseCircleOutlineIcon />} variant="outlined" />
+ )
+}
\ No newline at end of file
diff --git a/rsf-admin/src/page/orders/wave/WaveList.jsx b/rsf-admin/src/page/orders/wave/WaveList.jsx
index eec93fe..a0fb5a4 100644
--- a/rsf-admin/src/page/orders/wave/WaveList.jsx
+++ b/rsf-admin/src/page/orders/wave/WaveList.jsx
@@ -35,21 +35,15 @@
useRedirect,
Button,
} from 'react-admin';
-import { Box, Typography, Card, Stack } from '@mui/material';
-import { styled } from '@mui/material/styles';
-import WaveCreate from "./WaveCreate";
-import WavePanel from "./WavePanel";
-import EmptyData from "../../components/EmptyData";
-import MyCreateButton from "../../components/MyCreateButton";
-import MyExportButton from '../../components/MyExportButton';
-import PageDrawer from "../../components/PageDrawer";
-import MyField from "../../components/MyField";
-import request from '@/utils/request';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import ConfirmButton from "../../components/ConfirmButton";
+import PageDrawer from "../../components/PageDrawer";
import PublicIcon from '@mui/icons-material/Public';
import ItemToTaskModal from "./ItemToTaskModal";
-import ConfirmButton from "../../components/ConfirmButton";
+import { styled } from '@mui/material/styles';
+import request from '@/utils/request';
+import WaveCreate from "./WaveCreate";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -143,6 +137,7 @@
<TextField source="type$" label="table.field.wave.type" sortable={false} />
<TextField source="exceStatus$" label="table.field.wave.exceStatus" sortable={false} />
<NumberField source="anfme" label="table.field.wave.anfme" />
+ <NumberField source="groupQty" label="table.field.wave.groupQty" />
<NumberField source="qty" label="table.field.wave.qty" />
<NumberField source="orderNum" label="table.field.wave.orderNum" />
<TextField source="updateBy$" label="common.field.updateBy" />
@@ -153,8 +148,7 @@
<TextField source="memo" label="common.field.memo" sortable={false} />
<WrapperField cellClassName="opt" label="common.field.opt">
<PublicTaskButton setSelectIds={setSelectIds} setDetailDialog={setDetailDialog} />
- <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
- <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+ <EditButton label="toolbar.detail" sx={{ padding: '1px', fontSize: '.75rem' }} />
</WrapperField>
</StyledDatagrid>
</List>
@@ -184,12 +178,12 @@
const notify = useNotify();
const refresh = useRefresh();
const redirect = useRedirect();
-
+
const pubClick = async (event) => {
setSelectIds(record);
setDetailDialog(true);
}
return (
- record?.exceStatus == 0 ? <ConfirmButton label={"toolbar.createTask"} startIcon={<PublicIcon /> } onConfirm={pubClick} size='small' /> : <></>
+ record?.exceStatus == 0 ? <ConfirmButton label={"toolbar.createTask"} startIcon={<PublicIcon />} onConfirm={pubClick} size='small' /> : <></>
);
}
\ No newline at end of file
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
index d2d32ce..ba65995 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -294,10 +294,14 @@
if (Objects.isNull(params.get("outId"))) {
return R.error("鍑哄簱鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
-
List<OutStockToTaskParams> taskParams = JSONArray.parseArray(JSONArray.toJSONString(params.get("items")), OutStockToTaskParams.class);
-
- return outStockService.genOutStockTask(taskParams, getLoginUserId(), Long.parseLong(params.get("outId").toString()));
+ List<OutStockToTaskParams> tasks = new ArrayList<>();
+ for (OutStockToTaskParams taskParam : taskParams) {
+ if (StringUtils.isNotBlank(taskParam.getLocCode())) {
+ tasks.add(taskParam);
+ }
+ }
+ return outStockService.genOutStockTask(tasks, getLoginUserId(), Long.parseLong(params.get("outId").toString()));
}
/**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java
index b527b50..7c95b75 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java
@@ -92,14 +92,12 @@
if (Objects.isNull(ids)) {
throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
- List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getSourceId, ids));
- if (taskItems.isEmpty()) {
+ List<Long> list = Arrays.asList(ids);
+ List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getSourceId, list));
+ if (!taskItems.isEmpty()) {
throw new CoolException("鏈夋湭瀹屾垚浠诲姟锛屼笉鍙墽琛屽垹闄ゆ搷浣滐紒锛�");
}
- if (!waveService.removeByIds(Arrays.asList(ids))) {
- return R.error("Delete Fail");
- }
- return R.ok("Delete Success").add(ids);
+ return waveService.cancelWave(list);
}
@PreAuthorize("hasAuthority('manager:wave:list')")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java
index 31f8d53..cfd4a73 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java
@@ -80,6 +80,9 @@
@ApiModelProperty(value= "鍗曟嵁鏁伴噺")
private Integer orderNum;
+ @ApiModelProperty("鍝佺被鏁伴噺")
+ private Integer groupQty;
+
/**
* 鐘舵�� 1: 姝e父 0: 绂佺敤
*/
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 7739a13..e7bb2da 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
@@ -28,9 +28,11 @@
OUT_STOCK_STATUS_TASK_EXCE("11", "寰呭鐞�"),
OUT_STOCK_STATUS_TASK_WAVE("11", "鐢熸垚娉㈡"),
OUT_STOCK_STATUS_TASK_CREATE("13", "鐢熸垚宸ヤ綔妗�"),
- OUT_STOCK_STATUS_TASK_WORKING("14", "浣滀笟涓�")
+ OUT_STOCK_STATUS_TASK_WORKING("14", "浣滀笟涓�"),
+ OUT_STOCK_STATUS_TASK_DONE("15", "宸插畬鎴�")
- ;
+
+ ;
AsnExceStatus(String val, String desc) {
this.val = Short.parseShort(val);
this.desc = desc;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
index 5692412..be17fde 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
@@ -7,6 +7,7 @@
import com.vincent.rsf.server.manager.entity.AsnOrderItemLog;
import com.vincent.rsf.server.manager.entity.AsnOrderLog;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
+import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.service.AsnOrderItemLogService;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.AsnOrderLogService;
@@ -19,7 +20,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@@ -54,10 +54,45 @@
@Scheduled(cron = "0 0/05 * * * ? ")
@Transactional(rollbackFor = Exception.class)
public void moveOrderToLog() {
- List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val));
+ List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>()
+ .eq(AsnOrder::getType, OrderType.ORDER_IN.type)
+ .eq(AsnOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val));
if (asnOrders.isEmpty()) {
return;
}
+ moveOrderToLog(asnOrders, OrderType.ORDER_IN.type);
+ }
+
+
+ /**
+ * @author Ryan
+ * @description 鍑哄簱鍗曞畬鎴愬悗锛岀姸鎬佷慨鏀�
+ * @param
+ * @return
+ * @time 2025/6/16 08:35
+ */
+ @Scheduled(cron = "0/30 * * * * ? ")
+ @Transactional(rollbackFor = Exception.class)
+ public void outStockComplete() {
+ List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>()
+ .eq(AsnOrder::getType, OrderType.ORDER_OUT.type)
+ .apply("anfme=work_qty")
+ );
+ if (asnOrders.isEmpty()) {
+ return;
+ }
+ moveOrderToLog(asnOrders, OrderType.ORDER_OUT.type);
+ }
+
+ /**
+ * @param
+ * @param type
+ * @return
+ * @author Ryan
+ * @description 娣诲姞鍘嗗彶鍗曟嵁
+ * @time 2025/6/16 08:56
+ */
+ private void moveOrderToLog(List<AsnOrder> asnOrders, String type) {
Set<Long> longSet = asnOrders.stream().map(AsnOrder::getId).collect(Collectors.toSet());
List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getAsnId, longSet));
if (orderItems.isEmpty()) {
@@ -66,6 +101,10 @@
for (AsnOrder order : asnOrders) {
AsnOrderLog orderLog = new AsnOrderLog();
+ if (type.equals(OrderType.ORDER_OUT.type)) {
+ order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
+ order.setQty(order.getWorkQty());
+ }
BeanUtils.copyProperties(order, orderLog);
orderLog.setId(null);
orderLog.setAsnId(order.getId());
@@ -86,7 +125,7 @@
});
if (!asnOrderItemLogService.saveBatch(logs)) {
- throw new CoolException("閫氱煡鍗曟槑缁嗗巻鍙叉。淇濆瓨澶辫触锛侊紒");
+ throw new CoolException("鍗曟嵁鏄庣粏鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
}
}
@@ -97,4 +136,6 @@
throw new CoolException("鍘熷崟鎹垹闄ゅけ璐ワ紒锛�");
}
}
+
+
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java
index c9cc4f7..55a559b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java
@@ -28,4 +28,13 @@
* @time 2025/4/27 11:08
*/
List<WaveItem> mergeWavePreview(Long waveId);
+
+ /**
+ * @author Ryan
+ * @description 鍙栨秷娉㈡锛屼慨鏀硅鍗曚俊鎭�
+ * @param
+ * @return
+ * @time 2025/6/17 10:03
+ */
+ R cancelWave(List<Long> ids);
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index 849a6fd..46d5648 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -279,13 +279,13 @@
if (Objects.isNull(ids) || ids.isEmpty()) {
throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
- List<AsnOrder> orders = this.list(new LambdaQueryWrapper<AsnOrder>()
- .in(AsnOrder::getId, ids)
- .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val));
+ List<AsnOrder> orders = this.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, ids));
if (orders.isEmpty()) {
throw new CoolException("褰撳墠鍗曟嵁鐘舵�佷笉鑳芥墽琛屾尝娆$敓鎴愭搷浣滐紒锛�");
}
- double sum = orders.stream().mapToDouble(AsnOrder::getAnfme).sum();
+ Double sum = orders.stream().mapToDouble(AsnOrder::getAnfme).sum();
+ Double workQty = orders.stream().mapToDouble(AsnOrder::getWorkQty).sum();
+ Double anfme = Math.round((sum - workQty) * 10000) / 10000.0;
Wave wave = new Wave();
String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_WAVE_TYPE, null);
if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) {
@@ -295,7 +295,7 @@
.setType(Short.parseShort("1"))
.setCode(ruleCode)
.setExceStatus(WaveExceStatus.WAVE_EXCE_STATUS_INIT.val)
- .setAnfme(sum);
+ .setAnfme(anfme);
if (!waveService.save(wave)) {
throw new CoolException("娉㈡淇濆瓨澶辫触锛侊紒");
}
@@ -306,13 +306,13 @@
if (orderItems.isEmpty()) {
throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
}
-
+ //鍚堝苟鐗╂枡锛岀敓鎴愭尝娆℃槑缁�
List<WaveItem> waveItems = mergeWave(orderItems, wave);
if (!waveItemService.saveBatch(waveItems)) {
throw new CoolException("娉㈡鏄庣粏淇濆瓨澶辫触锛侊紒");
}
double sum1 = waveItems.stream().mapToDouble(WaveItem::getAnfme).sum();
- wave.setAnfme(sum1);
+ wave.setAnfme(sum1).setGroupQty(waveItems.size());
if (!waveService.saveOrUpdate(wave)) {
throw new CoolException("涓诲崟淇敼澶辫触锛侊紒");
}
@@ -325,14 +325,17 @@
throw new CoolException("鍑哄簱鍗曟墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�");
}
- double sum2 = orderItems.stream().mapToDouble(AsnOrderItem::getWorkQty).sum();
- if (!this.update(new LambdaUpdateWrapper<AsnOrder>()
- .set(AsnOrder::getWaveId, wave.getId())
- .set(AsnOrder::getWorkQty, sum2)
- .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WAVE.val)
- .in(AsnOrder::getId, ids))) {
- throw new CoolException("鎵ц鐘舵�佷慨鏀逛慨鏀瑰け璐ワ紒锛�");
+ for (AsnOrder order : orders) {
+ Double wkQty = Math.round((order.getWorkQty() + order.getAnfme()) * 10000) / 10000.0;
+ if (!this.update(new LambdaUpdateWrapper<AsnOrder>()
+ .set(AsnOrder::getWaveId, wave.getId())
+ .set(AsnOrder::getWorkQty, wkQty)
+ .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WAVE.val)
+ .in(AsnOrder::getId, ids))) {
+ throw new CoolException("鎵ц鐘舵�佷慨鏀逛慨鏀瑰け璐ワ紒锛�");
+ }
}
+
return R.ok("鎿嶄綔瀹屾垚锛侊紒");
}
@@ -442,12 +445,14 @@
throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
//浼樺厛鐢熸垚娴呭簱浣嶄换鍔�
- List<OutStockToTaskParams> Items = params.stream().sorted(Comparator.comparing(OutStockToTaskParams::getLocCode).thenComparing(item -> {
+ List<OutStockToTaskParams> Items = params.stream()
+ .sorted(Comparator.comparing(OutStockToTaskParams::getLocCode)
+ .thenComparing(item -> {
return LocUtils.isShallowLoc(item.getLocCode()) ? 1 : 0;
}).reversed()).collect(Collectors.toList());
for (OutStockToTaskParams param : Items) {
- if (Objects.isNull(param)) {
+ if (Objects.isNull(param) || StringUtils.isBlank(param.getLocCode())) {
continue;
}
Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, param.getLocCode()).eq(Loc::getBarcode, param.getBarcode()));
@@ -697,12 +702,11 @@
private List<WaveItem> mergeWave(List<AsnOrderItem> orderItems, Wave wave) {
List<WaveItem> items = new ArrayList<>();
orderItems.forEach(order -> {
+ Double anfme = Math.round((order.getAnfme() - order.getWorkQty()) * 10000) / 10000.0;
WaveItem item = new WaveItem();
BeanUtils.copyProperties(order, item);
- item.setOrderItemId(order.getId())
- .setId(null)
- .setOrderCode(order.getAsnCode())
- .setOrderId(order.getAsnId())
+ item.setId(null)
+ .setAnfme(anfme)
.setMatnrId(order.getMatnrId())
.setMaktx(order.getMaktx())
.setWaveId(wave.getId())
@@ -735,7 +739,7 @@
p1.getUpdateBy(),
p1.getMemo()
),
- WaveItem::getSplrBatch, WaveItem::getMatnrCode, WaveItem::getFieldsIndex
+ WaveItem::getSplrBatch, WaveItem::getMatnrId, WaveItem::getFieldsIndex
);
return waveItems;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 816bc4d..3430a52 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -1047,7 +1047,6 @@
if (Objects.isNull(orderItem)) {
throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
}
-
try {
saveOutStockItem(maps.get(key), orderItem, null, loginUserId);
} catch (Exception e) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
index 8e0e9d8..97f2276 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
@@ -43,6 +43,8 @@
private LocItemService locItemService;
@Autowired
private LocService locService;
+ @Autowired
+ private OutStockService outStockService;
/**
* @param
@@ -239,6 +241,20 @@
}
/**
+ * @author Ryan
+ * @description 鍙栨秷娉㈡
+ * @param
+ * @return
+ * @time 2025/6/17 10:04
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R cancelWave(List<Long> ids) {
+
+ return null;
+ }
+
+ /**
* @param
* @param waveItems
* @return
--
Gitblit v1.9.1