5 天以前 7a7a4b207d96a88bb1b324513ad475071289260e
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -34,6 +34,7 @@
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -89,6 +90,27 @@
        return productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto);
    }
    public BigDecimal getRatio(List<ProductWorkOrder> productWorkOrderList){
        // 获取完成数量
        BigDecimal completeQuantity = productWorkOrderList
                .stream()
                .filter(item -> item.getStatus() == 3)
                .map(ProductWorkOrder::getCompleteQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 获取所有数量
        BigDecimal totalQuantity = productWorkOrderList
                .stream()
                .map(ProductWorkOrder::getPlanQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 获取未完成数量
        BigDecimal unCompleteQuantity = totalQuantity.subtract(completeQuantity);
        if (unCompleteQuantity.compareTo(BigDecimal.ZERO) <= 0) {
            return BigDecimal.ZERO;
        }
        // 计算比例
        return unCompleteQuantity.divide(totalQuantity, 2, RoundingMode.HALF_UP);
    }
    @Override
    public Boolean addProductMain(ProductionProductMainDto dto) {
        SysUser user = userMapper.selectUserById(dto.getUserId());
@@ -98,13 +120,14 @@
        if (productProcessRouteItem == null) {
            throw new RuntimeException("工艺路线项不存在");
        }
        // 获取订单的已完成工单
        // 获取订单的工单
        List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
                .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId())
                .eq(ProductWorkOrder::getStatus, 3));
                .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
        if(CollectionUtils.isEmpty(productWorkOrderList)){
            productWorkOrderList = new ArrayList<>();
        }
        BigDecimal ratio = getRatio(productWorkOrderList);
        //当前具体工序
        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
        //工艺路线中当前工序对应的产出规格型号
@@ -215,7 +238,7 @@
                }
            }else {
                //直接入库
                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
//                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
            }
            /*更新工单和生产订单*/
            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -235,12 +258,16 @@
                productOrder.setStartTime(LocalDateTime.now());//开始时间
                productOrder.setStatus("生产中");
            }
            // 通过比例计算完成数量
            productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
            if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                //如果是最后一道工序报工之后生产订单完成数量+
                productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                    productOrder.setCompleteQuantity(productOrder.getQuantity());
                    productOrder.setEndTime(LocalDateTime.now());//结束时间
                    productOrder.setStatus("已完成");
                    // 生产完成入库
                    stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
                }
            }
            productOrderMapper.updateById(productOrder);
@@ -258,11 +285,11 @@
            salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
        }
        //如果报废数量>0,需要进入报废的库存
        if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
            }
        }
//        if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
//            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
//                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
//            }
//        }
        return true;
    }
@@ -286,7 +313,7 @@
            BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity();
            BigDecimal validQuantity = outputQty.subtract(scrapQty);
            productWorkOrder.setStatus(2);
            productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity));
            productWorkOrder.setActualEndTime(null);
            productWorkOrderMapper.updateById(productWorkOrder);
@@ -306,11 +333,16 @@
                BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
                BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
                productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty);
                List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
                        .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
                if(CollectionUtils.isEmpty(productWorkOrderList)){
                    productWorkOrderList = new ArrayList<>();
                }
                BigDecimal ratio = getRatio(productWorkOrderList);
                productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
                productOrder.setEndTime(null);
                productOrder.setStatus("生产中");
                productOrderMapper.updateById(productOrder);
            } else {
                throw new ServiceException("关联的生产订单不存在");