From 704265308b1227dbada5a36b2027b588c062ded2 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 12 十月 2026 09:14:37 +0800
Subject: [PATCH] feat(mes): 新增业务码支持并优化追溯查询功能
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/scan/MesProScanEventServiceImpl.java | 63 +++++++++++++++++++------------
1 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/scan/MesProScanEventServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/scan/MesProScanEventServiceImpl.java
index 4657035..f9412cc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/scan/MesProScanEventServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/scan/MesProScanEventServiceImpl.java
@@ -32,6 +32,12 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProPalletStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
@Slf4j
@Service
@@ -55,20 +61,31 @@
@Override
@Transactional(rollbackFor = Exception.class)
public MesProScanEventDO createInbound(MesProScanEventCreateReqVO req) {
+ String scanType = (req.getScanType() == null || req.getScanType().isBlank()) ? SCAN_TYPE_BAG : req.getScanType();
+ if (!List.of(SCAN_TYPE_BAG, SCAN_TYPE_PALLET, SCAN_TYPE_BATCH).contains(scanType)) {
+ throw new ServiceException(400, "涓嶆敮鎸佺殑鎵爜绫诲瀷");
+ }
MesProScanEventDO existing = eventMapper.selectByEventIdForUpdate(req.getEventId());
if (existing != null) {
boolean contentMatch = req.getBagCode().equals(existing.getBagCode())
- && (req.getDeviceCode() == null || req.getDeviceCode().equals(existing.getDeviceCode()));
+ && Objects.equals(req.getDeviceCode(), existing.getDeviceCode())
+ && Objects.equals(req.getLineCode(), existing.getLineCode())
+ && Objects.equals(scanType, existing.getScanType())
+ && Objects.equals(req.getLocationId(), existing.getLocationId())
+ && Objects.equals(req.getAreaId(), existing.getAreaId())
+ && (!SCAN_TYPE_BAG.equals(scanType) || (existing.getQuantity() != null
+ && req.getQuantity().compareTo(existing.getQuantity()) == 0))
+ && Objects.equals(String.valueOf(SecurityFrameworkUtils.getLoginUserId()), existing.getCreator());
if (!contentMatch) {
- return failed(existing, "MES_SCAN_EVENT_ID_CONFLICT", "浜嬩欢鍙峰凡瀛樺湪浣嗗唴瀹逛笉涓�鑷�");
+ throw new ServiceException(409, "浜嬩欢鍙峰凡瀛樺湪浣嗗唴瀹规垨鎿嶄綔浜轰笉涓�鑷达紝璇锋牳瀹炲師鎿嶄綔");
}
return existing;
}
- String scanType = (req.getScanType() == null || req.getScanType().isBlank()) ? SCAN_TYPE_BAG : req.getScanType();
MesProScanEventDO event = new MesProScanEventDO();
event.setEventId(req.getEventId()).setBagCode(req.getBagCode()).setScanType(scanType)
.setQuantity(req.getQuantity()).setDeviceCode(req.getDeviceCode()).setLineCode(req.getLineCode())
- .setRemark(req.getRemark()).setStatus(MesProScanEventStatusEnum.FAILED).setReceivedTime(LocalDateTime.now());
+ .setRemark(req.getRemark()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId())
+ .setStatus(MesProScanEventStatusEnum.FAILED).setReceivedTime(LocalDateTime.now());
eventMapper.insert(event);
// 1. 鎸夋壂鐮佺被鍨嬭В鏋愭壂鐮佺洰鏍囦笌鍏ュ簱鏁伴噺锛堟墭鐩樻寜宸茶琚嬫暟銆佹壒娆℃寜鎵规琚嬫暟鏁存壒/鏁存墭鍏ュ簱锛�
Long targetId;
@@ -79,37 +96,31 @@
Long bagCodeId = null;
String bagCode = null;
if (SCAN_TYPE_PALLET.equals(scanType)) {
- MesProPalletDO pallet = palletMapper.selectByCode(req.getBagCode());
- if (pallet == null) {
- pallet = palletMapper.selectByTempCode(req.getBagCode());
- }
+ MesProPalletDO pallet = palletMapper.selectByScanCodeForUpdate(req.getBagCode());
if (pallet == null) return failed(event, "MES_SCAN_PALLET_NOT_EXISTS", "鎵樼洏鐮佷笉瀛樺湪");
+ if (MesProPalletStatusEnum.CANCELED.getStatus().equals(pallet.getStatus()))
+ return failed(event, "MES_SCAN_PALLET_CANCELED", "鎵樼洏宸蹭綔搴燂紝涓嶅彲鍏ュ簱");
if (pallet.getInboundEventId() != null) return failed(event, "MES_SCAN_PALLET_ALREADY_INBOUND", "鎵樼洏宸插叆搴�");
batch = batchMapper.selectByIdForUpdate(pallet.getBatchId());
if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "鐢熶骇鎵规涓嶅瓨鍦�");
batchId = batch.getId();
targetId = pallet.getId();
- quantity = pallet.getBagCount() != null && pallet.getBagCount() > 0
- ? BigDecimal.valueOf(pallet.getBagCount())
- : BigDecimal.valueOf(bagCodeMapper.selectCountByPalletId(pallet.getId()));
+ quantity = BigDecimal.valueOf(bagCodeMapper.selectPendingInboundCountByPalletId(pallet.getId()));
} else if (SCAN_TYPE_BATCH.equals(scanType)) {
- batch = batchMapper.selectByCode(req.getBagCode());
- if (batch == null) {
- batch = batchMapper.selectByTempCode(req.getBagCode());
- }
+ batch = batchMapper.selectByScanCodeForUpdate(req.getBagCode());
if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "鐢熶骇鎵规涓嶅瓨鍦�");
- if (batch.getInboundEventId() != null) return failed(event, "MES_SCAN_BATCH_ALREADY_INBOUND", "鎵规宸叉暣鎵瑰叆搴�");
batchId = batch.getId();
targetId = batch.getId();
- quantity = batch.getBagQuantity() != null && batch.getBagQuantity() > 0
- ? BigDecimal.valueOf(batch.getBagQuantity())
- : BigDecimal.valueOf(bagCodeMapper.selectCountByBatchId(batch.getId()));
+ quantity = BigDecimal.valueOf(bagCodeMapper.selectPendingInboundCountByBatchId(batch.getId()));
} else {
- MesProBagCodeDO bag = bagCodeMapper.selectByCodeForUpdate(req.getBagCode());
+ MesProBagCodeDO bag = bagCodeMapper.selectByScanCodeForUpdate(req.getBagCode());
if (bag == null) return failed(event, "MES_SCAN_BAG_NOT_EXISTS", "琚嬬爜涓嶅瓨鍦�");
+ if (MesProBagCodeStatusEnum.CANCELED.getStatus().equals(bag.getStatus()))
+ return failed(event, "MES_SCAN_BAG_CANCELED", "琚嬬爜宸蹭綔搴燂紝涓嶅彲鍏ュ簱");
event.setBagCodeId(bag.getId());
bagCodeId = bag.getId();
- bagCode = req.getBagCode();
+ // 搴撳瓨娴佹按淇濇寔鍘熻拷婧爜涓鸿鑼冪爜锛屼笟鍔$爜浠呯敤浜庢煡鎵惧悓涓�琚嬶紝閬垮厤鍙岀爜鎷嗘垚涓や唤搴撳瓨銆�
+ bagCode = bag.getCode();
if (bag.getInboundEventId() != null) return failed(event, "MES_SCAN_BAG_ALREADY_INBOUND", "琚嬬爜宸插叆搴�");
batch = batchMapper.selectByIdForUpdate(bag.getBatchId());
if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "鐢熶骇鎵规涓嶅瓨鍦�");
@@ -117,7 +128,11 @@
targetId = bag.getId();
quantity = req.getQuantity();
}
- event.setBatchId(batchId).setBatchCode(batch.getCode()).setItemId(batch.getItemId());
+ if (MesProBatchStatusEnum.CANCELED.getStatus().equals(batch.getStatus()))
+ return failed(event, "MES_SCAN_BATCH_CANCELED", "鐢熶骇鎵规宸蹭綔搴燂紝涓嶅彲鍏ュ簱");
+ if (quantity.signum() <= 0)
+ return failed(event, "MES_SCAN_NO_PENDING_BAGS", "娌℃湁寰呭叆搴撶殑鏈夋晥琚嬬爜锛岃鍕块噸澶嶅叆搴�");
+ event.setBatchId(batchId).setBatchCode(batch.getCode()).setItemId(batch.getItemId()).setQuantity(quantity);
MesWmWarehouseDO warehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE);
if (warehouse == null) return failed(event, "MES_SCAN_WIP_WAREHOUSE_NOT_EXISTS", "WIP铏氭嫙浠撲笉瀛樺湪");
event.setWarehouseId(warehouse.getId()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId());
@@ -143,12 +158,12 @@
palletMapper.markInbound(targetId, event.getId());
bagCodeMapper.markInboundByPalletId(targetId, event.getId(), req.getLineCode());
} else if (SCAN_TYPE_BATCH.equals(scanType)) {
- batchMapper.markBatchInbound(targetId, event.getId(), req.getLineCode(), batch.getBagQuantity());
bagCodeMapper.markInboundByBatchId(targetId, event.getId(), req.getLineCode());
} else {
bagCodeMapper.markInbound(targetId, event.getId(), req.getDeviceCode(), req.getLineCode());
- batchMapper.markInbound(batchId, event.getId(), req.getDeviceCode(), req.getLineCode());
}
+ palletMapper.markCompletedInboundByBatchId(batchId, event.getId());
+ batchMapper.refreshInboundProgress(batchId, event.getId(), req.getDeviceCode(), req.getLineCode());
return event;
} catch (Exception ex) {
log.error("[createInbound] 搴撳瓨浜嬪姟澶勭悊澶辫触锛宔ventId={}, bagCode={}, batchId={}, itemId={}",
--
Gitblit v1.9.3