buhuazhen
2026-06-01 36e970e300c42410c176b806697c86227b6b17e7
src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
@@ -1,9 +1,214 @@
package com.ruoyi.quality.service.impl;
import com.ruoyi.basic.service.IProductModelService;
import com.ruoyi.basic.service.IProductService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.production.service.ProductOrderService;
import com.ruoyi.quality.dto.*;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.service.QualityReportService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class QualityReportServiceImpl implements QualityReportService {
    @Autowired
    private QualityInspectMapper qualityInspectMapper;
    @Override
    public List<QualityInspectStatDto> getInspectStatistics() {
        return qualityInspectMapper.getInspectStatistics();
    }
    @Override
    public List<QualityPassRateDto> getPassRateStatistics() {
        return qualityInspectMapper.getPassRateStatistics();
    }
    @Override
    public List<QualityMonthlyPassRateWrapperDto> getMonthlyPassRateStatistics(String year) {
        if (StringUtils.isEmpty(year)) {
            return new ArrayList<>();
        }
        List<QualityMonthlyPassRateDto> flatData = qualityInspectMapper.getMonthlyPassRateStatistics(year);
        // 按月份分组,并保持顺序
        Map<String, List<QualityMonthlyPassRateDto>> groupedByMonth = flatData.stream()
                .collect(Collectors.groupingBy(QualityMonthlyPassRateDto::getMonth, LinkedHashMap::new, Collectors.toList()));
        List<QualityMonthlyPassRateWrapperDto> result = new ArrayList<>();
        groupedByMonth.forEach((month, dtos) -> {
            QualityMonthlyPassRateWrapperDto wrapper = new QualityMonthlyPassRateWrapperDto();
            wrapper.setMonth(month);
            for (QualityMonthlyPassRateDto dto : dtos) {
                QualityPassRateDto passRateDto = new QualityPassRateDto();
                BeanUtils.copyProperties(dto, passRateDto);
                if (dto.getModelType() == 0) {
                    wrapper.setRawMaterial(passRateDto);
                } else if (dto.getModelType() == 1) {
                    wrapper.setProcess(passRateDto);
                } else if (dto.getModelType() == 2) {
                    wrapper.setOutgoing(passRateDto);
                }
            }
            result.add(wrapper);
        });
        return result;
    }
    @Override
    public List<QualityPassRateDto> getYearlyPassRateStatistics(String year) {
        if (StringUtils.isEmpty(year)) {
            return new ArrayList<>();
        }
        return qualityInspectMapper.getYearlyPassRateStatistics(year);
    }
    @Override
    public List<QualityMonthlyDetailDto> getMonthlyCompletionDetails(String year) {
        if (StringUtils.isEmpty(year)) {
            return new ArrayList<>();
        }
        return qualityInspectMapper.getMonthlyCompletionDetails(year);
    }
    @Override
    public QualityTopParameterDto getTopParameters(Integer modelType) {
        if (modelType == null) {
            return new QualityTopParameterDto();
        }
        List<QualityParameterStatDto> list = qualityInspectMapper.getTopParameters(modelType);
        BigDecimal total = list.stream()
                .map(QualityParameterStatDto::getCount)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        QualityTopParameterDto result = new QualityTopParameterDto();
        result.setTotalCount(total);
        result.setList(list);
        return result;
    }
    @Override
    public List<QualityPassRateDto> getMonthlyPassRateWithComparison(String year, Integer month) {
        if (StringUtils.isEmpty(year) || month == null || month < 1 || month > 12) {
            return new ArrayList<>();
        }
        // 获取当前年月的合格率数据
        List<QualityMonthlyPassRateDto> currentMonthData = qualityInspectMapper.getMonthlyPassRateStatistics(year);
        // 计算上月
        int lastMonth = month - 1;
        String lastMonthYear = year;
        if (lastMonth == 0) {
            lastMonth = 12;
            lastMonthYear = String.valueOf(Integer.parseInt(year) - 1);
        }
        // 计算去年同月
        String lastYear = String.valueOf(Integer.parseInt(year) - 1);
        // 获取上月数据
        List<QualityMonthlyPassRateDto> lastMonthData = qualityInspectMapper.getMonthlyPassRateStatistics(lastMonthYear);
        // 获取去年同月数据
        List<QualityMonthlyPassRateDto> lastYearData = qualityInspectMapper.getMonthlyPassRateStatistics(lastYear);
        // 月份名称映射
        String[] monthNames = {"一月", "二月", "三月", "四月", "五月", "六月",
                               "七月", "八月", "九月", "十月", "十一月", "十二月"};
        String currentMonthName = monthNames[month - 1];
        String lastMonthName = monthNames[lastMonth - 1];
        // 构建结果
        List<QualityPassRateDto> result = new ArrayList<>();
        for (int modelType = 0; modelType <= 2; modelType++) {
            final int type = modelType;
            QualityPassRateDto dto = new QualityPassRateDto();
            dto.setModelType(modelType);
            // 当前月数据
            QualityMonthlyPassRateDto currentDto = currentMonthData.stream()
                    .filter(d -> d.getMonth().equals(currentMonthName) && d.getModelType() == type)
                    .findFirst()
                    .orElse(null);
            if (currentDto != null) {
                dto.setTotalCount(currentDto.getTotalCount());
                dto.setCompletedCount(currentDto.getCompletedCount());
                dto.setQualifiedCount(currentDto.getQualifiedCount());
                dto.setUnqualifiedCount(currentDto.getUnqualifiedCount());
                dto.setCompletionRate(currentDto.getCompletionRate());
                dto.setPassRate(currentDto.getPassRate());
            } else {
                dto.setTotalCount(BigDecimal.ZERO);
                dto.setCompletedCount(BigDecimal.ZERO);
                dto.setQualifiedCount(BigDecimal.ZERO);
                dto.setUnqualifiedCount(BigDecimal.ZERO);
                dto.setCompletionRate(BigDecimal.ZERO);
                dto.setPassRate(BigDecimal.ZERO);
            }
            // 上月数据
            QualityMonthlyPassRateDto lastMonthDto = lastMonthData.stream()
                    .filter(d -> d.getMonth().equals(lastMonthName) && d.getModelType() == type)
                    .findFirst()
                    .orElse(null);
            BigDecimal lastMonthPassRate = lastMonthDto != null ? lastMonthDto.getPassRate() : BigDecimal.ZERO;
            dto.setLastMonthPassRate(lastMonthPassRate);
            // 去年同月数据
            QualityMonthlyPassRateDto lastYearDto = lastYearData.stream()
                    .filter(d -> d.getMonth().equals(currentMonthName) && d.getModelType() == type)
                    .findFirst()
                    .orElse(null);
            BigDecimal lastYearPassRate = lastYearDto != null ? lastYearDto.getPassRate() : BigDecimal.ZERO;
            dto.setLastYearPassRate(lastYearPassRate);
            // 计算环比变化
            BigDecimal currentPassRate = dto.getPassRate() != null ? dto.getPassRate() : BigDecimal.ZERO;
            if (lastMonthPassRate != null && lastMonthPassRate.compareTo(BigDecimal.ZERO) > 0) {
                BigDecimal momChange = currentPassRate.subtract(lastMonthPassRate);
                dto.setMomChange(momChange);
                dto.setMomTrend(momChange.compareTo(BigDecimal.ZERO));
            } else {
                dto.setMomChange(BigDecimal.ZERO);
                dto.setMomTrend(0);
            }
            // 计算同比变化
            if (lastYearPassRate != null && lastYearPassRate.compareTo(BigDecimal.ZERO) > 0) {
                BigDecimal yoyChange = currentPassRate.subtract(lastYearPassRate);
                dto.setYoyChange(yoyChange);
                dto.setYoyTrend(yoyChange.compareTo(BigDecimal.ZERO));
            } else {
                dto.setYoyChange(BigDecimal.ZERO);
                dto.setYoyTrend(0);
            }
            result.add(dto);
        }
        return result;
    }
}