| | |
| | | .filter(inspect -> inspect.getInspectType().equals(1)) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | factoryNum= factoryNum.add(reduce1); |
| | | processNum= processNum.add(reduce1); |
| | | BigDecimal reduce2 = monthInspects.stream() |
| | | .filter(inspect -> inspect.getInspectType().equals(2)) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | processNum = processNum.add(reduce2); |
| | | factoryNum = factoryNum.add(reduce2); |
| | | |
| | | // 构建当月统计项 |
| | | QualityStatisticsItem item = new QualityStatisticsItem(); |
| | |
| | | List<QualityInspect> qualityInspects = qualityStatisticsMapper.selectList(null); |
| | | if(!CollectionUtils.isEmpty(qualityInspects)){ |
| | | // 原材料合格率 |
| | | long rawwMaterialCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 0).count(); |
| | | long count = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 0).count(); |
| | | if(count > 0){ |
| | | qualityProductQualifiedRateDto.setRawMaterialQualifiedRate(new BigDecimal(rawwMaterialCount) |
| | | .divide(new BigDecimal( count), 4, RoundingMode.HALF_UP) |
| | | BigDecimal reduce = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 0) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | BigDecimal reduce1 = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 0) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | if(reduce1.compareTo(BigDecimal.ZERO) != 0){ |
| | | qualityProductQualifiedRateDto.setRawMaterialQualifiedRate(reduce |
| | | .divide(reduce1, 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100.0))); |
| | | } |
| | | // 过程合格率 |
| | | long processCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 1).count(); |
| | | long countOne = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 1).count(); |
| | | if(countOne > 0){ |
| | | qualityProductQualifiedRateDto.setProcessQualifiedRate(new BigDecimal(processCount) |
| | | .divide(new BigDecimal( countOne), 4, RoundingMode.HALF_UP) |
| | | BigDecimal reduce2 = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 1) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | BigDecimal reduce3 = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 1) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | if(reduce3.compareTo(BigDecimal.ZERO) != 0){ |
| | | qualityProductQualifiedRateDto.setProcessQualifiedRate(reduce2 |
| | | .divide(reduce3, 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100.0))); |
| | | } |
| | | // 出厂合格率 |
| | | long factoryCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 2).count(); |
| | | long countTwo = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 2).count(); |
| | | if(countTwo > 0){ |
| | | qualityProductQualifiedRateDto.setFactoryQualifiedRate(new BigDecimal(factoryCount) |
| | | .divide(new BigDecimal( countTwo), 4, RoundingMode.HALF_UP) |
| | | BigDecimal factoryCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 2) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | BigDecimal countTwo = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 2) |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | if(countTwo.compareTo(BigDecimal.ZERO) != 0){ |
| | | qualityProductQualifiedRateDto.setFactoryQualifiedRate(factoryCount |
| | | .divide(countTwo, 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100.0))); |
| | | } |
| | | } |
| | |
| | | |
| | | return qualityProductQualifiedRateDto; |
| | | } |
| | | |
| | | @Override |
| | | public QualityStatisticsDto inventoryStatistics() { |
| | | // 获取近四个月数据(往前推三个月,共4个完整月份) |
| | | LocalDate today = LocalDate.now(); |
| | | // 定义日期格式化器(用于显示“年月”格式) |
| | | DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); |
| | | |
| | | QualityStatisticsDto qualityStatisticsDto = new QualityStatisticsDto(); |
| | | List<QualityStatisticsItem> qualityStatisticsItems = new ArrayList<>(); |
| | | |
| | | BigDecimal supplierNum = new BigDecimal(0); //入库数量 |
| | | BigDecimal factoryNum = new BigDecimal(0); //出库数量 |
| | | // 循环4次,分别统计近4个月的数据(当前月、前1个月、前2个月、前3个月) |
| | | for (int i = 3; i >= 0; i--) { |
| | | // 计算当前循环对应的月份(i=0:当前月,i=1:前1个月,以此类推) |
| | | LocalDate currentMonth = today.minusMonths(i); |
| | | // 当月的开始日期(每月1号) |
| | | LocalDate monthStart = currentMonth.withDayOfMonth(1); |
| | | // 当月的结束日期(每月最后一天) |
| | | LocalDate monthEnd = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth()); |
| | | |
| | | // 入库数量 |
| | | // 构建当月的查询条件(如果想一次性查全4个月数据再内存筛选,可优化为先查全再循环筛选) |
| | | LambdaQueryWrapper<ProcurementRecordStorage> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.ge(ProcurementRecordStorage::getCreateTime, monthStart) |
| | | .le(ProcurementRecordStorage::getCreateTime, monthEnd); // 筛选当月数据 |
| | | List<ProcurementRecordStorage> monthInspects = procurementRecordStorageMapper.selectList(queryWrapper); |
| | | // 出库数量 |
| | | LambdaQueryWrapper<ProcurementRecordOut> queryWrapper1 = new LambdaQueryWrapper<>(); |
| | | queryWrapper1.ge(ProcurementRecordOut::getCreateTime, monthStart) |
| | | .le(ProcurementRecordOut::getCreateTime, monthEnd); |
| | | List<ProcurementRecordOut> monthInspects1 = procurementRecordOutMapper.selectList(queryWrapper1); |
| | | BigDecimal reduce = monthInspects.stream() |
| | | .map(ProcurementRecordStorage::getInboundNum) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | supplierNum = supplierNum.add(reduce); |
| | | BigDecimal reduce1 = monthInspects1.stream() |
| | | .map(ProcurementRecordOut::getInboundNum) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | factoryNum= factoryNum.add(reduce1); |
| | | |
| | | // 构建当月统计项 |
| | | QualityStatisticsItem item = new QualityStatisticsItem(); |
| | | item.setDate(monthStart.format(monthFormatter)); // 日期显示为“年月”(如 2025-10) |
| | | |
| | | // 1. 供应商检验(类型0)- 合格数量 |
| | | BigDecimal supplierQualified = monthInspects.stream() |
| | | .map(ProcurementRecordStorage::getInboundNum) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | item.setSupplierNum(supplierQualified); |
| | | |
| | | // 3. 工厂检验(类型2)- 合格数量 |
| | | BigDecimal factoryQualified = monthInspects1.stream() |
| | | .map(ProcurementRecordOut::getInboundNum) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | item.setFactoryNum(factoryQualified); |
| | | |
| | | qualityStatisticsItems.add(item); |
| | | } |
| | | // 统计近4个月总数据(所有月份汇总) |
| | | qualityStatisticsDto.setSupplierNum(supplierNum); |
| | | qualityStatisticsDto.setFactoryNum(factoryNum); |
| | | qualityStatisticsDto.setItem(qualityStatisticsItems); |
| | | |
| | | return qualityStatisticsDto; |
| | | } |
| | | } |