From ffc423dc5ab1318370ea8e3b63e9213172f805bb Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期三, 11 六月 2025 09:46:26 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/devlop' into devlop --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 161 +++++++++- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java | 62 ++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java | 47 +++ rsf-admin/src/page/orders/delivery/DeliveryList.jsx | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java | 10 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 47 ++ rsf-admin/src/page/orders/outStock/OutOrderModal.jsx | 3 rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java | 5 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java | 16 rsf-server/src/main/resources/application.yml | 2 rsf-admin/src/i18n/zh.js | 1 rsf-admin/src/page/orders/outStock/OutOrderList.jsx | 5 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/OutStockTemplate.java | 4 rsf-admin/src/i18n/en.js | 2 rsf-admin/.env | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java | 3 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java | 48 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java | 10 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java | 5 rsf-admin/src/page/orders/outStock/OutStockPublic.jsx | 342 ++++++++++++++-------- rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx | 3 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java | 13 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java | 8 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java | 18 - rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java | 15 27 files changed, 621 insertions(+), 221 deletions(-) diff --git a/rsf-admin/.env b/rsf-admin/.env index a0bb09f..a3c69b2 100644 --- a/rsf-admin/.env +++ b/rsf-admin/.env @@ -1,3 +1,3 @@ -VITE_BASE_IP=192.168.4.50 +VITE_BASE_IP=127.0.0.1 # 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 63c252c..d33ba92 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -1168,7 +1168,7 @@ recover: "recover", createWave: "Create Wave", order: 'Orders', - + modiftySite: 'Modify SiteNo', }, request: { error: { diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index bb18c4d..503f03b 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -1171,6 +1171,7 @@ publicWorking: '涓嬪彂鎵ц', createWave: "鐢熸垚娉㈡", recover: "缁х画鏀惰揣", + modiftySite: '淇敼搴撳彛', }, request: { error: { diff --git a/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx b/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx index aa6ffd3..7667817 100644 --- a/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx +++ b/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx @@ -20,11 +20,9 @@ import TreeSelectInput from "@/page/components/TreeSelectInput"; const AsnWareModal = (props) => { const { open, setOpen, data, setData } = props; - const translate = useTranslate(); const notify = useNotify(); const refresh = useRefresh(); - const handleClose = (event, reason) => { if (reason !== "backdropClick") { setOpen(false); @@ -55,7 +53,6 @@ const hasarr = data.map(el => +el.matnrId) const selectedData = selectedRows.filter(item => !hasarr.includes(item)).map(id => (tableData.find(row => row.id === id))); const value = selectedData.map((el => { - console.log(el); const dynamicFields = dyFields.reduce((acc, item) => { acc[item.fields] = el['extendFields']?.[item.fields] || ''; return acc; diff --git a/rsf-admin/src/page/orders/delivery/DeliveryList.jsx b/rsf-admin/src/page/orders/delivery/DeliveryList.jsx index 01ce8db..3124c3a 100644 --- a/rsf-admin/src/page/orders/delivery/DeliveryList.jsx +++ b/rsf-admin/src/page/orders/delivery/DeliveryList.jsx @@ -122,7 +122,7 @@ rowClick={(id, resource, record) => false} expand={false} expandSingle={true} - omit={['id', 'createTime', 'createBy', 'platId', 'platCode', 'memo', 'startTime', 'endTime', 'updateBy', 'createTime']} + omit={['id', 'createTime', 'createBy', 'platId', 'platCode', 'memo', 'startTime','qty', 'endTime', 'updateBy', 'createTime']} > <NumberField source="id" /> <TextField source="code" label="table.field.delivery.code" /> @@ -131,7 +131,7 @@ <TextField source="wkType$" label="table.field.delivery.wkType" /> <TextField source="source" label="table.field.delivery.source" /> <NumberField source="anfme" label="table.field.delivery.anfme" /> - <NumberField source="workQty" label="table.field.delivery.workQty" /> + <NumberField source="workQty" label="table.field.delivery.qty" /> <NumberField source="qty" label="table.field.delivery.qty" /> <TextField source="platCode" label="table.field.delivery.platCode" /> <DateField source="startTime" label="table.field.delivery.startTime" showTime /> diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx index fb818a2..80de6bb 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx @@ -5,6 +5,7 @@ DatagridConfigurable, SearchInput, TopToolbar, + Toolbar, SelectColumnsButton, EditButton, FilterButton, @@ -140,7 +141,7 @@ <CreateByOrderButton setCreateDialog={setCreateDialog} /> <MyCreateButton onClick={() => { setManualDialog(true); setmodalType(0) }} /> <SelectColumnsButton preferenceKey='outStock' /> - <ImportButton value={'outStock'} /> + <ImportButton value={'outStockItem'} /> {/* <MyExportButton /> */} </TopToolbar> )} @@ -298,6 +299,6 @@ } return ( - <ConfirmButton label={"toolbar.publicWorking"} startIcon={<AddTaskIcon />} onConfirm={taskEvent} size={"small"} /> + record.workQty < record.anfme ? <ConfirmButton label={"toolbar.publicWorking"} startIcon={<AddTaskIcon />} onConfirm={taskEvent} size={"small"} /> : <></> ) } diff --git a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx index ba39f27..6ef3697 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx @@ -5,6 +5,7 @@ DatagridConfigurable, SearchInput, TopToolbar, + Toolbar, Button, SelectColumnsButton, EditButton, @@ -13,7 +14,6 @@ ExportButton, BulkDeleteButton, WrapperField, - Toolbar, useRecordContext, useTranslate, useNotify, @@ -45,7 +45,6 @@ import { Grid, margin, Stack, width } from "@mui/system"; import request from '@/utils/request'; import SaveIcon from '@mui/icons-material/Save'; -import debounce from "lodash/debounce"; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx index 5b60940..5ba82cb 100644 --- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx +++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx @@ -1,4 +1,4 @@ -import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText, Tooltip } from "@mui/material"; +import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText } from "@mui/material"; import React, { useState, useRef, useEffect, useMemo } from "react"; import { List, @@ -13,7 +13,6 @@ ExportButton, BulkDeleteButton, WrapperField, - Toolbar, useRecordContext, useTranslate, useNotify, @@ -36,14 +35,18 @@ SimpleForm, required, Form, + useRefresh, + useRedirect, } from 'react-admin'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting'; import { styled } from '@mui/material/styles'; -import { DataGrid, useGridApiContext } from '@mui/x-data-grid'; +import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid'; import request from '@/utils/request'; import ConfirmationNumberOutlinedIcon from '@mui/icons-material/ConfirmationNumberOutlined'; import CloseSharpIcon from '@mui/icons-material/CloseSharp'; import ConfirmButton from '../../components/ConfirmButton'; +import { Delete, Edit, Add } from '@mui/icons-material'; +import OutStockSiteDialog from "./OutStockSiteDialog"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -60,17 +63,39 @@ const OutStockPublic = (props) => { const { record, open, setOpen } = props; - const dataGridRef = useRef(null); const notify = useNotify(); + const gridRef = useGridApiRef(); const [rows, setRows] = useState({}); const translate = useTranslate(); const [selectedIds, setSelectedIds] = React.useState([]); const [formData, setFormData] = useState({ orderId: record?.id }); + const [dialog, setDialog] = useState(false); + const [selectedValue, setSelectedValue] = useState({}); + + const handleClickOpen = () => { + setDialog(true); + }; + + const handleClose = (value) => { + setDialog(false); + setSelectedValue(value); + console.log(rows); + console.log(value); + const newRows = rows.map(item => { + return { + ...item, + siteNo: value?.site + } + }) + setRows(newRows); + }; + useEffect(() => { getWaveRule() }, [formData, open]) + const getWaveRule = async () => { if (formData.waveId == null && formData.waveId == undefined) { @@ -91,11 +116,13 @@ [name]: value })); }; + + return ( <> <Box> <Grid sx={{ display: "flex" }} container rowSpacing={2} columnSpacing={2}> - <Grid item xl={6} gap={2} > + <Grid item xl={5.7} gap={2} > <Card> <Form> <ReferenceInput @@ -124,9 +151,7 @@ empty={false} filter={{ asnId: record?.id, deleted: 0 }} sort={{ field: "create_time", order: "desc" }} - actions={( - <SelectColumnsButton preferenceKey='outStock' /> - )} + actions={false} perPage={DEFAULT_ITEM_PAGE_SIZE} > <LinearProgress @@ -152,47 +177,213 @@ </List> </Card> </Grid> - <Grid item xl={6} gap={2}> + <Grid item xl={6.3} gap={2}> <Card> - <Box> - <DataGrid + <Box sx={{ height: 500, width: '100%' }}> + <PreviewTable rows={rows} - columns={columns} - initialState={{ - pagination: { - paginationModel: { - pageSize: 15, - }, - }, - }} - ref={dataGridRef} - checkboxSelection - onRowSelectionModelChange={(ids) => { - setSelectedIds(ids) - }} - pageSizeOptions={[15, 25, 35, 45]} + gridRef={gridRef} + setRows={setRows} + record={record} + selectedIds={selectedIds} + setDialog={setDialog} + setSelectedIds={setSelectedIds} /> </Box> <Box sx={{ textAlign: 'center' }}> <CloseButton setOpen={setOpen} /> - <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} /> + <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} record={record} /> </Box> </Card> </Grid> + </Grid> + <Grid> + <OutStockSiteDialog + selectedValue={selectedValue} + open={dialog} + onClose={handleClose} + /> </Grid> </Box> </> ); } +const PreviewTable = ({ rows, gridRef, setRows, record, selectedIds, setSelectedIds, setDialog }) => { + gridRef.current = useGridApiRef(); -//鎻愪氦鎸夐挳 -const SubmitButton = ({ selectedIds, setSelectedIds }) => { - const submit = () => { - if (selectedIds.length < 1) { return } - console.log(selectedIds); + const columns = [ + { field: 'id', headerName: 'ID', width: 40 }, + { field: 'locCode', headerName: '搴撲綅', width: 110 }, + { field: 'barcode', headerName: '瀹瑰櫒', width: 120 }, + { field: 'batch', headerName: '鎵规', width: 90 }, + { field: 'unit', headerName: '鍗曚綅', width: 90 }, + { field: 'outQty', headerName: '鏈鍑哄簱鏁伴噺', width: 110 }, + { + field: 'siteNo', + headerName: '鍑哄簱鍙�', + width: 90, + type: 'singleSelect', + editable: true, + renderCell: (params) => ( + <OutStockSiteNo value={params.value} /> + ), + renderEditCell: (params) => ( + <OutStockSite {...params} /> + ), + }, + { + field: 'actions', + type: 'actions', + headerName: '鎿嶄綔', + with: 120, + getActions: (params) => [ + <GridActionsCellItem + icon={<Delete />} + label="Delete" + onClick={() => handleDelete(params.row, rows, setRows)} + />, + ] + }, + ] + + /** + * 鍒犻櫎浜嬩欢 + * @param {*} params + */ + const handleDelete = (params, rows, setRows) => { + const outRows = rows.filter(row => { + return row.id !== params.id + }) + setRows(outRows) } + const OutStockSiteNo = React.memo(function OutStockSiteNo(props) { + const { value } = props; + if (!value) { + return null; + } + return ( + <Box + sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }} + > + <span>{value}</span> + </Box> + ); + }); + + const CustomToolBar = () => { + const selectSiteNo = () => { + setDialog(true) + } + + return ( + selectedIds.length > 0 ? <Box sx={{ + p: 1, + display: 'flex', + justifyContent: 'flex-end', + borderTop: '1px solid rgba(224, 224, 224, 1)' + }}> + <Button + onClick={selectSiteNo} + variant="outlined" + label="toolbar.modiftySite" + size="medium" + sx={{ mr: 1 }} /> + </Box> : <></> + ); + } + + const OutStockSite = (params) => { + const { id, field, siteNo, row: { staNos } } = params; + const apiRef = useGridApiContext(); + const handleChange = async (event) => { + await apiRef.current.setEditCellValue( + { id, field, value: event.target.value }, + event, + ); + apiRef.current.stopCellEditMode({ id, field }); + }; + + const handleClose = (event, reason) => { + if (reason === 'backdropClick') { + apiRef.current.stopCellEditMode({ id, field }); + } + }; + + return ( + <Select + value={siteNo} + onChange={handleChange} + MenuProps={{ + onClose: handleClose, + }} + sx={{ + height: '100%', + '& .MuiSelect-select': { + display: 'flex', + alignItems: 'center', + pl: 1, + }, + }} + autoFocus + fullWidth + open + > + {staNos.map((option) => { + return ( + <MenuItem + key={option} + value={option.staNo} + > + <ListItemText sx={{ overflow: 'hidden' }} primary={option.staNo} /> + </MenuItem> + ); + })} + </Select > + ) + } + + return ( + <DataGrid + rows={rows} + columns={columns} + slots={{ toolbar: CustomToolBar }} + apiRef={gridRef} + initialState={{ + pagination: { + paginationModel: { + pageSize: 15, + }, + }, + }} + checkboxSelection + pageSizeOptions={[15, 25, 35, 45]} + onRowSelectionModelChange={(ids) => { + setSelectedIds(ids) + }} + /> + ) +} + + + +//鎻愪氦鎸夐挳 +const SubmitButton = ({ selectedIds, setSelectedIds, gridRef, record }) => { + const notify = useNotify(); + const refresh = useRefresh(); + const redirect = useRedirect(); + const submit = async () => { + console.log(record); + const items = gridRef.current?.getSortedRows(); + const { data: { code, data, msg } } = await request.post('/outStock/generate/tasks', { items, outId: record?.id }); + if (code == 200) { + refresh(); + redirect("/task") + } else { + notify(msg); + } + } return ( <ConfirmButton label="toolbar.confirm" @@ -219,95 +410,6 @@ sx={{ margin: '3.5em' }} /> ) } - - -const columns = [ - { field: 'id', headerName: 'ID', width: 40 }, - { field: 'locCode', headerName: '搴撲綅', width: 110 }, - { field: 'barcode', headerName: '瀹瑰櫒', width: 120 }, - { field: 'batch', headerName: '鎵规', width: 90 }, - { field: 'unit', headerName: '鍗曚綅', width: 90 }, - { field: 'workQty', headerName: '鏈鍑哄簱鏁伴噺', width: 110 }, - { - field: 'siteNo', - headerName: '鍑哄簱鍙�', - width: 90, - type: 'singleSelect', - editable: true, - renderCell: (params) => ( - <OutStockSiteNo value={params.value} /> - ), - renderEditCell: (params) => ( - <OutStockSite {...params} /> - ), - }, -] - -const OutStockSiteNo = React.memo(function OutStockSiteNo(props) { - const { value } = props; - if (!value) { - return null; - } - return ( - <Box - sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }} - > - <span>{value}</span> - </Box> - ); -}); - - -const OutStockSite = (params) => { - const { id, field, siteNo, row: { staNos } } = params; - const apiRef = useGridApiContext(); - const handleChange = async (event) => { - await apiRef.current.setEditCellValue( - { id, field, value: event.target.value }, - event, - ); - apiRef.current.stopCellEditMode({ id, field }); - }; - - const handleClose = (event, reason) => { - if (reason === 'backdropClick') { - apiRef.current.stopCellEditMode({ id, field }); - } - }; - - return ( - <Select - value={siteNo} - onChange={handleChange} - MenuProps={{ - onClose: handleClose, - }} - sx={{ - height: '100%', - '& .MuiSelect-select': { - display: 'flex', - alignItems: 'center', - pl: 1, - }, - }} - autoFocus - fullWidth - open - > - {staNos.map((option) => { - return ( - <MenuItem - key={option} - value={option.staNo} - > - <ListItemText sx={{ overflow: 'hidden' }} primary={option.staNo} /> - </MenuItem> - ); - })} - </Select > - ) -} - export default OutStockPublic; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java index 823b303..1819d59 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java @@ -84,10 +84,15 @@ if (Objects.isNull(param)) { return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } - return R.ok(param); -// param.setType(Constants.TASK_TYPE_OUT_STOCK); -// -// return locItemService.generateTask(param, getLoginUserId()); + param.setType(Constants.TASK_TYPE_OUT_STOCK); + + try { + locItemService.generateTask(param, getLoginUserId()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return R.ok("浠诲姟鐢熸垚鎴愬姛"); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java index 4441c62..406e377 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java @@ -103,6 +103,11 @@ public static final String TASK_TYPE_OUT_CHECK = "check"; /** + * 鍗曟嵁鍑哄簱 + */ + public static final String TASK_TYPE_ORDER_OUT_STOCK = "OrderOutStock"; + + /** * 鎷f枡鍑哄簱 */ public static final String TASK_TYPE_OUT_PICK = "pick"; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java index 612bce4..108539b 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java @@ -97,7 +97,13 @@ } param.setType(Constants.TASK_TYPE_OUT_STOCK); - return locItemService.generateTask(param, getLoginUserId()); + try { + locItemService.generateTask(param, getLoginUserId()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return R.ok(); } /** @@ -129,7 +135,13 @@ } map.setType(Constants.TASK_TYPE_OUT_CHECK); - return R.ok("浠诲姟鐢熸垚鎴愬姛").add(locItemService.generateTask(map, getLoginUserId())); + try { + locItemService.generateTask(map, getLoginUserId()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return R.ok("浠诲姟鐢熸垚鎴愬姛"); } 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 83c1aaa..1ee268e 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 @@ -1,5 +1,6 @@ package com.vincent.rsf.server.manager.controller; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -8,6 +9,8 @@ import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam; +import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams; +import com.vincent.rsf.server.manager.entity.excel.OutStockTemplate; import com.vincent.rsf.server.manager.enums.OrderType; import com.vincent.rsf.server.manager.enums.OrderWorkType; import com.vincent.rsf.server.common.annotation.OperationLog; @@ -28,6 +31,8 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -38,6 +43,8 @@ @RestController @Api(tags = "鍑哄簱鍗曟嵁") public class OutStockController extends BaseController { + + Logger logger = LoggerFactory.getLogger(OutStockController.class); @Autowired private OutStockService outStockService; @@ -234,12 +241,63 @@ } @PostMapping("/outStock/order/getOutTaskItems") + @ApiOperation("鍑哄簱鍗曞簱浣嶉瑙�") @PreAuthorize("hasAuthority('manager:outStock:list')") - public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param){ - if (Cools.isEmpty(param)){ + public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param) { + if (Cools.isEmpty(param)) { return R.error("鍙傛暟涓嶈兘涓虹┖"); } return outStockService.getOrderOutTaskItem(param); } + + + /** + * 鍑哄簱鍗曠敓鎴愬嚭搴撲换鍔� + * @param params + * @return + */ + @PostMapping("/outStock/generate/tasks") + @ApiOperation("鍑哄簱鍗曠敓鎴愬嚭搴撲换鍔�") + @PreAuthorize("hasAuthority('manager:outStock:list')") + public R genOutStockTask( @RequestBody Map<String, Object> params) { + if (Cools.isEmpty()) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + 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())); + } + + /** + * 鑾峰彇鍑哄簱绔欑偣 + * @return + */ + @GetMapping("/outStock/tasks/sites") + @ApiOperation("鑾峰彇鍑哄簱搴撳彛") + @PreAuthorize("hasAuthority('manager:outStock:list')") + public R getSiteNos() { + return outStockService.getSiteNos(); + } + + /** + * @author Ryan + * @description 涓嬭浇妯℃澘 + * @param + * @return + * @time 2025/4/18 08:17 + */ + @PostMapping("/outStock/template/download") + @ApiOperation("涓嬭浇鏀惰揣鍗曟ā鏉�") + @PreAuthorize("hasAuthority('manager:outStockItem:update')") + public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + OutStockTemplate template = ExcelUtil.mockData(OutStockTemplate.class); + List<OutStockTemplate> list = Arrays.asList(template); + ExcelUtil.build(ExcelUtil.create(list, OutStockTemplate.class, true), response); + } + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java index c665a12..0e11b1c 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java @@ -159,7 +159,7 @@ @PostMapping("/outStockItem/import") @ApiOperation("ASN瀵煎叆鎺ュ彛") @PreAuthorize("hasAuthority('manager:outStockItem:update')") - public R importExcel(@RequestParam(value = "file") MultipartFile file, @RequestParam String asnId) throws Exception { + public R importExcel(@RequestParam(value = "file") MultipartFile file) throws Exception { if (Objects.isNull(file)) { R.error("鏂囦欢涓嶈兘涓虹┖锛侊紒"); } @@ -167,20 +167,6 @@ return outStockItemService.excelImport(file, hashMap, getLoginUserId()); } - /** - * @author Ryan - * @description 涓嬭浇妯℃澘 - * @param - * @return - * @time 2025/4/18 08:17 - */ - @PostMapping("/outStockItem/template/download") - @ApiOperation("涓嬭浇鏀惰揣鍗曟ā鏉�") - @PreAuthorize("hasAuthority('manager:outStockItem:update')") - public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { - AsnOrderTemplate template = ExcelUtil.mockData(AsnOrderTemplate.class); - List<AsnOrderTemplate> list = Arrays.asList(template); - ExcelUtil.build(ExcelUtil.create(list, AsnOrderTemplate.class, true), response); - } + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java index bfada9a..8323840 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java @@ -17,6 +17,9 @@ @ApiModelProperty("绫诲瀷锛� check:鐩樼偣鍑哄簱锛� outStock: 搴撳瓨鍑哄簱") private String type; + @ApiModelProperty("鍘熷崟鎹甀D (鐢ㄦ埛鍗曟嵁鍑哄簱鏌ユ壘涓氬姟绫诲瀷") + private Long sourceId; + @ApiModelProperty("鐩爣绔欑偣") private String siteNo; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java new file mode 100644 index 0000000..6a676bb --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java @@ -0,0 +1,47 @@ +package com.vincent.rsf.server.manager.controller.params; + + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Map; + +@Data +@Accessors(chain = true) +@ApiModel(value = "OutStockToTaskParams", description = "鍑哄簱鍗曠敓鎴愪换鍔″弬鏁�") +public class OutStockToTaskParams { + + @ApiModelProperty("搴撲綅") + private String locCode; + + @ApiModelProperty("搴撲綅鏄庣粏ID") + private Long id; + + @ApiModelProperty("鎵樼洏鐮�") + private String barcode; + + @ApiModelProperty("鎵规") + private String batch; + + @ApiModelProperty("鍗曚綅") + private String unit; + + @ApiModelProperty("瀹㈠崟鍙�") + private String platOrderCode; + + @ApiModelProperty("瀛楁绱㈠紩") + private String fieldsIndex; + + @ApiModelProperty("鎵╁睍瀛楁") + @TableField(exist = false) + private Map<String, String> extendFields; + + @ApiModelProperty("鏁伴噺") + private Double outQty; + + @ApiModelProperty("绔欑偣") + private String siteNo; +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java index 96b195d..4eb3587 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java @@ -172,6 +172,10 @@ @TableField(exist = false) private Map<String, String> extendFields; + @ApiModelProperty("鎵樼洏鐮�") + @TableField(exist = false) + private String barcode; + /** * 鐘舵�� 1: 姝e父 0: 鍐荤粨 */ @@ -220,13 +224,13 @@ private Date updateTime; @TableField(exist = false) - private Long waveId; + private Long sourceId; @TableField(exist = false) - private Long waveItemId; + private Long source; @TableField(exist = false) - private String waveCode; + private String sourceCode; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java index 6bcd33f..f6ecbfe 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java @@ -29,7 +29,7 @@ @Excel(name = "鍗曟嵁绫诲瀷") @ApiModelProperty(value= "鍗曟嵁绫诲瀷") - @ExcelComment(value = "type", example = "鍏ュ簱鍗�") + @ExcelComment(value = "type", example = "鍑哄簱鍗�") private String type; @Excel(name = "鍗曟嵁鏉ユ簮") @@ -54,7 +54,7 @@ @Excel(name = "涓氬姟绫诲瀷") @ApiModelProperty(value= "涓氬姟绫诲瀷") - @ExcelComment(value = "wkType", example = "閲囪喘鍏ュ簱鍗�") + @ExcelComment(value = "wkType", example = "閿�鍞嚭搴撳崟") private String wkType; @Excel(name = "椤圭洰鍚嶇О") diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/OutStockTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/OutStockTemplate.java index 8a67839..839c006 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/OutStockTemplate.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/OutStockTemplate.java @@ -68,7 +68,7 @@ */ @Excel(name = "*鍗曟嵁绫诲瀷") @ApiModelProperty(value = "*鍗曟嵁绫诲瀷") - @ExcelComment(value = "type", example = "鍏ュ簱鍗�") + @ExcelComment(value = "type", example = "鍑哄簱鍗�") private String type; /** @@ -76,7 +76,7 @@ */ @Excel(name = "*涓氬姟绫诲瀷") @ApiModelProperty(value = "*涓氬姟绫诲瀷") - @ExcelComment(value = "wkType", example = "閲囪喘鍏ュ簱鍗�") + @ExcelComment(value = "wkType", example = "閿�鍞嚭搴撳崟") private String wkType; 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 37cac19..7739a13 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 @@ -26,9 +26,11 @@ OUT_STOCK_STATUS_TASK_INIT("10", "鍒濆鍖�"), OUT_STOCK_STATUS_TASK_EXCE("11", "寰呭鐞�"), - OUT_STOCK_STATUS_TASK_WAVE("12", "鐢熸垚娉㈡"), - OUT_STOCK_STATUS_TASK_WORKING("13", "浣滀笟涓�") - ; + OUT_STOCK_STATUS_TASK_WAVE("11", "鐢熸垚娉㈡"), + OUT_STOCK_STATUS_TASK_CREATE("13", "鐢熸垚宸ヤ綔妗�"), + OUT_STOCK_STATUS_TASK_WORKING("14", "浣滀笟涓�") + + ; 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/service/LocItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java index 2e24cfe..44a86d7 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java @@ -8,7 +8,7 @@ public interface LocItemService extends IService<LocItem> { - R generateTask(LocToTaskParams map, Long loginUserId); + void generateTask(LocToTaskParams map, Long loginUserId) throws Exception; Task genMoveTask(LocToTaskParams map, Long loginUserId); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java index 152874d..d2964c1 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java @@ -4,6 +4,7 @@ import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams; import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam; +import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams; import com.vincent.rsf.server.manager.entity.AsnOrder; import java.util.List; @@ -21,4 +22,8 @@ R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId); R getOrderOutTaskItem(OrderOutTaskParam param); + + R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId, Long outId); + + R getSiteNos(); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java index ca4d6b6..634da61 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java @@ -7,7 +7,6 @@ import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; import com.vincent.rsf.server.api.service.WcsService; import com.vincent.rsf.server.api.utils.LocUtils; -import com.vincent.rsf.server.api.utils.SlaveProperties; import com.vincent.rsf.server.common.constant.Constants; import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; import com.vincent.rsf.server.manager.entity.*; @@ -19,6 +18,8 @@ import com.vincent.rsf.server.system.utils.SerialRuleUtils; import lombok.Synchronized; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -29,6 +30,8 @@ @Service("locItemService") public class LocItemServiceImpl extends ServiceImpl<LocItemMapper, LocItem> implements LocItemService { + + Logger logger = LoggerFactory.getLogger(LocItemServiceImpl.class); @Autowired private LocService locService; @@ -42,6 +45,8 @@ private DeviceSiteService deviceSiteService; @Autowired private WcsService wcsService; + @Autowired + private OutStockService outStockService; /** @@ -55,7 +60,7 @@ @Override @Synchronized @Transactional(rollbackFor = Exception.class) - public R generateTask(LocToTaskParams map, Long loginUserId) { + public void generateTask(LocToTaskParams map, Long loginUserId) throws Exception { if (Objects.isNull(map.getSiteNo())) { throw new CoolException("绔欑偣涓嶈兘涓虹┖锛�"); } @@ -66,19 +71,31 @@ String siteNo = map.getSiteNo(); List<LocItem> items = map.getItems(); Map<Long, List<LocItem>> listMap = items.stream().collect(Collectors.groupingBy(LocItem::getLocId)); + AsnOrder order; + if (!Objects.isNull(map.getSourceId())) { + order = outStockService.getById(map.getSourceId()); + } else { + order = new AsnOrder(); + } + listMap.keySet().forEach(key -> { Task task = new Task(); Loc loc = locService.getById(key); + logger.info("搴撲綅锛�>{}<UNK>", loc.getCode()); + if (Objects.isNull(loc)) { throw new CoolException("鏁版嵁閿欒锛氭墍閫夊簱瀛樹俊鎭笉瀛樺湪锛侊紒"); } + if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { + throw new CoolException("搴撲綅:" + loc.getCode() + ",涓嶅浜嶧.鍦ㄥ簱鐘舵�侊紝涓嶅彲鎵цR.鍑哄簱棰勭害鎿嶄綔锛侊紒"); + } + loc.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!locService.updateById(loc)) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐ワ紒锛�"); } Task moveTask = new Task(); - String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); task.setOrgLoc(loc.getCode()) .setTaskCode(ruleCode) @@ -101,12 +118,12 @@ List<LocItem> locItemList = listMap.get(key); Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum(); - Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode())); - if (!Objects.isNull(serviceOne)) { - throw new CoolException("鎵樼洏浠诲姟鎵ц涓紝涓嶈兘閲嶅鍒涘缓锛�"); - } +// Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode())); +// if (!Objects.isNull(serviceOne)) { +// throw new CoolException("鎵樼洏浠诲姟鎵ц涓紝涓嶈兘閲嶅鍒涘缓锛�"); +// } - if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) { + if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) { Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0; if (orgQty.compareTo(useQty) > 0) { //鎷f枡鍑哄簱 @@ -140,6 +157,7 @@ } task.setTaskType(TaskType.TASK_TYPE_CHECK_OUT.type).setWarehType(deviceSite.getDevice()); } + if (!taskService.save(task)) { throw new CoolException("浠诲姟鍒涘缓澶辫触锛侊紒"); } @@ -186,13 +204,19 @@ .setBatch(item.getBatch()) .setUpdateBy(loginUserId) .setCreateBy(loginUserId) - .setSource(item.getId()) - .setSourceId(item.getLocId()) - .setSourceCode(item.getLocCode()) .setCreateTime(new Date()) .setUpdateTime(new Date()) .setOrderType(OrderType.ORDER_OUT.type) .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)); + if (map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) { + taskItem.setWkType(Short.parseShort(order.getWkType())) + .setSourceCode(order.getCode()) + .setSourceId(order.getId()); + } else if (map.getType().equals(Constants.TASK_TYPE_OUT_CHECK) || map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) { + taskItem.setSource(item.getId()) + .setSourceId(item.getLocId()) + .setSourceCode(item.getLocCode()); + } taskItems.add(taskItem); Double qty = Math.round((item.getWorkQty() + item.getOutQty()) * 10000) / 10000.0; @@ -222,8 +246,6 @@ throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触锛侊紒"); } }); - - return R.ok("浠诲姟鐢熸垚瀹屾垚锛�!"); } /** diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java index e7707b9..686c267 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java @@ -11,6 +11,7 @@ import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.excel.OutStockTemplate; +import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.enums.OrderType; import com.vincent.rsf.server.manager.enums.OrderWorkType; import com.vincent.rsf.server.common.domain.BaseParam; @@ -101,9 +102,6 @@ public R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception { ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), OutStockTemplate.class, ExcelUtil.getDefaultImportParams()); if (result.getList().isEmpty()) { - throw new CoolException("鐗╂枡瀵煎叆澶辫触锛侊紒"); - } - if (result.getList().isEmpty()) { throw new CoolException("琛ㄦ牸鍐呭涓嶈兘涓虹┖锛侊紒"); } List<OutStockTemplate> resultList = result.getList(); @@ -111,7 +109,7 @@ for (String key : listMap.keySet()) { OutStockTemplate template = listMap.get(key).stream().findFirst().get(); AsnOrder asnOrder = outStockService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode())); - if (Objects.isNull(asnOrder)) { + if (!Objects.isNull(asnOrder)) { continue; } AsnOrder order = new AsnOrder(); @@ -129,7 +127,7 @@ for (OutStockTemplate orderTemplate : listMap.get(key)) { AsnOrderItem orderItem = new AsnOrderItem(); Matnr matnr = null; - if (!Objects.isNull(orderTemplate.getMatnrCode()) || StringUtils.isNotBlank(orderTemplate.getMatnrCode())) { + if (StringUtils.isNotBlank(orderTemplate.getMatnrCode())) { matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>() .eq(Matnr::getCode, orderTemplate.getMatnrCode())); } @@ -151,9 +149,10 @@ } } if (!items.isEmpty()) { - double qty = items.stream().mapToDouble(AsnOrderItem::getQty).sum(); - double purQty = items.stream().mapToDouble(AsnOrderItem::getPurQty).sum(); - if (!outStockService.update(new LambdaUpdateWrapper<AsnOrder>().set(AsnOrder::getQty, qty).set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) { + double purQty = items.stream().mapToDouble(AsnOrderItem::getAnfme).sum(); + if (!outStockService.update(new LambdaUpdateWrapper<AsnOrder>() + .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) + .set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) { throw new CoolException("鍗曟嵁鏁伴噺淇敼澶辫触锛侊紒"); } } 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 a1fb137..c93da6b 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 @@ -1,16 +1,18 @@ 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.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.utils.LocUtils; +import com.vincent.rsf.server.common.constant.Constants; import com.vincent.rsf.server.manager.controller.dto.ExistDto; import com.vincent.rsf.server.manager.controller.dto.OrderOutItemDto; +import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam; +import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams; import com.vincent.rsf.server.manager.entity.*; @@ -20,6 +22,8 @@ import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,6 +32,7 @@ import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; + import com.vincent.rsf.server.manager.enums.WaveRuleType; /** @@ -39,6 +44,9 @@ */ @Service("outStockServiceImpl") public class OutStockServiceImpl extends ServiceImpl<AsnOrderMapper, AsnOrder> implements OutStockService { + + public Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired private AsnOrderItemService asnOrderItemService; @@ -368,6 +376,7 @@ } return R.ok(); } + /** * @param * @return @@ -400,14 +409,14 @@ @Override public R getOrderOutTaskItem(OrderOutTaskParam param) { - if (Cools.isEmpty(param.getWaveId())){ + if (Cools.isEmpty(param.getWaveId())) { throw new CoolException("绛栫暐鍙傛暟涓虹┖"); } - if (Cools.isEmpty(param.getOrderId())){ - throw new CoolException("鍗曟嵁id涓虹┖"); + if (Cools.isEmpty(param.getOrderId())) { + throw new CoolException("鍗曟嵁ID涓虹┖"); } WaveRule waveRule = waveRuleService.getOne(new LambdaQueryWrapper<WaveRule>().eq(WaveRule::getId, param.getWaveId())); - if (Cools.isEmpty(waveRule)){ + if (Cools.isEmpty(waveRule)) { throw new CoolException("鏈壘鍒板綋鍓嶇瓥鐣�"); } List<OrderOutItemDto> locItems = null; @@ -415,7 +424,108 @@ return R.ok(locItems); } - private List<LocItem> getEfficiencyFirstItemList(AsnOrderItem asnOrderItem){ + /** + * 鐢熸垚鍑哄簱浠诲姟 + * + * @param params + * @param outId + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId, Long outId) { + if (params.isEmpty()) { + throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + //浼樺厛鐢熸垚娴呭簱浣嶄换鍔� + 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)) { + continue; + } + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode())); + if (!Objects.isNull(loc)) { + List<LocItem> locItems = new ArrayList<>(); + LocItem locItem = locItemService.getById(param.getId()); + + AsnOrderItem orderItem = outStockItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>() + .eq(AsnOrderItem::getAsnId, outId) + .eq(StringUtils.isNotBlank(locItem.getBatch()), AsnOrderItem::getSplrBatch, locItem.getBatch()) + .eq(StringUtils.isNotBlank(locItem.getFieldsIndex()), AsnOrderItem::getFieldsIndex, locItem.getFieldsIndex()) + .eq(AsnOrderItem::getMatnrId, locItem.getMatnrId())); + + if (Objects.isNull(orderItem)) { + throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); + } + + locItem.setOutQty(param.getOutQty()) + .setBatch(param.getBatch()) + .setSourceId(outId) + .setSourceCode(orderItem.getAsnCode()) + .setSource(orderItem.getId()); + locItems.add(locItem); + + LocToTaskParams taskParams = new LocToTaskParams(); + taskParams.setType(Constants.TASK_TYPE_ORDER_OUT_STOCK) + .setOrgLoc(loc.getCode()) + .setItems(locItems) + .setSourceId(outId) + .setSiteNo(param.getSiteNo()); + try { + //鐢熸垚鍑哄簱浠诲姟 + locItemService.generateTask(taskParams, loginUserId); + } catch (Exception e) { + logger.error("UNK", e); + throw new CoolException(e.getMessage()); + } + + + Double workQty = Math.round((orderItem.getWorkQty() + locItem.getOutQty()) * 10000) / 10000.0; + + orderItem.setUpdateBy(loginUserId).setUpdateTime(new Date()).setWorkQty(workQty); + + if (!outStockItemService.updateById(orderItem)) { + throw new CoolException("鍗曟嵁鏄庣粏淇敼澶辫触锛侊紒"); + } + } + } + + Double sum = Items.stream().mapToDouble(OutStockToTaskParams::getOutQty).sum(); + //鏇存柊鍑哄簱鍗曟槑缁嗗強涓诲崟 + AsnOrder outOrder = outStockService.getById(outId); + if (Objects.isNull(outOrder)) { + throw new CoolException("鍑哄簱鍗曟嵁涓嶅瓨鍦紒锛�"); + } + Double workQty = Math.round((outOrder.getWorkQty() + sum) * 10000) / 10000.0; + + outOrder.setWorkQty(workQty).setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_CREATE.val); + + if (!outStockService.updateById(outOrder)) { + throw new CoolException("鍑哄簱鍗曠姸鎬佷慨鏀瑰け璐ワ紒锛�"); + } + + return R.ok(); + } + + /** + * 鑾峰彇鍑哄簱绔欑偣 + * @return + */ + @Override + public R getSiteNos() { + List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_MERGE_OUT.type, + TaskType.TASK_TYPE_OUT.type, + TaskType.TASK_TYPE_MERGE_OUT.type, + TaskType.TASK_TYPE_PICK_AGAIN_OUT.type); + List<DeviceSite> sites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>().in(DeviceSite::getType, list).groupBy(DeviceSite::getSite)); + return R.ok(sites); + } + + + private List<LocItem> getEfficiencyFirstItemList(AsnOrderItem asnOrderItem) { LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>(); locItemQueryWrapper.eq(LocItem::getMatnrCode, asnOrderItem.getMatnrCode()); locItemQueryWrapper.eq(LocItem::getBatch, asnOrderItem.getSplrBatch()); @@ -434,7 +544,7 @@ return locItems; } - private List<LocItem> getFirstInFirstOutItemList(AsnOrderItem asnOrderItem){ + private List<LocItem> getFirstInFirstOutItemList(AsnOrderItem asnOrderItem) { LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>(); locItemQueryWrapper.eq(LocItem::getMatnrCode, asnOrderItem.getMatnrCode()); locItemQueryWrapper.eq(LocItem::getBatch, asnOrderItem.getSplrBatch()); @@ -451,10 +561,9 @@ return locItems; } - private List<OrderOutItemDto> getOutOrderList(Long orderId,WaveRule waveRule){ + private List<OrderOutItemDto> getOutOrderList(Long orderId, WaveRule waveRule) { List<AsnOrderItem> asnOrderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>() - .eq(AsnOrderItem::getAsnId, orderId) - ); + .eq(AsnOrderItem::getAsnId, orderId)); List<OrderOutItemDto> list = new ArrayList<>(); Set<ExistDto> existDtos = new HashSet<>(); @@ -470,16 +579,17 @@ locItems = getEfficiencyFirstItemList(asnOrderItem); } else if (WaveRuleType.First_In_First_Out.type.equals(waveRule.getType())) { locItems = getFirstInFirstOutItemList(asnOrderItem); - }else { + } else { locItems = getFirstInFirstOutItemList(asnOrderItem); } for (LocItem locItem : locItems) { Loc loc = locService.getById(locItem.getLocId()); List<LocItem> itemList = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locItem.getLocCode())); - if (issued.doubleValue() > 0){ + if (issued.doubleValue() > 0) { ExistDto existDto = new ExistDto().setBatch(locItem.getBatch()).setMatnr(locItem.getMatnrCode()).setLocNo(locItem.getLocCode()); - if (existDtos.add(existDto)){ - locItem.setWorkQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue()); + if (existDtos.add(existDto)) { + locItem.setOutQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue()); + locItem.setBarcode(loc.getBarcode()); OrderOutItemDto orderOutItemDto = new OrderOutItemDto(); orderOutItemDto.setLocItem(locItem); @@ -487,21 +597,28 @@ .eq(DeviceSite::getChannel, loc.getChannel()) .eq(DeviceSite::getType, issued.doubleValue() >= locItem.getAnfme() && itemList.size() == 1 ? TaskType.TASK_TYPE_OUT.type : TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) ); - List<OrderOutItemDto.staListDto> maps = new ArrayList<>(); - for (DeviceSite sta : deviceSites) { - OrderOutItemDto.staListDto staListDto = new OrderOutItemDto.staListDto(); - staListDto.setStaNo(sta.getSite()); - staListDto.setStaName(sta.getSite()); - maps.add(staListDto); + + if (!deviceSites.isEmpty()) { + List<OrderOutItemDto.staListDto> maps = new ArrayList<>(); + for (DeviceSite sta : deviceSites) { + OrderOutItemDto.staListDto staListDto = new OrderOutItemDto.staListDto(); + staListDto.setStaNo(sta.getSite()); + staListDto.setStaName(sta.getSite()); + maps.add(staListDto); + } + orderOutItemDto.setStaNos(maps); + //榛樿鑾峰彇绗竴绔欑偣 + DeviceSite deviceSite = deviceSites.stream().findFirst().get(); + orderOutItemDto.setSiteNo(deviceSite.getSite()); } - orderOutItemDto.setStaNos(maps); list.add(orderOutItemDto); issued = issued.subtract(new BigDecimal(locItem.getAnfme().toString())); } - } + } else { + } } } 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 f0caa13..aaa683a 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 @@ -79,6 +79,10 @@ private LocItemWorkingService locItemWorkingService; @Autowired private WcsService wcsService; + @Autowired + private OutStockService outStockService; + @Autowired + private OutStockItemService outStockItemService; @Override @Transactional(rollbackFor = Exception.class) @@ -519,6 +523,7 @@ /** * 浠诲姟瀹屾垚鍚庯紝鍒ゆ柇娣卞簱浣嶆槸鍚︿负绌猴紝濡傛灉涓虹┖鐢熸垚绉诲簱浠诲姟 + * * @param loginUserId * @param curLoc */ @@ -785,17 +790,47 @@ if (!taskItems.isEmpty()) { for (TaskItem item : taskItems) { if (item.getOrderType().equals(OrderType.ORDER_OUT.type)) { + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc())); + if (Objects.isNull(loc)) { + throw new CoolException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉瀛樺湪锛侊紒"); + } + + loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type).setBarcode(task.getBarcode()).setUpdateBy(loginUserId).setUpdateTime(new Date()); + if (!locService.updateById(loc)) { + throw new CoolException("搴撲綅淇℃伅淇敼澶辫触锛侊紒"); + } + //鍑哄簱 if (item.getWkType().equals(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type))) { //搴撳瓨鍑哄簱 - Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, item.getSourceId())); - if (Objects.isNull(loc)) { - throw new CoolException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉瀛樺湪锛侊紒"); + } else if (item.getWkType().equals(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_OTHER.type))) { + //鍏跺畠鍑哄簱 + } else { + //鍑哄簱鍗曞嚭搴� + AsnOrder asnOrder = outStockService.getById(item.getSourceId()); + if (Objects.isNull(asnOrder)) { + throw new CoolException("鏁版嵁閿欒锛氬崟鎹凡涓嶅瓨鍦紒锛�"); + } + Double workQty = Math.round((asnOrder.getWorkQty() - item.getAnfme()) * 10000) / 10000.0; + + asnOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) + .setWorkQty(workQty.compareTo(0.00) > 0 ? workQty : 0.00 ) + .setUpdateBy(loginUserId) + .setUpdateTime(new Date()); + if (!outStockService.updateById(asnOrder)) { + throw new CoolException("鍘熷崟鎹姸鎬佷慨鏀瑰け璐ワ紒锛�"); } - loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type).setBarcode(task.getBarcode()).setUpdateBy(loginUserId).setUpdateTime(new Date()); - if (!locService.updateById(loc)) { - throw new CoolException("搴撲綅淇℃伅淇敼澶辫触锛侊紒"); + AsnOrderItem orderItem = outStockItemService.getById(item.getSource()); + if (Objects.isNull(orderItem)) { + throw new CoolException("鏁版嵁閿欒锛氬崟鎹槑缁嗗凡涓嶅瓨鍦紒锛�"); + } + + Double workItmQty = Math.round((orderItem.getWorkQty() - item.getAnfme()) * 10000) / 10000.0; + orderItem.setWorkQty(workItmQty); + + if (!outStockItemService.updateById(orderItem)) { + throw new CoolException("鍘熷崟鎹槑缁嗕慨鏀瑰け璐ワ紒锛�"); } } } else { 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 9584e8a..cafe93e 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 @@ -125,9 +125,9 @@ /***灏嗘湁璐ф湁鐨勬槑缁嗕俊鎭瓨鏀惧埌搴撲綅淇℃伅涓�*/ for (int i = 0; i < items.size(); i++) { items.get(i) - .setWaveId(param.getWaveId()) - .setWaveCode(param.getWaveCode()) - .setWaveItemId(param.getId()); + .setSourceId(param.getWaveId()) + .setSourceCode(param.getWaveCode()) + .setSource(param.getId()); } locItemList.addAll(items); } @@ -141,7 +141,7 @@ listMap.keySet().forEach(key -> { List<LocItem> locItems = listMap.get(key); LocItem item1 = locItems.stream().findFirst().get(); - WaveItem waveItem = waveItemService.getById(item1.getWaveItemId()); + WaveItem waveItem = waveItemService.getById(item1.getSource()); if (null == waveItem || Objects.isNull(waveItem)) { throw new CoolException("鏁版嵁閿欒锛氭尝娆℃槑缁嗕笉瀛樺湪锛侊紒"); } @@ -183,7 +183,7 @@ .setId(null) .setSourceCode(wave.getCode()) .setSourceId(wave.getId()) - .setSource(item.getWaveItemId()); + .setSource(item.getSource()); taskItems.add(taskItem); } if (!taskItemService.saveBatch(taskItems)) { diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml index db51329..ac31a5b 100644 --- a/rsf-server/src/main/resources/application.yml +++ b/rsf-server/src/main/resources/application.yml @@ -25,7 +25,7 @@ # global-config: # field-strategy: 0 configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true cache-enabled: true call-setters-on-nulls: true -- Gitblit v1.9.1