From c05d4037b04f5182088fcf07835409a6eda83362 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期二, 10 六月 2025 14:44:45 +0800 Subject: [PATCH] 下发执行功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 41 ++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java | 12 ++ 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/OutStockService.java | 2 rsf-admin/src/page/orders/outStock/OutStockPublic.jsx | 272 +++++++++++++++++++++++---------------------- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java | 6 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java | 13 ++ rsf-server/src/main/resources/application.yml | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java | 3 9 files changed, 216 insertions(+), 143 deletions(-) diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx index b3b7062..b3570fe 100644 --- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx +++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx @@ -94,7 +94,6 @@ })); }; - gridRef.current = useGridApiRef(); return ( <> @@ -158,27 +157,11 @@ <Grid item xl={6.3} gap={2}> <Card> <Box sx={{ height: 500, width: '100%' }}> - <DataGrid - rows={rows} - columns={columns} - apiRef={gridRef} - initialState={{ - pagination: { - paginationModel: { - pageSize: 15, - }, - }, - }} - checkboxSelection - pageSizeOptions={[15, 25, 35, 45]} - onRowSelectionModelChange={(ids) => { - setSelectedIds(ids) - }} - /> + <PreviewTable rows={rows} gridRef={gridRef} setRows={setRows} record={record}/> </Box> <Box sx={{ textAlign: 'center' }}> <CloseButton setOpen={setOpen} /> - <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} /> + <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} record={record}/> </Box> </Card> </Grid> @@ -188,15 +171,149 @@ ); } +const PreviewTable = ({ rows, gridRef, setRows, record }) => { + gridRef.current = useGridApiRef(); + + 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 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} + apiRef={gridRef} + initialState={{ + pagination: { + paginationModel: { + pageSize: 15, + }, + }, + }} + checkboxSelection + pageSizeOptions={[15, 25, 35, 45]} + onRowSelectionModelChange={(ids) => { + setSelectedIds(ids) + }} + /> + ) +} //鎻愪氦鎸夐挳 -const SubmitButton = ({ selectedIds, setSelectedIds, gridRef }) => { +const SubmitButton = ({ selectedIds, setSelectedIds, gridRef, record }) => { const notify = useNotify(); const refresh = useRefresh(); - const redirect = useRedirect(); + 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 }); + const { data: { code, data, msg } } = await request.post('/outStock/generate/tasks', { items, outId: record?.id }); if (code == 200) { refresh(); redirect("/task") @@ -230,117 +347,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: '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.id)} - />, - ] - }, -] - -/** - * 鍒犻櫎浜嬩欢 - * @param {*} params - */ -const handleDelete = (params) => { - console.log(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/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java index 9ee7129..a4fc8e0 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 @@ -262,9 +262,13 @@ 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()); + return outStockService.genOutStockTask(taskParams, getLoginUserId(), Long.parseLong(params.get("outId").toString())); } 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 index 0cb5e8d..6a676bb 100644 --- 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 @@ -1,10 +1,13 @@ 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) @@ -26,6 +29,16 @@ @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; 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/OutStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java index a4db92a..01bd225 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 @@ -23,5 +23,5 @@ R getOrderOutTaskItem(OrderOutTaskParam param); - R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId); + R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId, Long outId); } 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 7d8c06a..6071fb1 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 @@ -45,6 +45,8 @@ private DeviceSiteService deviceSiteService; @Autowired private WcsService wcsService; + @Autowired + private OutStockService outStockService; /** @@ -69,6 +71,13 @@ 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); @@ -202,6 +211,9 @@ .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())); + } taskItems.add(taskItem); Double qty = Math.round((item.getWorkQty() + item.getOutQty()) * 10000) / 10000.0; 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 705b509..def395e 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,7 +1,6 @@ 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; @@ -429,15 +428,15 @@ * 鐢熸垚鍑哄簱浠诲姟 * * @param params + * @param outId * @return */ @Override @Transactional(rollbackFor = Exception.class) - public R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId) { + 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; @@ -455,19 +454,53 @@ locItems.add(locItem); LocToTaskParams taskParams = new LocToTaskParams(); - taskParams.setType(Constants.TASK_TYPE_OUT_STOCK) + 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()); } + + 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("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); + } + + 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(); } diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml index ac31a5b..db51329 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