From 274dd8b724dd4485658e1d2a3f825a007f625bd7 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 17 七月 2026 09:10:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 104 insertions(+), 12 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
index b167ca2..f78cdbd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -19,6 +19,9 @@
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService;
+import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
@@ -59,6 +62,9 @@
@Resource
@Lazy
private MesWmTransactionService wmTransactionService;
+ @Resource
+ @Lazy
+ private MesWmBatchService batchService;
@Override
public MesWmMaterialStockDO getMaterialStock(Long id) {
@@ -264,28 +270,41 @@
// 1. 鏍¢獙鐗╂枡瀛樺湪涓斿惎鐢�
MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
- // 2. 鏍¢獙搴撲綅娣锋斁瑙勫垯
- checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId());
+ // 2. 澶勭悊鎵规锛堜粎鍏ュ簱鏃堕渶瑕佸鐞嗘壒娆★級
+ Long batchId = reqVO.getBatchId();
+ String batchCode = reqVO.getBatchCode();
+ if (isInbound) {
+ MesWmBatchDO batch = resolveBatch(reqVO, item);
+ if (batch != null) {
+ batchId = batch.getId();
+ batchCode = batch.getCode();
+ }
+ } else {
+ // 鍑哄簱鏃舵牎楠屾壒娆″瓨鍦�
+ if (batchId != null) {
+ batchService.validateBatchExists(batchId, reqVO.getItemId());
+ }
+ }
- // 3. 鑾峰彇鎴栧垱寤哄簱瀛樿褰�
+ // 3. 鏍¢獙搴撲綅娣锋斁瑙勫垯
+ checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), batchId);
+
+ // 4. 鑾峰彇鎴栧垱寤哄簱瀛樿褰�
MesWmMaterialStockDO stock = getOrCreateMaterialStock(
reqVO.getItemId(),
reqVO.getWarehouseId(),
reqVO.getLocationId(),
reqVO.getAreaId(),
- reqVO.getBatchId(),
- reqVO.getBatchCode(),
+ batchId,
+ batchCode,
reqVO.getVendorId(),
LocalDateTime.now()
);
- // 4. 璁$畻鍙樺姩鏁伴噺锛氬叆搴撲负姝o紝鍑哄簱涓鸿礋
+ // 5. 璁$畻鍙樺姩鏁伴噺锛氬叆搴撲负姝o紝鍑哄簱涓鸿礋
BigDecimal quantity = isInbound ? reqVO.getQuantity() : reqVO.getQuantity().negate();
- // 5. 鏇存柊搴撳瓨鏁伴噺锛堝嚭搴撴椂鏍¢獙搴撳瓨鍏呰冻锛�
- updateMaterialStockQuantity(stock.getId(), quantity, !isInbound);
-
- // 6. 鍒涘缓搴撳瓨浜嬪姟娴佹按
+ // 6. 鍒涘缓搴撳瓨浜嬪姟娴佹按锛堝唴閮ㄤ細鏇存柊搴撳瓨鏁伴噺锛�
int bizType = isInbound ? MesBizTypeConstants.WM_STOCK_ADJUST_IN : MesBizTypeConstants.WM_STOCK_ADJUST_OUT;
MesWmTransactionSaveReqDTO transaction = new MesWmTransactionSaveReqDTO()
.setType(isInbound ? MesWmTransactionTypeEnum.IN.getType() : MesWmTransactionTypeEnum.OUT.getType())
@@ -295,8 +314,8 @@
.setBizLineId(stock.getId())
.setItemId(reqVO.getItemId())
.setQuantity(quantity)
- .setBatchId(reqVO.getBatchId())
- .setBatchCode(reqVO.getBatchCode())
+ .setBatchId(batchId)
+ .setBatchCode(batchCode)
.setWarehouseId(reqVO.getWarehouseId())
.setLocationId(reqVO.getLocationId())
.setAreaId(reqVO.getAreaId())
@@ -308,4 +327,77 @@
return stock.getId();
}
+ /**
+ * 瑙f瀽鎵规
+ * <p>
+ * 鍏ュ簱鏃剁殑鎵规澶勭悊閫昏緫锛�
+ * 1. 鐗╂枡鏈惎鐢ㄦ壒娆$鐞嗭細杩斿洖 null
+ * 2. 浼犲叆 batchId锛氭牎楠屽苟浣跨敤宸叉湁鎵规
+ * 3. 鏈紶 batchId锛氭牴鎹� batchCode 绛夊弬鏁拌嚜鍔ㄥ垱寤烘壒娆�
+ *
+ * @param reqVO 鍏ュ簱璇锋眰
+ * @param item 鐗╂枡淇℃伅
+ * @return 鎵规璁板綍锛堢墿鏂欐湭鍚敤鎵规绠$悊鏃惰繑鍥� null锛�
+ */
+ private MesWmBatchDO resolveBatch(MesWmMaterialStockAdjustReqVO reqVO, MesMdmItemDO item) {
+ // 1. 鐗╂枡鏈惎鐢ㄦ壒娆$鐞嗭紝杩斿洖 null
+ if (Boolean.FALSE.equals(item.getIsBatchManaged())) {
+ return null;
+ }
+
+ // 2. 浼犲叆 batchId锛屾牎楠屽苟杩斿洖宸叉湁鎵规
+ if (reqVO.getBatchId() != null) {
+ return batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId());
+ }
+
+ // 3. 鏈紶 batchId锛岃嚜鍔ㄥ垱寤烘壒娆�
+ MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO()
+ .setItemId(reqVO.getItemId())
+ .setBatchCode(reqVO.getBatchCode())
+ .setVendorId(reqVO.getVendorId())
+ .setProduceDate(reqVO.getProduceDate() != null ? reqVO.getProduceDate().atStartOfDay() : null)
+ .setExpireDate(reqVO.getExpireDate() != null ? reqVO.getExpireDate().atStartOfDay() : null)
+ .setReceiptDate(LocalDateTime.now())
+ .setLotNumber(reqVO.getLotNumber())
+ .setQualityStatus(parseQualityStatus(reqVO.getQualityStatus()));
+ return batchService.getOrGenerateBatchCode(batchReqVO);
+ }
+
+ /**
+ * 瑙f瀽璐ㄩ噺鐘舵�侊紙鏀寔鏁板瓧鎴栧瓧绗︿覆锛�
+ */
+ private Integer parseQualityStatus(Object qualityStatus) {
+ if (qualityStatus == null) {
+ return null;
+ }
+ if (qualityStatus instanceof Integer) {
+ return (Integer) qualityStatus;
+ }
+ if (qualityStatus instanceof String) {
+ String str = (String) qualityStatus;
+ // 鏀寔鏁板瓧瀛楃涓�
+ if (str.matches("\\d+")) {
+ return Integer.parseInt(str);
+ }
+ // 鏀寔甯歌瀛楃涓叉槧灏�
+ switch (str.toUpperCase()) {
+ case "PENDING":
+ case "寰呮楠�":
+ case "寰呮":
+ return 0;
+ case "PASS":
+ case "QUALIFIED":
+ case "鍚堟牸":
+ return 1;
+ case "FAIL":
+ case "UNQUALIFIED":
+ case "涓嶅悎鏍�":
+ return 2;
+ default:
+ throw new IllegalArgumentException("鏃犳晥鐨勮川閲忕姸鎬�: " + str);
+ }
+ }
+ throw new IllegalArgumentException("鏃犳晥鐨勮川閲忕姸鎬佺被鍨�: " + qualityStatus.getClass().getName());
+ }
+
}
--
Gitblit v1.9.3