Browse Source

接收数据

lin 3 years ago
parent
commit
1a535a5405
22 changed files with 549 additions and 42 deletions
  1. 1 0
      zoniot-rmcp/pom.xml
  2. 19 0
      zoniot-rmcp/zoniot-rmcp-alarm/pom.xml
  3. 20 0
      zoniot-rmcp/zoniot-rmcp-alarm/src/main/java/com/bz/rmcp/alarm/RmcpAlarmApplication.java
  4. 8 0
      zoniot-rmcp/zoniot-rmcp-alarm/src/main/java/com/bz/rmcp/alarm/service/impl.java
  5. 8 0
      zoniot-rmcp/zoniot-rmcp-alarm/src/main/java/com/bz/rmcp/alarm/service/tt.java
  6. 6 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceVo.java
  7. 6 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java
  8. 3 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/DeviceDataDao.java
  9. 3 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/entity/Product.java
  10. 2 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml
  11. 1 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mongo/MeterReadRecord.java
  12. 2 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/RmcpDapApplication.java
  13. 27 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/common/Constants.java
  14. 29 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/config/CurrentRedisConfig.java
  15. 20 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/model/MeasureInfo.java
  16. 26 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/model/MeterData.java
  17. 11 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/service/ProductService.java
  18. 213 29
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/service/impl/DeviceDataServiceImpl.java
  19. 26 0
      zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/service/impl/ProductServiceImpl.java
  20. 99 7
      zoniot-rmcp/zoniot-rmcp-dap/src/test/java/com/bz/rmcp/dap/DeviceDataServiceTests.java
  21. 17 2
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/ImportFileService.java
  22. 2 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/resources/application-dev.properties

+ 1 - 0
zoniot-rmcp/pom.xml

@@ -18,6 +18,7 @@
         <module>zoniot-xxljob-client</module>
         <module>zoniot-rmcp-sync</module>
         <module>zoniot-rmcp-dap</module>
+        <module>zoniot-rmcp-alarm</module>
     </modules>
 
     <properties>

+ 19 - 0
zoniot-rmcp/zoniot-rmcp-alarm/pom.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>zoniot-rmcp</artifactId>
+        <groupId>com.zcxk</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>zoniot-rmcp-alarm</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+</project>

+ 20 - 0
zoniot-rmcp/zoniot-rmcp-alarm/src/main/java/com/bz/rmcp/alarm/RmcpAlarmApplication.java

@@ -0,0 +1,20 @@
+package com.bz.rmcp.alarm;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 9:53
+ */
+@SpringBootApplication
+public class RmcpAlarmApplication {
+    public static void main(String[] args) throws UnknownHostException {
+        ApplicationContext context = SpringApplication.run(RmcpAlarmApplication.class, args);
+    }
+}

+ 8 - 0
zoniot-rmcp/zoniot-rmcp-alarm/src/main/java/com/bz/rmcp/alarm/service/impl.java

@@ -0,0 +1,8 @@
+package com.bz.rmcp.alarm.service;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 18:43
+ */
+public class impl {
+}

+ 8 - 0
zoniot-rmcp/zoniot-rmcp-alarm/src/main/java/com/bz/rmcp/alarm/service/tt.java

@@ -0,0 +1,8 @@
+package com.bz.rmcp.alarm.service;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 18:43
+ */
+public class tt {
+}

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceVo.java

@@ -16,6 +16,12 @@ public class DeviceVo {
     @ApiModelProperty(value="id")
     private Long id;
 
+    @ApiModelProperty(value="租户")
+    private String tenantId;
+
+    @ApiModelProperty(value="分类")
+    private Integer categoryId;
+
     @ApiModelProperty(value="公司")
     private Integer companyOrgId;
 

+ 6 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java

@@ -131,5 +131,11 @@ public interface DeviceMapper {
      **/
     List<InstallDeviceDto> getUnInstallDeviceList(@Param("tenantId") String tenantId, @Param("companyOrgId") Integer companyOrgId, @Param("deptOrgId") Integer deptOrgId,@Param("productId") Integer productId, @Param("listId") Integer listId);
 
+    /*
+     * @description deviceNo获取设备
+     * @param deviceNo
+     * @return com.zcxk.rmcp.core.entity.Device
+     * @author linqingwei
+     **/
     Device findByDeviceNo(String deviceNo);
 }

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

@@ -88,7 +88,9 @@ public class DeviceDataDao  extends BaseDao<DeviceData, String> implements BaseM
         AggregationResults<JSONObject> reminds = mongoTemplate.aggregate(aggregation, "rmcp_device_data", JSONObject.class);
         List<JSONObject> mappedResults = reminds.getMappedResults();
         if (mappedResults != null && mappedResults.size() > 0) {
-            list.add(JSONObject.parseObject(mappedResults.get(0).getJSONObject("data").toJSONString(), DeviceDataItem.class));
+            for (JSONObject mappedResult : mappedResults) {
+                list.add(JSONObject.parseObject(mappedResult.getJSONObject("data").toJSONString(), DeviceDataItem.class));
+            }
         }
 
         return list;

+ 3 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/entity/Product.java

@@ -2,6 +2,8 @@ package com.zcxk.rmcp.core.entity;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
 import java.time.LocalDateTime;
 import lombok.Data;
 
@@ -12,7 +14,7 @@ import lombok.Data;
  */
 @ApiModel(value="产品(设备类型)")
 @Data
-public class Product {
+public class Product implements Serializable {
     @ApiModelProperty(value="")
     private Integer id;
 

+ 2 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml

@@ -391,6 +391,8 @@
   <select id="findDetail" resultType="com.zcxk.rmcp.api.vo.DeviceDetailVo">
     select
       rd.id,
+      rd.tenant_id,
+      rd.category_id,
       rd.company_org_id,
       rd.dept_org_id,
       rd.product_id,

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

@@ -18,7 +18,7 @@ import java.util.List;
  * @date 2021/7/22
  **/
 @Data
-@Document(collection = "meter_read_record")
+@Document(collection = "rmcp_meter_read_record")
 @ToString
 public class MeterReadRecord extends BaseDO {
 

+ 2 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/RmcpDapApplication.java

@@ -6,6 +6,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.env.Environment;
 
@@ -18,6 +19,7 @@ import java.net.UnknownHostException;
  */
 
 @Slf4j
+@EnableCaching  //开启缓存
 @SpringBootApplication
 public class RmcpDapApplication implements CommandLineRunner {
     public static void main(String[] args) {

+ 27 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/common/Constants.java

@@ -0,0 +1,27 @@
+package com.bz.rmcp.dap.common;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 10:34
+ */
+public class Constants {
+    /**
+     * 系统标识符
+     */
+    public static final String SYS_FLAG = "system";
+
+    /**
+     * 水表最后数据缓存前缀
+     */
+    public static final String PREFIX_CACHE_FLAG = "LAST-METER-DATA:";
+
+    /**
+     * 抄表记录表名称
+     */
+    public static final String METER_READ_RECORD_TABLE = "rmcp_meter_read_record";
+
+    /**
+     * 设备数据表名称
+     */
+    public static final String DEVICE_DATA_TABLE = "rmcp_device_data";
+}

+ 29 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/config/CurrentRedisConfig.java

@@ -0,0 +1,29 @@
+package com.bz.rmcp.dap.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+
+import java.net.UnknownHostException;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 11:07
+ */
+@Configuration
+public class CurrentRedisConfig {
+    @Bean
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
+        template.setConnectionFactory(redisConnectionFactory);
+        //Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
+        template.setDefaultSerializer(serializer);
+
+        return template;
+    }
+
+}

+ 20 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/model/MeasureInfo.java

@@ -0,0 +1,20 @@
+package com.bz.rmcp.dap.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 16:30
+ */
+@Data
+public class MeasureInfo {
+    @ApiModelProperty(value="日期")
+    private Date receiveDate;
+
+    @ApiModelProperty(value="测点map")
+    Map<String, Object> measureMap;
+}

+ 26 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/model/MeterData.java

@@ -0,0 +1,26 @@
+package com.bz.rmcp.dap.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 10:58
+ */
+@Data
+public class MeterData {
+
+    @ApiModelProperty(value="设备id")
+    private Long deviceId;
+
+    @ApiModelProperty(value="读数")
+    private Double readData = 0D;
+
+    @ApiModelProperty(value="阀门状态 0:关,1:开,2:无阀")
+    private Integer valveStatus;
+
+    @ApiModelProperty(value="日期")
+    private Date receiveDate;
+}

+ 11 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/service/ProductService.java

@@ -0,0 +1,11 @@
+package com.bz.rmcp.dap.service;
+
+import com.zcxk.rmcp.core.entity.Product;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 15:48
+ */
+public interface ProductService {
+    Product findProductByCache(Integer productId);
+}

+ 213 - 29
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/service/impl/DeviceDataServiceImpl.java

@@ -1,4 +1,12 @@
 package com.bz.rmcp.dap.service.impl;
+import com.bz.rmcp.dap.common.Constants;
+import com.bz.rmcp.dap.model.MeasureInfo;
+import com.bz.rmcp.dap.model.MeterData;
+import com.bz.rmcp.dap.service.ProductService;
+import com.google.common.collect.Lists;
+
+import java.math.BigDecimal;
+import java.util.Date;
 import com.alibaba.fastjson.JSONObject;
 
 import java.time.LocalDateTime;
@@ -10,18 +18,22 @@ import com.bz.rmcp.dap.service.DeviceDataService;
 import com.zcxk.core.common.util.SnowflakeIdWorker;
 import com.zcxk.core.utils.DateUtil;
 import com.zcxk.rmcp.api.enums.DeviceStatusEnum;
+import com.zcxk.rmcp.api.enums.ValveStatusEnum;
+import com.zcxk.rmcp.api.vo.DeviceDetailVo;
 import com.zcxk.rmcp.core.dao.DeviceMapper;
 import com.zcxk.rmcp.core.dao.ProductMapper;
 import com.zcxk.rmcp.core.entity.Device;
 import com.zcxk.rmcp.core.entity.Product;
 import com.zcxk.rmcp.core.mongo.DeviceData;
 import com.zcxk.rmcp.core.mongo.DeviceDataItem;
+import com.zcxk.rmcp.core.mongo.MeterReadRecord;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -42,33 +54,173 @@ public class DeviceDataServiceImpl implements DeviceDataService {
     @Autowired
     private MongoTemplate mongoTemplate;
     @Autowired
-    private ProductMapper productMapper;
+    private ProductService productService;
+    @Autowired
+    private RedisTemplate redisTemplate;
 
     @Override
     public int saveDeviceData(DeviceOrigDataDTO data) {
-        log.info("begin saveDeviceData,device = {} ,data = {}" , JSON.toJSONString(data));
+        log.info("begin saveDeviceData ,data = {}" , JSON.toJSONString(data));
         Device device = deviceMapper.findByDeviceNo(data.getDeviceNo());
         if (device != null) {
             // 1,保存设备测点数据
-            Map<String,Object> measureMap = saveDeviceMeasuringDatas(device,data);
+            MeasureInfo measureInfo = saveDeviceMeasuringData(device,data);
 
-            // 2,更新设备
-            updateDevice(device,measureMap);
+            // 2,更新设备信息
+            MeterData meterData = updateDevice(device,measureInfo);
+
+            // 3,保存抄表数据
+            saveReadingData(meterData);
 
         }
         log.info("end saveDeviceData");
         return 0;
     }
 
+    /*
+     * @description 保存抄表数据
+     * @param updateDevice
+     * @return void
+     * @author linqingwei
+     **/
+    private void saveReadingData(MeterData meterData) {
+        log.info("begin saveReadingData ,meterData = {}" , JSON.toJSONString(meterData));
+        MeterReadRecord.MeterReadInfo meterReadInfo =  buildMeterReadInfo(meterData);
+
+        //更新数据项
+        Query updateQuery = new Query();
+        updateQuery.addCriteria(Criteria.where("deviceId").is(meterData.getDeviceId()));
+        updateQuery.addCriteria(Criteria.where("data.readDate").is(DateUtil.getDate(new Date())));
+        Update update = new Update();
+        update.set("data.$.readTime",meterData.getReceiveDate());
+        update.set("data.$.readData",meterData.getReadData());
+        update.set("data.$.valveStatus",meterData.getValveStatus());
+        update.set("data.$.lastValid",meterReadInfo.getLastValid());
+        update.inc("data.$.lastCost", meterReadInfo.getLastCost());
+        long updateResult = mongoTemplate.updateMulti(updateQuery,update,Constants.METER_READ_RECORD_TABLE).getModifiedCount();
+        if(updateResult == 0){
+            //更新失败推送数据
+            Query pushQuery = new Query();
+            pushQuery.addCriteria(Criteria.where("deviceId").is(meterData.getDeviceId()));
+            Update push = new Update();
+            push.push("data",meterReadInfo);
+            long pushResult = mongoTemplate.updateMulti(pushQuery,push,Constants.METER_READ_RECORD_TABLE).getModifiedCount();
+            if(pushResult == 0){
+                //推送失败插入数据
+                MeterReadRecord meterReadRecord = buildMeterReadRecord(meterData,meterReadInfo);
+                mongoTemplate.insert(meterReadRecord,Constants.METER_READ_RECORD_TABLE);
+            }
+        }
+
+        //保存最新抄表信息到缓存中
+        redisTemplate.opsForValue().set(Constants.PREFIX_CACHE_FLAG+meterData.getDeviceId(),meterData);
+        log.info("end saveReadingData");
+    }
+
+    /*
+     * @description 构建MeterReadInfo
+     * @param device
+     * @return com.zcxk.rmcp.core.mongo.MeterReadRecord.MeterReadInfo
+     * @author linqingwei
+     **/
+    private MeterReadRecord.MeterReadInfo buildMeterReadInfo(MeterData meterData) {
+        // 上次表数据
+        MeterData lastMeterData =  getMeterLastData(meterData);
+        // 计算今日用水量
+        BigDecimal todayCost = calculateTodayCost(meterData.getReadData(), lastMeterData.getReadData());
+        
+        MeterReadRecord.MeterReadInfo readInfo = new MeterReadRecord.MeterReadInfo();
+        readInfo.setReadDate(DateUtil.getDate(new Date()));
+        readInfo.setReadTime(meterData.getReceiveDate());
+        readInfo.setValveStatus(meterData.getValveStatus());
+        readInfo.setReadData(meterData.getReadData());
+        readInfo.setLastValid(lastMeterData.getReadData());
+        readInfo.setLastCost(todayCost.doubleValue());//用水量
+        return readInfo;
+    }
+
+    private BigDecimal calculateTodayCost(Double currentReading, Double lastValid) {
+        BigDecimal currentValidDecimal = new BigDecimal(currentReading);
+        BigDecimal lastValidDecimal = new BigDecimal(lastValid);
+        return currentValidDecimal.subtract(lastValidDecimal);
+    }
+
+
+    /*
+     * @description 获取最后抄表数据
+     * @param waterMeter
+     * @param readDate
+     * @return java.lang.String
+     * @author linqingwei
+     **/
+    private MeterData getMeterLastData(MeterData meterData){
+        MeterData data = null;
+        data = getMeterLastDataFromCache(meterData.getDeviceId());
+        if(data==null){
+            data = new MeterData();
+        }
+
+        return data;
+    }
+
+    private MeterData getMeterLastDataFromCache(Long deviceId) {
+        return (MeterData) redisTemplate.opsForValue().get(Constants.PREFIX_CACHE_FLAG+deviceId);
+    }
+
+    /*
+     * @description 构建MeterReadRecord
+     * @param device
+     * @return com.zcxk.rmcp.core.mongo.MeterReadRecord
+     * @author linqingwei
+     **/
+    private MeterReadRecord buildMeterReadRecord(MeterData meterData,MeterReadRecord.MeterReadInfo meterReadInfo) {
+        DeviceDetailVo vo =  deviceMapper.findDetail(meterData.getDeviceId());
+
+        List<MeterReadRecord.MeterReadInfo> list = new ArrayList<>();
+        list.add(meterReadInfo);
+
+        MeterReadRecord readRecord = new MeterReadRecord();
+        readRecord.setYear(DateUtil.getYear(new Date()));
+        readRecord.setTenantId(vo.getTenantId());
+        readRecord.setCategoryId(vo.getCategoryId());
+        readRecord.setCompanyOrgId(vo.getCompanyOrgId());
+        readRecord.setCompanyOrgName(vo.getCompanyName());
+        readRecord.setDeptOrgId(vo.getDeptOrgId());
+        readRecord.setDeptOrgName(vo.getDeptName());
+        readRecord.setCommunityId(vo.getCommunityId());
+        readRecord.setCommunityName(vo.getCommunityName());
+        //readRecord.setConcentratorId(0);
+        //readRecord.setConcentratorCode("");
+        //readRecord.setCollectorId(0);
+        //readRecord.setCollectorCode("");
+        //readRecord.setChannelNumber("");
+        readRecord.setDeviceId(vo.getId());
+        readRecord.setDeviceNo(vo.getDeviceNo());
+        readRecord.setLocation(vo.getDeviceNo());
+        readRecord.setProductId(vo.getProductId());
+        readRecord.setDeviceModel(vo.getProductModel());
+        readRecord.setMeterNo(vo.getMeterNo());
+        readRecord.setFileNo(vo.getFileNo());
+        readRecord.setCreateTime(new Date());
+        readRecord.setCreatorName(Constants.SYS_FLAG);
+        readRecord.setUpdateTime(new Date());
+        readRecord.setData(list);
+
+        return readRecord;
+    }
+
     /*
      * @description 更新设备
      * @param device
      * @param measureMap
-     * @return void
+     * @return MeterData
      * @author linqingwei
      **/
-    private void updateDevice(Device device, Map<String, Object> measureMap) {
-        Product product = productMapper.findById(device.getProductId());
+    private MeterData updateDevice(Device device, MeasureInfo measureInfo) {
+        log.info("begin updateDevice ,device = {},measureInfo = {}" , JSON.toJSONString(device),JSON.toJSONString(measureInfo));
+        Map<String, Object> measureMap = measureInfo.getMeasureMap();
+
+        Product product = productService.findProductByCache(device.getProductId());
         Device update = new Device();
         update.setId(device.getId());
         update.setDeviceStatus(DeviceStatusEnum.NORMAL.getCode());
@@ -77,8 +229,24 @@ public class DeviceDataServiceImpl implements DeviceDataService {
         update.setLastReceiveTime(LocalDateTime.now());
         update.setUpdateDate(LocalDateTime.now());
         deviceMapper.updateByPrimaryKeySelective(update);
+
+        MeterData meterData = new MeterData();
+        meterData.setDeviceId(device.getId());
+        if(update.getReadData()!=null)meterData.setReadData(Double.valueOf(update.getReadData()));
+        if(update.getValveStatus()!=null)meterData.setValveStatus(update.getValveStatus());
+        meterData.setReceiveDate(measureInfo.getReceiveDate());
+
+        log.info("end updateDevice");
+        return meterData;
     }
 
+    /*
+     * @description 按抄表code获取读数
+     * @param measureMap
+     * @param product
+     * @return java.lang.String
+     * @author linqingwei
+     **/
     private String convertReadData(Map<String, Object> measureMap,Product product){
         Object temp = measureMap.get(product.getReadingMeasuringCode());
         if (temp != null) {
@@ -86,10 +254,21 @@ public class DeviceDataServiceImpl implements DeviceDataService {
         }
         return null;
     }
+
+    /*
+     * @description 按阀门code获取阀门状态
+     * @param measureMap
+     * @param product
+     * @return java.lang.Integer
+     * @author linqingwei
+     **/
     private Integer convertValveStatus(Map<String, Object> measureMap,Product product){
         Object temp = measureMap.get(product.getValveMeasuringCode());
         if (temp != null) {
-            return (Integer) measureMap.get(product.getValveMeasuringCode());
+            Integer valve =  Integer.valueOf((String) measureMap.get(product.getValveMeasuringCode()));
+            if(valve == 0)  return ValveStatusEnum.ON.getCode();
+            if(valve == 1)  return ValveStatusEnum.OFF.getCode();
+            return ValveStatusEnum.ABNORMAL.getCode();
         }
         return null;
     }
@@ -98,20 +277,25 @@ public class DeviceDataServiceImpl implements DeviceDataService {
      * @description 保存设备测点数据
      * @param device
      * @param data
-     * @return void
+     * @return MeasureInfo
      * @author linqingwei
      **/
-    private Map<String, Object> saveDeviceMeasuringDatas(Device device, DeviceOrigDataDTO data) {
-        Map<String, Object> measureMap = new HashMap<>();
-        // 3.保存数据
+    private MeasureInfo saveDeviceMeasuringData(Device device, DeviceOrigDataDTO data) {
+        MeasureInfo measureInfo = new MeasureInfo();
+        // 保存数据
         for (Map.Entry<Date, String> entry : data.getParsedData().entrySet()) {
 
             Date date = entry.getKey();
-            String value = entry.getValue();
+            String json = entry.getValue();
+
+
+            JSONObject jsonObject = JSONObject.parseObject(json);
+            Map<String, Object> measureMap = (Map<String, Object>)jsonObject;
+
+            measureInfo.setReceiveDate(date);
+            measureInfo.setMeasureMap(measureMap);
 
-            JSONObject jsonObject = JSONObject.parseObject(value);
-            measureMap = (Map<String, Object>)jsonObject;
-            DeviceDataItem deviceDataItem = buildDeviceDataItem(date ,measureMap);
+            DeviceDataItem deviceDataItem = buildDeviceDataItem(measureInfo);
 
 
             //更新数据项
@@ -119,15 +303,15 @@ public class DeviceDataServiceImpl implements DeviceDataService {
             query.addCriteria(Criteria.where("deviceId").is(device.getId()));
             Update update = new Update();
             update.push("data", deviceDataItem);
-            long result = mongoTemplate.updateMulti(query,update,"rmcp_device_data").getModifiedCount();
+            long updateResult = mongoTemplate.updateMulti(query,update,Constants.DEVICE_DATA_TABLE).getModifiedCount();
 
-            if(result == 0){
+            if(updateResult == 0){
                 //更新失败插入数据
-                DeviceData deviceData = buildDeviceData(device,date ,measureMap);
-                mongoTemplate.insert(deviceData,"rmcp_device_data");
+                DeviceData deviceData = buildDeviceData(device,measureInfo);
+                mongoTemplate.insert(deviceData,Constants.DEVICE_DATA_TABLE);
             }
         }
-        return measureMap;
+        return measureInfo;
     }
 
     /*
@@ -137,11 +321,11 @@ public class DeviceDataServiceImpl implements DeviceDataService {
      * @return com.zcxk.rmcp.core.mongo.DeviceDataItem
      * @author linqingwei
      **/
-    private DeviceDataItem buildDeviceDataItem(Date date, Map<String, Object> measureMap) {
+    private DeviceDataItem buildDeviceDataItem(MeasureInfo measureInfo) {
         DeviceDataItem dataItem = new DeviceDataItem();
-        dataItem.setReceiveDate(DateUtil.getDate(date));
-        dataItem.setReceiveTime(date.getTime());
-        dataItem.setMeasureData(measureMap);
+        dataItem.setReceiveDate(DateUtil.getDate(measureInfo.getReceiveDate()));
+        dataItem.setReceiveTime(measureInfo.getReceiveDate().getTime());
+        dataItem.setMeasureData(measureInfo.getMeasureMap());
         return dataItem;
     }
 
@@ -153,18 +337,18 @@ public class DeviceDataServiceImpl implements DeviceDataService {
      * @return com.zcxk.rmcp.core.mongo.DeviceData
      * @author linqingwei
      **/
-    private DeviceData buildDeviceData(Device device, Date date, Map<String, Object> measureMap) {
+    private DeviceData buildDeviceData(Device device, MeasureInfo measureInfo) {
         DeviceData deviceData = new DeviceData();
         deviceData.setId(idWorker.nextId());
         deviceData.setDeviceId(device.getId());
         deviceData.setYear(DateUtil.getYear(new Date()));
         deviceData.setStatus(1);
-        deviceData.setCreateBy("system");
+        deviceData.setCreateBy(Constants.SYS_FLAG);
         deviceData.setCreateDate(new Date());
 
         List<DeviceDataItem> list = new ArrayList<>();
 
-        DeviceDataItem dataItem = buildDeviceDataItem(date,measureMap);
+        DeviceDataItem dataItem = buildDeviceDataItem(measureInfo);
         list.add(dataItem);
 
         deviceData.setData(list);

+ 26 - 0
zoniot-rmcp/zoniot-rmcp-dap/src/main/java/com/bz/rmcp/dap/service/impl/ProductServiceImpl.java

@@ -0,0 +1,26 @@
+package com.bz.rmcp.dap.service.impl;
+
+import com.bz.rmcp.dap.service.ProductService;
+import com.zcxk.rmcp.core.dao.ProductMapper;
+import com.zcxk.rmcp.core.entity.Product;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * @author linqingwei
+ * @date 2021-08-05 15:48
+ */
+@Service
+public class ProductServiceImpl implements ProductService {
+
+    @Resource
+    private ProductMapper productMapper;
+
+    @Override
+    @Cacheable(value = "CacheProduct", key = "#productId",unless = "#result == null")
+    public Product findProductByCache(Integer productId) {
+        return productMapper.findById(productId);
+    }
+}

+ 99 - 7
zoniot-rmcp/zoniot-rmcp-dap/src/test/java/com/bz/rmcp/dap/DeviceDataServiceTests.java

@@ -1,28 +1,34 @@
 package com.bz.rmcp.dap;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import com.alibaba.fastjson.JSON;
-import com.bz.rmcp.dap.model.DeviceOrigDataItemDTO;
-import com.google.common.collect.Maps;
+import com.bz.rmcp.dap.model.MeterData;
 
 import com.bz.rmcp.dap.model.DeviceOrigDataDTO;
-import com.bz.rmcp.dap.service.DeviceDataService;
 import com.bz.rmcp.dap.service.impl.DeviceDataServiceImpl;
-import com.zcxk.rmcp.core.entity.Device;
+import com.google.common.collect.Lists;
+import com.zcxk.core.utils.DateUtil;
+import com.zcxk.rmcp.core.mongo.MeterReadRecord;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.test.context.junit4.SpringRunner;
 
 /**
  * @author linqingwei
  * @date 2021-08-03 18:16
  */
+@EnableCaching  //开启缓存
 @RunWith(SpringRunner.class)
 @SpringBootTest
 @ComponentScan(basePackages = {"com.zcxk","com.bz"})
@@ -31,6 +37,10 @@ public class DeviceDataServiceTests {
 
     @Autowired
     private DeviceDataServiceImpl deviceDataService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private MongoTemplate mongoTemplate;
 
     @Test
     public void DeviceDataTest(){
@@ -38,7 +48,9 @@ public class DeviceDataServiceTests {
 
 
         Map<String,Object> param = new HashMap<>();
-        param.put("temp",12);
+        param.put("currentQuantity",107.4);
+        param.put("valveState","1");
+        param.put("temp","0");
 
         Map<Date,String> map = new HashMap<>();
         map.put(new Date(),JSON.toJSONString(param));
@@ -60,4 +72,84 @@ public class DeviceDataServiceTests {
         deviceDataService.saveDeviceData(dto);
     }
 
+
+    @Test
+    public void redis(){
+        MeterData data = new MeterData();
+        data.setReadData(10.5);
+        data.setReceiveDate(new Date());
+
+        redisTemplate.opsForValue().set("test:111",data);
+
+        MeterData data1 = (MeterData) redisTemplate.opsForValue().get("test:222");
+        System.out.println(data1);
+    }
+
+    @Test
+    public void buildMeterReadData(){
+        MeterReadRecord readRecord = new MeterReadRecord();
+        readRecord.setYear(0);
+        readRecord.setTenantId("1");
+        readRecord.setCategoryId(1);
+        readRecord.setCompanyOrgId(1);
+        readRecord.setCompanyOrgName("");
+        readRecord.setDeptOrgId(1);
+        readRecord.setDeptOrgName("");
+        readRecord.setCommunityId(1);
+        readRecord.setCommunityName("");
+        readRecord.setConcentratorId(0);
+        readRecord.setConcentratorCode("");
+        readRecord.setCollectorId(0);
+        readRecord.setCollectorCode("");
+        readRecord.setDeviceId(1L);
+        readRecord.setDeviceNo("11111");
+        readRecord.setLocation("11111");
+        readRecord.setProductId(1);
+        readRecord.setDeviceModel("");
+        readRecord.setChannelNumber("");
+        readRecord.setMeterNo("11111");
+        readRecord.setFileNo("11111");
+
+        readRecord.setCreateTime(new Date());
+        readRecord.setCreatorName("system");
+        readRecord.setUpdateTime(new Date());
+        List<MeterReadRecord.MeterReadInfo> list = new ArrayList<>();
+        MeterReadRecord.MeterReadInfo info1 = new MeterReadRecord.MeterReadInfo();
+        info1.setReadDate(20210801);
+        info1.setReadTime(new Date());
+        info1.setValveStatus(1);
+        info1.setReadData(1.5D);
+        info1.setLastValid(1.4D);
+        info1.setLastCost(0.1D);
+        list.add(info1);
+
+        MeterReadRecord.MeterReadInfo info2 = new MeterReadRecord.MeterReadInfo();
+        info2.setReadDate(20210805);
+        info2.setReadTime(new Date());
+        info2.setValveStatus(1);
+        info2.setReadData(2.6D);
+        info2.setLastValid(1.5D);
+        info2.setLastCost(1.1D);
+        list.add(info2);
+
+
+        readRecord.setData(list);
+        mongoTemplate.insert(readRecord,"rmcp_meter_read_record");
+    }
+
+    @Test
+    public void updateMeterReadData(){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("deviceId").is(1L));
+        query.addCriteria(Criteria.where("data.readDate").is(20210805));
+        Update update = new Update();
+        update.set("data.$.readTime",new Date());
+        update.set("data.$.readData",3.6D);
+        update.set("data.$.valveStatus",1);
+        update.set("data.$.lastValid",3.6D);
+        update.inc("data.$.lastCost", 0.1);
+        long result = mongoTemplate.updateMulti(query,update,"rmcp_meter_read_record").getModifiedCount();
+        System.out.println(result);
+    }
+
 }

+ 17 - 2
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/ImportFileService.java

@@ -17,7 +17,22 @@ public interface ImportFileService{
 
     int updateByPrimaryKeySelective(ImportFile record);
 
-        void importExcel(Integer categoryId, Integer importType, MultipartFile file);
-
+    /*
+     * @description 导入excel
+     * @param categoryId
+     * @param importType
+     * @param file
+     * @return void
+     * @author linqingwei
+     **/
+    void importExcel(Integer categoryId, Integer importType, MultipartFile file);
+
+    /*
+     * @description 下载失败文件
+     * @param objId
+     * @param response
+     * @return void
+     * @author linqingwei
+     **/
     void downloadFailFile(Integer objId, HttpServletResponse response);
 }

+ 2 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/resources/application-dev.properties

@@ -103,7 +103,8 @@ spring.rabbitmq.publisher-returns=true
 spring.rabbitmq.template.mandatory=true
 
 #mongodb url
-spring.data.mongodb.uri=mongodb://10.0.0.63:27017/meter-reading-database
+#spring.data.mongodb.uri=mongodb://10.0.0.63:27017/meter-reading-database
+spring.data.mongodb.uri=mongodb://127.0.0.1:27017/meter-reading-database
 logging.level.org.springframework.data.mongodb.core=DEBUG
 
 receive.exchange.name=messageExchangeTest