buhuazhen
昨天 7bde96aaac4fcbd3afe4532e53f515f82c04a121
fix(production): 优化报工投入品数量计算及库存校验逻辑

- 新增判断最后一道工序,调整投入品数量计算方式
- 修改库存比较逻辑,使用动态计算的所需数量替代固定乘积
- 修正生产投入品表中投入数量的赋值,确保准确反映需求量
- sales模块中优化按工序处理数量,针对包装工序特殊处理数量计算
- 调整部分BigDecimal运算使用RoundingMode,提高计算准确性
已修改2个文件
49 ■■■■■ 文件已修改
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -160,7 +160,25 @@
        productionProductMain.setStatus(0);
        productionProductMainMapper.insert(productionProductMain);
        /*新增报工投入表*/
        List<ProductStructureDto> allProcess = productStructureMapper.listBybomId(productProcessRoute.getBomId());
        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
        List<Long> lastProcessIds = new ArrayList<>();
        if (!allProcess.isEmpty()) {
            String lastProcessName = allProcess.get(allProcess.size() - 1).getProcessName();
            for (int i = allProcess.size() - 1; i >= 0; i--) {
                ProductStructureDto d = allProcess.get(i);
                if (lastProcessName.equals(d.getProcessName())) {
                    lastProcessIds.add(d.getId());
                } else {
                    break;
                }
            }
        }
        if (productStructureDtos.size() == 0) {
            //如果该工序没有产品结构的投入品,那这个投入品和产出品是同一个
            ProductStructureDto productStructureDto = new ProductStructureDto();
@@ -171,12 +189,20 @@
        for (ProductStructureDto productStructureDto : productStructureDtos) {
            ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
            Product product = productMapper.selectById(productModel1.getProductId());
            // 判断是否为最后一道工序
            BigDecimal needQuantity = dto.getQuantity().divide(productStructureDto.getUnitQuantity(), 2, BigDecimal.ROUND_HALF_UP);
            if (lastProcessIds.contains(productStructureDto.getId())) {
                needQuantity = dto.getQuantity().multiply(productStructureDto.getUnitQuantity());
            }
            // 查询产品库存
            BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
            if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
                throw new RuntimeException(product.getProductName()+"产品的"+productModel1.getModel() + "的规格库存为0");
            }
            if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
            if (stockQuantity.compareTo(needQuantity) < 0) {
                throw new RuntimeException(product.getProductName()+"产品的"+productModel1.getModel() + "的规格库存不足");
            }
            // 查询采购产品
@@ -186,7 +212,7 @@
            ProductionProductInput productionProductInput = new ProductionProductInput();
            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
            productionProductInput.setQuantity(needQuantity);
            productionProductInput.setProductMainId(productionProductMain.getId());
            productionProductInputMapper.insert(productionProductInput);
            //对应的库存出库
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -31,6 +31,7 @@
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -365,12 +366,26 @@
            Assert.notNull(productStructureDto.getUnitQuantity(), "单位产出所需数量不存在");
            if (productStructureDto.getMaterialType().equals("0")) {
                quantity = quantity.multiply(productStructureDto.getUnitQuantity());
                resultMap.put(productStructureDto.getProcessId(), quantity);
                // 第一道工序
                BigDecimal result = quantity;
//                if(i == 0){
//                     result = quantity.divide(productStructureDto.getUnitQuantity(), 2, RoundingMode.HALF_UP);
//                }
                resultMap.put(productStructureDto.getProcessId(),result );
            } else {
                resultMap.put(productStructureDto.getProcessId(), originalQuantity.multiply(productStructureDto.getUnitQuantity()));
                if(Optional.ofNullable(productStructureDto.getProcessName()).orElse("").contains("包装")){
                    resultMap.put(productStructureDto.getProcessId(), quantity);
                }else {
                    resultMap.put(productStructureDto.getProcessId(), originalQuantity.multiply(productStructureDto.getUnitQuantity()));
                }
            }
        }
        return resultMap;
    }