Browse Source

抄表记录排序

lihui001 3 years ago
parent
commit
adba0bb140
21 changed files with 233 additions and 59 deletions
  1. 11 0
      zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/DateUtil.java
  2. 2 2
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/dto/meterreadrecord/MeterReadRecordUpdateDto.java
  3. 28 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/MeterReadRecordExcelCodeVo.java
  4. 6 18
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/MeterReadRecordExcelVo.java
  5. 1 1
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/MeterReadRecordVo.java
  6. 2 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRate7DayMapper.java
  7. 2 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateMonthMapper.java
  8. 2 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateTodayMapper.java
  9. 2 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateYesterdayMapper.java
  10. 56 19
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/MeterReadRecordDao.java
  11. 6 2
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRate7Day.xml
  12. 6 2
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateMonth.xml
  13. 6 2
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateToday.xml
  14. 6 2
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateYesterday.xml
  15. 4 0
      zoniot-rmcp/zoniot-rmcp-web/pom.xml
  16. 2 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/MeterReadRecordService.java
  17. 73 2
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/MeterReadRecordServiceImpl.java
  18. 4 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRate7DayServiceImpl.java
  19. 8 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRateMonthServiceImpl.java
  20. 3 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRateTodayServiceImpl.java
  21. 3 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRateYesterdayServiceImpl.java

+ 11 - 0
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/DateUtil.java

@@ -2259,4 +2259,15 @@ public class DateUtil extends DateFormatUtils {
         ZonedDateTime zonedDateTime = localDate.atZone(ZoneId.systemDefault());
         return Date.from(zonedDateTime.toInstant());
     }
+
+    public static int parseInt(Date date, int addDays){
+        LocalDate localDate =  parseLocalDate(date);
+        if (addDays !=0 ){
+            localDate = localDate.plusDays(addDays);
+        }
+        String month =  (localDate.getMonthValue() +"").length() == 1 ? "0" + localDate.getMonthValue() : localDate.getMonthValue() +"";
+        String days  =  (localDate.getDayOfMonth() +"").length() == 1 ? "0" + localDate.getDayOfMonth() : localDate.getDayOfMonth() +"";
+        return  Integer.parseInt(localDate.getYear() + "" + month + "" + days);
+    }
+
 }

+ 2 - 2
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/dto/meterreadrecord/MeterReadRecordUpdateDto.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
 
 /**
  * @author Andy
@@ -26,6 +27,5 @@ public class MeterReadRecordUpdateDto  {
 
     @ApiModelProperty(value="读数")
     @NotNull
-    @NotEmpty
-    private String readData;
+    private BigDecimal readData;
 }

+ 28 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/MeterReadRecordExcelCodeVo.java

@@ -0,0 +1,28 @@
+package com.zcxk.rmcp.api.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表记录
+ * @date 2021/7/22
+ **/
+@Data
+public class MeterReadRecordExcelCodeVo extends MeterReadRecordExcelVo {
+
+    @ApiModelProperty(value="集中器编码")
+    @ExcelProperty(value = {"集中器编码"}, index = 11)
+    private String concentratorCode;
+
+    @ApiModelProperty(value="通道号")
+    @ExcelProperty(value = {"通道号"}, index = 12)
+    private String channelNumber;
+
+    @ApiModelProperty(value="采集器编码")
+    @ExcelProperty(value = {"采集器编码"}, index = 13)
+    private String collectorCode;
+
+}

+ 6 - 18
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/MeterReadRecordExcelVo.java

@@ -47,32 +47,20 @@ public class MeterReadRecordExcelVo {
     @ExcelProperty(value = {"抄表时间"}, index = 6)
     private String readTime;
 
-    @ApiModelProperty(value="公司名字")
-    @ExcelProperty(value = {"公司名字"}, index = 7)
+    @ApiModelProperty(value="公司")
+    @ExcelProperty(value = {"公司"}, index = 7)
     private String companyOrgName;
 
-    @ApiModelProperty(value="部门名字")
-    @ExcelProperty(value = {"部门名字"}, index = 8)
+    @ApiModelProperty(value="部门")
+    @ExcelProperty(value = {"部门"}, index = 8)
     private String deptOrgName;
 
-    @ApiModelProperty(value="小区名字")
-    @ExcelProperty(value = {"小区名字"}, index = 9)
+    @ApiModelProperty(value="小区")
+    @ExcelProperty(value = {"小区"}, index = 9)
     private String communityName;
 
     @ApiModelProperty(value="安装地址")
     @ExcelProperty(value = {"安装地址"}, index = 10)
     private String location;
 
-    @ApiModelProperty(value="集中器编码")
-    @ExcelProperty(value = {"集中器编码"}, index = 11)
-    private String concentratorCode;
-
-    @ApiModelProperty(value="通道号")
-    @ExcelProperty(value = {"通道号"}, index = 12)
-    private String channelNumber;
-
-    @ApiModelProperty(value="采集器编码")
-    @ExcelProperty(value = {"采集器编码"}, index = 13)
-    private String collectorCode;
-
 }

+ 1 - 1
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/MeterReadRecordVo.java

@@ -20,7 +20,7 @@ import java.io.Serializable;
 public class MeterReadRecordVo {
 
     @ApiModelProperty(value="id")
-    private String id;
+    private Long id;
 
     @ApiModelProperty(value="水表电子号")
     private String meterNo;

+ 2 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRate7DayMapper.java

@@ -32,10 +32,11 @@ public interface ReadRate7DayMapper {
     * @author Andy
     * @date 15:01 2021/8/3
     * @param dto:
+    * @param statDay:
     * @param condition:
     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
     **/
-    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto,  @Param("statDay") int statDay, @Param("userCondition") UserCondition condition);
 
     /**
     * 统计总数

+ 2 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateMonthMapper.java

@@ -32,10 +32,11 @@ public interface ReadRateMonthMapper {
     * @author Andy
     * @date 15:01 2021/8/3
     * @param dto:
+    * @param statDay:
     * @param condition:
     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
     **/
-    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("statDay") int statDay, @Param("userCondition") UserCondition condition);
 
     /**
     * 统计总数

+ 2 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateTodayMapper.java

@@ -32,10 +32,11 @@ public interface ReadRateTodayMapper {
     * @author Andy
     * @date 15:02 2021/8/3
     * @param dto:
+    * @param statDay:
     * @param condition:
     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
     **/
-    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto,  @Param("statDay") int statDay, @Param("userCondition") UserCondition condition);
 
     /**
     * 统计总数

+ 2 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ReadRateYesterdayMapper.java

@@ -32,10 +32,11 @@ public interface ReadRateYesterdayMapper {
     * @author Andy
     * @date 15:02 2021/8/3
     * @param dto:
+    * @param statDay:
     * @param condition:
     * @return java.util.List<com.zcxk.rmcp.api.vo.ReadRateVo>
     **/
-    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("userCondition") UserCondition condition);
+    List<ReadRateVo> listReadRate(@Param("dto") ReadRateDto dto, @Param("statDay") int statDay,  @Param("userCondition") UserCondition condition);
 
     /**
     * 统计总数

+ 56 - 19
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/MeterReadRecordDao.java

@@ -1,5 +1,6 @@
 package com.zcxk.rmcp.core.dao.mongo;
 
+import com.zcxk.core.common.exception.BusinessException;
 import com.zcxk.core.common.pojo.PageResult;
 import com.zcxk.core.common.pojo.UserCondition;
 import com.zcxk.core.mongo.base.BaseDao;
@@ -11,12 +12,16 @@ import com.zcxk.core.utils.ZoniotIntegerUtils;
 import com.zcxk.core.utils.ZoniotStringUtils;
 import com.zcxk.rmcp.api.dto.meterreadrecord.MeterReadRecordDto;
 import com.zcxk.rmcp.api.dto.meterreadrecord.MeterReadRecordUpdateDto;
+import com.zcxk.rmcp.api.dto.readmeter.MeterData;
 import com.zcxk.rmcp.api.enums.ReadStatusEnum;
+import com.zcxk.rmcp.api.enums.RmcpErrorEnum;
 import com.zcxk.rmcp.api.vo.MeterReadRecordAggregationVo;
 import com.zcxk.rmcp.api.vo.MeterReadRecordVo;
+import com.zcxk.rmcp.core.dao.DeviceMapper;
 import com.zcxk.rmcp.core.entity.Device;
 import com.zcxk.rmcp.core.mongo.MeterReadRecord;
 import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.aggregation.*;
@@ -26,6 +31,7 @@ import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Repository;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -43,6 +49,9 @@ import java.util.Map;
 @Repository
 public class MeterReadRecordDao extends BaseDao<MeterReadRecord, String> implements BaseMongoDao {
 
+    @Resource
+    private DeviceMapper deviceMapper;
+
     /**
     * @author Andy
     * @description 根据日期和ID获取当前日期的抄表数据
@@ -66,6 +75,25 @@ public class MeterReadRecordDao extends BaseDao<MeterReadRecord, String> impleme
         return dataList.get(0);
     }
 
+    public MeterReadRecordVo findMeterReadRecord(Long id, Criteria childCriteria, String sortKey, Sort.Direction direction){
+        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
+        Aggregation agg = Aggregation.newAggregation(
+                Aggregation.match(Criteria.where("id").is(id)),
+                Aggregation.unwind("data"),
+                Aggregation.match(childCriteria),
+                Aggregation.sort(Sort.by(direction, sortKey))
+        ).withOptions(aggregationOptions);
+        AggregationResults<MeterReadRecordVo> durationData =
+                mongoTemplate.aggregate(agg, MeterReadRecord.class, MeterReadRecordVo.class);
+        List<MeterReadRecordVo> dataList = durationData.getMappedResults();
+        if (CollectionUtils.isEmpty(dataList)) {
+            return null;
+        }
+        return dataList.get(0);
+    }
+
+
+
     /**
     * @author Andy
     * @description 保存抄表记录
@@ -77,34 +105,43 @@ public class MeterReadRecordDao extends BaseDao<MeterReadRecord, String> impleme
         super.save(readRecord);
     }
 
-
     /**
+    * 更新读数和哟用水量
     * @author Andy
-    * @description 更新读数
-    * @date 15:27 2021/7/23
-    * @param dto
+    * @date 10:35 2021/8/30
+    * @param id:
+    * @param readDate:
+    * @param readData:
+    * @param lastCost:
     * @return long
     **/
-    public long updateReadData(MeterReadRecordUpdateDto dto){
-        MeterReadRecordVo meterReadRecordVo = findMeterReadRecord(dto.getId(), dto.getReadDate());
-        if (meterReadRecordVo == null) {
-            return 0;
-        }
+    public long updateReadData(long id, int readDate, BigDecimal readData,  BigDecimal lastCost){
         Query query = new Query();
-        query.addCriteria(Criteria.where("id").is(dto.getId()));
-        query.addCriteria(Criteria.where("data.readDate").is(Integer.parseInt(dto.getReadDate().replaceAll("-",""))));
+        query.addCriteria(Criteria.where("id").is(id));
+        query.addCriteria(Criteria.where("data.readDate").is(readDate));
         Update update = new Update();
-        update.set("data.$.readData",dto.getReadData());
+        update.set("data.$.readData" , readData.doubleValue());
         update.set("data.$.readStatus", ReadStatusEnum.READ.getCode());
         update.set("data.$.readTime", System.currentTimeMillis());
-        Double lastValid = meterReadRecordVo.getData().getLastValid();
-        if (lastValid == null) {
-            update.set("data.$.lastCost", new BigDecimal(dto.getReadData()));
-        } else {
-            update.set("data.$.lastCost", BigDecimalUtils.subtract(meterReadRecordVo.getData().getLastValid(), new BigDecimal(dto.getReadData())));
-        }
+        update.set("data.$.lastCost", lastCost.doubleValue());
         update.set("data.$.createBy", UserUtil.getCurrentUser().getUsername());
-        return upsert(query,update).getModifiedCount();
+        long total =  upsert(query,update).getModifiedCount();
+        if (total > 0 ) {
+            Device device = deviceMapper.findById(id);
+            if (device != null) {
+                LocalDateTime localDateTime = device.getLastReceiveTime();
+                int monthLength     = (localDateTime.getMonthValue() + "").length();
+                String monthValue   = monthLength ==  1 ? "0" + localDateTime.getMonthValue() : localDateTime.getMonthValue() + "";
+                int eqDate       = Integer.parseInt(localDateTime.getYear() + "" + monthValue + "" + localDateTime.getDayOfMonth());
+                if (readDate >= eqDate) {
+                    Device deviceUpdate = new Device();
+                    deviceUpdate.setId(id);
+                    deviceUpdate.setReadData(readData.toPlainString());
+                    deviceMapper.updateByDeviceData(deviceUpdate);
+                }
+            }
+        }
+        return total;
     }
 
     /**

+ 6 - 2
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRate7Day.xml

@@ -61,8 +61,11 @@
     <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 test="dto.readRateBegin != null and dto.readRateEnd == null">
+      and rd.read_rate >= #{dto.readRateBegin}
+    </if>
+    <if test="dto.readRateBegin == null and dto.readRateEnd != null">
+      and #{dto.readRateEnd} >= rd.read_rate
     </if>
     <include refid="permissionCondition"></include>
   </select>
@@ -80,6 +83,7 @@
     left join rmcp_community rm on rm.id = rd.community_id
     where
     1=1
+    and stat_day = #{statDay}
     <if test="dto.categoryId != null and dto.categoryId != ''">
       and rd.category_id = #{dto.categoryId}
     </if>

+ 6 - 2
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateMonth.xml

@@ -60,8 +60,11 @@
     <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 test="dto.readRateBegin != null and dto.readRateEnd == null">
+      and rd.read_rate >= #{dto.readRateBegin}
+    </if>
+    <if test="dto.readRateBegin == null and dto.readRateEnd != null">
+      and #{dto.readRateEnd} >= rd.read_rate
     </if>
     <include refid="permissionCondition"></include>
   </select>
@@ -79,6 +82,7 @@
     left join rmcp_community rm on rm.id = rd.community_id
     where
     1=1
+    and stat_day = #{statDay}
     <if test="dto.categoryId != null and dto.categoryId != ''">
       and rd.category_id = #{dto.categoryId}
     </if>

+ 6 - 2
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateToday.xml

@@ -61,8 +61,11 @@
     <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 test="dto.readRateBegin != null and dto.readRateEnd == null">
+      and rd.read_rate >= #{dto.readRateBegin}
+    </if>
+    <if test="dto.readRateBegin == null and dto.readRateEnd != null">
+      and #{dto.readRateEnd} >= rd.read_rate
     </if>
     <include refid="permissionCondition"></include>
   </select>
@@ -80,6 +83,7 @@
     left join rmcp_community rm on rm.id = rd.community_id
     where
     1=1
+    and stat_day = #{statDay}
     <if test="dto.categoryId != null and dto.categoryId != ''">
       and rd.category_id = #{dto.categoryId}
     </if>

+ 6 - 2
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ReadRateYesterday.xml

@@ -60,8 +60,11 @@
     <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 test="dto.readRateBegin != null and dto.readRateEnd == null">
+      and rd.read_rate >= #{dto.readRateBegin}
+    </if>
+    <if test="dto.readRateBegin == null and dto.readRateEnd != null">
+      and #{dto.readRateEnd} >= rd.read_rate
     </if>
     <include refid="permissionCondition"></include>
   </select>
@@ -80,6 +83,7 @@
     left join rmcp_community rm on rm.id = rd.community_id
     where
     1=1
+    and stat_day = #{statDay}
     <if test="dto.categoryId != null and dto.categoryId != ''">
       and rd.category_id = #{dto.categoryId}
     </if>

+ 4 - 0
zoniot-rmcp/zoniot-rmcp-web/pom.xml

@@ -61,6 +61,10 @@
             <groupId>com.zcxk</groupId>
             <artifactId>zoniot-core-mysql</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.zcxk</groupId>
+            <artifactId>zoniot-core-redis</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>

+ 2 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/MeterReadRecordService.java

@@ -28,7 +28,8 @@ public interface MeterReadRecordService {
     void saveMeterReadRecord(MeterReadRecord readRecord);
 
     /**
-    * 更新读数
+    * 更新读数和用水量
+     * 今天要修改读数- 昨天的读数 = 今天用水量
     * @author Andy
     * @date 14:53 2021/8/3
     * @param dto:

+ 73 - 2
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/MeterReadRecordServiceImpl.java

@@ -3,18 +3,30 @@ package com.zcxk.rmcp.web.service.impl;
 import com.zcxk.core.common.exception.BusinessException;
 import com.zcxk.core.common.pojo.PageResult;
 import com.zcxk.core.oauth2.util.UserUtil;
+import com.zcxk.core.utils.BigDecimalUtils;
+import com.zcxk.core.utils.CacheClient;
+import com.zcxk.core.utils.DateUtil;
+import com.zcxk.core.utils.util.RedisUtil;
 import com.zcxk.rmcp.api.dto.meterreadrecord.MeterReadRecordDeviceDto;
 import com.zcxk.rmcp.api.dto.meterreadrecord.MeterReadRecordDto;
 import com.zcxk.rmcp.api.dto.meterreadrecord.MeterReadRecordUpdateDto;
+import com.zcxk.rmcp.api.dto.readmeter.MeterData;
+import com.zcxk.rmcp.api.enums.ReadStatusEnum;
 import com.zcxk.rmcp.api.enums.RmcpErrorEnum;
 import com.zcxk.rmcp.api.vo.MeterReadRecordVo;
 import com.zcxk.rmcp.core.dao.mongo.MeterReadRecordDao;
 import com.zcxk.rmcp.core.mongo.MeterReadRecord;
 import com.zcxk.rmcp.web.service.MeterReadRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
 
@@ -27,10 +39,18 @@ import java.util.List;
 @Service
 public class MeterReadRecordServiceImpl implements MeterReadRecordService {
 
+
+    @Autowired
+    private CacheClient cacheClient;
+
+    /**
+     * 水表最后数据缓存前缀
+     */
+    public static final String PREFIX_CACHE_FLAG = "last-meter-data:";
+
     @Resource
     private MeterReadRecordDao meterReadRecordDao;
 
-
     @Override
     public void saveMeterReadRecord(MeterReadRecord readRecord) {
         for (MeterReadRecord.MeterReadInfo datum : readRecord.getData()) {
@@ -41,7 +61,33 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
 
     @Override
     public long updateReadData(MeterReadRecordUpdateDto dto) {
-        long total =  meterReadRecordDao.updateReadData(dto);
+        MeterReadRecordVo readRecordVo = meterReadRecordDao.findMeterReadRecord(dto.getId(), dto.getReadDate());
+        if (readRecordVo == null) {
+            throw BusinessException.builder(RmcpErrorEnum.RMCP_NOT_FOUND);
+        }
+        if (readRecordVo.getData().getReadStatus().equals(ReadStatusEnum.READ.getMessage())) {
+            throw BusinessException.builder(RmcpErrorEnum.RMCP_UPDATE_FAIL.getStatus(), "该设备已抄表,不能再更新读数。");
+        }
+        long total;
+        // 上一次读数
+        Double prevReadData = 0D;
+        String queryDate    = dto.getReadDate().replaceAll("-","");
+        LocalDate localDate = DateUtil.parseLocalDate(new Date());
+        int monthLength     = (localDate.getMonthValue() + "").length();
+        String monthValue   = monthLength ==  1 ? "0" + localDate.getMonthValue() : localDate.getMonthValue() + "";
+        String eqDate       = localDate.getYear() + "" + monthValue + "" + localDate.getDayOfMonth();
+        if (!eqDate.equals(queryDate)) {
+            total = meterReadRecordDao.updateReadData(dto.getId(), Integer.parseInt(queryDate), dto.getReadData(), new BigDecimal("0"));
+        } else {
+            // 获取上一个记录
+            MeterReadRecordVo prevVo = findPrevRecord(dto.getId(), Integer.parseInt(queryDate));
+            if (prevVo != null) {
+                prevReadData = prevVo.getData().getReadData();
+            }
+            // 当前读数 - 上一次读数 = 当前用水量
+            BigDecimal lastCost  = BigDecimalUtils.subtract(dto.getReadData(), prevReadData);
+            total = meterReadRecordDao.updateReadData(dto.getId(), Integer.parseInt(queryDate), dto.getReadData(), lastCost);
+        }
         if (total == 0) {
             throw BusinessException.builder(RmcpErrorEnum.RMCP_UPDATE_FAIL);
         }
@@ -63,4 +109,29 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
     public List<MeterReadRecordVo> listSingleDeviceTimeWaterConsumption(MeterReadRecordDeviceDto dto) {
         return meterReadRecordDao.queryDeviceMeterReadRecordWithCondtion(dto.getDeviceId(), dto.getStartDate(),dto.getEndDate());
     }
+
+    /**
+    * 获取上一个记录
+    * @author Andy
+    * @date 10:21 2021/8/30
+    * @param id:
+    * @param currentDate: 当前时间
+    * @return com.zcxk.rmcp.api.vo.MeterReadRecordVo
+    **/
+    private MeterReadRecordVo findPrevRecord(Long id, Integer currentDate){
+        return meterReadRecordDao.findMeterReadRecord(id, Criteria.where("data.readDate").lt(currentDate) ,"data.readDate", Sort.Direction.DESC);
+    }
+
+    /**
+    * 获取下一个记录
+    * @author Andy
+    * @date 10:21 2021/8/30
+    * @param id:
+    * @param currentDate: 当前时间
+    * @return com.zcxk.rmcp.api.vo.MeterReadRecordVo
+    **/
+    private MeterReadRecordVo findNextRecord(Long id, Integer currentDate){
+        return meterReadRecordDao.findMeterReadRecord(id, Criteria.where("data.readDate").gt(currentDate) ,"data.readDate", Sort.Direction.ASC);
+    }
+
 }

+ 4 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRate7DayServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zcxk.rmcp.web.service.impl.readrate;
 
 import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.core.utils.DateUtil;
 import com.zcxk.rmcp.api.dto.readrate.ReadRateDto;
 import com.zcxk.rmcp.api.enums.ReadRateEnum;
 import com.zcxk.rmcp.api.vo.ReadRateVo;
@@ -10,6 +11,8 @@ import com.zcxk.rmcp.web.service.AbstractReadRateService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -31,7 +34,7 @@ public class ReadRate7DayServiceImpl extends AbstractReadRateService {
 
     @Override
     public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
-        return readRate7DayMapper.listReadRate(dto, userCondition);
+        return readRate7DayMapper.listReadRate(dto, DateUtil.parseInt(new Date(), -1),  userCondition);
     }
 
     @Override

+ 8 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRateMonthServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zcxk.rmcp.web.service.impl.readrate;
 
 import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.core.utils.DateUtil;
 import com.zcxk.rmcp.api.dto.readrate.ReadRateDto;
 import com.zcxk.rmcp.api.enums.ReadRateEnum;
 import com.zcxk.rmcp.api.vo.ReadRateVo;
@@ -10,6 +11,8 @@ import com.zcxk.rmcp.web.service.AbstractReadRateService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -31,7 +34,11 @@ public class ReadRateMonthServiceImpl extends AbstractReadRateService {
 
     @Override
     public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
-        return readRateMonthMapper.listReadRate(dto, userCondition);
+        LocalDate localDate = DateUtil.parseLocalDate(new Date());
+        localDate = localDate.plusMonths(-1);
+        String month =  (localDate.getMonthValue() +"").length() == 1 ? "0" + localDate.getMonthValue() : localDate.getMonthValue() +"";
+        int queryDate = Integer.parseInt(localDate.getYear() + "" + month);
+        return readRateMonthMapper.listReadRate(dto, queryDate, userCondition);
     }
 
     @Override

+ 3 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRateTodayServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zcxk.rmcp.web.service.impl.readrate;
 
 import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.core.utils.DateUtil;
 import com.zcxk.rmcp.api.dto.readrate.ReadRateDto;
 import com.zcxk.rmcp.api.enums.ReadRateEnum;
 import com.zcxk.rmcp.api.vo.ReadRateVo;
@@ -10,6 +11,7 @@ import com.zcxk.rmcp.web.service.AbstractReadRateService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -31,7 +33,7 @@ public class ReadRateTodayServiceImpl extends AbstractReadRateService {
 
     @Override
     public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
-        return readRateTodayMapper.listReadRate(dto, userCondition);
+        return readRateTodayMapper.listReadRate(dto, DateUtil.parseInt(new Date(), 0), userCondition);
     }
 
     @Override

+ 3 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/readrate/ReadRateYesterdayServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zcxk.rmcp.web.service.impl.readrate;
 
 import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.core.utils.DateUtil;
 import com.zcxk.rmcp.api.dto.readrate.ReadRateDto;
 import com.zcxk.rmcp.api.enums.ReadRateEnum;
 import com.zcxk.rmcp.api.vo.ReadRateVo;
@@ -10,6 +11,7 @@ import com.zcxk.rmcp.web.service.AbstractReadRateService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -31,7 +33,7 @@ public class ReadRateYesterdayServiceImpl extends AbstractReadRateService {
 
     @Override
     public List<ReadRateVo> listReadRate(ReadRateDto dto, UserCondition userCondition) {
-        return readRateYesterdayMapper.listReadRate(dto, userCondition);
+        return readRateYesterdayMapper.listReadRate(dto, DateUtil.parseInt(new Date(), -1), userCondition);
     }
 
     @Override