huminmin
20 小时以前 18480213c000dfd7f6f236903f965a4d3f254597
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -26,9 +26,14 @@
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.mapper.ShippingProductDetailMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.pojo.ShippingProductDetail;
import com.ruoyi.sales.service.ShippingInfoService;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockUninventoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -62,6 +67,8 @@
    private final ShippingProductDetailMapper shippingProductDetailMapper;
    private final ApprovalTemplateMapper approvalTemplateMapper;
    private final ApprovalInstanceService approvalInstanceService;
    private final StockInventoryService stockInventoryService;
    private final StockUninventoryService stockUninventoryService;
    @Override
    public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) {
@@ -85,7 +92,7 @@
                throw new RuntimeException("发货信息不存在");
            }
            for (ShippingProductDetail shippingProductDetail : shippingProductDetails) {
                stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo());
                addShippingStockOutRecord(shippingProductDetail, req.getId());
            }
        }
        byId.setExpressNumber(req.getExpressNumber());
@@ -142,12 +149,13 @@
    @Override
    public boolean add(ShippingInfoDto req) {
        String ledgerStockType = resolveLedgerStockType(req.getSalesLedgerProductId());
        this.save(req);
        req.getBatchNoDetailList().forEach(item -> item.setShippingInfoId(req.getId()));
        req.getBatchNoDetailList().forEach(item -> {
            item.setShippingInfoId(req.getId());
            item.setStockType(ledgerStockType);
        });
        shippingProductDetailMapper.insert(req.getBatchNoDetailList());
        for (ShippingProductDetail shippingProductDetail : req.getBatchNoDetailList()) {
            stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo());
        }
        // 保存文件
        fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs());
        return true;
@@ -192,4 +200,71 @@
        approvalInstanceService.add(approvalInstance);
        return true;
    }
    private void addShippingStockOutRecord(ShippingProductDetail shippingProductDetail, Long shippingInfoId) {
        ShippingInfo shippingInfo = this.getById(shippingInfoId);
        String stockType = resolveLedgerStockType(shippingInfo != null ? shippingInfo.getSalesLedgerProductId() : null);
        if (stockType == null) {
            stockType = normalizeStockType(shippingProductDetail.getStockType());
        }
        String detailStockType = normalizeStockType(shippingProductDetail.getStockType());
        if (detailStockType != null && stockType != null && !stockType.equals(detailStockType)) {
            throw new RuntimeException("发货明细库存类型与销售台账产品库存类型不一致");
        }
        if ("waste".equals(stockType)) {
            StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
            stockUninventoryDto.setRecordId(shippingInfoId);
            stockUninventoryDto.setRecordType(StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
            stockUninventoryDto.setQualitity(shippingProductDetail.getQuantity());
            stockUninventoryDto.setProductModelId(shippingProductDetail.getProductModelId());
            stockUninventoryDto.setBatchNo(normalizeBatchNo(shippingProductDetail.getBatchNo()));
            stockUninventoryDto.setType("waste");
            stockUninventoryService.addStockOutRecordOnly(stockUninventoryDto);
            return;
        }
        if (!"qualified".equals(stockType)) {
            throw new RuntimeException("发货明细库存类型无效,只支持 qualified 或 waste");
        }
        StockInventoryDto stockInventoryDto = new StockInventoryDto();
        stockInventoryDto.setRecordId(shippingInfoId);
        stockInventoryDto.setRecordType(StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
        stockInventoryDto.setQualitity(shippingProductDetail.getQuantity());
        stockInventoryDto.setProductModelId(shippingProductDetail.getProductModelId());
        stockInventoryDto.setBatchNo(normalizeBatchNo(shippingProductDetail.getBatchNo()));
        stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
    }
    private String normalizeBatchNo(String batchNo) {
        if (batchNo == null) {
            return null;
        }
        String normalized = batchNo.trim();
        return normalized.isEmpty() ? null : normalized;
    }
    private String normalizeStockType(String stockType) {
        if (stockType == null) {
            return null;
        }
        String normalized = stockType.trim().toLowerCase();
        if (normalized.isEmpty()) {
            return null;
        }
        if ("unqualified".equals(normalized)) {
            return "waste";
        }
        return normalized;
    }
    private String resolveLedgerStockType(Long salesLedgerProductId) {
        if (salesLedgerProductId == null) {
            return null;
        }
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(salesLedgerProductId);
        if (salesLedgerProduct == null) {
            throw new RuntimeException("销售台账产品不存在");
        }
        String stockType = normalizeStockType(salesLedgerProduct.getStockType());
        return stockType == null ? "qualified" : stockType;
    }
}