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