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 芋道源码 */ @Service @Validated public class ErpStockRecordServiceImpl implements ErpStockRecordService { @Resource private ErpStockRecordMapper stockRecordMapper; @Resource private ErpStockService stockService; @Resource private WmsInventoryApi wmsInventoryApi; @Resource private MdmItemSkuApi mdmItemSkuApi; @Override public ErpStockRecordDO getStockRecord(Long id) { return stockRecordMapper.selectById(id); } @Override public PageResult getStockRecordPage(ErpStockRecordPageReqVO pageReqVO) { return stockRecordMapper.selectPage(pageReqVO); } @Override @Transactional(rollbackFor = Exception.class) public void createStockRecord(ErpStockRecordCreateReqBO createReqBO) { // 1. 获取产品的默认 SKU ID(ERP 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 正负判断入库还是出库 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(currentStock != null ? currentStock : BigDecimal.ZERO); stockRecordMapper.insert(stockRecord); } /** * 获取产品的默认 SKU ID */ private Long getDefaultSkuId(Long productId) { if (productId == null) { return null; } List 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; } /** * 转换业务类型(ERP 业务类型映射到 WMS 业务类型) */ private Integer convertBizType(Integer erpBizType) { // ERP 业务类型映射到 WMS 业务类型 // 可以根据实际业务需求扩展映射关系 if (erpBizType == null) { return WmsInventoryBizTypeEnum.OTHER.getType(); } // 默认返回 OTHER 类型,后续可根据 ERP 业务类型枚举扩展 return WmsInventoryBizTypeEnum.OTHER.getType(); } }