From 8546dfc55df24663d18137c83bf490c15b8d46da Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期三, 11 三月 2026 13:03:03 +0800
Subject: [PATCH] 能耗管理的统计

---
 src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java            |   13 ++
 src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java    |   10 +-
 src/main/java/com/ruoyi/energy/dto/EnergyCostDto.java                               |   43 ++++++++
 src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java          |    3 
 src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java |   36 ++++++
 src/main/java/com/ruoyi/energy/vo/EnergyStatisticsVo.java                           |   23 ++++
 src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java                         |   34 +++++-
 src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java                  |    6 +
 src/main/java/com/ruoyi/energy/controller/EnergyController.java                     |    2 
 src/main/java/com/ruoyi/energy/dto/EnergyConsumptionTypeDto.java                    |   22 ++++
 src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml                  |   84 ++++++++++++++++
 11 files changed, 255 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java b/src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java
index d7db119..10d0701 100644
--- a/src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java
+++ b/src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java
@@ -3,11 +3,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
-import com.ruoyi.energy.dto.EnergyStatisticsDto;
-import com.ruoyi.energy.pojo.Energy;
 import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
 import com.ruoyi.energy.service.EnergyConsumptionDetailService;
-import com.ruoyi.energy.service.EnergyService;
+import com.ruoyi.energy.vo.EnergyStatisticsVo;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
@@ -56,11 +54,13 @@
 
     @Log(title = "鑳借�楁妱琛ㄦ槑缁�-瀵煎叆", businessType = BusinessType.IMPORT)
     @PostMapping("/importData")
+    @ApiOperation("鑳借�楁妱琛ㄦ槑缁�-瀵煎叆")
     public R importData(MultipartFile file) throws Exception {
         return energyConsumptionDetailService.importData(file);
     }
 
     @PostMapping("/downloadTemplate")
+    @ApiOperation("鑳借�楁妱琛�-涓嬭浇妯℃澘")
     @Log(title = "鑳借�楁妱琛�-涓嬭浇妯℃澘", businessType = BusinessType.EXPORT)
     public void downloadTemplate(HttpServletResponse response) {
         ExcelUtil<EnergyConsumptionDetailDto> util = new ExcelUtil<EnergyConsumptionDetailDto>(EnergyConsumptionDetailDto.class);
@@ -78,8 +78,8 @@
 
     @GetMapping("/statistics")
     @ApiOperation("鎸夋棩鏈堝勾姹囨�荤粺璁�")
-    public R statistics(EnergyStatisticsDto energyStatisticsDto) {
-        return R.ok(energyConsumptionDetailService.statistics(energyStatisticsDto));
+    public R statistics(EnergyStatisticsVo energyStatisticsVo) {
+        return R.ok(energyConsumptionDetailService.statistics(energyStatisticsVo));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/energy/controller/EnergyController.java b/src/main/java/com/ruoyi/energy/controller/EnergyController.java
index 46bb32a..cd9f8a7 100644
--- a/src/main/java/com/ruoyi/energy/controller/EnergyController.java
+++ b/src/main/java/com/ruoyi/energy/controller/EnergyController.java
@@ -57,11 +57,13 @@
 
     @Log(title = "鑳芥簮绫诲瀷-瀵煎叆", businessType = BusinessType.IMPORT)
     @PostMapping("/importData")
+    @ApiOperation("鑳芥簮绫诲瀷-瀵煎叆")
     public R importData(MultipartFile file) throws Exception {
         return energyService.importData(file);
     }
 
     @PostMapping("/downloadTemplate")
+    @ApiOperation("鑳芥簮绫诲瀷-涓嬭浇妯℃澘")
     @Log(title = "鑳芥簮绫诲瀷-涓嬭浇妯℃澘", businessType = BusinessType.EXPORT)
     public void downloadTemplate(HttpServletResponse response) {
         ExcelUtil<Energy> util = new ExcelUtil<Energy>(Energy.class);
diff --git a/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java b/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java
index eec50f8..cd712be 100644
--- a/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java
+++ b/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java
@@ -7,6 +7,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 //鑳借�楁妱琛ㄦ槑缁�
 @Data
 @ExcelIgnoreUnannotated
@@ -26,4 +28,8 @@
 
     //鍒涘缓浜�
     private String createUserName;
+
+    //璐圭敤
+    private BigDecimal cost;
+
 }
diff --git a/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionTypeDto.java b/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionTypeDto.java
new file mode 100644
index 0000000..47b469b
--- /dev/null
+++ b/src/main/java/com/ruoyi/energy/dto/EnergyConsumptionTypeDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.energy.dto;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel("鑳借�楃被鍨嬪崰姣�")
+public class EnergyConsumptionTypeDto {
+
+    @ApiModelProperty("鑳芥簮绫诲瀷")
+    private String energyTyep;
+
+    @ApiModelProperty("鑳借�楃敤閲�")
+    private BigDecimal energyConsumption;
+
+    @ApiModelProperty("鑳借�楄垂鐢�")
+    private BigDecimal energyCost;
+}
diff --git a/src/main/java/com/ruoyi/energy/dto/EnergyCostDto.java b/src/main/java/com/ruoyi/energy/dto/EnergyCostDto.java
new file mode 100644
index 0000000..c7814fd
--- /dev/null
+++ b/src/main/java/com/ruoyi/energy/dto/EnergyCostDto.java
@@ -0,0 +1,43 @@
+package com.ruoyi.energy.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.checkerframework.checker.units.qual.A;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+//鑳借�楄垂鐢ㄦ槑缁�
+@Data
+@ApiModel("鑳借�楄垂鐢ㄦ槑缁�")
+public class EnergyCostDto {
+
+    @ApiModelProperty("鏃ユ湡")
+    private LocalDate meterReadingDate;
+
+    @ApiModelProperty("鐢ㄦ按閲�")
+    private BigDecimal waterConsumption;
+
+    @ApiModelProperty("姘磋垂")
+    private BigDecimal waterCost;
+
+    @ApiModelProperty("鐢ㄧ數閲�")
+    private BigDecimal electricityConsumption;
+
+    @ApiModelProperty("鐢佃垂")
+    private BigDecimal electricityCost;
+
+    @ApiModelProperty("鐢ㄦ皵閲�")
+    private BigDecimal gasConsumption;
+
+    @ApiModelProperty("姘旇垂")
+    private BigDecimal gasCost;
+
+    @ApiModelProperty("鍚堣鐢ㄩ噺")
+    private BigDecimal totalConsumption;
+
+    @ApiModelProperty("鍚堣璐圭敤")
+    private BigDecimal totalCost;
+
+}
diff --git a/src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java b/src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java
index 25764b8..810f4c2 100644
--- a/src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java
+++ b/src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java
@@ -1,20 +1,36 @@
 package com.ruoyi.energy.dto;
 
-
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.time.LocalDate;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
 
-//鎸夋棩鏈堝勾姹囨�荤粺璁¤兘鑰楃殑浼犲弬
 @Data
+@ApiModel("鎸夋棩鏈堝勾姹囨�荤粺璁$殑鑳借�楁暟鎹�")
 public class EnergyStatisticsDto {
 
-    //寮�濮嬫棩鏈�
-    private LocalDate startDate;
+    @ApiModelProperty("鎬昏�楃敤閲�")
+    private BigDecimal totalEnergyConsumption;
 
-    //缁撴潫鏃ユ湡
-    private LocalDate endDate;
+    @ApiModelProperty("鎬昏兘鑰楄垂鐢�")
+    private BigDecimal totalEnergyCost;
 
-    //鑳借�楀満鏅�(鍔炲叕/鐢熶骇)
-    private String type;
+    @ApiModelProperty("骞冲潎鐢ㄩ噺")
+    private BigDecimal averageConsumption;
+
+    @ApiModelProperty("鐜瘮鍙樺寲")
+    private BigDecimal changeVite;
+
+    @ApiModelProperty("鑳借�楃被鍨嬪崰姣�")
+    private List<EnergyConsumptionTypeDto> energyConsumptionTypeProportion;
+
+    @ApiModelProperty("鑳借�楁槑缁�")
+    private List<EnergyCostDto> energyCostDtos;
+
+
+
+
 }
diff --git a/src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java b/src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java
index af10b49..119451e 100644
--- a/src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java
+++ b/src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java
@@ -3,10 +3,17 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
+import com.ruoyi.energy.dto.EnergyConsumptionTypeDto;
+import com.ruoyi.energy.dto.EnergyCostDto;
 import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.energy.vo.EnergyStatisticsVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -20,4 +27,10 @@
 public interface EnergyConsumptionDetailMapper extends BaseMapper<EnergyConsumptionDetail> {
 
     IPage<EnergyConsumptionDetailDto> pageEnergyConsumptionDetail(Page<EnergyConsumptionDetailDto> page, @Param("c") EnergyConsumptionDetailDto energyConsumptionDetailDto);
+
+    Map<String, BigDecimal> calculateEnergy(@Param("c") EnergyStatisticsVo energyStatisticsVo);
+
+    List<EnergyConsumptionTypeDto> energyConsumptionTypeProportion(@Param("c") EnergyStatisticsVo energyStatisticsVo);
+
+    List<EnergyCostDto> energyCostDtos(@Param("c") EnergyStatisticsVo energyStatisticsVo);
 }
diff --git a/src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java b/src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java
index 2e77177..d770f01 100644
--- a/src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java
+++ b/src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java
@@ -6,6 +6,7 @@
 import com.ruoyi.energy.dto.EnergyStatisticsDto;
 import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.energy.vo.EnergyStatisticsVo;
 import com.ruoyi.framework.web.domain.R;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -27,6 +28,6 @@
 
     void export(HttpServletResponse response);
 
-    Object statistics(EnergyStatisticsDto energyStatisticsDto);
+    EnergyStatisticsDto statistics(EnergyStatisticsVo energyStatisticsVo);
 
 }
diff --git a/src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java b/src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java
index ec91e5a..fd0e5e2 100644
--- a/src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java
+++ b/src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java
@@ -7,6 +7,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
+import com.ruoyi.energy.dto.EnergyConsumptionTypeDto;
+import com.ruoyi.energy.dto.EnergyCostDto;
 import com.ruoyi.energy.dto.EnergyStatisticsDto;
 import com.ruoyi.energy.mapper.EnergyMapper;
 import com.ruoyi.energy.pojo.Energy;
@@ -14,6 +16,7 @@
 import com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper;
 import com.ruoyi.energy.service.EnergyConsumptionDetailService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.energy.vo.EnergyStatisticsVo;
 import com.ruoyi.framework.web.domain.R;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,7 +24,11 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -91,7 +98,32 @@
     }
 
     @Override
-    public Object statistics(EnergyStatisticsDto energyStatisticsDto) {
-        return null;
+    public EnergyStatisticsDto statistics(EnergyStatisticsVo energyStatisticsVo) {
+        EnergyStatisticsDto energyStatisticsDto = new EnergyStatisticsDto();
+        //璁$畻鎬昏�楃敤閲�+鎬昏兘鑰楄垂鐢�
+        Map<String, BigDecimal> map=energyConsumptionDetailMapper.calculateEnergy(energyStatisticsVo);
+        energyStatisticsDto.setTotalEnergyConsumption(map.get("totalEnergyConsumption"));
+        energyStatisticsDto.setTotalEnergyCost(map.get("totalEnergyCost"));
+        //骞冲潎鐢ㄩ噺
+        energyStatisticsDto.setAverageConsumption(energyStatisticsDto.getTotalEnergyConsumption().divide(new BigDecimal(energyStatisticsVo.getDays()),2, RoundingMode.HALF_UP));
+        //鐜瘮鍙樺寲=(鏈湡鍊� - 涓婃湡鍊�) / 涓婃湡鍊� * 100
+        LocalDate minDays = energyStatisticsVo.getStartDate().minusDays(energyStatisticsVo.getDays());
+        LocalDate masDays = energyStatisticsVo.getEndDate().minusDays(energyStatisticsVo.getDays());
+        EnergyStatisticsVo oldenergyStatisticsVo = new EnergyStatisticsVo();
+        BeanUtils.copyProperties(energyStatisticsVo,oldenergyStatisticsVo);
+        oldenergyStatisticsVo.setStartDate(minDays);
+        oldenergyStatisticsVo.setEndDate(masDays);
+        Map<String, BigDecimal> oldmap=energyConsumptionDetailMapper.calculateEnergy(oldenergyStatisticsVo);
+        if (ObjectUtils.isNotEmpty(oldmap)) {
+            BigDecimal changeVite = (map.get("totalEnergyConsumption").subtract(oldmap.get("totalEnergyConsumption"))).divide(oldmap.get("totalEnergyConsumption"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
+            energyStatisticsDto.setChangeVite(changeVite);
+        }
+        //鑳借�楃被鍨嬪崰姣�
+        List<EnergyConsumptionTypeDto> energyConsumptionTypeDtos=energyConsumptionDetailMapper.energyConsumptionTypeProportion(energyStatisticsVo);
+        energyStatisticsDto.setEnergyConsumptionTypeProportion(energyConsumptionTypeDtos);
+        //鑳借�楁槑缁�
+        List<EnergyCostDto> energyCostDtos=energyConsumptionDetailMapper.energyCostDtos(energyStatisticsVo);
+        energyStatisticsDto.setEnergyCostDtos(energyCostDtos);
+        return energyStatisticsDto;
     }
 }
diff --git a/src/main/java/com/ruoyi/energy/vo/EnergyStatisticsVo.java b/src/main/java/com/ruoyi/energy/vo/EnergyStatisticsVo.java
new file mode 100644
index 0000000..0adf74c
--- /dev/null
+++ b/src/main/java/com/ruoyi/energy/vo/EnergyStatisticsVo.java
@@ -0,0 +1,23 @@
+package com.ruoyi.energy.vo;
+
+
+import lombok.Data;
+
+import java.time.LocalDate;
+
+//鎸夋棩鏈堝勾姹囨�荤粺璁¤兘鑰楃殑浼犲弬
+@Data
+public class EnergyStatisticsVo {
+
+    //寮�濮嬫棩鏈�
+    private LocalDate startDate;
+
+    //缁撴潫鏃ユ湡
+    private LocalDate endDate;
+
+    //鏌ヨ闂撮殧澶╂暟
+    private Long days;
+
+    //鑳借�楀満鏅�(鍔炲叕/鐢熶骇)
+    private String type;
+}
diff --git a/src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml b/src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml
index 2fe5f17..b2cf830 100644
--- a/src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml
+++ b/src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml
@@ -26,16 +26,92 @@
                        left join energy e on ecd.energy_id = e.id
                        left join sys_user su on ecd.create_user = su.user_id) A
          <where>
-            <if test="c.energyTyep != null and c.energyTyep != ''">
+             <if test="c.type != null and c.type != ''">
+                and type =#{c.type}
+             </if>
+             <if test="c.energyTyep != null and c.energyTyep != ''">
                 and energy_tyep like concat('%',#{c.energyTyep},'%')
-            </if>
+             </if>
              <if test="c.energyName != null and c.energyName != ''">
                 and energy_name like concat('%',#{c.energyName},'%')
-            </if>
+             </if>
              <if test="c.meterReadingDate != null and c.meterReadingDate != ''">
                  and meter_reading_date =#{c.meterReadingDate}
+             </if>
+         </where>
+    </select>
+    <select id="calculateEnergy" resultType="java.util.Map">
+        select SUM(ecd.dosage) totalEnergyConsumption,
+               SUM(ecd.dosage * e.unit_price) totalEnergyCost
+            from energy_consumption_detail ecd
+            left join  energy e on ecd.energy_id = e.id
+            where ecd.meter_reading_date between #{c.startDate} and #{c.endDate}
+            <if test="c.type != null and c.type != ''">
+                and ecd.type =#{c.type}
             </if>
-        </where>
+    </select>
+    <select id="energyConsumptionTypeProportion"
+            resultType="com.ruoyi.energy.dto.EnergyConsumptionTypeDto">
+         select e.energy_tyep,
+                SUM(ecd.dosage) energyConsumption,
+               SUM(ecd.dosage * e.unit_price) energyCost
+            from energy_consumption_detail ecd
+            left join  energy e on ecd.energy_id = e.id
+            where ecd.meter_reading_date between #{c.startDate} and #{c.endDate}
+            <if test="c.type != null and c.type != ''">
+                and ecd.type =#{c.type}
+            </if>
+            group by e.energy_tyep
+    </select>
+    <select id="energyCostDtos" resultType="com.ruoyi.energy.dto.EnergyCostDto">
+    select A.meter_reading_date,
+           A.waterConsumption,
+           A.waterCost,
+           B.electricityConsumption,
+           B.electricityCost,
+           C.gasConsumption,
+           C.gasCost,
+           sum(A.waterConsumption+B.electricityConsumption+C.gasConsumption) totalConsumption,
+           sum(A.waterCost+B.electricityCost+C.gasCost) totalCost
+    from
+    (select ecd.meter_reading_date,
+               sum(ecd.dosage) waterConsumption,
+               sum(ecd.dosage * e1.unit_price) waterCost
+            from energy_consumption_detail ecd
+            left join  energy e1 on ecd.energy_id = e1.id
+            where ecd.meter_reading_date between #{c.startDate} and #{c.endDate}
+            and e1.energy_tyep='姘�'
+            <if test="c.type != null and c.type != ''">
+                and ecd.type =#{c.type}
+            </if>
+            group by ecd.meter_reading_date)A
+    join
+    (select ecd.meter_reading_date,
+               sum(ecd.dosage) electricityConsumption,
+               sum(ecd.dosage * e2.unit_price) electricityCost
+            from energy_consumption_detail ecd
+            left join  energy e2 on ecd.energy_id = e2.id
+            where ecd.meter_reading_date between #{c.startDate} and #{c.endDate}
+            and e2.energy_tyep='鐢�'
+            <if test="c.type != null and c.type != ''">
+                and ecd.type =#{c.type}
+            </if>
+            group by ecd.meter_reading_date)B
+        on A.meter_reading_date=B.meter_reading_date
+    join
+    (select ecd.meter_reading_date,
+               sum(ecd.dosage) gasConsumption,
+               sum(ecd.dosage * e3.unit_price) gasCost
+            from energy_consumption_detail ecd
+            left join  energy e3 on ecd.energy_id = e3.id
+            where ecd.meter_reading_date between #{c.startDate} and #{c.endDate}
+            and e3.energy_tyep='姘�'
+            <if test="c.type != null and c.type != ''">
+                and ecd.type =#{c.type}
+            </if>
+            group by ecd.meter_reading_date)C
+        on A.meter_reading_date=C.meter_reading_date
+        
     </select>
 
 </mapper>

--
Gitblit v1.9.3