gongchunyi
11 小时以前 a9d2ef88a2ac9cdc0b07e98e9c3a8ba621cfb1d8
feat: 生产订单根据库存数量判断生产,发货与冻结解冻挂钩
已添加6个文件
已修改7个文件
316 ■■■■■ 文件已修改
doc/长治-祥雨远见.sql 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerProductFrozenController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductFrozenMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProductFrozen.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ISalesLedgerProductFrozenService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductFrozenServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductFrozenMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/³¤ÖÎ-ÏéÓêÔ¶¼û.sql
@@ -2,4 +2,15 @@
    ADD COLUMN `worker_id`          bigint       NULL COMMENT '指派工人ID',
    ADD COLUMN `worker_name`        varchar(100) NULL COMMENT '指派工人姓名',
    ADD COLUMN `handover_user_id`   bigint       NULL COMMENT '交接人员ID',
    ADD COLUMN `handover_user_name` varchar(100) NULL COMMENT '交接人员名称';
    ADD COLUMN `handover_user_name` varchar(100) NULL COMMENT '交接人员名称';
CREATE TABLE `sales_ledger_product_frozen`
(
    `id`                      bigint(20)     NOT NULL AUTO_INCREMENT COMMENT '主键id',
    `sales_ledger_product_id` bigint(20)     NOT NULL COMMENT '销售订单产品id',
    `product_model_id`        bigint(20)     NOT NULL COMMENT '产品规格id',
    `frozen_quantity`         decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '冻结数量',
    `create_time`             datetime                DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售产品冻结库存表';
src/main/java/com/ruoyi/sales/controller/SalesLedgerProductFrozenController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.sales.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * é”€å”®äº§å“å†»ç»“库存表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author deslrey
 * @since 2026-04-09
 */
@RestController
@RequestMapping("/sales-ledger-product-frozen")
public class SalesLedgerProductFrozenController {
}
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -86,8 +86,11 @@
//            }
            //出库
            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
            //  å®¡æ‰¹åŒæ„å¹¶å‘出物料,释放 locked_quantity
            salesLedgerProductService.revertFrozenStock(salesLedgerProduct.getId());
            //  æ‰£å‡åº“存总数
            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
        }
        return AjaxResult.success();
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductFrozenMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.sales.mapper;
import com.ruoyi.sales.pojo.SalesLedgerProductFrozen;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * é”€å”®äº§å“å†»ç»“库存表 Mapper æŽ¥å£
 * </p>
 *
 * @author deslrey
 * @since 2026-04-09
 */
public interface SalesLedgerProductFrozenMapper extends BaseMapper<SalesLedgerProductFrozen> {
}
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProductFrozen.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.sales.pojo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 * é”€å”®äº§å“å†»ç»“库存表
 * </p>
 *
 * @author deslrey
 * @since 2026-04-09
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sales_ledger_product_frozen")
@ApiModel(value="SalesLedgerProductFrozen对象", description="销售产品冻结库存表")
public class SalesLedgerProductFrozen implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "销售订单产品id")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "产品规格id")
    private Long productModelId;
    @ApiModelProperty(value = "冻结数量")
    private BigDecimal frozenQuantity;
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
}
src/main/java/com/ruoyi/sales/service/ISalesLedgerProductFrozenService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.sales.service;
import com.ruoyi.sales.pojo.SalesLedgerProductFrozen;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * é”€å”®äº§å“å†»ç»“库存表 æœåŠ¡ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-04-09
 */
public interface ISalesLedgerProductFrozenService extends IService<SalesLedgerProductFrozen> {
}
src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
@@ -23,6 +23,8 @@
    int deleteSalesLedgerProductByIds(Long[] ids);
    void revertFrozenStock(Long salesLedgerProductId);
    int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct);
    IPage<SalesLedgerProductDto> listPage(Page page, SalesLedgerProductDto salesLedgerProduct);
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductFrozenServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.sales.service.impl;
import com.ruoyi.sales.pojo.SalesLedgerProductFrozen;
import com.ruoyi.sales.mapper.SalesLedgerProductFrozenMapper;
import com.ruoyi.sales.service.ISalesLedgerProductFrozenService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * é”€å”®äº§å“å†»ç»“库存表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-04-09
 */
@Service
public class SalesLedgerProductFrozenServiceImpl extends ServiceImpl<SalesLedgerProductFrozenMapper, SalesLedgerProductFrozen> implements ISalesLedgerProductFrozenService {
}
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);
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -437,8 +437,8 @@
                    salesLedgerProduct.setApproveStatus(0);
                    salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
                    salesLedgerProductMapper.insert(salesLedgerProduct);
                    // æ·»åŠ ç”Ÿäº§æ•°æ®
                    salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
                    // æ·»åŠ ç”Ÿäº§æ•°æ®ï¼Œå¹¶å¤„ç†å†»ç»“åº“å­˜
                    salesLedgerProductServiceImpl.processStockAndProduction(salesLedgerProduct);
                }
            }
@@ -539,6 +539,11 @@
                .collect(Collectors.toList());
        //删除生产数据
        salesLedgerProductServiceImpl.deleteProductionData(productIds);
        // è¿˜åŽŸå†»ç»“çš„ç‰©ç†åº“å­˜
        for (Long productId : productIds) {
            salesLedgerProductServiceImpl.revertFrozenStock(productId);
        }
        // æ‰¹é‡åˆ é™¤äº§å“å­è¡¨
        if (!productIds.isEmpty()) {
@@ -737,8 +742,8 @@
                salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
                salesLedgerProductMapper.insert(salesLedgerProduct);
                // æ·»åŠ ç”Ÿäº§æ•°æ®
                salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
                // æ·»åŠ ç”Ÿäº§æ•°æ®ï¼Œå¹¶å¤„ç†å†»ç»“åº“å­˜
                salesLedgerProductServiceImpl.processStockAndProduction(salesLedgerProduct);
            }
        }
    }
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -15,14 +15,19 @@
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesLedgerProductFrozen;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ISalesLedgerProductFrozenService;
import com.ruoyi.sales.service.ShippingInfoService;
import com.ruoyi.stock.mapper.StockInventoryMapper;
import com.ruoyi.stock.pojo.StockInventory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
@@ -45,6 +50,10 @@
    private StockUtils stockUtils;
    @Autowired
    private CommonFileServiceImpl commonFileService;
    @Autowired
    private ISalesLedgerProductFrozenService salesLedgerProductFrozenService;
    @Autowired
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private ApproveProcessServiceImpl approveProcessService;
@@ -67,6 +76,26 @@
        //扣减库存
        if(!"已发货".equals(byId.getStatus())){
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
            //  åŒæ­¥æ‰£å‡æˆ–释放冻结的库存
            SalesLedgerProductFrozen frozenRecord = salesLedgerProductFrozenService.getOne(new LambdaQueryWrapper<SalesLedgerProductFrozen>()
                    .eq(SalesLedgerProductFrozen::getSalesLedgerProductId, byId.getSalesLedgerProductId())
                    .last("limit 1"));
            if (frozenRecord != null) {
                java.math.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());
            }
            //  æ‰£å‡åº“å­˜
            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
        }
        byId.setExpressNumber(req.getExpressNumber());
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -1,16 +1,18 @@
package com.ruoyi.stock.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesLedgerProductFrozen;
import com.ruoyi.sales.service.ISalesLedgerProductFrozenService;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockOutRecordDto;
@@ -46,6 +48,7 @@
    private StockInRecordService stockInRecordService;
    private StockOutRecordService stockOutRecordService;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ISalesLedgerProductFrozenService salesLedgerProductFrozenService;
    @Override
    public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
@@ -201,10 +204,28 @@
    @Override
    public Boolean thawStock(StockInventoryDto stockInventoryDto) {
        StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
            throw new RuntimeException("解冻数量不能超过冻结数量");
        }
        stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
        BigDecimal newLockedQty = stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity());
        //  ä¸èƒ½å°äºŽç³»ç»Ÿå·²ç»‘定的冻结数量
        List<SalesLedgerProductFrozen> frozenList = salesLedgerProductFrozenService.list(new LambdaQueryWrapper<SalesLedgerProductFrozen>()
                .eq(SalesLedgerProductFrozen::getProductModelId, stockInventory.getProductModelId()));
        BigDecimal systemFrozenTotal = BigDecimal.ZERO;
        if (frozenList != null) {
            for (SalesLedgerProductFrozen frozen : frozenList) {
                if (frozen.getFrozenQuantity() != null) {
                    systemFrozenTotal = systemFrozenTotal.add(frozen.getFrozenQuantity());
                }
            }
        }
        if (newLockedQty.compareTo(systemFrozenTotal) < 0) {
            throw new RuntimeException("操作失败,当前产品被销售订单硬性冻结数量为: " + systemFrozenTotal + ",剩余解冻数量不能低于此数值");
        }
        stockInventory.setLockedQuantity(newLockedQty);
        return this.updateById(stockInventory);
    }
}
src/main/resources/mapper/sales/SalesLedgerProductFrozenMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sales.mapper.SalesLedgerProductFrozenMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.sales.pojo.SalesLedgerProductFrozen">
        <id column="id" property="id" />
        <result column="sales_ledger_product_id" property="salesLedgerProductId" />
        <result column="product_model_id" property="productModelId" />
        <result column="frozen_quantity" property="frozenQuantity" />
        <result column="create_time" property="createTime" />
    </resultMap>
</mapper>