gongchunyi
6 小时以前 a9d2ef88a2ac9cdc0b07e98e9c3a8ba621cfb1d8
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -26,8 +26,10 @@
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesLedgerProductFrozen;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ISalesLedgerProductFrozenService;
import com.ruoyi.stock.mapper.StockInventoryMapper;
import com.ruoyi.stock.pojo.StockInventory;
import lombok.AllArgsConstructor;
@@ -92,6 +94,8 @@
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private ProductOrderServiceImpl productOrderServiceImpl;
    @Autowired
    private ISalesLedgerProductFrozenService salesLedgerProductFrozenService;
    @Override
    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -183,6 +187,10 @@
        //删除对应的生产订单
        deleteProductionData(Arrays.asList(ids));
        for (Long id : ids) {
            revertFrozenStock(id);
        }
        // 3. 对每个主表ID进行金额更新
        for (Long salesLedgerId : mainIds) {
            LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>();
@@ -222,9 +230,11 @@
        if (salesLedgerProduct.getId() == null) {
            salesLedgerProduct.setRegisterDate(LocalDateTime.now());
            result = salesLedgerProductMapper.insert(salesLedgerProduct);
            addProductionData(salesLedgerProduct);
            processStockAndProduction(salesLedgerProduct);
        } else {
            checkProductionDataExist(Collections.singletonList(salesLedgerProduct.getId()));
            revertFrozenStock(salesLedgerProduct.getId());
            //查询原本的产品型号id
            salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
@@ -233,7 +243,7 @@
            deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
            // 删除生产核算数据
            addProductionData(salesLedgerProduct);
            processStockAndProduction(salesLedgerProduct);
        }
        // 如果插入或更新成功,并且有 salesLedgerId,才继续更新主表金额
@@ -266,17 +276,87 @@
        return result;
    }
    public void processStockAndProduction(SalesLedgerProduct salesLedgerProduct) {
        BigDecimal salesQty = salesLedgerProduct.getQuantity();
        if (salesQty == null) salesQty = BigDecimal.ZERO;
        BigDecimal frozenQty = BigDecimal.ZERO;
        BigDecimal productionQty = salesQty;
        //  查询可用库存
        StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>()
                .eq(StockInventory::getProductModelId, salesLedgerProduct.getProductModelId())
                .last("for update"));
        if (stockInventory != null) {
            BigDecimal quality = stockInventory.getQualitity() != null ? stockInventory.getQualitity() : BigDecimal.ZERO;
            BigDecimal lockedQty = stockInventory.getLockedQuantity() != null ? stockInventory.getLockedQuantity() : BigDecimal.ZERO;
            BigDecimal availableStock = quality.subtract(lockedQty);
            if (availableStock.compareTo(BigDecimal.ZERO) > 0) {
                // 有可用库存
                if (availableStock.compareTo(salesQty) >= 0) {
                    frozenQty = salesQty;
                    productionQty = BigDecimal.ZERO;
                } else {
                    frozenQty = availableStock;
                    productionQty = salesQty.subtract(frozenQty);
                }
            }
        }
        // 冻结库存
        if (frozenQty.compareTo(BigDecimal.ZERO) > 0) {
            SalesLedgerProductFrozen frozenRecord = new SalesLedgerProductFrozen();
            frozenRecord.setSalesLedgerProductId(salesLedgerProduct.getId());
            frozenRecord.setProductModelId(salesLedgerProduct.getProductModelId());
            frozenRecord.setFrozenQuantity(frozenQty);
            frozenRecord.setCreateTime(LocalDateTime.now());
            salesLedgerProductFrozenService.save(frozenRecord);
            if (stockInventory != null) {
                BigDecimal currentLocked = stockInventory.getLockedQuantity() != null ? stockInventory.getLockedQuantity() : BigDecimal.ZERO;
                stockInventory.setLockedQuantity(currentLocked.add(frozenQty));
                stockInventoryMapper.updateById(stockInventory);
            }
        }
        // 如果需要生产,则生成生产数据
        if (productionQty.compareTo(BigDecimal.ZERO) > 0) {
            addProductionData(salesLedgerProduct, productionQty);
        }
    }
    public void revertFrozenStock(Long salesLedgerProductId) {
        SalesLedgerProductFrozen frozenRecord = salesLedgerProductFrozenService.getOne(new LambdaQueryWrapper<SalesLedgerProductFrozen>()
                        .eq(SalesLedgerProductFrozen::getSalesLedgerProductId, salesLedgerProductId)
                        .last("limit 1"));
        if (frozenRecord != null) {
            BigDecimal frozenQty = frozenRecord.getFrozenQuantity();
            if (frozenQty != null && frozenQty.compareTo(BigDecimal.ZERO) > 0) {
                StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>()
                        .eq(StockInventory::getProductModelId, frozenRecord.getProductModelId())
                        .last("for update"));
                if (stockInventory != null) {
                    BigDecimal currentLocked = stockInventory.getLockedQuantity() != null ? stockInventory.getLockedQuantity() : BigDecimal.ZERO;
                    stockInventory.setLockedQuantity(currentLocked.subtract(frozenQty));
                    stockInventoryMapper.updateById(stockInventory);
                }
            }
            salesLedgerProductFrozenService.removeById(frozenRecord.getId());
        }
    }
    /**
     * 新增生产数据
     */
    public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
    public void addProductionData(SalesLedgerProduct salesLedgerProduct, BigDecimal productionQty) {
        ProductOrder productOrder = new ProductOrder();
        productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
        productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
        productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
        String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
        productOrder.setNpsNo(string);
        productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量
        productOrder.setQuantity(productionQty);//需求数量
        productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量
        productOrderMapper.insert(productOrder);
@@ -324,7 +404,7 @@
                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                    productWorkOrder.setProductOrderId(productOrder.getId());
                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                    productWorkOrder.setPlanQuantity(productionQty);
                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
                    productWorkOrder.setStatus(1);