From 940c8481d2fdcf51341db4ccd6fd6fcc2d43debb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 29 六月 2026 15:32:58 +0800
Subject: [PATCH] 初始化项目
---
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 109 insertions(+), 5 deletions(-)
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java
index d84951c..0bfaed8 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java
@@ -1,20 +1,33 @@
package cn.iocoder.yudao.module.erp.service.stock;
+import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.record.ErpStockRecordPageReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockRecordDO;
import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockRecordMapper;
import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemSkuApi;
+import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSkuRespDTO;
+import cn.iocoder.yudao.module.wms.api.inventory.WmsInventoryApi;
+import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsReceiptReqDTO;
+import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsShipmentReqDTO;
+import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryBizTypeEnum;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.util.List;
/**
* ERP 浜у搧搴撳瓨鏄庣粏 Service 瀹炵幇绫�
+ *
+ * 鏀归�犺鏄庯細搴撳瓨鍙樻洿璋冪敤 WMS 搴撳瓨 API
+ * - 鍏ュ簱鎿嶄綔璋冪敤 WmsInventoryApi.receipt()
+ * - 鍑哄簱鎿嶄綔璋冪敤 WmsInventoryApi.shipment()
+ * - productId 瀵瑰簲 MDM itemId锛岄�氳繃 SKU API 鑾峰彇榛樿 SKU
*
* @author 鑺嬮亾婧愮爜
*/
@@ -27,6 +40,12 @@
@Resource
private ErpStockService stockService;
+
+ @Resource
+ private WmsInventoryApi wmsInventoryApi;
+
+ @Resource
+ private MdmItemSkuApi mdmItemSkuApi;
@Override
public ErpStockRecordDO getStockRecord(Long id) {
@@ -41,13 +60,98 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void createStockRecord(ErpStockRecordCreateReqBO createReqBO) {
- // 1. 鏇存柊搴撳瓨
- BigDecimal totalCount = stockService.updateStockCountIncrement(
- createReqBO.getProductId(), createReqBO.getWarehouseId(), createReqBO.getCount());
- // 2. 鍒涘缓搴撳瓨鏄庣粏
+ // 1. 鑾峰彇浜у搧鐨勯粯璁� SKU ID锛圗RP productId = MDM itemId锛�
+ Long skuId = getDefaultSkuId(createReqBO.getProductId());
+ if (skuId == null) {
+ // 濡傛灉娌℃湁 SKU锛屼娇鐢ㄥ師鏈夐�昏緫鏇存柊搴撳瓨
+ BigDecimal totalCount = stockService.updateStockCountIncrement(
+ createReqBO.getProductId(), createReqBO.getWarehouseId(), createReqBO.getCount());
+ ErpStockRecordDO stockRecord = BeanUtils.toBean(createReqBO, ErpStockRecordDO.class)
+ .setTotalCount(totalCount);
+ stockRecordMapper.insert(stockRecord);
+ return;
+ }
+
+ // 2. 鏍规嵁 count 姝h礋鍒ゆ柇鍏ュ簱杩樻槸鍑哄簱
+ BigDecimal count = createReqBO.getCount();
+ if (count.compareTo(BigDecimal.ZERO) > 0) {
+ // 鍏ュ簱鎿嶄綔
+ WmsReceiptReqDTO receiptReq = buildReceiptReqDTO(createReqBO, skuId);
+ wmsInventoryApi.receipt(receiptReq);
+ } else if (count.compareTo(BigDecimal.ZERO) < 0) {
+ // 鍑哄簱鎿嶄綔锛堟暟閲忚浆涓烘鏁帮級
+ WmsShipmentReqDTO shipmentReq = buildShipmentReqDTO(createReqBO, skuId);
+ wmsInventoryApi.shipment(shipmentReq);
+ }
+
+ // 3. 鍒涘缓搴撳瓨鏄庣粏锛堣褰曟搷浣滐級
+ BigDecimal currentStock = wmsInventoryApi.getAvailableQuantity(skuId, createReqBO.getWarehouseId()).getCheckedData();
ErpStockRecordDO stockRecord = BeanUtils.toBean(createReqBO, ErpStockRecordDO.class)
- .setTotalCount(totalCount);
+ .setTotalCount(currentStock != null ? currentStock : BigDecimal.ZERO);
stockRecordMapper.insert(stockRecord);
}
+ /**
+ * 鑾峰彇浜у搧鐨勯粯璁� SKU ID
+ */
+ private Long getDefaultSkuId(Long productId) {
+ if (productId == null) {
+ return null;
+ }
+ List<MdmItemSkuRespDTO> skuList = mdmItemSkuApi.getItemSkuListByItemId(productId).getCheckedData();
+ if (CollUtil.isEmpty(skuList)) {
+ return null;
+ }
+ return skuList.get(0).getId();
+ }
+
+ /**
+ * 鏋勫缓鍏ュ簱璇锋眰
+ */
+ private WmsReceiptReqDTO buildReceiptReqDTO(ErpStockRecordCreateReqBO createReqBO, Long skuId) {
+ WmsReceiptReqDTO receiptReq = new WmsReceiptReqDTO();
+ receiptReq.setBizType(convertBizType(createReqBO.getBizType()));
+ receiptReq.setBizId(createReqBO.getBizId());
+ receiptReq.setBizNo(createReqBO.getBizNo());
+ receiptReq.setWarehouseId(createReqBO.getWarehouseId());
+ receiptReq.setRemark(createReqBO.getRemark());
+
+ WmsReceiptReqDTO.Item item = new WmsReceiptReqDTO.Item();
+ item.setSkuId(skuId);
+ item.setQuantity(createReqBO.getCount());
+ receiptReq.setItems(List.of(item));
+ return receiptReq;
+ }
+
+ /**
+ * 鏋勫缓鍑哄簱璇锋眰
+ */
+ private WmsShipmentReqDTO buildShipmentReqDTO(ErpStockRecordCreateReqBO createReqBO, Long skuId) {
+ WmsShipmentReqDTO shipmentReq = new WmsShipmentReqDTO();
+ shipmentReq.setBizType(convertBizType(createReqBO.getBizType()));
+ shipmentReq.setBizId(createReqBO.getBizId());
+ shipmentReq.setBizNo(createReqBO.getBizNo());
+ shipmentReq.setWarehouseId(createReqBO.getWarehouseId());
+ shipmentReq.setRemark(createReqBO.getRemark());
+
+ WmsShipmentReqDTO.Item item = new WmsShipmentReqDTO.Item();
+ item.setSkuId(skuId);
+ item.setQuantity(createReqBO.getCount().negate()); // 鍑哄簱鏁伴噺涓烘鏁�
+ shipmentReq.setItems(List.of(item));
+ return shipmentReq;
+ }
+
+ /**
+ * 杞崲涓氬姟绫诲瀷锛圗RP 涓氬姟绫诲瀷鏄犲皠鍒� WMS 涓氬姟绫诲瀷锛�
+ */
+ private Integer convertBizType(Integer erpBizType) {
+ // ERP 涓氬姟绫诲瀷鏄犲皠鍒� WMS 涓氬姟绫诲瀷
+ // 鍙互鏍规嵁瀹為檯涓氬姟闇�姹傛墿灞曟槧灏勫叧绯�
+ if (erpBizType == null) {
+ return WmsInventoryBizTypeEnum.OTHER.getType();
+ }
+ // 榛樿杩斿洖 OTHER 绫诲瀷锛屽悗缁彲鏍规嵁 ERP 涓氬姟绫诲瀷鏋氫妇鎵╁睍
+ return WmsInventoryBizTypeEnum.OTHER.getType();
+ }
+
}
\ No newline at end of file
--
Gitblit v1.9.3