2 天以前 f4d4d29368ccacb807f93e2033cd4a643a3ddade
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -90,6 +90,25 @@
        return productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto);
    }
    public BigDecimal getRatio(List<ProductWorkOrder> productWorkOrderList,BigDecimal quantity){
        // 获取完成数量
        BigDecimal completeQuantity = productWorkOrderList
                .stream()
                .map(ProductWorkOrder::getCompleteQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 获取所有数量
        BigDecimal totalQuantity = productWorkOrderList
                .stream()
                .map(ProductWorkOrder::getPlanQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        completeQuantity = completeQuantity.add(quantity); // 加上报工数量
        if (completeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
            return BigDecimal.ZERO;
        }
        // 计算比例
        return completeQuantity.divide(totalQuantity, 2, RoundingMode.HALF_UP);
    }
    @Override
    public Boolean addProductMain(ProductionProductMainDto dto) {
        SysUser user = userMapper.selectUserById(dto.getUserId());
@@ -102,27 +121,11 @@
        // 获取订单的工单
        List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
                .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
        // 获取完成数量
        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) {
            throw new ServiceException("该工单已全部完成");
        }
        // 计算比例
        BigDecimal ratio = unCompleteQuantity.divide(totalQuantity, 2, RoundingMode.HALF_UP);
        if(CollectionUtils.isEmpty(productWorkOrderList)){
            productWorkOrderList = new ArrayList<>();
        }
        BigDecimal ratio = getRatio(productWorkOrderList,dto.getQuantity().subtract(dto.getScrapQty() == null ? BigDecimal.ZERO : dto.getScrapQty()));
        //当前具体工序
        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
        //工艺路线中当前工序对应的产出规格型号
@@ -255,16 +258,17 @@
            }
            // 通过比例计算完成数量
            productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
            if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                //如果是最后一道工序报工之后生产订单完成数量+
            //如果是最后一道工序报工之后生产订单完成数量+
            if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                productOrder.setCompleteQuantity(productOrder.getQuantity());
                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                    productOrder.setEndTime(LocalDateTime.now());//结束时间
                    productOrder.setStatus("已完成");
                    // 生产完成入库
                    stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
                }
                productOrder.setEndTime(LocalDateTime.now());//结束时间
                productOrder.setStatus("已完成");
                // 生产完成入库
                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
            }
//            if (productWorkOrderList.stream().filter(item -> item.getStatus() == 3).count() == productProcessRouteItems.size() - 1) {
//
//            }
            productOrderMapper.updateById(productOrder);
            /*添加生产核算*/
            SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
@@ -317,26 +321,32 @@
        }
        //判断是否是最后一道工序
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
        if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
            if (productOrder != null) {
                BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
                BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
                BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO;
//        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
//        if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
//
//        }
        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
        if (productOrder != null) {
            BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
            BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
            BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO;
                BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
            BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
                BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
                productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty);
                productOrder.setEndTime(null);
                productOrder.setStatus("生产中");
                productOrderMapper.updateById(productOrder);
            } else {
                throw new ServiceException("关联的生产订单不存在");
            BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
            List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
                    .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
            if(CollectionUtils.isEmpty(productWorkOrderList)){
                productWorkOrderList = new ArrayList<>();
            }
            BigDecimal ratio = getRatio(productWorkOrderList,BigDecimal.ZERO);
            productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
            productOrder.setEndTime(null);
            productOrder.setStatus("生产中");
            productOrderMapper.updateById(productOrder);
        } else {
            throw new ServiceException("关联的生产订单不存在");
        }
        //删除质检
        qualityInspectMapper.selectList(