gaoluyang
6 小时以前 f4ef6d1f4489e0d4cbba1845792945b924c16228
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java
@@ -11,6 +11,7 @@
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -90,6 +91,23 @@
        summary.setAndonActiveCount(homeStatisticsMapper.selectAndonActiveCount());
        summary.setRepairActiveCount(homeStatisticsMapper.selectRepairActiveCount());
        // 6. 质检合格率(来料 / 过程 / 出货)
        //    数量口径 = 合格数量 / 检验数量;不过滤单据状态,也不做时间范围限制(全量累计)
        Map<String, Map<String, BigDecimal>> qcSummary = new HashMap<>();
        for (Map<String, Object> row : homeStatisticsMapper.selectQcQualifiedSummary()) {
            Map<String, BigDecimal> metrics = new HashMap<>();
            metrics.put("checkQuantity", getDecimalFromObj(row.get("checkQuantity")));
            metrics.put("qualifiedQuantity", getDecimalFromObj(row.get("qualifiedQuantity")));
            qcSummary.put(String.valueOf(row.get("type")), metrics);
        }
        summary.setIqcQualifiedRate(calcQcQualifiedRate(qcSummary.get("IQC")));
        summary.setIpqcQualifiedRate(calcQcQualifiedRate(qcSummary.get("IPQC")));
        summary.setOqcQualifiedRate(calcQcQualifiedRate(qcSummary.get("OQC")));
        // 三个环节各自的检验数量合计(合格率的分母),供卡片副行展示样本量
        summary.setIqcCheckQuantity(calcCheckQuantity(qcSummary.get("IQC")));
        summary.setIpqcCheckQuantity(calcCheckQuantity(qcSummary.get("IPQC")));
        summary.setOqcCheckQuantity(calcCheckQuantity(qcSummary.get("OQC")));
        return summary;
    }
@@ -165,4 +183,35 @@
        return new BigDecimal(obj.toString());
    }
    /**
     * 计算质检合格率(百分比,保留两位小数)
     *
     * 检验数量为 0(即没有已完成的质检单)时返回 null,
     * 让页面显示「—」,而不是误导性的 0%。
     */
    private BigDecimal calcQcQualifiedRate(Map<String, BigDecimal> qcSummary) {
        if (qcSummary == null) {
            return null;
        }
        BigDecimal checkedQuantity = getDecimal(qcSummary, "checkQuantity");
        if (checkedQuantity.compareTo(BigDecimal.ZERO) <= 0) {
            return null;
        }
        return getDecimal(qcSummary, "qualifiedQuantity")
                .multiply(BigDecimal.valueOf(100))
                .divide(checkedQuantity, 2, RoundingMode.HALF_UP);
    }
    /**
     * 取该检验环节的检验数量合计(合格率的分母,即卡片副行展示的样本量)
     *
     * 该环节没有任何质检单时返回 0。
     */
    private Long calcCheckQuantity(Map<String, BigDecimal> qcSummary) {
        if (qcSummary == null) {
            return 0L;
        }
        return getDecimal(qcSummary, "checkQuantity").longValue();
    }
}