| | |
| | | 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; |
| | |
| | | /** |
| | | * MES 首页统计 Service 实现类 |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @Service |
| | | public class MesHomeStatisticsServiceImpl implements MesHomeStatisticsService { |
| | |
| | | // 5. 异常/待办 |
| | | 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; |
| | | } |
| | |
| | | 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(); |
| | | } |
| | | |
| | | } |