huminmin
14 小时以前 a34f7d669aa91045dc661bceae9a78793b989410
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -14,6 +14,10 @@
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductWorkOrderService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityUnqualified;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -39,9 +43,13 @@
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Autowired
    private ProductionProductMainMapper productionProductMainMapper;
    @Autowired
    private ProductionProductOutputMapper productionProductOutputMapper;
    @Autowired
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
    @Value("${file.temp-dir}")
    private String tempDir;
@@ -50,28 +58,63 @@
    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        IPage<ProductWorkOrderDto> productWorkOrderDtoIPage = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
        productWorkOrderDtoIPage.getRecords().forEach(record -> {
            //检查上一个工序是否已报工
            // 是否能报工: 1. 第一个工序能报工 2. 上一个工序已报工 3. 之前的工序未被隔离
            Integer currentDragSort = record.getDragSort();
            if (currentDragSort == null || currentDragSort == 1) {
                record.setIsCanReport(true);
            } else {
                //查找上一个工序
                ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
                        Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
                // 上一个工序是否已报工
                boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
                        record.getProductRouteId(),
                        currentDragSort
                );
                record.setIsCanReport(isPreviousReported);
                if (previousItem != null) {
                    //检查上一个工序是否有报工记录
                    Long count = productionProductMainMapper.selectCount(
                            Wrappers.<ProductionProductMain>lambdaQuery()
                                    .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                // 之前的工序是否被隔离
                if (record.getIsCanReport()) {
                    // 查询所有之前的工序(排序号小于当前工序)
                    List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
                            Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                    .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                    .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
                    );
                    record.setIsCanReport(count > 0);
                } else {
                    record.setIsCanReport(true);
                    if (CollectionUtils.isNotEmpty(previousItems)) {
                        // 提取之前工序的名称列表
                        List<String> previousProcessNames = new ArrayList<>();
                        for (ProductProcessRouteItem item : previousItems) {
                            ProductProcess process = productProcessMapper.selectById(item.getProcessId());
                            if (process != null) {
                                previousProcessNames.add(process.getName());
                            }
                        }
                        // 检查之前的工序是否有被隔离的不合格记录
                        List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
                        if (CollectionUtils.isNotEmpty(unqualifiedList)) {
                            record.setIsCanReport(false);
                        }
                    }
                }
            }
            // 查询当前实际的合格率
            // 查询关联产出表数据
            List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery().eq(ProductionProductMain::getWorkOrderId, record.getId()));
            BigDecimal totalScrapQty = BigDecimal.ZERO;
            if (CollectionUtils.isNotEmpty(productionProductMains)) {
                // 计算报废数量
                List<Long> mainIds = productionProductMains.stream().map(ProductionProductMain::getId).collect(Collectors.toList());
                List<ProductionProductOutput> productionProductOutputs = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().in(ProductionProductOutput::getProductMainId, mainIds));
                totalScrapQty = productionProductOutputs.stream().map(ProductionProductOutput::getScrapQty).reduce(BigDecimal.ZERO, BigDecimal::add);
            }
            if (record.getCompleteQuantity().compareTo(BigDecimal.ZERO) > 0) {
                record.setActualQualifiedRate((record.getCompleteQuantity().subtract(totalScrapQty))
                        .divide(record.getCompleteQuantity(), 2, RoundingMode.HALF_UP)
                        .multiply(new BigDecimal("100"))
                );
            } else {
                record.setActualQualifiedRate((record.getCompleteQuantity().subtract(totalScrapQty)).multiply(BigDecimal.valueOf(100)));
            }
        });
        return productWorkOrderDtoIPage;
@@ -154,13 +197,14 @@
                    scrapQty = productionProductOutputs.stream().map(ProductionProductOutput::getScrapQty).reduce(BigDecimal.ZERO, BigDecimal::add);
                }
                if (productWorkOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) > 0) {
                    productWorkOrderDto.setScrapRate(scrapQty.divide(productWorkOrderDto.getCompleteQuantity(), 2, RoundingMode.HALF_UP));
                    productWorkOrderDto.setScrapRate(scrapQty.divide(productWorkOrderDto.getCompleteQuantity(), 4, RoundingMode.HALF_UP));
                } else {
                    productWorkOrderDto.setScrapRate(scrapQty.multiply(BigDecimal.valueOf(100)));
                }
                productWorkOrderDto.setScrapQty(scrapQty);
                productWorkOrderDto.setCompleteQty(productWorkOrderDto.getCompleteQuantity().subtract(scrapQty));
            });
        }
        return productWorkOrderDtos;
    }
}
}