浏览代码

计算每天的环保数据:优化存储方式。

zhuoning 3 年之前
父节点
当前提交
69d68094e6

+ 12 - 0
huimv-farm-v2/huimv-center-receiver/src/main/java/com/huimv/receiver/cloud/dao/repo/EnvDayRepo.java

@@ -3,7 +3,19 @@ package com.huimv.receiver.cloud.dao.repo;
 import com.huimv.receiver.cloud.dao.entity.EnvDayEntity;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Optional;
 
 public interface EnvDayRepo extends JpaRepository<EnvDayEntity, Integer>, JpaSpecificationExecutor<EnvDayEntity> {
 
+    @Transactional
+    @Modifying(clearAutomatically = true, flushAutomatically = true)
+    @Query(nativeQuery = true,value ="DELETE FROM env_day WHERE farm_id=?1 AND DATE_FORMAT(add_date,'%Y-%m-%d')=DATE_FORMAT(?2,'%Y-%m-%d')")
+    void removeByFarmIdAndDate(Integer farmId, String todayDateText);
+
+    @Query(nativeQuery = true,value ="SELECT * FROM env_day WHERE farm_id=?1 AND DATE_FORMAT(add_date,'%Y-%m-%d')=DATE_FORMAT(?2,'%Y-%m-%d')")
+    Optional<EnvDayEntity> findByFarmIdAndDate(Integer farmId, String todayDateText);
 }

+ 80 - 6
huimv-farm-v2/huimv-center-receiver/src/main/java/com/huimv/receiver/cloud/service/impl/EnvironImpl.java

@@ -61,29 +61,103 @@ public class EnvironImpl implements IEnviron {
      */
     @Override
     public void handleEnvironJSONObject(String data) throws ParseException {
+        System.out.println("接收数据>>"+data);
 //        JSONObject deviceJo = JSON.parseObject(data);
         EnvHourEntity envHourEntity = JSON.parseObject(data, EnvHourEntity.class);
         envHourRepo.save(envHourEntity);
 
         Integer farmId = envHourEntity.getFarmId();
 //        String todayDateText = dateUtil.formatTimestampToDate(envHourEntity.getAddTime());
+//        String todayDateTimeText = dateUtil.formatTimestampToDatetime(envHourEntity.getDatetime());
+//        System.out.println(">>>>>>>>>>> 采样时间 todayDateTimeText>>"+todayDateTimeText);
         String todayDateText = dateUtil.formatTimestampToDate(envHourEntity.getDatetime());
-        //计算每天平均数量
-        countDayAvgEnviron(farmId, todayDateText);
+//        System.out.println(">>>>>>>>>>> 采样日期 todayDateText>>"+todayDateText);
+
+        //计算每天平均数据
+        countDayAvgEnviron2(farmId, todayDateText);
+    }
+
+    // 计算每天都平均数据
+    public void countDayAvgEnviron2(Integer farmId, String todayDateText) throws ParseException {
+        System.out.println("计算每天的环保数据");
+        System.out.println("farmId="+farmId);
+        System.out.println("todayDateText="+todayDateText);
+        //计算平均数
+        List<Object[]> envHourEntityList = envHourRepo.findByFarmIdAndDate(farmId, todayDateText);
+        System.out.println("每天小时采集数envHourEntityList.size>>"+envHourEntityList.size());
+
+        if (envHourEntityList.size() > 0) {
+            //更新新数据
+            JSONArray dataJa = new JSONArray();
+            for (int a = 0; a < envHourEntityList.size(); a++) {
+                JSONObject dataJo = new JSONObject();
+                dataJa.add(dataJo);
+                Object[] avgObj = (Object[]) envHourEntityList.get(a);
+                dataJo.put("cod", avgObj[2]);
+                dataJo.put("ad", avgObj[3]);
+                dataJo.put("ph", avgObj[4]);
+                dataJo.put("ws", avgObj[5]);
+            }
+            BigDecimal codBd = new BigDecimal(0);
+            BigDecimal adBd = new BigDecimal(0);
+            BigDecimal phBd = new BigDecimal(0);
+            BigDecimal wsBd = new BigDecimal(0);
+
+            for (int a = 0; a < dataJa.size(); a++) {
+                JSONObject dataJo = dataJa.getJSONObject(a);
+                codBd = new BigDecimal(dataJo.getString("cod")).add(codBd);
+                adBd = new BigDecimal(dataJo.getString("ad")).add(adBd);
+                phBd = new BigDecimal(dataJo.getString("ph")).add(phBd);
+                wsBd = new BigDecimal(dataJo.getString("ws")).add(wsBd);
+            }
+            //精度位数
+            int bit = 3;
+            double codDouble = codBd.divide(new BigDecimal(dataJa.size()), 3, BigDecimal.ROUND_HALF_UP).setScale(bit, BigDecimal.ROUND_HALF_UP).doubleValue();
+            double adDouble = adBd.divide(new BigDecimal(dataJa.size()), 3, BigDecimal.ROUND_HALF_UP).setScale(bit, BigDecimal.ROUND_HALF_UP).doubleValue();
+            double phDouble = phBd.divide(new BigDecimal(dataJa.size()), 3, BigDecimal.ROUND_HALF_UP).setScale(bit, BigDecimal.ROUND_HALF_UP).doubleValue();
+            double wsDouble = wsBd.divide(new BigDecimal(dataJa.size()), 3, BigDecimal.ROUND_HALF_UP).setScale(bit, BigDecimal.ROUND_HALF_UP).doubleValue();
+            Optional<EnvDayEntity> option = envDayRepo.findByFarmIdAndDate(farmId, todayDateText);
+            if(option.isPresent()){
+                System.out.println("更新数据");
+                //更新数据
+                EnvDayEntity envDayEntity = option.get();
+                envDayEntity.setAd(String.valueOf(adDouble));
+                envDayEntity.setCod(String.valueOf(codDouble));
+                envDayEntity.setPh(String.valueOf(phDouble));
+                envDayEntity.setWs(String.valueOf(wsDouble));
+                envDayEntity.setFarmId(farmId);
+                envDayEntity.setAddDate(dateUtil.parseDate(todayDateText));
+                //保存
+                envDayRepo.saveAndFlush(envDayEntity);
+            }else{
+                System.out.println("增加新数据");
+                //增加新数据
+                EnvDayEntity envDayEntity = new EnvDayEntity();
+                envDayEntity.setAd(String.valueOf(adDouble));
+                envDayEntity.setCod(String.valueOf(codDouble));
+                envDayEntity.setPh(String.valueOf(phDouble));
+                envDayEntity.setWs(String.valueOf(wsDouble));
+                envDayEntity.setFarmId(farmId);
+                envDayEntity.setAddDate(dateUtil.parseDate(todayDateText));
+                //保存
+                envDayRepo.saveAndFlush(envDayEntity);
+            }
+        }
     }
 
     @Override
     public void countDayAvgEnviron(Integer farmId, String todayDateText) throws ParseException {
-//        System.out.println("farmId="+farmId);
-//        System.out.println("todayDateText="+todayDateText);
+        System.out.println("计算每天的环保数据");
+        System.out.println("farmId="+farmId);
+        System.out.println("todayDateText="+todayDateText);
         //计算平均数
         List<Object[]> envHourEntityList = envHourRepo.findByFarmIdAndDate(farmId, todayDateText);
         System.out.println("每天小时采集数envHourEntityList.size>>"+envHourEntityList.size());
 
         if (envHourEntityList.size() > 0) {
             //删除旧数据
-            envHourRepo.removeByFarmIdAndDate(farmId, todayDateText);
-
+//            envHourRepo.removeByFarmIdAndDate(farmId, todayDateText);
+            envDayRepo.removeByFarmIdAndDate(farmId, todayDateText);
 
             JSONArray dataJa = new JSONArray();
             for (int a = 0; a < envHourEntityList.size(); a++) {

+ 7 - 0
huimv-farm-v2/huimv-center-receiver/src/main/java/com/huimv/receiver/utils/DateUtil.java

@@ -23,6 +23,13 @@ import java.util.Date;
 @Slf4j
 public class DateUtil {
 
+    //Long转换为Date格式
+    public String fromLongToDate(Long time ,String format) {
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        Date date = new Date(time);
+        return sdf.format(date);
+    }
+
     public String formatTimestampToDatetime(Timestamp timestamp){
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         return sdf.format(timestamp);

+ 23 - 0
huimv-farm-v2/huimv-center-receiver/src/test/java/com/huimv/receiver/HuimvCenterReceiverApplicationTests.java

@@ -3,6 +3,9 @@ package com.huimv.receiver;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 @SpringBootTest
 class HuimvCenterReceiverApplicationTests {
 
@@ -10,4 +13,24 @@ class HuimvCenterReceiverApplicationTests {
     void contextLoads() {
     }
 
+    @Test
+    public void testDatetime(){
+        Long dateLong = 1638603480000L;
+        Date date = new Date();
+        date.setTime(dateLong);
+        System.out.println(""+date.toString());
+
+        String dateStr = fromLongToDate("yyyy-MM-dd HH:mm:ss", dateLong);
+        System.out.println(dateStr);
+    }
+
+    /**
+     * Long类型时间->转换成日期->转成要求格式的String类型
+     */
+    public static String fromLongToDate(String format, Long time) {
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        Date date = new Date(time);
+        return sdf.format(date);
+    }
+
 }