From 00b31db4f3677dc919a1c4e1c227fd8fdd65f60f Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期四, 11 六月 2026 19:30:35 +0800
Subject: [PATCH] fix: 修复采购库存自动提交同一个入库单,多个同一规格入库报错
---
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java | 159 ++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 133 insertions(+), 26 deletions(-)
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index 91bce0d..5fbc6b3 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -52,12 +52,13 @@
// 鏂板鍏ュ簱
@Override
@Transactional(rollbackFor = Exception.class)
- public int add(StockInRecordDto stockInRecordDto) {
+ public StockInRecord add(StockInRecordDto stockInRecordDto) {
String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches");
stockInRecordDto.setInboundBatches(no);
StockInRecord stockInRecord = new StockInRecord();
BeanUtils.copyProperties(stockInRecordDto, stockInRecord);
- return stockInRecordMapper.insert(stockInRecord);
+ stockInRecordMapper.insert(stockInRecord);
+ return stockInRecord;
}
@Override
@@ -69,9 +70,56 @@
throw new BaseException("璇ュ叆搴撹褰曚笉瀛樺湪,鏃犳硶鏇存柊!!!");
}
+ // 璁板綍淇敼鍓嶇殑 batch_no
+ String oldBatchNo = stockInRecord.getBatchNo();
+ String newBatchNo = stockInRecordDto.getBatchNo();
+
String[] ignoreProperties = {"id", "inbound_batches"};//鎺掗櫎id灞炴��
BeanUtils.copyProperties(stockInRecordDto, stockInRecord, ignoreProperties);
- return stockInRecordMapper.updateById(stockInRecord);
+ int result = stockInRecordMapper.updateById(stockInRecord);
+
+ // 濡傛灉 batch_no 鍙戠敓鍙樺寲锛岄渶瑕佸悓姝ユ洿鏂板叧鑱旇〃
+ if (newBatchNo != null && !newBatchNo.equals(oldBatchNo)) {
+ updateRelatedBatchNo(stockInRecord, oldBatchNo, newBatchNo);
+ }
+
+ return result;
+ }
+
+ /**
+ * 鍚屾鏇存柊鍏宠仈琛ㄧ殑 batch_no
+ * @param stockInRecord 鍏ュ簱璁板綍
+ * @param oldBatchNo 淇敼鍓嶇殑鎵瑰彿
+ * @param newBatchNo 淇敼鍚庣殑鎵瑰彿
+ */
+ private void updateRelatedBatchNo(StockInRecord stockInRecord, String oldBatchNo, String newBatchNo) {
+ // 1. 鏇存柊 stock_inventory 琛紙鍚堟牸搴撳瓨锛�
+ LambdaQueryWrapper<StockInventory> inventoryEq = new LambdaQueryWrapper<StockInventory>()
+ .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId());
+ if (StringUtils.isEmpty(oldBatchNo)) {
+ inventoryEq.isNull(StockInventory::getBatchNo);
+ } else {
+ inventoryEq.eq(StockInventory::getBatchNo, oldBatchNo);
+ }
+ StockInventory stockInventory = stockInventoryMapper.selectOne(inventoryEq);
+ if (stockInventory != null) {
+ stockInventory.setBatchNo(newBatchNo);
+ stockInventoryMapper.updateById(stockInventory);
+ }
+
+ // 2. 鏇存柊 stock_uninventory 琛紙涓嶅悎鏍煎簱瀛橈級
+ LambdaQueryWrapper<StockUninventory> uninventoryEq = new LambdaQueryWrapper<StockUninventory>()
+ .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
+ if (StringUtils.isEmpty(oldBatchNo)) {
+ uninventoryEq.isNull(StockUninventory::getBatchNo);
+ } else {
+ uninventoryEq.eq(StockUninventory::getBatchNo, oldBatchNo);
+ }
+ StockUninventory stockUninventory = stockUninventoryMapper.selectOne(uninventoryEq);
+ if (stockUninventory != null) {
+ stockUninventory.setBatchNo(newBatchNo);
+ stockUninventoryMapper.updateById(stockUninventory);
+ }
}
@Override
@@ -156,6 +204,32 @@
return stockUninventoryMapper.selectOne(eq);
}
+ /**
+ * 鍥炴粴鐢熶骇閫�鏂欏叆搴撶殑棰嗘枡璁板綍閫�鏂欐暟閲�
+ * @param stockInRecord 鍏ュ簱璁板綍
+ */
+ private void rollbackFeedReturnQty(StockInRecord stockInRecord) {
+ ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+ if (productionOrderPick != null) {
+ BigDecimal returnQty = productionOrderPick.getReturnQty();
+ if (returnQty == null) {
+ returnQty = BigDecimal.ZERO;
+ }
+ BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
+ if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
+ newReturnQty = BigDecimal.ZERO;
+ }
+ productionOrderPick.setReturnQty(newReturnQty);
+ // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+ BigDecimal actualQty = productionOrderPick.getQuantity().add(
+ productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+ .subtract(newReturnQty);
+ productionOrderPick.setActualQty(actualQty);
+ productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+ productionOrderPickMapper.updateById(productionOrderPick);
+ }
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public int batchDeletePending(List<Long> ids) {
@@ -166,6 +240,11 @@
}
if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘鍒犻櫎,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+ }
+
+ // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鍒犻櫎鏃堕渶瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
+ if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+ rollbackFeedReturnQty(stockInRecord);
}
}
return stockInRecordMapper.deleteBatchIds(ids);
@@ -185,36 +264,16 @@
if (stockInRecord == null) {
throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
}
- if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
+ /*if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
- }
+ }*/
stockInRecord.setApprovalStatus(approvalStatus);
stockInRecordMapper.updateById(stockInRecord);
// 瀹℃壒椹冲洖鏃讹紝濡傛灉鏄敓浜ч��鏂欏叆搴擄紝闇�瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
if (ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus) &&
StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
- // 鎵惧埌瀵瑰簲鐨勯鏂欒褰�
- ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
- if (productionOrderPick != null) {
- // 鍥炴粴閫�鏂欐暟閲�
- BigDecimal returnQty = productionOrderPick.getReturnQty();
- if (returnQty == null) {
- returnQty = BigDecimal.ZERO;
- }
- BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
- if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
- newReturnQty = BigDecimal.ZERO;
- }
- productionOrderPick.setReturnQty(newReturnQty);
- // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
- BigDecimal actualQty = productionOrderPick.getQuantity().add(
- productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
- .subtract(newReturnQty);
- productionOrderPick.setActualQty(actualQty);
- productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
- productionOrderPickMapper.updateById(productionOrderPick);
- }
+ rollbackFeedReturnQty(stockInRecord);
}
// 瀹℃壒閫氳繃鏃讹紝搴撳瓨澧炲姞
@@ -227,10 +286,12 @@
stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
stockInventoryDto.setRemark(stockInRecord.getRemark());
+ stockInventoryDto.setWarnNum(stockInRecord.getWarnNum());
if (stockInventory == null) {
stockInventoryMapper.insert(new StockInventory() {{
setProductModelId(stockInRecord.getProductModelId());
setQualitity(stockInRecord.getStockInNum());
+ setWarnNum(stockInRecord.getWarnNum());
setBatchNo(stockInRecord.getBatchNo());
setRemark(stockInRecord.getRemark());
setVersion(1);
@@ -262,4 +323,50 @@
}
return ids.size();
}
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int batchReAudit(List<Long> ids) {
+ if (CollectionUtils.isEmpty(ids)) {
+ throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+ }
+
+ for (Long id : ids) {
+ StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+ if (stockInRecord == null) {
+ throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶閲嶆柊瀹℃牳!!!");
+ }
+ // 鍙湁椹冲洖鐘舵�佹墠鑳介噸鏂板鏍�
+ if (!ReviewStatusEnum.REJECTED.getCode().equals(stockInRecord.getApprovalStatus())) {
+ throw new BaseException("鍙湁椹冲洖鐘舵�佺殑璁板綍鎵嶈兘閲嶆柊瀹℃牳,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+ }
+
+ // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鎭㈠閫�鏂欐暟閲忥紙鍥犱负椹冲洖鏃跺凡鎵e噺锛�
+ if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+ ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+ if (productionOrderPick != null) {
+ BigDecimal returnQty = productionOrderPick.getReturnQty();
+ if (returnQty == null) {
+ returnQty = BigDecimal.ZERO;
+ }
+ // 閲嶆柊瀹℃牳鏃舵仮澶嶉��鏂欐暟閲�
+ BigDecimal newReturnQty = returnQty.add(stockInRecord.getStockInNum());
+ productionOrderPick.setReturnQty(newReturnQty);
+ // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+ BigDecimal actualQty = productionOrderPick.getQuantity().add(
+ productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+ .subtract(newReturnQty);
+ productionOrderPick.setActualQty(actualQty);
+ productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+ productionOrderPickMapper.updateById(productionOrderPick);
+ }
+ }
+
+ // 灏嗙姸鎬佹敼涓哄緟瀹℃牳
+ stockInRecord.setApprovalStatus(ReviewStatusEnum.PENDING_REVIEW.getCode());
+ stockInRecordMapper.updateById(stockInRecord);
+ }
+
+ return ids.size();
+ }
}
--
Gitblit v1.9.3