From 2ed500595e8e56431d9ddefb19c30a566f416e55 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 02 四月 2026 15:42:44 +0800
Subject: [PATCH] fix: 首页趋势换成周、月、年

---
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  250 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 249 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 8d7b825..996cd1c 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -36,6 +36,8 @@
 import com.ruoyi.productionPlan.enums.AddressRegionEnum;
 import com.ruoyi.productionPlan.mapper.SalesDeliveryMapper;
 import com.ruoyi.productionPlan.pojo.SalesDelivery;
+import com.ruoyi.productionPlan.pojo.ProductionPlan;
+import com.ruoyi.productionPlan.service.ProductionPlanService;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysDictData;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
@@ -58,8 +60,10 @@
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.StaffOnJob;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
-import com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper;
+import com.ruoyi.energy.mapper.EnergyMapper;
+import com.ruoyi.energy.pojo.Energy;
 import com.ruoyi.energy.dto.EnergyCostDto;
+import com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper;
 import com.ruoyi.energy.vo.EnergyStatisticsVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -158,6 +162,10 @@
 
     @Autowired
     private SalesDeliveryMapper salesDeliveryMapper;
+
+    @Autowired
+    private EnergyMapper energyMapper;
+
 
     @Override
     public HomeBusinessDto business() {
@@ -3405,6 +3413,13 @@
         }
 
         if (!CollectionUtils.isEmpty(costDtos)) {
+            // 鑾峰彇鍗曚綅
+            List<Energy> energies = energyMapper.selectList(Wrappers.<Energy>lambdaQuery()
+                    .in(Energy::getEnergyTyep, Arrays.asList("姘�", "鐢�", "姘�")));
+            String waterUnit = energies.stream().filter(e -> "姘�".equals(e.getEnergyTyep())).map(Energy::getUnit).findFirst().orElse("");
+            String electricityUnit = energies.stream().filter(e -> "鐢�".equals(e.getEnergyTyep())).map(Energy::getUnit).findFirst().orElse("");
+            String steamUnit = energies.stream().filter(e -> "姘�".equals(e.getEnergyTyep())).map(Energy::getUnit).findFirst().orElse("");
+
             for (EnergyCostDto costDto : costDtos) {
                 String dateStr = costDto.getMeterReadingDate();
                 String label = "";
@@ -3427,11 +3442,165 @@
                     dayDto.setWater(water);
                     dayDto.setElectricity(electricity);
                     dayDto.setSteam(steam);
+                    dayDto.setWaterUnit(waterUnit);
+                    dayDto.setElectricityUnit(electricityUnit);
+                    dayDto.setSteamUnit(steamUnit);
                 }
             }
         }
 
         return new ArrayList<>(resultData.values());
+    }
+
+    @Override
+    public SolidWasteCoreIndicatorsDto coreIndicators(productionStatisticsDto dto) {
+        if (dto == null) {
+            dto = new productionStatisticsDto();
+            dto.setDateType(1);
+        }
+
+        LocalDate now = LocalDate.now();
+        LocalDate startDate = null;
+        if (dto.getDateType() != null && dto.getDateType() == 1) { // 鏈湀鑷充粖
+            startDate = now.withDayOfMonth(1);
+        } else { // 鏈勾鑷充粖
+            startDate = now.withDayOfYear(1);
+        }
+
+        // 绱娑堢撼閲忎粠2022-01-01寮�濮�
+        LocalDate cumulativeStartDate = LocalDate.of(2022, 1, 1);
+        // 鏌ヨ浠�2022-01-01鑷充粖鐨勬墍鏈夋姤宸ユ暟鎹�
+        List<ProductionProductMain> mainList = productionProductMainService.list(Wrappers.<ProductionProductMain>lambdaQuery()
+                .ge(ProductionProductMain::getReportingTime, cumulativeStartDate.atStartOfDay()));
+        if (CollectionUtils.isEmpty(mainList)) return new SolidWasteCoreIndicatorsDto();
+
+        List<Long> mainIds = mainList.stream().map(ProductionProductMain::getId).collect(Collectors.toList());
+        Map<Long, ProductionProductMain> mainMap = mainList.stream().collect(Collectors.toMap(ProductionProductMain::getId, m -> m));
+
+        // 鑾峰彇鎶曞叆鏄庣粏
+        List<ProductionProductInput> allInputs = productionProductInputService.list(Wrappers.<ProductionProductInput>lambdaQuery()
+                .in(ProductionProductInput::getProductMainId, mainIds));
+        if (CollectionUtils.isEmpty(allInputs)) return new SolidWasteCoreIndicatorsDto();
+
+        // 鑾峰彇瑙勬牸鍜岀墿鏂欏悕绉�
+        Set<Long> skuIds = allInputs.stream().map(ProductionProductInput::getProductId).filter(Objects::nonNull).collect(Collectors.toSet());
+        Map<Long, String> skuToMaterialNameMap = new HashMap<>();
+        if (!skuIds.isEmpty()) {
+            List<ProductMaterialSku> skus = productMaterialSkuService.listByIds(skuIds);
+            Set<Long> productIds = skus.stream().map(ProductMaterialSku::getProductId).filter(Objects::nonNull).collect(Collectors.toSet());
+            Map<Long, String> materialNameMap = productMaterialService.listByIds(productIds).stream()
+                    .collect(Collectors.toMap(ProductMaterial::getId, ProductMaterial::getProductName));
+            skuToMaterialNameMap = skus.stream()
+                    .filter(s -> s.getProductId() != null && materialNameMap.containsKey(s.getProductId()))
+                    .collect(Collectors.toMap(ProductMaterialSku::getId, s -> materialNameMap.get(s.getProductId())));
+        }
+
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        BigDecimal cumulativeAmount = BigDecimal.ZERO;
+
+        Set<String> targetMaterials = new HashSet<>(Arrays.asList("绮夌叅鐏�", "鐭宠啅", "鐭崇伆"));
+
+        for (ProductionProductInput input : allInputs) {
+            String materialName = skuToMaterialNameMap.get(input.getProductId());
+            if (materialName == null || !targetMaterials.contains(materialName)) continue;
+
+            ProductionProductMain main = mainMap.get(input.getProductMainId());
+            if (main == null || main.getReportingTime() == null) continue;
+
+            BigDecimal qty = UnitUtils.convertValueToTon(input.getQuantity(), input.getUnit());
+            // 绱姞绱娑堢撼閲�
+            cumulativeAmount = cumulativeAmount.add(qty);
+
+            if (!main.getReportingTime().toLocalDate().isBefore(startDate)) {
+                totalAmount = totalAmount.add(qty);
+            }
+        }
+
+        SolidWasteCoreIndicatorsDto result = new SolidWasteCoreIndicatorsDto();
+        result.setTotalAmount(totalAmount.setScale(2, RoundingMode.HALF_UP));
+        result.setCumulativeAmount(cumulativeAmount.setScale(2, RoundingMode.HALF_UP));
+        return result;
+    }
+
+    @Override
+    public List<SolidWasteStatisticsDto> trends(productionStatisticsDto dto) {
+        return solidWaste(dto);
+    }
+
+    @Override
+    public List<MapDto> typeDistribution(productionStatisticsDto dto) {
+        if (dto == null) {
+            dto = new productionStatisticsDto();
+            dto.setDateType(1);
+        }
+
+        LocalDate now = LocalDate.now();
+        LocalDate startDate = null;
+        if (dto.getDateType() != null && dto.getDateType() == 1) { // 鏈湀鑷充粖
+            startDate = now.withDayOfMonth(1);
+        } else { // 鏈勾鑷充粖
+            startDate = now.withDayOfYear(1);
+        }
+
+        // 鏌ヨ鎶ュ伐涓昏〃
+        List<ProductionProductMain> mainList = productionProductMainService.list(Wrappers.<ProductionProductMain>lambdaQuery()
+                .ge(ProductionProductMain::getReportingTime, startDate.atStartOfDay()));
+        if (CollectionUtils.isEmpty(mainList)) return new ArrayList<>();
+
+        List<Long> mainIds = mainList.stream().map(ProductionProductMain::getId).collect(Collectors.toList());
+
+        // 鑾峰彇鎶曞叆鏄庣粏
+        List<ProductionProductInput> allInputs = productionProductInputService.list(Wrappers.<ProductionProductInput>lambdaQuery()
+                .in(ProductionProductInput::getProductMainId, mainIds));
+        if (CollectionUtils.isEmpty(allInputs)) return new ArrayList<>();
+
+        // 鑾峰彇瑙勬牸鍜岀墿鏂欏悕绉�
+        Set<Long> skuIds = allInputs.stream().map(ProductionProductInput::getProductId).filter(Objects::nonNull).collect(Collectors.toSet());
+        Map<Long, String> skuToMaterialNameMap = new HashMap<>();
+        if (!skuIds.isEmpty()) {
+            List<ProductMaterialSku> skus = productMaterialSkuService.listByIds(skuIds);
+            Set<Long> productIds = skus.stream().map(ProductMaterialSku::getProductId).filter(Objects::nonNull).collect(Collectors.toSet());
+            Map<Long, String> materialNameMap = productMaterialService.listByIds(productIds).stream()
+                    .collect(Collectors.toMap(ProductMaterial::getId, ProductMaterial::getProductName));
+            skuToMaterialNameMap = skus.stream()
+                    .filter(s -> s.getProductId() != null && materialNameMap.containsKey(s.getProductId()))
+                    .collect(Collectors.toMap(ProductMaterialSku::getId, s -> materialNameMap.get(s.getProductId())));
+        }
+
+        Map<String, BigDecimal> countMap = new HashMap<>();
+        countMap.put("绮夌叅鐏�", BigDecimal.ZERO);
+        countMap.put("鐭宠啅", BigDecimal.ZERO);
+        countMap.put("鐭崇伆", BigDecimal.ZERO);
+
+        BigDecimal total = BigDecimal.ZERO;
+
+        for (ProductionProductInput input : allInputs) {
+            String materialName = skuToMaterialNameMap.get(input.getProductId());
+            if (materialName == null || !countMap.containsKey(materialName)) continue;
+
+            BigDecimal qty = UnitUtils.convertValueToTon(input.getQuantity(), input.getUnit());
+            countMap.put(materialName, countMap.get(materialName).add(qty));
+            total = total.add(qty);
+        }
+
+        List<MapDto> result = new ArrayList<>();
+        for (Map.Entry<String, BigDecimal> entry : countMap.entrySet()) {
+            MapDto mapDto = new MapDto();
+            mapDto.setName(entry.getKey());
+            BigDecimal value = entry.getValue().setScale(2, RoundingMode.HALF_UP);
+            mapDto.setValue(value.toString());
+
+            if (total.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal rate = entry.getValue().divide(total, 4, RoundingMode.HALF_UP)
+                        .multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP);
+                mapDto.setRate(rate.toString());
+            } else {
+                mapDto.setRate("0.00");
+            }
+            result.add(mapDto);
+        }
+
+        return result;
     }
 
     @Override
@@ -3454,4 +3623,83 @@
         map.put("materialInspection", materialInspection);
         return map;
     }
+
+    @Autowired
+    private ProductionPlanService productionPlanService;
+
+    @Override
+    public List<PlanTrendsDto> planTrends(Integer type) {
+        LocalDate now = LocalDate.now();
+        LocalDate startDate;
+        DateTimeFormatter formatter;
+        int points;
+
+        if (type == null) type = 1;
+
+        if (type == 1) { // 鍛�
+            startDate = now.with(DayOfWeek.MONDAY);
+            points = (int) ChronoUnit.DAYS.between(startDate, now) + 1;
+            formatter = DateTimeFormatter.ofPattern("MM-dd");
+        } else if (type == 2) { // 鏈�
+            startDate = now.with(TemporalAdjusters.firstDayOfMonth());
+            points = now.getDayOfMonth();
+            formatter = DateTimeFormatter.ofPattern("MM-dd");
+        } else { // 骞�
+            startDate = now.with(TemporalAdjusters.firstDayOfYear());
+            points = now.getMonthValue();
+            formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        }
+
+        Map<String, PlanTrendsDto> resultMap = new LinkedHashMap<>();
+        for (int i = 0; i < points; i++) {
+            String label = (type == 3) 
+                ? startDate.plusMonths(i).format(formatter) 
+                : startDate.plusDays(i).format(formatter);
+            PlanTrendsDto dto = new PlanTrendsDto();
+            dto.setDateStr(label);
+            dto.setPlannedVolume(BigDecimal.ZERO);
+            dto.setLowerVolume(BigDecimal.ZERO);
+            dto.setCompletionVolume(BigDecimal.ZERO);
+            resultMap.put(label, dto);
+        }
+        //  缁熻璁″垝閲�   
+        List<ProductionPlan> plans = productionPlanService.list(Wrappers.<ProductionPlan>lambdaQuery()
+                .ge(ProductionPlan::getStartDate, Date.from(startDate.atStartOfDay(ZoneId.systemDefault()).toInstant())));
+        for (ProductionPlan plan : plans) {
+            if (plan.getStartDate() == null || plan.getVolume() == null) continue;
+            LocalDate d = plan.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            String label = d.format(formatter);
+            if (resultMap.containsKey(label)) {
+                PlanTrendsDto dto = resultMap.get(label);
+                dto.setPlannedVolume(dto.getPlannedVolume().add(plan.getVolume()));
+            }
+        }
+        //  缁熻涓嬪彂閲�
+        List<ProductOrder> orders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery()
+                .ge(ProductOrder::getStartTime, startDate.atStartOfDay()));
+        for (ProductOrder order : orders) {
+            if (order.getStartTime() == null || order.getQuantity() == null) continue;
+            LocalDate d = order.getStartTime().toLocalDate();
+            String label = d.format(formatter);
+            if (resultMap.containsKey(label)) {
+                PlanTrendsDto dto = resultMap.get(label);
+                dto.setLowerVolume(dto.getLowerVolume().add(order.getQuantity()));
+            }
+        }
+        //  缁熻瀹屾垚閲�
+        List<ProductionProductOutput> outputs = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery()
+                .ge(ProductionProductOutput::getCreateTime, startDate.atStartOfDay()));
+        for (ProductionProductOutput output : outputs) {
+            if (output.getCreateTime() == null || output.getQuantity() == null) continue;
+            LocalDate d = output.getCreateTime().toLocalDate();
+            String label = d.format(formatter);
+            if (resultMap.containsKey(label)) {
+                PlanTrendsDto dto = resultMap.get(label);
+                dto.setCompletionVolume(dto.getCompletionVolume().add(output.getQuantity()));
+            }
+        }
+
+        return new ArrayList<>(resultMap.values());
+    }
+
 }

--
Gitblit v1.9.3