Browse Source

遵义新区用水信息同步修改

pengdi@zoniot.com 4 years ago
parent
commit
e8ee9ec47f

+ 34 - 0
smart-city-platform/src/main/java/com/bz/smart_city/dao/MeterPushDataMapper.java

@@ -0,0 +1,34 @@
+package com.bz.smart_city.dao;
+
+import com.bz.smart_city.entity.MeterPushData;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p></p>
+ * @Author wilian.peng
+ * @Date 2020/9/23 17:56
+ * @Version 1.0
+ */
+@Mapper
+public interface MeterPushDataMapper {
+    int deleteByPrimaryKey(@Param("deviceId") Long deviceId, @Param("syncDate") Integer syncDate);
+
+    int insert(MeterPushData record);
+
+    int insertOrUpdate(MeterPushData record);
+
+    int insertOrUpdateSelective(MeterPushData record);
+
+    int insertSelective(MeterPushData record);
+
+    MeterPushData selectByPrimaryKey(@Param("deviceId") Long deviceId, @Param("syncDate") Integer syncDate);
+
+    int updateByPrimaryKeySelective(MeterPushData record);
+
+    int updateByPrimaryKey(MeterPushData record);
+
+    int batchInsert(@Param("list") List<MeterPushData> list);
+}

+ 3 - 0
smart-city-platform/src/main/java/com/bz/smart_city/dao/MeterReadRecordMapper.java

@@ -100,4 +100,7 @@ public interface MeterReadRecordMapper {
     List<MeterReadRecord> findSyncMeterRecord(@Param("deviceIds")List<Long>deviceIds,
                                               @Param("readTime") String readTime);
 
+    // 查询水表最后一次抄表数据
+    MeterReadRecord findMeterLastReadRecord(@Param("deviceId") Long deviceId);
+
 }

+ 89 - 0
smart-city-platform/src/main/java/com/bz/smart_city/entity/MeterPushData.java

@@ -0,0 +1,89 @@
+package com.bz.smart_city.entity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * <p></p>
+ * @Author wilian.peng
+ * @Date 2020/9/23 17:56
+ * @Version 1.0
+ */
+@Data
+public class MeterPushData {
+    /**
+    * 设备Id
+    */
+    private Long deviceId;
+
+    /**
+    * 同步日期,格式yyyyMMdd
+    */
+    private Integer syncDate;
+
+    /**
+    * 物联网编号
+    */
+    private String deviceNo;
+
+    /**
+    * 水表表号
+    */
+    private String meterNo;
+
+    /**
+    * 水表当前状态
+    */
+    private Integer deviceStatus;
+
+    /**
+    * 今日抄表真实数据
+    */
+    private String realData;
+
+    /**
+    * 真实抄表时间
+    */
+    private Date realDataDate;
+
+    /**
+    * 同步数据
+    */
+    private String syncData;
+
+    /**
+    * 同步数据时间
+    */
+    private Date syncDataDate;
+
+    /**
+    * 波动差值
+    */
+    private BigDecimal gap;
+
+    /**
+    * 客户ID
+    */
+    private Integer customerId;
+
+    /**
+    * 创建人
+    */
+    private String createBy;
+
+    /**
+    * 更新人
+    */
+    private String updateBy;
+
+    /**
+    * 创建时间
+    */
+    private Date dateCreate;
+
+    /**
+    * 更新时间
+    */
+    private Date dateUpdate;
+}

+ 5 - 1
smart-city-platform/src/main/java/com/bz/smart_city/service/SyncWaterMeterDataService.java

@@ -11,5 +11,9 @@ public interface SyncWaterMeterDataService {
 
     void syncWaterMeterData(Integer customerId);
 
-
+    /**
+     * 模拟同步数据,单元测试
+     * @param deviceId
+     */
+    void mockSyncWaterMeterData(Long deviceId);
 }

+ 223 - 5
smart-city-platform/src/main/java/com/bz/smart_city/service/impl/ZunYiNewRegionSyncServiceImpl.java

@@ -3,9 +3,14 @@ package com.bz.smart_city.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.bz.smart_city.commom.model.CommonQueryCondition;
 import com.bz.smart_city.commom.util.DateTimeUtil;
+import com.bz.smart_city.dao.DeviceDataDimMapper;
+import com.bz.smart_city.dao.DeviceMapper;
+import com.bz.smart_city.dao.MeterPushDataMapper;
 import com.bz.smart_city.dao.MeterReadRecordMapper;
 import com.bz.smart_city.dto.MessageData;
 import com.bz.smart_city.dto.WaterConsumptionDto;
+import com.bz.smart_city.entity.Device;
+import com.bz.smart_city.entity.MeterPushData;
 import com.bz.smart_city.entity.MeterReadRecord;
 import com.bz.smart_city.service.SyncWaterMeterDataService;
 import com.bz.smart_city.service.SyncWaterMeterInfoService;
@@ -18,10 +23,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 
 /**
  * <p></p>
@@ -39,11 +42,204 @@ public class ZunYiNewRegionSyncServiceImpl implements SyncWaterMeterDataService
     @Autowired
     MeterReadRecordMapper meterReadRecordMapper;
 
+    @Autowired
+    DeviceMapper  deviceMapper ;
+
+    @Autowired
+    MeterPushDataMapper meterPushDataMapper ;
+
     @Value("${spring.profiles.active}")
     String env ;
 
+    /**
+     * 测试水表Id 724303849996681216
+     * @param customerId
+     */
+    @Override
+    public void syncWaterMeterData(Integer customerId){
+        // 1,查询昨日抄表数据
+        int yesterday = Integer.parseInt(DateTimeUtil.formatDate(DateTimeUtil.beforeNow(1), "yyyyMMdd"));
+        int today = Integer.parseInt(DateTimeUtil.formatNow("yyyyMMdd"));
+        CommonQueryCondition condition = new CommonQueryCondition();
+        condition.setCustormerId(customerId);
+        if("prd".equals(env)){
+            condition.setStartDate(yesterday);
+            condition.setEndDate(yesterday);
+        }
+        else{
+            condition.setStartDate(20190528);
+            condition.setEndDate(20190528);
+        }
+        // 只传已验收上线的
+        condition.setChannelId(40);
+        log.info("begin query meter read records ,condition = {}",JSON.toJSONString(condition));
+        List<MeterReadRecord> meterReadRecords = meterReadRecordMapper.queryMeterReadRecordWithCondtion(condition);
+        log.info("end query meter read records ,result size is = {}",meterReadRecords.size());
+        // 2,构建消息
+        for(MeterReadRecord record : meterReadRecords){
+            try{
+                Long deviceId = record.getDeviceId();
+                Device device = deviceMapper.findByDeviceId(deviceId);
+                // 设备为故障时不进行数据同步
+                if(device.getDeviceStatus() == 2){
+                    continue;
+                }
+                else {
+                    MeterPushData mpd = new MeterPushData();
+                    mpd.setCustomerId(device.getCustomerId());
+                    mpd.setDeviceId(device.getId());
+                    mpd.setDeviceNo(device.getDeviceNo());
+                    mpd.setDeviceStatus(device.getDeviceStatus());
+                    mpd.setMeterNo(device.getWaterMeterNo());
+                    mpd.setSyncDataDate(new Date());
+                    mpd.setSyncDate(today);
+                    // 非故障设备时判断是否有抄表数据
+                    if (record.getReadStatus().equals("1")) {
+                        // 无抄表数据,则继续取上日的推送数据进行推送,若上一日无推送数据则取最近一次的抄表数据进行推送
+                        MeterReadRecord meterLastReadRecord = meterReadRecordMapper.findMeterLastReadRecord(deviceId);
+                        mpd.setRealData(meterLastReadRecord.getReadData());
+                        mpd.setRealDataDate(meterLastReadRecord.getReadTime());
+                        mpd.setSyncData(meterLastReadRecord.getReadData());
+                        mpd.setGap(new BigDecimal(0));
+                    } else {
+                        // 有抄表数据,则判断与上日推送数据是否存在-3内的波动差
+                        MeterPushData pushData = meterPushDataMapper.selectByPrimaryKey(device.getId(), yesterday);
+                        // 若不存在推送数据,则直接推送今日抄表数据
+                        if (pushData == null) {
+                            mpd.setRealData(record.getReadData());
+                            mpd.setRealDataDate(record.getReadTime());
+                            mpd.setSyncData(record.getReadData());
+                            mpd.setGap(new BigDecimal(0));
+                        } else {
+                            // 若存在推送数据则比较今日数据真实上报数据进行比较,若比上日推送数据大或者波动差>=-3则直接进行推送,
+                            // 若波动差<-3则推送上日的推送数据
+                            mpd.setRealData(record.getReadData());
+                            mpd.setRealDataDate(record.getReadTime());
+                            BigDecimal syncData = new BigDecimal(pushData.getSyncData());
+                            BigDecimal readData = new BigDecimal(record.getReadData());
+                            BigDecimal gap = readData.subtract(syncData);
+                            // 今日上报数据大于等于昨日推送数据,则推送今日上报数据
+                            if (gap.compareTo(new BigDecimal(0)) > -1) {
+                                mpd.setSyncData(record.getReadData());
+                                mpd.setGap(gap);
+                            } else {
+                                // 波动差>=-3则直接进行推送
+                                if (gap.abs().compareTo(new BigDecimal(3)) < 1) {
+                                    mpd.setSyncData(record.getReadData());
+                                    mpd.setGap(gap);
+                                }
+                                // 若波动差<-3则推送上日的推送数据
+                                else {
+                                    mpd.setSyncData(pushData.getSyncData());
+                                    mpd.setGap(gap);
+                                }
+                            }
+                        }
+                    }
+                    // 将推送记录进行存储,并将数据进行推送
+                    meterPushDataMapper.insert(mpd);
+                    Map<String, Object> message = buildSendMessage(mpd);
+                    if (message != null) {
+                        // 3,发送消息
+                        sendMessage(JSON.toJSONString(message));
+                    }
+                }
+            }catch (Exception e){
+                log.error("Synchronize Data Error ! ",e);
+            }
+        }
+
+    }
+
     @Override
-    public void syncWaterMeterData(Integer customerId) {
+    public void mockSyncWaterMeterData(Long deviceId) {
+        // 1,查询昨日抄表数据
+        int yesterday = Integer.parseInt(DateTimeUtil.formatDate(DateTimeUtil.beforeNow(1), "yyyyMMdd"));
+        int today = Integer.parseInt(DateTimeUtil.formatNow("yyyyMMdd"));
+        MeterReadRecord record = meterReadRecordMapper.getLastDayData(deviceId, yesterday);
+        // 2,构建消息
+        if(record != null){
+            try{
+                Device device = deviceMapper.findByDeviceId(deviceId);
+                // 设备为故障时不进行数据同步
+                if(device.getDeviceStatus() == 2){
+                    return;
+                }
+                else {
+                    MeterPushData mpd = new MeterPushData();
+                    mpd.setCustomerId(device.getCustomerId());
+                    mpd.setDeviceId(device.getId());
+                    mpd.setDeviceNo(device.getDeviceNo());
+                    mpd.setDeviceStatus(device.getDeviceStatus());
+                    mpd.setMeterNo(device.getWaterMeterNo());
+                    mpd.setSyncDataDate(new Date());
+                    mpd.setSyncDate(today);
+                    // 非故障设备时判断是否有抄表数据
+                    if ("1".equals(record.getReadStatus())) {
+                        // 无抄表数据,则继续取上日的推送数据进行推送,若上一日无推送数据则取最近一次的抄表数据进行推送
+                        MeterPushData pushData = meterPushDataMapper.selectByPrimaryKey(device.getId(), yesterday);
+                        if(pushData == null ){
+                            MeterReadRecord meterLastReadRecord = meterReadRecordMapper.findMeterLastReadRecord(deviceId);
+                            mpd.setRealData(meterLastReadRecord.getReadData());
+                            mpd.setRealDataDate(meterLastReadRecord.getReadTime());
+                            mpd.setSyncData(meterLastReadRecord.getReadData());
+                            mpd.setGap(new BigDecimal(0));
+                        }
+                        else{
+                            mpd.setSyncData(pushData.getSyncData());
+                            mpd.setGap(new BigDecimal(0));
+                        }
+                    } else {
+                        // 有抄表数据,则判断与上日推送数据是否存在-3内的波动差
+                        MeterPushData pushData = meterPushDataMapper.selectByPrimaryKey(device.getId(), yesterday);
+                        // 若不存在推送数据,则直接推送今日抄表数据
+                        if (pushData == null) {
+                            mpd.setRealData(record.getReadData());
+                            mpd.setRealDataDate(record.getReadTime());
+                            mpd.setSyncData(record.getReadData());
+                            mpd.setGap(new BigDecimal(0));
+                        } else {
+                            // 若存在推送数据则比较今日数据真实上报数据进行比较,若比上日推送数据大或者波动差>=-3则直接进行推送,
+                            // 若波动差<-3则推送上日的推送数据
+                            mpd.setRealData(record.getReadData());
+                            mpd.setRealDataDate(record.getReadTime());
+                            BigDecimal syncData = new BigDecimal(pushData.getSyncData());
+                            BigDecimal readData = new BigDecimal(record.getReadData());
+                            BigDecimal gap = readData.subtract(syncData);
+                            // 今日上报数据大于等于昨日推送数据,则推送今日上报数据
+                            if (gap.compareTo(new BigDecimal(0)) > -1) {
+                                mpd.setSyncData(record.getReadData());
+                                mpd.setGap(gap);
+                            } else {
+                                // 若波动差>-3,即波动差的绝对值小于3 ,则推送上日的推送数据
+                                if (gap.abs().compareTo(new BigDecimal(3)) < 1) {
+                                    mpd.setSyncData(pushData.getSyncData());
+                                    mpd.setGap(gap);
+                                }
+                                //  波动差<=-3,即波动差的绝对值>3,则直接进行推送
+                                else {
+                                    mpd.setSyncData(record.getReadData());
+                                    mpd.setGap(gap);
+                                }
+                            }
+                        }
+                    }
+                    // 将推送记录进行存储,并将数据进行推送
+                    meterPushDataMapper.insert(mpd);
+                    Map<String, Object> message = buildSendMessage(mpd);
+                    if (message != null) {
+                        // 3,发送消息
+                        sendMessage(JSON.toJSONString(message));
+                    }
+                }
+            }catch (Exception e){
+                log.error("Synchronize Data Error ! ",e);
+            }
+        }
+    }
+
+    @Deprecated
+    public void syncWaterMeterDataOld(Integer customerId) {
         // 1,查询昨日抄表数据
         int yesterday = Integer.parseInt(DateTimeUtil.formatDate(DateTimeUtil.beforeNow(1), "yyyyMMdd"));
         CommonQueryCondition condition = new CommonQueryCondition();
@@ -80,11 +276,33 @@ public class ZunYiNewRegionSyncServiceImpl implements SyncWaterMeterDataService
 
     }
 
+    protected Map<String,Object> buildSendMessage(MeterPushData pushData){
+        HashMap<String, Object> msg = new HashMap<>();
+        msg.put("type","nbxb");
+        // 设备编号
+        String deviceId= pushData.getMeterNo();
+        if(StringUtils.isNotBlank(deviceId)) {
+            // 设备编码补齐14位后再添加30
+            msg.put("deviceId","30"+deviceId) ;
+            List<MessageData> datas = new ArrayList<>() ;
+            MessageData data = new MessageData();
+            data.setS("v");
+            data.setT(System.currentTimeMillis());
+            data.setV(Double.parseDouble(pushData.getSyncData()));
+            datas.add(data);
+            msg.put("real",datas);
+        }
+        else{
+            msg = null ;
+        }
+        return msg ;
+    }
     /**
      *  {"real":[{"s":"v","t":1578534831000,"v":39.0}],"type":"nbxb","deviceId":"30000161034460"}
      * @param record
      * @return
      */
+    @Deprecated
     protected Map<String,Object> buildSendMessage(MeterReadRecord record){
         HashMap<String, Object> msg = new HashMap<>();
         msg.put("type","nbxb");

+ 6 - 6
smart-city-platform/src/main/resources/application-dev.properties

@@ -151,12 +151,12 @@ crm.login.password=111111
 
 
 #rabbitmq
-spring.rabbitmq.host=192.168.0.120
-spring.rabbitmq.port=5672
-spring.rabbitmq.username=admin
-spring.rabbitmq.password=admin
-spring.rabbitmq.virtual-host=my_vhost
-spring.rabbitmq.zy.topic=test
+spring.rabbitmq.host=222.86.88.126
+spring.rabbitmq.port=5627
+spring.rabbitmq.username=hdkj
+spring.rabbitmq.password=hdkj123
+spring.rabbitmq.virtual-host=/
+spring.rabbitmq.zy.topic=hello
 
 #UDIP平台集成元管理url
 udip.unit.url=http://114.135.61.188:48322

+ 414 - 0
smart-city-platform/src/main/resources/mapper/MeterPushDataMapper.xml

@@ -0,0 +1,414 @@
+<?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.bz.smart_city.dao.MeterPushDataMapper">
+  <resultMap id="BaseResultMap" type="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    <!--@Table sc_meter_push_data-->
+    <id column="device_id" jdbcType="BIGINT" property="deviceId" />
+    <id column="sync_date" jdbcType="INTEGER" property="syncDate" />
+    <result column="device_no" jdbcType="VARCHAR" property="deviceNo" />
+    <result column="meter_no" jdbcType="VARCHAR" property="meterNo" />
+    <result column="device_status" jdbcType="CHAR" property="deviceStatus" />
+    <result column="real_data" jdbcType="VARCHAR" property="realData" />
+    <result column="real_data_date" jdbcType="TIMESTAMP" property="realDataDate" />
+    <result column="sync_data" jdbcType="VARCHAR" property="syncData" />
+    <result column="sync_data_date" jdbcType="TIMESTAMP" property="syncDataDate" />
+    <result column="gap" jdbcType="DECIMAL" property="gap" />
+    <result column="customer_id" jdbcType="INTEGER" property="customerId" />
+    <result column="create_by" jdbcType="VARCHAR" property="createBy" />
+    <result column="update_by" jdbcType="VARCHAR" property="updateBy" />
+    <result column="date_create" jdbcType="TIMESTAMP" property="dateCreate" />
+    <result column="date_update" jdbcType="TIMESTAMP" property="dateUpdate" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    device_id, sync_date, device_no, meter_no, device_status, real_data, real_data_date, 
+    sync_data, sync_data_date, gap, customer_id, create_by, update_by, date_create, date_update
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="map" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from sc_meter_push_data
+    where device_id = #{deviceId,jdbcType=BIGINT}
+      and sync_date = #{syncDate,jdbcType=INTEGER}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="map">
+    <!--@mbg.generated-->
+    delete from sc_meter_push_data
+    where device_id = #{deviceId,jdbcType=BIGINT}
+      and sync_date = #{syncDate,jdbcType=INTEGER}
+  </delete>
+  <insert id="insert" parameterType="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    insert into sc_meter_push_data (device_id, sync_date, device_no, 
+      meter_no, device_status, real_data, 
+      real_data_date, sync_data, sync_data_date, 
+      gap, customer_id, create_by, 
+      update_by, date_create, date_update
+      )
+    values (#{deviceId,jdbcType=BIGINT}, #{syncDate,jdbcType=INTEGER}, #{deviceNo,jdbcType=VARCHAR}, 
+      #{meterNo,jdbcType=VARCHAR}, #{deviceStatus,jdbcType=CHAR}, #{realData,jdbcType=VARCHAR}, 
+      #{realDataDate,jdbcType=TIMESTAMP}, #{syncData,jdbcType=VARCHAR}, #{syncDataDate,jdbcType=TIMESTAMP}, 
+      #{gap,jdbcType=DECIMAL}, #{customerId,jdbcType=INTEGER}, #{createBy,jdbcType=VARCHAR}, 
+      #{updateBy,jdbcType=VARCHAR}, #{dateCreate,jdbcType=TIMESTAMP}, #{dateUpdate,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    insert into sc_meter_push_data
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="deviceId != null">
+        device_id,
+      </if>
+      <if test="syncDate != null">
+        sync_date,
+      </if>
+      <if test="deviceNo != null">
+        device_no,
+      </if>
+      <if test="meterNo != null">
+        meter_no,
+      </if>
+      <if test="deviceStatus != null">
+        device_status,
+      </if>
+      <if test="realData != null">
+        real_data,
+      </if>
+      <if test="realDataDate != null">
+        real_data_date,
+      </if>
+      <if test="syncData != null">
+        sync_data,
+      </if>
+      <if test="syncDataDate != null">
+        sync_data_date,
+      </if>
+      <if test="gap != null">
+        gap,
+      </if>
+      <if test="customerId != null">
+        customer_id,
+      </if>
+      <if test="createBy != null">
+        create_by,
+      </if>
+      <if test="updateBy != null">
+        update_by,
+      </if>
+      <if test="dateCreate != null">
+        date_create,
+      </if>
+      <if test="dateUpdate != null">
+        date_update,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="deviceId != null">
+        #{deviceId,jdbcType=BIGINT},
+      </if>
+      <if test="syncDate != null">
+        #{syncDate,jdbcType=INTEGER},
+      </if>
+      <if test="deviceNo != null">
+        #{deviceNo,jdbcType=VARCHAR},
+      </if>
+      <if test="meterNo != null">
+        #{meterNo,jdbcType=VARCHAR},
+      </if>
+      <if test="deviceStatus != null">
+        #{deviceStatus,jdbcType=CHAR},
+      </if>
+      <if test="realData != null">
+        #{realData,jdbcType=VARCHAR},
+      </if>
+      <if test="realDataDate != null">
+        #{realDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="syncData != null">
+        #{syncData,jdbcType=VARCHAR},
+      </if>
+      <if test="syncDataDate != null">
+        #{syncDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="gap != null">
+        #{gap,jdbcType=DECIMAL},
+      </if>
+      <if test="customerId != null">
+        #{customerId,jdbcType=INTEGER},
+      </if>
+      <if test="createBy != null">
+        #{createBy,jdbcType=VARCHAR},
+      </if>
+      <if test="updateBy != null">
+        #{updateBy,jdbcType=VARCHAR},
+      </if>
+      <if test="dateCreate != null">
+        #{dateCreate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="dateUpdate != null">
+        #{dateUpdate,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    update sc_meter_push_data
+    <set>
+      <if test="deviceNo != null">
+        device_no = #{deviceNo,jdbcType=VARCHAR},
+      </if>
+      <if test="meterNo != null">
+        meter_no = #{meterNo,jdbcType=VARCHAR},
+      </if>
+      <if test="deviceStatus != null">
+        device_status = #{deviceStatus,jdbcType=CHAR},
+      </if>
+      <if test="realData != null">
+        real_data = #{realData,jdbcType=VARCHAR},
+      </if>
+      <if test="realDataDate != null">
+        real_data_date = #{realDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="syncData != null">
+        sync_data = #{syncData,jdbcType=VARCHAR},
+      </if>
+      <if test="syncDataDate != null">
+        sync_data_date = #{syncDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="gap != null">
+        gap = #{gap,jdbcType=DECIMAL},
+      </if>
+      <if test="customerId != null">
+        customer_id = #{customerId,jdbcType=INTEGER},
+      </if>
+      <if test="createBy != null">
+        create_by = #{createBy,jdbcType=VARCHAR},
+      </if>
+      <if test="updateBy != null">
+        update_by = #{updateBy,jdbcType=VARCHAR},
+      </if>
+      <if test="dateCreate != null">
+        date_create = #{dateCreate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="dateUpdate != null">
+        date_update = #{dateUpdate,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where device_id = #{deviceId,jdbcType=BIGINT}
+      and sync_date = #{syncDate,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    update sc_meter_push_data
+    set device_no = #{deviceNo,jdbcType=VARCHAR},
+      meter_no = #{meterNo,jdbcType=VARCHAR},
+      device_status = #{deviceStatus,jdbcType=CHAR},
+      real_data = #{realData,jdbcType=VARCHAR},
+      real_data_date = #{realDataDate,jdbcType=TIMESTAMP},
+      sync_data = #{syncData,jdbcType=VARCHAR},
+      sync_data_date = #{syncDataDate,jdbcType=TIMESTAMP},
+      gap = #{gap,jdbcType=DECIMAL},
+      customer_id = #{customerId,jdbcType=INTEGER},
+      create_by = #{createBy,jdbcType=VARCHAR},
+      update_by = #{updateBy,jdbcType=VARCHAR},
+      date_create = #{dateCreate,jdbcType=TIMESTAMP},
+      date_update = #{dateUpdate,jdbcType=TIMESTAMP}
+    where device_id = #{deviceId,jdbcType=BIGINT}
+      and sync_date = #{syncDate,jdbcType=INTEGER}
+  </update>
+  <insert id="batchInsert" parameterType="map">
+    <!--@mbg.generated-->
+    insert into sc_meter_push_data
+    (device_id, sync_date, device_no, meter_no, device_status, real_data, real_data_date, 
+      sync_data, sync_data_date, gap, customer_id, create_by, update_by, date_create, 
+      date_update)
+    values
+    <foreach collection="list" item="item" separator=",">
+      (#{item.deviceId,jdbcType=BIGINT}, #{item.syncDate,jdbcType=INTEGER}, #{item.deviceNo,jdbcType=VARCHAR}, 
+        #{item.meterNo,jdbcType=VARCHAR}, #{item.deviceStatus,jdbcType=CHAR}, #{item.realData,jdbcType=VARCHAR}, 
+        #{item.realDataDate,jdbcType=TIMESTAMP}, #{item.syncData,jdbcType=VARCHAR}, #{item.syncDataDate,jdbcType=TIMESTAMP}, 
+        #{item.gap,jdbcType=DECIMAL}, #{item.customerId,jdbcType=INTEGER}, #{item.createBy,jdbcType=VARCHAR}, 
+        #{item.updateBy,jdbcType=VARCHAR}, #{item.dateCreate,jdbcType=TIMESTAMP}, #{item.dateUpdate,jdbcType=TIMESTAMP}
+        )
+    </foreach>
+  </insert>
+  <insert id="insertOrUpdate" parameterType="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    insert into sc_meter_push_data
+    (device_id, sync_date, device_no, meter_no, device_status, real_data, real_data_date, 
+      sync_data, sync_data_date, gap, customer_id, create_by, update_by, date_create, 
+      date_update)
+    values
+    (#{deviceId,jdbcType=BIGINT}, #{syncDate,jdbcType=INTEGER}, #{deviceNo,jdbcType=VARCHAR}, 
+      #{meterNo,jdbcType=VARCHAR}, #{deviceStatus,jdbcType=CHAR}, #{realData,jdbcType=VARCHAR}, 
+      #{realDataDate,jdbcType=TIMESTAMP}, #{syncData,jdbcType=VARCHAR}, #{syncDataDate,jdbcType=TIMESTAMP}, 
+      #{gap,jdbcType=DECIMAL}, #{customerId,jdbcType=INTEGER}, #{createBy,jdbcType=VARCHAR}, 
+      #{updateBy,jdbcType=VARCHAR}, #{dateCreate,jdbcType=TIMESTAMP}, #{dateUpdate,jdbcType=TIMESTAMP}
+      )
+    on duplicate key update 
+    device_id = #{deviceId,jdbcType=BIGINT}, 
+    sync_date = #{syncDate,jdbcType=INTEGER}, 
+    device_no = #{deviceNo,jdbcType=VARCHAR}, 
+    meter_no = #{meterNo,jdbcType=VARCHAR}, 
+    device_status = #{deviceStatus,jdbcType=CHAR}, 
+    real_data = #{realData,jdbcType=VARCHAR}, 
+    real_data_date = #{realDataDate,jdbcType=TIMESTAMP}, 
+    sync_data = #{syncData,jdbcType=VARCHAR}, 
+    sync_data_date = #{syncDataDate,jdbcType=TIMESTAMP}, 
+    gap = #{gap,jdbcType=DECIMAL}, 
+    customer_id = #{customerId,jdbcType=INTEGER}, 
+    create_by = #{createBy,jdbcType=VARCHAR}, 
+    update_by = #{updateBy,jdbcType=VARCHAR}, 
+    date_create = #{dateCreate,jdbcType=TIMESTAMP}, 
+    date_update = #{dateUpdate,jdbcType=TIMESTAMP}
+  </insert>
+  <insert id="insertOrUpdateSelective" parameterType="com.bz.smart_city.entity.MeterPushData">
+    <!--@mbg.generated-->
+    insert into sc_meter_push_data
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="deviceId != null">
+        device_id,
+      </if>
+      <if test="syncDate != null">
+        sync_date,
+      </if>
+      <if test="deviceNo != null">
+        device_no,
+      </if>
+      <if test="meterNo != null">
+        meter_no,
+      </if>
+      <if test="deviceStatus != null">
+        device_status,
+      </if>
+      <if test="realData != null">
+        real_data,
+      </if>
+      <if test="realDataDate != null">
+        real_data_date,
+      </if>
+      <if test="syncData != null">
+        sync_data,
+      </if>
+      <if test="syncDataDate != null">
+        sync_data_date,
+      </if>
+      <if test="gap != null">
+        gap,
+      </if>
+      <if test="customerId != null">
+        customer_id,
+      </if>
+      <if test="createBy != null">
+        create_by,
+      </if>
+      <if test="updateBy != null">
+        update_by,
+      </if>
+      <if test="dateCreate != null">
+        date_create,
+      </if>
+      <if test="dateUpdate != null">
+        date_update,
+      </if>
+    </trim>
+    values
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="deviceId != null">
+        #{deviceId,jdbcType=BIGINT},
+      </if>
+      <if test="syncDate != null">
+        #{syncDate,jdbcType=INTEGER},
+      </if>
+      <if test="deviceNo != null">
+        #{deviceNo,jdbcType=VARCHAR},
+      </if>
+      <if test="meterNo != null">
+        #{meterNo,jdbcType=VARCHAR},
+      </if>
+      <if test="deviceStatus != null">
+        #{deviceStatus,jdbcType=CHAR},
+      </if>
+      <if test="realData != null">
+        #{realData,jdbcType=VARCHAR},
+      </if>
+      <if test="realDataDate != null">
+        #{realDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="syncData != null">
+        #{syncData,jdbcType=VARCHAR},
+      </if>
+      <if test="syncDataDate != null">
+        #{syncDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="gap != null">
+        #{gap,jdbcType=DECIMAL},
+      </if>
+      <if test="customerId != null">
+        #{customerId,jdbcType=INTEGER},
+      </if>
+      <if test="createBy != null">
+        #{createBy,jdbcType=VARCHAR},
+      </if>
+      <if test="updateBy != null">
+        #{updateBy,jdbcType=VARCHAR},
+      </if>
+      <if test="dateCreate != null">
+        #{dateCreate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="dateUpdate != null">
+        #{dateUpdate,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+    on duplicate key update 
+    <trim suffixOverrides=",">
+      <if test="deviceId != null">
+        device_id = #{deviceId,jdbcType=BIGINT},
+      </if>
+      <if test="syncDate != null">
+        sync_date = #{syncDate,jdbcType=INTEGER},
+      </if>
+      <if test="deviceNo != null">
+        device_no = #{deviceNo,jdbcType=VARCHAR},
+      </if>
+      <if test="meterNo != null">
+        meter_no = #{meterNo,jdbcType=VARCHAR},
+      </if>
+      <if test="deviceStatus != null">
+        device_status = #{deviceStatus,jdbcType=CHAR},
+      </if>
+      <if test="realData != null">
+        real_data = #{realData,jdbcType=VARCHAR},
+      </if>
+      <if test="realDataDate != null">
+        real_data_date = #{realDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="syncData != null">
+        sync_data = #{syncData,jdbcType=VARCHAR},
+      </if>
+      <if test="syncDataDate != null">
+        sync_data_date = #{syncDataDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="gap != null">
+        gap = #{gap,jdbcType=DECIMAL},
+      </if>
+      <if test="customerId != null">
+        customer_id = #{customerId,jdbcType=INTEGER},
+      </if>
+      <if test="createBy != null">
+        create_by = #{createBy,jdbcType=VARCHAR},
+      </if>
+      <if test="updateBy != null">
+        update_by = #{updateBy,jdbcType=VARCHAR},
+      </if>
+      <if test="dateCreate != null">
+        date_create = #{dateCreate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="dateUpdate != null">
+        date_update = #{dateUpdate,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+</mapper>

+ 11 - 2
smart-city-platform/src/main/resources/mapper/MeterReadRecordMapper.xml

@@ -1673,8 +1673,17 @@
         <foreach collection="deviceIds" item="item" separator="," open="(" close=")">
             #{item}
         </foreach>
-
-
+    </select>
+    <select id="findMeterLastReadRecord" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>
+        from
+            sc_meter_read_record
+        where device_id = #{deviceId,jdbcType=BIGINT}
+        and read_status = 2
+        and status = 1
+        and read_date = ( SELECT max( read_date ) FROM sc_meter_read_record WHERE device_id =  #{deviceId,jdbcType=BIGINT}  and read_status = 2)
+        limit 1
     </select>
 </mapper>
 

+ 9 - 0
smart-city-platform/src/test/java/com/bz/smart_city/DateTest.java

@@ -6,6 +6,7 @@ import org.junit.Test;
 import com.bz.smart_city.commom.util.DateTimeUtil;
 
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.time.LocalDate;
@@ -18,6 +19,14 @@ import java.util.Date;
 public class DateTest {
 
 
+    public static void main(String[] args) {
+        BigDecimal num1 = new BigDecimal("-15.9");
+        BigDecimal num2 = new BigDecimal("-15.99");
+
+        System.out.println(num1.compareTo(num2));
+    }
+
+
     @Test
     public void test(){
         LocalDateTime startDateTime =  LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);

+ 16 - 3
smart-city-platform/src/test/java/com/bz/smart_city/DeviceDataPushServiceTest.java

@@ -1,5 +1,6 @@
 package com.bz.smart_city;
 
+import com.bz.smart_city.service.impl.ZunYiNewRegionSyncServiceImpl;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,10 +27,14 @@ public class DeviceDataPushServiceTest {
 	
 	@Autowired
 	SyncWaterMeterInfoService  syncWaterMeterInfoService ; 
-	
+
+	@Autowired
+	ZunYiNewRegionSyncServiceImpl  zunYiNewRegionSyncServiceImpl;
+
 	@Autowired
 	JobAndTriggerService jobAndTriggerService;
-	
+
+
 	@Test
 	public void contextLoads() {
 	}
@@ -52,7 +57,15 @@ public class DeviceDataPushServiceTest {
 		Integer customerId = 47;
 		syncWaterMeterInfoService.syncWaterMeterInfo(customerId );
 	}
-	
+
+	/**
+	 * 遵义新区数据推送测试
+	 */
+	@Test
+	public void zunYiNewRegionSyncTest(){
+		zunYiNewRegionSyncServiceImpl.mockSyncWaterMeterData(724303849996681216L);
+	}
+
 	@Test
 	public void fjDataTest() {
 		DeviceDataPushConfigDTO dto = new DeviceDataPushConfigDTO();