src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -19,6 +19,7 @@
import com.ruoyi.common.enums.ApproveTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.consumables.mapper.ConsumablesInventoryMapper;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.dto.MapDto;
@@ -38,8 +39,10 @@
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.mapper.RawMaterialMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.pojo.RawMaterial;
import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -85,6 +88,9 @@
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private ConsumablesInventoryMapper consumablesInventoryMapper;
    @Autowired
    private QualityInspectMapper qualityStatisticsMapper;
    @Autowired
@@ -128,6 +134,9 @@
    @Autowired
    private QualityInspectMapper qualityInspectMapper;
    @Autowired
    private RawMaterialMapper rawMaterialMapper;
    @Autowired
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
@@ -202,11 +211,15 @@
        }
        // 统计库存
        BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal();
        BigDecimal consumablesQuantityTotal = consumablesInventoryMapper.selectTotal();
        homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
        homeBusinessDto.setConsumablesQuantityTotal(consumablesQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
        // 获取当天入库数量
        BigDecimal bigDecimal = stockInventoryMapper.selectTotalByDate(LocalDate.now());
        BigDecimal consumablesTodayNum = consumablesInventoryMapper.selectTotalByDate(LocalDate.now());
        homeBusinessDto.setTodayInventoryNum(bigDecimal.setScale(2, RoundingMode.HALF_UP).toString());
        homeBusinessDto.setConsumablesTodayNum(consumablesTodayNum.setScale(2, RoundingMode.HALF_UP).toString());
        return homeBusinessDto;
    }
@@ -2389,87 +2402,88 @@
                endDate = today.with(DayOfWeek.SUNDAY);
        }
        List<QualityInspect> qualityInspectList = qualityInspectMapper
                .selectList(new LambdaQueryWrapper<QualityInspect>()
                        .ge(QualityInspect::getCheckTime, startDate.toString())
                        .le(QualityInspect::getCheckTime, endDate.toString())
                        .eq(QualityInspect::getInspectState, 1));
        List<RawMaterial> rawMaterialList = rawMaterialMapper
                .selectList(new LambdaQueryWrapper<RawMaterial>()
                        .ge(RawMaterial::getCheckTime, startDate.toString())
                        .le(RawMaterial::getCheckTime, endDate.toString())
                        .eq(RawMaterial::getInspectState, 1));
        QualityStatisticsDto dto = new QualityStatisticsDto();
        dto.setSupplierNum(sumQuantity(qualityInspectList, 0)); // 原材料
        dto.setProcessNum(sumQuantity(qualityInspectList, 1)); // 过程
        dto.setFactoryNum(sumQuantity(qualityInspectList, 2)); // 出厂
        Map<Integer, BigDecimal> countMap = rawMaterialList.stream()
                .collect(Collectors.groupingBy(
                        RawMaterial::getCheckType,
                        Collectors.collectingAndThen(
                                Collectors.counting(),
                                count -> BigDecimal.valueOf(count)
                        )
                ));
        Map<String, List<QualityInspect>> groupedByCheckResult = qualityInspectList.stream()
                .collect(Collectors.groupingBy(QualityInspect::getCheckResult));
        dto.setSupplierNum(countMap.getOrDefault(0, BigDecimal.ZERO)); // 入厂
        dto.setProcessNum(countMap.getOrDefault(1, BigDecimal.ZERO));  // 车间
        dto.setFactoryNum(countMap.getOrDefault(2, BigDecimal.ZERO));  // 出厂
        List<QualityInspect> qualityInspects = groupedByCheckResult.getOrDefault("不合格", new ArrayList<>());
        // 3. 筛选不合格的记录(check_result = 0)
        List<RawMaterial> unqualifiedList = rawMaterialList.stream()
                .filter(i -> i.getCheckResult() == 0)  // 0表示不合格
                .collect(Collectors.toList());
        // 4. 处理图表项 (Item)
        List<QualityStatisticsItem> itemList = new ArrayList<>();
        Map<QualityInspect, LocalDate> dateMap = qualityInspects.isEmpty() ?
                new HashMap<>() :
                qualityInspectList.stream()
                        .collect(Collectors.toMap(
                                i -> i,
                                i -> i.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
                                (existing, replacement) -> existing));
        List<RawMaterial> itemList = new ArrayList<>();
        if (type == 3) {
            // 季度模式:按月分组
            Map<String, List<QualityInspect>> groupByMonth = qualityInspects.isEmpty() ?
            Map<String, List<RawMaterial>> groupByMonth = unqualifiedList.isEmpty() ?
                    new HashMap<>() :
                    qualityInspects.stream()
                    unqualifiedList.stream()
                            .collect(Collectors.groupingBy(i -> {
                                LocalDate ld = dateMap.get(i);
                                LocalDate ld = i.getCheckTime().toInstant()
                                        .atZone(ZoneId.systemDefault()).toLocalDate();
                                return ld.format(DateTimeFormatter.ofPattern("yyyy-MM"));
                            }));
            for (int i = 0; i < 3; i++) {
                LocalDate monthDate = startDate.plusMonths(i);
                String monthStr = monthDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
                itemList.add(buildItem(monthStr, groupByMonth.getOrDefault(monthStr, new ArrayList<>())));
                List<RawMaterial> monthData = groupByMonth.getOrDefault(monthStr, new ArrayList<>());
                itemList.add(buildItem(monthStr, monthData));
            }
        } else {
            // 周或月模式:按天分组
            Map<String, List<QualityInspect>> groupByDay = qualityInspects.isEmpty() ?
            Map<String, List<RawMaterial>> groupByDay = unqualifiedList.isEmpty() ?
                    new HashMap<>() :
                    qualityInspects.stream()
                    unqualifiedList.stream()
                            .collect(Collectors.groupingBy(i -> {
                                LocalDate ld = dateMap.get(i);
                                LocalDate ld = i.getCheckTime().toInstant()
                                        .atZone(ZoneId.systemDefault()).toLocalDate();
                                return ld.format(DateTimeFormatter.ofPattern("MM/dd"));
                            }));
            long days = ChronoUnit.DAYS.between(startDate, endDate);
            for (int i = 0; i <= days; i++) {
                LocalDate tempDay = startDate.plusDays(i);
                String dayStr = tempDay.format(DateTimeFormatter.ofPattern("MM/dd"));
                itemList.add(buildItem(dayStr, groupByDay.getOrDefault(dayStr, new ArrayList<>())));
                List<RawMaterial> dayData = groupByDay.getOrDefault(dayStr, new ArrayList<>());
                itemList.add(buildItem(dayStr, dayData));
            }
        }
        dto.setItem(itemList);
        dto.setRawItem(itemList);
        return dto;
    }
    private BigDecimal sumQuantity(List<QualityInspect> list, Integer type) {
        return list.stream()
                .filter(i -> i.getInspectType().equals(type))
                .map(QualityInspect::getQuantity)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    private QualityStatisticsItem buildItem(String dateLabel, List<QualityInspect> list) {
        QualityStatisticsItem item = new QualityStatisticsItem();
    private RawMaterial buildItem(String dateLabel, List<RawMaterial> list) {
        RawMaterial item = new RawMaterial();
        item.setDate(dateLabel);
        item.setSupplierNum(list.stream().filter(i -> i.getInspectType() == 0).map(QualityInspect::getQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add));
        item.setProcessNum(list.stream().filter(i -> i.getInspectType() == 1).map(QualityInspect::getQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add));
        item.setFactoryNum(list.stream().filter(i -> i.getInspectType() == 2).map(QualityInspect::getQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add));
        item.setSupplierNum(
                BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 0).count())
        );
        item.setProcessNum(
                BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 1).count())
        );
        item.setFactoryNum(
                BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 2).count())
        );
        return item;
    }