Browse Source

版本更新

lihui001 3 years ago
parent
commit
4125fea92e
40 changed files with 1374 additions and 25 deletions
  1. 3 2
      zoniot-common/zoniot-core-mysql/src/main/java/com/zcxk/core/mysql/pageing/Pagination.java
  2. 24 1
      zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/BigDecimalUtils.java
  3. 3 3
      zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/ZoniotIntegerUtils.java
  4. 9 0
      zoniot-rmcp/zoniot-rmcp-api/pom.xml
  5. 29 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/dto/readRate/ReadRateDto.java
  6. 6 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/CommandStatusEnum.java
  7. 6 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/CommandTypeEnum.java
  8. 6 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/OperationTypeEnum.java
  9. 61 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ReadRateEnum.java
  10. 6 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ReadStatusEnum.java
  11. 6 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ReplaceMethodEnum.java
  12. 4 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/RmcpErrorEnum.java
  13. 3 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/TaskEnum.java
  14. 3 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ValveStatusEnum.java
  15. 50 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ReadRatePageVo.java
  16. 54 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ReadRateVo.java
  17. 29 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/StatisticsReadRateVo.java
  18. 47 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRate7DayMapper.java
  19. 47 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateMonthMapper.java
  20. 47 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateTodayMapper.java
  21. 47 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateYesterdayMapper.java
  22. 1 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/BaseMongoDao.java
  23. 3 6
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/MeterReadRecordDao.java
  24. 56 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/entity/ReadRate.java
  25. 91 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRate7Day.xml
  26. 90 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateMonth.xml
  27. 91 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateToday.xml
  28. 91 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateYesterday.xml
  29. 17 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/BaseController.java
  30. 1 3
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/DeviceCommandController.java
  31. 2 5
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/MeterReadRecordController.java
  32. 1 4
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/MeterReplaceController.java
  33. 62 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/ReadRateController.java
  34. 39 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/factory/ReadRateFactory.java
  35. 98 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/AbstractReadRateService.java
  36. 51 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/ReadRateService.java
  37. 47 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRate7DayServiceImpl.java
  38. 47 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRateMonthServiceImpl.java
  39. 48 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRateTodayServiceImpl.java
  40. 48 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRateYesterdayServiceImpl.java

+ 3 - 2
zoniot-common/zoniot-core-mysql/src/main/java/com/zcxk/core/mysql/pageing/Pagination.java

@@ -13,17 +13,18 @@ import java.util.List;
  */
 @Data
 public class Pagination<T> implements Serializable {
+
     private static final long serialVersionUID = -4899829840696212229L;
+
     @ApiModelProperty("总记录数")
     private long total;
 
     @ApiModelProperty("结果集")
     private List<T> list;
 
-
     public Pagination(){
 
-    };
+    }
 
     /**
      * 包装Page对象

+ 24 - 1
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/BigDecimalUtils.java

@@ -11,10 +11,33 @@ import java.math.RoundingMode;
  **/
 public class BigDecimalUtils {
 
+
+    public static String percentDivideDown(Object value, Object value2, int scale){
+        return divideDown(value, value2, scale).multiply(new BigDecimal("100")).stripTrailingZeros().toPlainString() + "%";
+    }
+
     public static String percentDivide(Object value, Object value2, int scale){
         return divide(value, value2, scale).multiply(new BigDecimal("100")).stripTrailingZeros().toPlainString() + "%";
     }
 
+    /**
+    * @author Andy
+    * @description 不进行四舍五入,直接截取
+    * @date 14:22 2021/7/26
+    * @param value, value2, scale
+    * @return java.math.BigDecimal
+    **/
+    public static BigDecimal divideDown(Object value, Object value2, int scale){
+        return new BigDecimal(value.toString()).divide(new BigDecimal(value2.toString()), scale, RoundingMode.DOWN);
+    }
+
+    /**
+    * @author Andy
+    * @description 四舍五入
+    * @date 14:22 2021/7/26
+    * @param value, value2, scale
+    * @return java.math.BigDecimal
+    **/
     public static BigDecimal divide(Object value, Object value2, int scale){
         return new BigDecimal(value.toString()).divide(new BigDecimal(value2.toString()), scale, RoundingMode.HALF_UP);
     }
@@ -24,7 +47,7 @@ public class BigDecimalUtils {
     }
 
     public static void main(String[] args) {
-        System.out.println(BigDecimalUtils.percentDivide(3,10,2));
+        System.out.println(BigDecimalUtils.divideDown(1888,2068,4));
     }
 
 }

+ 3 - 3
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/ZoniotIntegerUtils.java

@@ -11,11 +11,11 @@ import java.text.DecimalFormat;
  **/
 public class ZoniotIntegerUtils {
 
-    private static  final  String pattern = "###,###";
+    private static  final String pattern = "###,###";
 
     /**
      * @author Andy
-     * @description 不为空值 != 0
+     * @description 不为空值 != 0
      * @date 9:26 2021/7/21
      * @param value
      * @return boolean
@@ -26,7 +26,7 @@ public class ZoniotIntegerUtils {
 
     /**
      * @author Andy
-     * @description 不为空,值 == 0
+     * @description 为空或值 == 0
      * @date 9:26 2021/7/21
      * @param value
      * @return boolean

+ 9 - 0
zoniot-rmcp/zoniot-rmcp-api/pom.xml

@@ -11,4 +11,13 @@
     <artifactId>zoniot-rmcp-api</artifactId>
     <version>1.0-SNAPSHOT</version>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+            <version>5.1.8</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
 </project>

+ 29 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/dto/readRate/ReadRateDto.java

@@ -0,0 +1,29 @@
+package com.zcxk.rmcp.api.dto.readRate;
+
+import com.zcxk.rmcp.api.dto.BasePageDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表率入参
+ * @date 2021/7/26
+ **/
+@Data
+public class ReadRateDto extends BasePageDto {
+
+    @ApiModelProperty(value = "类型")
+    private Integer statDaysCode;
+
+    @ApiModelProperty(value = "分类ID")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "抄表率起止")
+    private BigDecimal readRateBegin;
+
+    @ApiModelProperty(value = "抄表率结束")
+    private BigDecimal readRateEnd;
+}

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/CommandStatusEnum.java

@@ -35,8 +35,14 @@ public enum CommandStatusEnum {
     FAIL(3, "失败"),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
+    /**
+     * 说明
+     */
     private final String message;
 
 

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/CommandTypeEnum.java

@@ -24,8 +24,14 @@ public enum CommandTypeEnum {
     CLOSE(0, "关阀"),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
+    /**
+     * 说明
+     */
     private final String message;
 
 

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/OperationTypeEnum.java

@@ -30,8 +30,14 @@ public enum OperationTypeEnum {
     HAND(3, "手动触发指令"),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
+    /**
+     * 说明
+     */
     private final String message;
 
     OperationTypeEnum(Integer code, String message) {

+ 61 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ReadRateEnum.java

@@ -0,0 +1,61 @@
+package com.zcxk.rmcp.api.enums;
+
+import com.zcxk.core.common.exception.BusinessException;
+import lombok.Getter;
+
+/**
+ * @author Andy
+ * @date 2021-07-20 11:46
+ */
+@Getter
+public enum ReadRateEnum {
+
+    /**
+     * 今天
+     */
+    TODAY(1, "今日"),
+
+    /**
+     * 昨天
+     */
+    YESTERDAY(2, "昨日"),
+
+    /**
+     * 7天
+     */
+    SEVEN_DAY(3, "近7日"),
+
+    /**
+     * 月
+     */
+    MONTH(4, "上月"),
+
+    ;
+
+    /**
+     * code
+     */
+    private final int code;
+
+    /**
+     * 说明
+     */
+    private final String message;
+
+
+    ReadRateEnum(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public static ReadRateEnum getReadRateEnum(int code){
+        for (ReadRateEnum value : ReadRateEnum.values()) {
+             if (value.code == code) {
+                 return value;
+             }
+        }
+        throw BusinessException.builder(RmcpErrorEnum.RMCP_NOT_FOUND_CODE);
+    }
+
+
+}

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ReadStatusEnum.java

@@ -26,8 +26,14 @@ public enum ReadStatusEnum {
 
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
+    /**
+     * 说明
+     */
     private final String message;
 
 

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ReplaceMethodEnum.java

@@ -24,8 +24,14 @@ public enum ReplaceMethodEnum {
     CLOSE(2, "更换整表"),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
+    /**
+     * 说明
+     */
     private final String message;
 
 

+ 4 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/RmcpErrorEnum.java

@@ -18,6 +18,10 @@ public enum RmcpErrorEnum implements RespCode {
     RMCP_DEVICE_ELECTRONIC_NO_NOT_EXISTED(201005,"您输入的水表电子号已存在,请重新输入"),
 
     RMCP_UPDATE_FAIL(201006,"更新失败!"),
+
+    RMCP_NOT_FOUND(201404,"未找到相关数据"),
+
+    RMCP_NOT_FOUND_CODE(201405,"未找到指定的code"),
     ;
 
     /**

+ 3 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/TaskEnum.java

@@ -11,6 +11,9 @@ public enum TaskEnum {
     install(2),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
 

+ 3 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/ValveStatusEnum.java

@@ -16,6 +16,9 @@ public enum ValveStatusEnum {
     ABNORMAL(2),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
 

+ 50 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ReadRatePageVo.java

@@ -0,0 +1,50 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import com.github.pagehelper.Page;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表率分页
+ * @date 2021/7/26
+ **/
+@Data
+public class ReadRatePageVo<T> implements Serializable {
+
+    private static final long serialVersionUID = -4899829840696212229L;
+
+    public ReadRatePageVo(){
+    }
+
+    @ApiModelProperty("总记录数")
+    private long total;
+
+    @ApiModelProperty(value="应抄数据")
+    private int readTimes;
+
+    @ApiModelProperty(value="实抄数据")
+    private int realReadTimes;
+
+    @ApiModelProperty(value="抄表率")
+    private String readRate;
+
+    @ApiModelProperty("结果集")
+    private List<T> list;
+
+    public ReadRatePageVo(List<T> list) {
+        Page page = (Page) list;
+        this.list = page;
+        this.total = page.getTotal();
+    }
+
+    public ReadRatePageVo(List<T> list , long total){
+        this.list = list ;
+        this.total =total ;
+    }
+
+}

+ 54 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ReadRateVo.java

@@ -0,0 +1,54 @@
+package com.zcxk.rmcp.api.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表数据
+ * @date 2021/7/26
+ **/
+@Data
+public class ReadRateVo {
+
+    @ApiModelProperty(value="小区名字")
+    @ExcelProperty(value = {"小区名字"},index = 0)
+    private String communityName;
+
+    @ApiModelProperty(value="水表名字")
+    @ExcelProperty(value = {"水表名字"},index = 1)
+    private String categoryName;
+
+    @ApiModelProperty(value="公司名字")
+    @ExcelProperty(value = {"公司名字"},index = 2)
+    private String companyOrgName;
+
+    @ApiModelProperty(value="部门名字")
+    @ExcelProperty(value = {"部门名字"},index = 3)
+    private String deptOrgName;
+
+    @ApiModelProperty(value="应抄数据")
+    @ExcelProperty(value = {"应抄水表总数"},index = 4)
+    private int readTimes;
+
+    @ApiModelProperty(value="实抄数据")
+    @ExcelProperty(value = {"抄收成功总数"},index = 5)
+    private int realReadTimes;
+
+    @ApiModelProperty(value="未抄数据")
+    @ExcelIgnore
+    private int unReadTimes;
+
+    @ApiModelProperty(value="抄表率")
+    @ExcelProperty(value = {"抄收成功率(%)"},index = 6)
+    private BigDecimal readRate;
+
+
+
+}

+ 29 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/StatisticsReadRateVo.java

@@ -0,0 +1,29 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计抄表率
+ * @date 2021/7/26
+ **/
+@Data
+public class StatisticsReadRateVo {
+
+    @ApiModelProperty(value="水表名字")
+    private String name;
+
+    @ApiModelProperty(value="应抄数据")
+    private int readTimes;
+
+    @ApiModelProperty(value="实抄数据")
+    private int realReadTimes;
+
+    @ApiModelProperty(value="未抄数据")
+    private int unReadTimes;
+
+    @ApiModelProperty(value="抄表率")
+    private String readRate;
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRate7DayMapper.java

@@ -0,0 +1,47 @@
+package com.zcxk.rmcp.core.dao;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计7天的抄表率
+ * @date 2021/7/26
+ **/
+@Mapper
+public interface ReadRate7DayMapper {
+
+    /**
+    * @author Andy
+    * @description 统计抄表率
+    * @date 10:42 2021/7/26
+    * @param condition
+    * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+    **/
+    List<StatisticsReadRateVo> statReadRateGroupCategory(@Param("userCondition") UserCondition condition);
+
+    /**
+    * @author Andy
+    * @description 查询数据
+    * @date 14:59 2021/7/26
+    * @param dto, condition
+    * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
+    **/
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+
+    /**
+    * @author Andy
+    * @description 统计总数
+    * @date 15:27 2021/7/26
+    * @param dto, condition
+    * @return void
+    **/
+    StatisticsReadRateVo countReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateMonthMapper.java

@@ -0,0 +1,47 @@
+package com.zcxk.rmcp.core.dao;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计上月的抄表率
+ * @date 2021/7/26
+ **/
+@Mapper
+public interface ReadRateMonthMapper {
+
+    /**
+     * @author Andy
+     * @description 统计抄表率
+     * @date 10:42 2021/7/26
+     * @param condition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+     **/
+    List<StatisticsReadRateVo> statReadRateGroupCategory(@Param("userCondition") UserCondition condition);
+
+    /**
+     * @author Andy
+     * @description 查询数据
+     * @date 14:59 2021/7/26
+     * @param dto, condition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
+     **/
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+
+    /**
+     * @author Andy
+     * @description 统计总数
+     * @date 15:27 2021/7/26
+     * @param dto, condition
+     * @return void
+     **/
+    StatisticsReadRateVo countReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateTodayMapper.java

@@ -0,0 +1,47 @@
+package com.zcxk.rmcp.core.dao;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计今天的抄表率
+ * @date 2021/7/26
+ **/
+@Mapper
+public interface ReadRateTodayMapper {
+
+    /**
+     * @author Andy
+     * @description 统计抄表率
+     * @date 10:42 2021/7/26
+     * @param condition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+     **/
+    List<StatisticsReadRateVo> statReadRateGroupCategory(@Param("userCondition") UserCondition condition);
+
+    /**
+     * @author Andy
+     * @description 查询数据
+     * @date 14:59 2021/7/26
+     * @param dto, condition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
+     **/
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+
+    /**
+     * @author Andy
+     * @description 统计总数
+     * @date 15:27 2021/7/26
+     * @param dto, condition
+     * @return void
+     **/
+    StatisticsReadRateVo countReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateYesterdayMapper.java

@@ -0,0 +1,47 @@
+package com.zcxk.rmcp.core.dao;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计昨天的抄表率
+ * @date 2021/7/26
+ **/
+@Mapper
+public interface ReadRateYesterdayMapper {
+
+    /**
+     * @author Andy
+     * @description 统计抄表率
+     * @date 10:42 2021/7/26
+     * @param condition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+     **/
+    List<StatisticsReadRateVo> statReadRateGroupCategory(@Param("userCondition") UserCondition condition);
+
+    /**
+     * @author Andy
+     * @description 查询数据
+     * @date 14:59 2021/7/26
+     * @param dto, condition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
+     **/
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+
+    /**
+     * @author Andy
+     * @description 统计总数
+     * @date 15:27 2021/7/26
+     * @param dto, condition
+     * @return void
+     **/
+    StatisticsReadRateVo countReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+}

+ 1 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/BaseMongoDao.java

@@ -26,7 +26,7 @@ public interface BaseMongoDao {
              if (userCondition.getPermissionType() == 2 || userCondition.getPermissionType() == 5)  {
                  Criteria criteria1 = Criteria.where("company_org_id").in(orgIds);
                  Criteria criteria2 = Criteria.where("dept_org_id").in(orgIds);
-                 criteria.orOperator(criteria1,criteria2);
+                 criteria.orOperator(criteria1, criteria2);
              }
              if (userCondition.getPermissionType() == 4 || userCondition.getPermissionType() == 3)  {
                  criteria.and("dept_org_id").in(orgIds);

+ 3 - 6
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/MeterReadRecordDao.java

@@ -96,8 +96,7 @@ public class MeterReadRecordDao extends BaseDao<MeterReadRecord, String> impleme
         update.set("data.$.readTime", LocalDateTime.now());
         update.set("data.$.lastCost", BigDecimalUtils.subtract(meterReadRecordVo.getData().getLastValid(), new BigDecimal(dto.getReadData())));
         update.set("data.$.createBy", UserUtil.getCurrentUser().getUsername());
-        UpdateResult result = upsert(query,update);
-        return result.getModifiedCount();
+        return upsert(query,update).getModifiedCount();
     }
 
     /**
@@ -164,9 +163,7 @@ public class MeterReadRecordDao extends BaseDao<MeterReadRecord, String> impleme
         } else {
             localDate = DateUtil.parseLocalDate(dto.getDate());
         }
-        Integer year = localDate.getYear();
-        String date  = localDate.toString();
-        criteria.and("year").is(year);
+        criteria.and("year").is(localDate.getYear());
         criteria.and("categoryId").is(dto.getCategoryId());
         criteria.and("tenantId").is(userCondition.getTenantId());
         if (ZoniotStringUtils.isNotEmpty(dto.getConcentratorId())) {
@@ -199,7 +196,7 @@ public class MeterReadRecordDao extends BaseDao<MeterReadRecord, String> impleme
         commonOperations.add(unwind);
         // 3.子文档查询
         MatchOperation match2 = Aggregation.match(
-                Criteria.where("data.readDate").is(date));
+                Criteria.where("data.readDate").is(localDate.toString()));
         commonOperations.add(match2);
         return commonOperations;
     }

+ 56 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/entity/ReadRate.java

@@ -0,0 +1,56 @@
+package com.zcxk.rmcp.core.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表率(今天,昨天,7天,上月)
+ * @date 2021/7/26
+ **/
+@ApiModel(value="抄表率(今天,昨天,7天,上月)")
+@Data
+public class ReadRate {
+
+    @ApiModelProperty(value="统计日期")
+    private Integer statDay;
+
+    @ApiModelProperty(value="租户ID")
+    private String tenantId;
+
+    @ApiModelProperty(value="分类ID")
+    private Integer categoryId;
+
+    @ApiModelProperty(value="公司ID")
+    private Integer companyOrgId;
+
+    @ApiModelProperty(value="部门ID")
+    private Integer deptOrgId;
+
+    @ApiModelProperty(value="设备数")
+    private int deviceCount;
+
+    @ApiModelProperty(value="应抄数据")
+    private int readTimes;
+
+    @ApiModelProperty(value="实抄数据")
+    private int realReadTimes;
+
+    @ApiModelProperty(value="未抄数据")
+    private int unReadTimes;
+
+    @ApiModelProperty(value="抄表率")
+    private BigDecimal readRate;
+
+    @ApiModelProperty(value="创建日期")
+    private Date dateCreate;
+
+    @ApiModelProperty(value="更新日期")
+    private Date dateUpdate;
+
+}

+ 91 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRate7Day.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zcxk.rmcp.core.dao.ReadRate7DayMapper">
+
+  <sql id="Base_Column_List">
+    stat_day, tenant_id, category_id, company_org_id, dept_org_id, device_count,
+    `read_times`, real_read_times, un_read_times, read_rate, date_create, date_update
+  </sql>
+
+
+  <sql id="permissionCondition">
+    <if test="userCondition.tenantId != null">and rd.tenant_id = #{userCondition.tenantId}</if>
+    <if test="userCondition.userType!=null and userCondition.userType!=-999 and userCondition.userType!=-9999 and  userCondition.programItems != null and userCondition.programItems.size() > 0">
+      <if test="userCondition.permissionType == 5 or userCondition.permissionType == 2">
+        and ( rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        or
+        rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        )
+      </if>
+      <if test="userCondition.permissionType == 4 or userCondition.permissionType == 3">
+        and rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+      </if>
+      <if test="userCondition.permissionType == 1">
+        and rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        and (rd.dept_org_id is null or rd.dept_org_id =0)
+      </if>
+    </if>
+  </sql>
+
+  <select id="statReadRateGroupCategory" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT
+    rc.name, sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_7day rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <include refid="permissionCondition"></include>
+    GROUP BY rd.category_id
+  </select>
+
+  <select id="countReadRate" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_7day rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+
+  <select id="listReadRate" resultType="com.zcxk.rmcp.api.vo.ReadRateVo">
+    SELECT
+    rc.name categoryName, rm.`name` communityName, rd.read_times, rd.real_read_times,
+    rd.un_read_times,rd.read_rate,
+    org1.org_name as companyOrgName,
+    org2.org_name as deptOrgName
+    from rmcp_stat_meter_read_rate_by_community_7day rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    left join rmcp_org org1 on org1.id = rd.company_org_id
+    left join rmcp_org org2 on org2.id = rd.dept_org_id
+    left join rmcp_community rm on rm.id = rd.community_id
+    where
+    1=1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+</mapper>

+ 90 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateMonth.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zcxk.rmcp.core.dao.ReadRateMonthMapper">
+
+  <sql id="Base_Column_List">
+    stat_day, tenant_id, category_id, company_org_id, dept_org_id, device_count,
+    `read_times`, real_read_times, un_read_times, read_rate, date_create, date_update
+  </sql>
+
+  <sql id="permissionCondition">
+    <if test="userCondition.tenantId != null">and rd.tenant_id = #{userCondition.tenantId}</if>
+    <if test="userCondition.userType!=null and userCondition.userType!=-999 and userCondition.userType!=-9999 and  userCondition.programItems != null and userCondition.programItems.size() > 0">
+      <if test="userCondition.permissionType == 5 or userCondition.permissionType == 2">
+        and ( rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        or
+        rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        )
+      </if>
+      <if test="userCondition.permissionType == 4 or userCondition.permissionType == 3">
+        and rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+      </if>
+      <if test="userCondition.permissionType == 1">
+        and rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        and (rd.dept_org_id is null or rd.dept_org_id =0)
+      </if>
+    </if>
+  </sql>
+
+  <select id="statReadRateGroupCategory" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT
+    rc.name, sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_month rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <include refid="permissionCondition"></include>
+    GROUP BY rd.category_id
+  </select>
+
+  <select id="countReadRate" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_month rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+
+  <select id="listReadRate" resultType="com.zcxk.rmcp.api.vo.ReadRateVo">
+    SELECT
+    rc.name categoryName, rm.`name` communityName, rd.read_times, rd.real_read_times,
+    rd.un_read_times,rd.read_rate,
+    org1.org_name as companyOrgName,
+    org2.org_name as deptOrgName
+    from rmcp_stat_meter_read_rate_by_community_month rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    left join rmcp_org org1 on org1.id = rd.company_org_id
+    left join rmcp_org org2 on org2.id = rd.dept_org_id
+    left join rmcp_community rm on rm.id = rd.community_id
+    where
+    1=1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+</mapper>

+ 91 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateToday.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zcxk.rmcp.core.dao.ReadRateTodayMapper">
+
+  <sql id="Base_Column_List">
+    stat_day, tenant_id, category_id, company_org_id, dept_org_id, device_count,
+    `read_times`, real_read_times, un_read_times, read_rate, date_create, date_update
+  </sql>
+
+  <sql id="permissionCondition">
+    <if test="userCondition.tenantId != null">and rd.tenant_id = #{userCondition.tenantId}</if>
+    <if test="userCondition.userType!=null and userCondition.userType!=-999 and userCondition.userType!=-9999 and  userCondition.programItems != null and userCondition.programItems.size() > 0">
+      <if test="userCondition.permissionType == 5 or userCondition.permissionType == 2">
+        and ( rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        or
+        rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        )
+      </if>
+      <if test="userCondition.permissionType == 4 or userCondition.permissionType == 3">
+        and rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+      </if>
+      <if test="userCondition.permissionType == 1">
+        and rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        and (rd.dept_org_id is null or rd.dept_org_id =0)
+      </if>
+    </if>
+  </sql>
+
+  <select id="statReadRateGroupCategory" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT
+    rc.name, sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_today rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <include refid="permissionCondition"></include>
+    GROUP BY rd.category_id
+  </select>
+
+
+  <select id="countReadRate" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_today rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+
+  <select id="listReadRate" resultType="com.zcxk.rmcp.api.vo.ReadRateVo">
+    SELECT
+    rc.name categoryName, rm.`name` communityName, rd.read_times, rd.real_read_times,
+    rd.un_read_times,rd.read_rate,
+    org1.org_name as companyOrgName,
+    org2.org_name as deptOrgName
+    from rmcp_stat_meter_read_rate_by_community_today rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    left join rmcp_org org1 on org1.id = rd.company_org_id
+    left join rmcp_org org2 on org2.id = rd.dept_org_id
+    left join rmcp_community rm on rm.id = rd.community_id
+    where
+    1=1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+</mapper>

+ 91 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateYesterday.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zcxk.rmcp.core.dao.ReadRateYesterdayMapper">
+
+  <sql id="Base_Column_List">
+    stat_day, tenant_id, category_id, company_org_id, dept_org_id, device_count,
+    `read_times`, real_read_times, un_read_times, read_rate, date_create, date_update
+  </sql>
+
+  <sql id="permissionCondition">
+    <if test="userCondition.tenantId != null">and rd.tenant_id = #{userCondition.tenantId}</if>
+    <if test="userCondition.userType!=null and userCondition.userType!=-999 and userCondition.userType!=-9999 and  userCondition.programItems != null and userCondition.programItems.size() > 0">
+      <if test="userCondition.permissionType == 5 or userCondition.permissionType == 2">
+        and ( rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        or
+        rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        )
+      </if>
+      <if test="userCondition.permissionType == 4 or userCondition.permissionType == 3">
+        and rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+      </if>
+      <if test="userCondition.permissionType == 1">
+        and rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        and (rd.dept_org_id is null or rd.dept_org_id =0)
+      </if>
+    </if>
+  </sql>
+
+  <select id="statReadRateGroupCategory" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT
+    rc.name, sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_yesterday rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <include refid="permissionCondition"></include>
+    GROUP BY rd.category_id
+  </select>
+
+  <select id="countReadRate" resultType="com.zcxk.rmcp.api.vo.StatisticsReadRateVo">
+    SELECT sum(rd.read_times) read_times, sum(rd.real_read_times) real_read_times,
+    SUM(rd.un_read_times) un_read_times, ROUND(sum(rd.real_read_times)/sum(rd.read_times),4) readRate
+    from rmcp_stat_meter_read_rate_by_community_yesterday rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    1 = 1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+
+
+  <select id="listReadRate" resultType="com.zcxk.rmcp.api.vo.ReadRateVo">
+    SELECT
+    rc.name categoryName, rm.`name` communityName, rd.read_times, rd.real_read_times,
+    rd.un_read_times,rd.read_rate,
+    org1.org_name as companyOrgName,
+    org2.org_name as deptOrgName
+    from rmcp_stat_meter_read_rate_by_community_yesterday rd
+    LEFT JOIN rmcp_product_category rc on rd.category_id = rc.id
+    left join rmcp_org org1 on org1.id = rd.company_org_id
+    left join rmcp_org org2 on org2.id = rd.dept_org_id
+    left join rmcp_community rm on rm.id = rd.community_id
+    where
+    1=1
+    <if test="dto.categoryId != null and dto.categoryId != ''">
+      and rd.category_id = #{dto.categoryId}
+    </if>
+    <if test="dto.readRateBegin != null and dto.readRateEnd != null">
+      and rd.read_rate BETWEEN #{dto.readRateBegin} and  #{dto.readRateEnd}
+    </if>
+    <include refid="permissionCondition"></include>
+  </select>
+</mapper>

+ 17 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/BaseController.java

@@ -0,0 +1,17 @@
+package com.zcxk.rmcp.web.controller;
+
+import org.springframework.beans.factory.annotation.Value;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: TODO
+ * @date 2021/7/26
+ **/
+public class BaseController {
+
+    @Value("${rmcp.sys_excel_path}")
+    protected String baseDir;
+
+
+}

+ 1 - 3
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/DeviceCommandController.java

@@ -24,10 +24,8 @@ import java.util.List;
 @ResponseBody
 @RequestMapping("/device/command")
 @Api(tags = "设备维护-阀控管理")
-public class DeviceCommandController {
+public class DeviceCommandController extends BaseController{
 
-    @Value("${rmcp.sys_excel_path}")
-    private String baseDir;
 
     @Autowired
     private DeviceCommandService deviceCommandService;

+ 2 - 5
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/MeterReadRecordController.java

@@ -36,10 +36,7 @@ import java.util.List;
 @ResponseBody
 @RequestMapping("/meter/read/record")
 @Api(tags = "抄表记录")
-public class MeterReadRecordController {
-
-    @Value("${rmcp.sys_excel_path}")
-    private String baseDir;
+public class MeterReadRecordController extends BaseController {
 
     @Resource
     private MeterReadRecordServcie meterReadRecordServcie;
@@ -63,7 +60,7 @@ public class MeterReadRecordController {
         return AjaxMessage.success(meterReadRecordServcie.pageMeterReadRecord(dto));
     }
 
-    @RequestMapping(value="export/excel" , method = RequestMethod.POST)
+    @RequestMapping(value="/export/excel" , method = RequestMethod.POST)
     @ApiOperation(value = "excel导出")
     public AjaxMessage<String> exportExcel(@RequestBody @Valid MeterReadRecordDto dto) {
         List<MeterReadRecordVo> list = meterReadRecordServcie.listMeterReadRecord(dto);

+ 1 - 4
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/MeterReplaceController.java

@@ -29,10 +29,7 @@ import java.util.List;
 @ResponseBody
 @RequestMapping("/device/meter/replace")
 @Api(tags = "设备维护-换表管理")
-public class MeterReplaceController {
-
-    @Value("${rmcp.sys_excel_path}")
-    private String baseDir;
+public class MeterReplaceController  extends BaseController {
 
     @Autowired
     private MeterReplaceLogService meterReplaceLogService;

+ 62 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/ReadRateController.java

@@ -0,0 +1,62 @@
+package com.zcxk.rmcp.web.controller;
+
+import com.zcxk.core.common.pojo.AjaxMessage;
+import com.zcxk.core.utils.export.EasyExcelUtil;
+import com.zcxk.rmcp.api.dto.deviceCommand.DeviceCommandPageDto;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.enums.ReadRateEnum;
+import com.zcxk.rmcp.api.vo.DeviceCommandVo;
+import com.zcxk.rmcp.api.vo.ReadRatePageVo;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.web.factory.ReadRateFactory;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Controller
+@ResponseBody
+@RequestMapping("/read/rate")
+@Api(tags = "抄表率统计")
+public class ReadRateController extends BaseController{
+
+    @Autowired
+    private ReadRateFactory readRateFactory;
+
+    @RequestMapping(value = "/statistics", method = RequestMethod.GET)
+    @ApiOperation(value = "统计抄表率")
+    public AjaxMessage<List> statistics(@ApiParam(value = "统计天数", required = true) @RequestParam("statDaysCode") Integer statDaysCode) {
+        if (ReadRateEnum.getReadRateEnum(statDaysCode) == null) {
+            return AjaxMessage.success(null);
+        }
+        return AjaxMessage.success(readRateFactory.getReadRateService(statDaysCode).statReadRateGroupCategory());
+    }
+
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiOperation(value = "分页查询")
+    public AjaxMessage<ReadRatePageVo> page(@RequestBody @Valid ReadRateDto dto) {
+        if (ReadRateEnum.getReadRateEnum(dto.getStatDaysCode()) == null) {
+            return AjaxMessage.success(null);
+        }
+        return AjaxMessage.success(readRateFactory.getReadRateService(dto.getStatDaysCode()).pageReadRate(dto));
+    }
+
+    @RequestMapping(value="export/excel" , method = RequestMethod.POST)
+    @ApiOperation(value = "excel导出")
+    public AjaxMessage<String> exportExcel(@RequestBody @Valid ReadRateDto dto) {
+        ReadRateEnum readRateEnum = ReadRateEnum.getReadRateEnum(dto.getStatDaysCode());
+        List<ReadRateVo> list = readRateFactory.getReadRateService(dto.getStatDaysCode()).listReadRate(dto);
+        if (CollectionUtils.isEmpty(list)) {
+            return AjaxMessage.success(null);
+        }
+        String filePath = EasyExcelUtil.excelWrite(baseDir, ReadRateVo.class, readRateEnum.getMessage() +"抄表率记录", list);
+        return AjaxMessage.success(filePath);
+    }
+}

+ 39 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/factory/ReadRateFactory.java

@@ -0,0 +1,39 @@
+package com.zcxk.rmcp.web.factory;
+
+import com.zcxk.rmcp.web.service.ReadRateService;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表率处理
+ * @date 2021/7/26
+ **/
+@Component
+public class ReadRateFactory implements ApplicationContextAware {
+
+    /**
+     * 接口聚合
+     */
+    private static Map<Integer, ReadRateService> readRateMap;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        Map<String, ReadRateService> acts = applicationContext.getBeansOfType(ReadRateService.class);
+        readRateMap = new HashMap<>();
+        acts.forEach((key, value) -> {
+            readRateMap.put(value.getStatDays().getCode(),value);
+        });
+    }
+
+    public <T extends ReadRateService> T getReadRateService(int code) {
+        return (T)readRateMap.get(code);
+    }
+
+}

+ 98 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/AbstractReadRateService.java

@@ -0,0 +1,98 @@
+package com.zcxk.rmcp.web.service;
+
+import com.github.pagehelper.PageHelper;
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.core.common.util.UserUtil;
+import com.zcxk.core.utils.BigDecimalUtils;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.vo.ReadRatePageVo;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 报表率
+ * @date 2021/7/26
+ **/
+public abstract class AbstractReadRateService implements ReadRateService{
+
+
+    @Override
+    public List<StatisticsReadRateVo> statReadRateGroupCategory(){
+        List<StatisticsReadRateVo> list = this.statReadRateGroupCategory(UserUtil.getCurrentUser().getUserCondition());
+        if (CollectionUtils.isEmpty(list)) {
+            return null;
+        }
+        int readTimes  = 0;
+        int realReadTimes = 0;
+        int unReadTimes = 0;
+        StatisticsReadRateVo allStatisticsReadRateVo = new StatisticsReadRateVo();
+        for (StatisticsReadRateVo statisticsReadRateVo : list) {
+            readTimes += statisticsReadRateVo.getReadTimes();
+            realReadTimes += statisticsReadRateVo.getRealReadTimes();
+            unReadTimes += statisticsReadRateVo.getUnReadTimes();
+        }
+        allStatisticsReadRateVo.setName("所有水表");
+        allStatisticsReadRateVo.setReadTimes(readTimes);
+        allStatisticsReadRateVo.setRealReadTimes(realReadTimes);
+        allStatisticsReadRateVo.setUnReadTimes(unReadTimes);
+        allStatisticsReadRateVo.setReadRate(BigDecimalUtils.divide(realReadTimes, readTimes, 4).stripTrailingZeros().toPlainString());
+        list.add(0, allStatisticsReadRateVo);
+        return list;
+    }
+
+    @Override
+    public ReadRatePageVo<ReadRateVo> pageReadRate(ReadRateDto dto) {
+        PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
+        UserCondition userCondition = UserUtil.getCurrentUser().getUserCondition();
+        List<ReadRateVo> list = this.listReadRate(dto, userCondition);
+        if (CollectionUtils.isEmpty(list)){
+            return new ReadRatePageVo<>();
+        }
+        StatisticsReadRateVo statisticsReadRateVo = this.countReadRate(dto, userCondition);
+        ReadRatePageVo<ReadRateVo> result = new ReadRatePageVo<>(list);
+        if (statisticsReadRateVo != null) {
+            result.setReadRate(statisticsReadRateVo.getReadRate());
+            result.setReadTimes(statisticsReadRateVo.getReadTimes());
+            result.setRealReadTimes(statisticsReadRateVo.getRealReadTimes());
+        }
+        return result;
+    }
+
+    @Override
+    public  List<ReadRateVo> listReadRate(ReadRateDto dto){
+        return this.listReadRate(dto, UserUtil.getCurrentUser().getUserCondition());
+    }
+
+    /**
+    * @author Andy
+    * @description 统计抄表率
+    * @date 11:31 2021/7/26
+    * @param
+    * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+    **/
+    protected abstract List<StatisticsReadRateVo> statReadRateGroupCategory(UserCondition userCondition);
+
+    /**
+     * @author Andy
+     * @description 统计抄表率
+     * @date 11:31 2021/7/26
+     * @param
+     * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+     **/
+    protected abstract List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition);
+
+    /**
+     * @author Andy
+     * @description 统计抄表率
+     * @date 11:31 2021/7/26
+     * @param
+     * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+     **/
+    protected abstract StatisticsReadRateVo countReadRate(ReadRateDto dto, UserCondition userCondition);
+
+}

+ 51 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/ReadRateService.java

@@ -0,0 +1,51 @@
+package com.zcxk.rmcp.web.service;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.enums.ReadRateEnum;
+import com.zcxk.rmcp.api.vo.ReadRatePageVo;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计抄表率
+ * @date 2021/7/26
+ **/
+public interface ReadRateService {
+
+    /**
+    * @author Andy
+    * @description 统计抄表率按分类分组
+    * @date 11:13 2021/7/26
+    * @param
+    * @return java.util.List<com.zcxk.rmcp.api.vo.StatisticsReadRateVo>
+    **/
+    List<StatisticsReadRateVo> statReadRateGroupCategory();
+
+    /**
+    * @author Andy
+    * @description 分页查询
+    * @date 14:33 2021/7/26
+    * @param dto
+    * @return com.zcxk.core.mysql.pageing.Pagination<java.lang.Void>
+    **/
+    ReadRatePageVo<ReadRateVo> pageReadRate(ReadRateDto dto);
+
+    /**
+    * @author Andy
+    * @description 集合查询
+    * @date 16:02 2021/7/26
+    * @param dto
+    * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
+    **/
+    List<ReadRateVo> listReadRate(ReadRateDto dto);
+
+    /**
+     * 获取统计天数类型
+     */
+    ReadRateEnum getStatDays();
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRate7DayServiceImpl.java

@@ -0,0 +1,47 @@
+package com.zcxk.rmcp.web.service.impl.readRate;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.enums.ReadRateEnum;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import com.zcxk.rmcp.core.dao.ReadRate7DayMapper;
+import com.zcxk.rmcp.web.service.AbstractReadRateService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计昨天抄表率
+ * @date 2021/7/26
+ **/
+@Service
+public class ReadRate7DayServiceImpl extends AbstractReadRateService {
+
+    @Resource
+    private ReadRate7DayMapper readRate7DayMapper;
+
+    @Override
+    protected List<StatisticsReadRateVo> statReadRateGroupCategory(UserCondition userCondition) {
+        return readRate7DayMapper.statReadRateGroupCategory(userCondition);
+    }
+
+    @Override
+    public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRate7DayMapper.listReadRate(dto, userCondition);
+    }
+
+    @Override
+    protected StatisticsReadRateVo countReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRate7DayMapper.countReadRate(dto, userCondition);
+    }
+
+    @Override
+    public ReadRateEnum getStatDays() {
+        return ReadRateEnum.SEVEN_DAY;
+    }
+
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRateMonthServiceImpl.java

@@ -0,0 +1,47 @@
+package com.zcxk.rmcp.web.service.impl.readRate;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.enums.ReadRateEnum;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import com.zcxk.rmcp.core.dao.ReadRateMonthMapper;
+import com.zcxk.rmcp.web.service.AbstractReadRateService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计月抄表率
+ * @date 2021/7/26
+ **/
+@Service
+public class ReadRateMonthServiceImpl extends AbstractReadRateService {
+
+    @Resource
+    private ReadRateMonthMapper readRateMonthMapper;
+
+    @Override
+    protected List<StatisticsReadRateVo> statReadRateGroupCategory(UserCondition userCondition){
+        return readRateMonthMapper.statReadRateGroupCategory(userCondition);
+    }
+
+    @Override
+    public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRateMonthMapper.listReadRate(dto, userCondition);
+    }
+
+    @Override
+    protected StatisticsReadRateVo countReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRateMonthMapper.countReadRate(dto, userCondition);
+    }
+
+    @Override
+    public ReadRateEnum getStatDays() {
+        return ReadRateEnum.MONTH;
+    }
+
+}

+ 48 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRateTodayServiceImpl.java

@@ -0,0 +1,48 @@
+package com.zcxk.rmcp.web.service.impl.readRate;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.enums.ReadRateEnum;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import com.zcxk.rmcp.core.dao.ReadRateTodayMapper;
+import com.zcxk.rmcp.web.service.AbstractReadRateService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计今天抄表率
+ * @date 2021/7/26
+ **/
+@Service
+public class ReadRateTodayServiceImpl extends AbstractReadRateService {
+
+    @Resource
+    private ReadRateTodayMapper readRateTodayMapper;
+
+    @Override
+    protected List<StatisticsReadRateVo> statReadRateGroupCategory(UserCondition userCondition) {
+        return readRateTodayMapper.statReadRateGroupCategory(userCondition);
+    }
+
+    @Override
+    public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRateTodayMapper.listReadRate(dto, userCondition);
+    }
+
+    @Override
+    protected StatisticsReadRateVo countReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRateTodayMapper.countReadRate(dto, userCondition);
+    }
+
+
+    @Override
+    public ReadRateEnum getStatDays() {
+        return ReadRateEnum.TODAY;
+    }
+
+}

+ 48 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readRate/ReadRateYesterdayServiceImpl.java

@@ -0,0 +1,48 @@
+package com.zcxk.rmcp.web.service.impl.readRate;
+
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.readRate.ReadRateDto;
+import com.zcxk.rmcp.api.enums.ReadRateEnum;
+import com.zcxk.rmcp.api.vo.ReadRateVo;
+import com.zcxk.rmcp.api.vo.StatisticsReadRateVo;
+import com.zcxk.rmcp.core.dao.ReadRateYesterdayMapper;
+import com.zcxk.rmcp.web.service.AbstractReadRateService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 统计昨天抄表率
+ * @date 2021/7/26
+ **/
+@Service
+public class ReadRateYesterdayServiceImpl extends AbstractReadRateService {
+
+    @Resource
+    private ReadRateYesterdayMapper readRateYesterdayMapper;
+
+    @Override
+    protected List<StatisticsReadRateVo> statReadRateGroupCategory(UserCondition userCondition) {
+        return readRateYesterdayMapper.statReadRateGroupCategory(userCondition);
+    }
+
+    @Override
+    public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRateYesterdayMapper.listReadRate(dto, userCondition);
+    }
+
+    @Override
+    protected StatisticsReadRateVo countReadRate(ReadRateDto dto, UserCondition userCondition) {
+        return readRateYesterdayMapper.countReadRate(dto, userCondition);
+    }
+
+
+    @Override
+    public ReadRateEnum getStatDays() {
+        return ReadRateEnum.YESTERDAY;
+    }
+
+}