From 0f792c9b3b88dc4b1b7b306f89e257d931d2d0bd Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 18 七月 2026 15:38:57 +0800
Subject: [PATCH] 代码提交
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java | 137 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 122 insertions(+), 15 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..b62bbec 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
@@ -9,6 +9,7 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
@@ -17,8 +18,12 @@
import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
+import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
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;
@@ -50,6 +55,8 @@
@Resource
private MesMdmItemService mdmItemService;
@Resource
+ private MesMdItemService mdItemService;
+ @Resource
private MesMdItemTypeService itemTypeService;
@Resource
private MesWmWarehouseAreaService areaService;
@@ -59,6 +66,9 @@
@Resource
@Lazy
private MesWmTransactionService wmTransactionService;
+ @Resource
+ @Lazy
+ private MesWmBatchService batchService;
@Override
public MesWmMaterialStockDO getMaterialStock(Long id) {
@@ -88,10 +98,13 @@
List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(pageReqVO.getItemTypeId());
itemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId));
}
- // 1.2 瑙f瀽 itemId
+ // 1.2 瑙f瀽 itemId锛氬墠绔紶鐨勬槸 mes_md_item.id锛屽簱瀛樿〃瀛樼殑鏄� mdm_item_id锛岄渶瑕佽浆鎹�
Set<Long> itemIds = null;
if (pageReqVO.getItemId() != null) {
- itemIds = SetUtils.asSet(pageReqVO.getItemId());
+ MesMdItemDO item = mdItemService.getItem(pageReqVO.getItemId());
+ if (item != null && item.getMdmItemId() != null) {
+ itemIds = SetUtils.asSet(item.getMdmItemId());
+ }
}
// 1.3 瑙f瀽 virtualFilter锛氳浆鎹负铏氭嫙浠� warehouseId
Long virtualWarehouseId = null;
@@ -175,7 +188,15 @@
.frozen(false)
.build();
materialStockMapper.insert(newStock);
- return newStock;
+ // 3. 閲嶆柊鏌ヨ锛岀‘淇濇嬁鍒版暟鎹簱鐢熸垚鐨勫畬鏁磋褰曪紙id銆乧reateTime 绛夛級
+ MesWmMaterialStockDO inserted = materialStockMapper.selectById(newStock.getId());
+ return inserted != null ? inserted : newStock;
+ }
+
+ @Override
+ public MesWmMaterialStockDO getMaterialStockByCompositeKey(Long itemId, Long warehouseId, Long locationId, Long areaId,
+ Long batchId, Long vendorId) {
+ return materialStockMapper.selectByCompositeKey(itemId, warehouseId, locationId, areaId, batchId, vendorId);
}
@Override
@@ -264,28 +285,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 +329,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 +342,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