malijun 1 year ago
parent
commit
e3340a0c84

+ 460 - 49
electricity/meter/src/main/java/com/gyee/gaia/meter/service/SaveMeterInfoHistoryDayTest.java

@@ -56,7 +56,10 @@ class SaveMeterInfoHistoryDayTest {
 
 
         //1,在testingpoint中根据 uniform_code=AI064 和code like "%_FJ_%" 取出所有风机的电量测点code
-        List<TestingPoint> testingPointList = testingPointService.list(new QueryWrapper<TestingPoint>().eq("uniform_code", "AI064").like("code", "%_FJ_%"));
+        List<TestingPoint> testingPointList = testingPointService.list(new QueryWrapper<TestingPoint>()
+                .eq("uniform_code", "AI064")
+                .like("code", "%_FJ_%")
+        );
 
         //2,遍历list,每次取出一个code
         for (TestingPoint testingPoint : testingPointList) {
@@ -80,16 +83,26 @@ class SaveMeterInfoHistoryDayTest {
 
             for (int i = 0; i <= between; i++) {
 
+                DateTime dateTime0 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i), -1);
                 DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
-                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+//                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i + 1), -1);
 
                 //8,结束点发电量减去开始点发电量得到日发电量(单位Kwh)
+                Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                double value0 = 0;
+                if (!historySection.isEmpty()) {
+                    value0 = historySection.get(pointcode).getValue();
+                }
+                BigDecimal bigDecimal1 = new BigDecimal(Double.toString(value0));
+
+
                 List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
 
                 BigDecimal rfdl = new BigDecimal(0);
 
                 if (historyRaw.size() > 0) {
-                    BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+//                    BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
                     BigDecimal bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
                     rfdl = bigDecimal2.subtract(bigDecimal1);
 
@@ -143,6 +156,7 @@ class SaveMeterInfoHistoryDayTest {
         }
     }
 
+
     //电计量底码表
     @Test
     void saveCalculatingProjectFDL() {
@@ -207,7 +221,10 @@ class SaveMeterInfoHistoryDayTest {
         for (PowerStation powerStation : powerStationList) {
 
             //2,根据场站ID得到场站下所有测点
-            List<MeterPoint> meterPointList = meterPointService.list(new QueryWrapper<MeterPoint>().eq("windpowerstation_id", powerStation.getId()).eq("property", "CD"));
+            List<MeterPoint> meterPointList = meterPointService.list(new QueryWrapper<MeterPoint>()
+                    .eq("windpowerstation_id", powerStation.getId())
+                    .eq("property", "CD")
+            );
 
             //3,遍历测点,拿到每个测点的nem_code
             for (MeterPoint meterPoint : meterPointList) {
@@ -230,18 +247,28 @@ class SaveMeterInfoHistoryDayTest {
 
                 for (int i = 0; i <= between; i++) {
 
+                    DateTime dateTime0 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i), -1);
                     //开始时间00:00:01
                     DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
                     //结束时间第二天00:00:01
-                    DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+//                    DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                    DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i + 1), -1);
 
-                    List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
                     BigDecimal bigDecimal1 = new BigDecimal(0);
                     BigDecimal bigDecimal2 = new BigDecimal(0);
                     BigDecimal rfdl = new BigDecimal(0);
 
+                    Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                    double value0 = 0;
+                    if (!historySection.isEmpty()) {
+                        value0 = historySection.get(pointcode).getValue();
+                    }
+                    bigDecimal1 = new BigDecimal(Double.toString(value0));
+
+                    List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
+
                     if (historyRaw.size() > 0) {
-                        bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+//                        bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
                         bigDecimal1 = bigDecimal1.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
                         bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
                         bigDecimal2 = bigDecimal2.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
@@ -365,59 +392,59 @@ class SaveMeterInfoHistoryDayTest {
 
                     }
                 }
-                    System.out.println("map集合:"+map);
-                    try {
-                        BigDecimal bigDecimal1 = (BigDecimal) ScriptShell.parseExpr(formula2, map);
-                        System.out.println("公式计算后数据:"+bigDecimal1);
-                        MeterInfoCalculating meterInfoCalculating = new MeterInfoCalculating();
-                        meterInfoCalculating.setName(meterPoint.getName());
-                        meterInfoCalculating.setCode(meterPoint.getNemCode());
-                        meterInfoCalculating.setDate(dateTime1.toLocalDateTime());
-                        meterInfoCalculating.setValue(bigDecimal1);
-                        meterInfoCalculating.setUpdateTime(LocalDateTime.now());
-                        meterInfoCalculating.setWindpowerstationId(meterPoint.getWindpowerstationId());
-
-                        QueryWrapper<MeterInfoCalculating> queryWrapper = new QueryWrapper<>();
-                        queryWrapper.eq("date", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
-                        List<MeterInfoCalculating> list = meterInfoCalculatingService.list(queryWrapper);
-                        if (list.size() > 0) {
-                            meterInfoCalculating.update(queryWrapper);
-                        } else {
-                            meterInfoCalculating.insert();
-                        }
-
-                    }catch (ArithmeticException e) {
-
-                        MeterInfoCalculating meterInfoCalculating = new MeterInfoCalculating();
-                        meterInfoCalculating.setName(meterPoint.getName());
-                        meterInfoCalculating.setCode(meterPoint.getNemCode());
-                        meterInfoCalculating.setDate(dateTime1.toLocalDateTime());
-                        meterInfoCalculating.setValue(BigDecimal.valueOf(0));
-                        meterInfoCalculating.setUpdateTime(LocalDateTime.now());
-                        meterInfoCalculating.setWindpowerstationId(meterPoint.getWindpowerstationId());
-
-                        QueryWrapper<MeterInfoCalculating> queryWrapper = new QueryWrapper<>();
-                        queryWrapper.eq("date", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
-                        List<MeterInfoCalculating> list = meterInfoCalculatingService.list(queryWrapper);
-                        if (list.size() > 0) {
-                            meterInfoCalculating.update(queryWrapper);
-                        } else {
-                            meterInfoCalculating.insert();
-                        }
+                System.out.println("map集合:" + map);
+                try {
+                    BigDecimal bigDecimal1 = (BigDecimal) ScriptShell.parseExpr(formula2, map);
+                    System.out.println("公式计算后数据:" + bigDecimal1);
+                    MeterInfoCalculating meterInfoCalculating = new MeterInfoCalculating();
+                    meterInfoCalculating.setName(meterPoint.getName());
+                    meterInfoCalculating.setCode(meterPoint.getNemCode());
+                    meterInfoCalculating.setDate(dateTime1.toLocalDateTime());
+                    meterInfoCalculating.setValue(bigDecimal1);
+                    meterInfoCalculating.setUpdateTime(LocalDateTime.now());
+                    meterInfoCalculating.setWindpowerstationId(meterPoint.getWindpowerstationId());
+
+                    QueryWrapper<MeterInfoCalculating> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("date", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
+                    List<MeterInfoCalculating> list = meterInfoCalculatingService.list(queryWrapper);
+                    if (list.size() > 0) {
+                        meterInfoCalculating.update(queryWrapper);
+                    } else {
+                        meterInfoCalculating.insert();
+                    }
 
-                    } catch (Exception e) {
-                        System.out.println("存入异常  :" + e.getMessage());
+                } catch (ArithmeticException e) {
 
+                    MeterInfoCalculating meterInfoCalculating = new MeterInfoCalculating();
+                    meterInfoCalculating.setName(meterPoint.getName());
+                    meterInfoCalculating.setCode(meterPoint.getNemCode());
+                    meterInfoCalculating.setDate(dateTime1.toLocalDateTime());
+                    meterInfoCalculating.setValue(BigDecimal.valueOf(0));
+                    meterInfoCalculating.setUpdateTime(LocalDateTime.now());
+                    meterInfoCalculating.setWindpowerstationId(meterPoint.getWindpowerstationId());
 
+                    QueryWrapper<MeterInfoCalculating> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("date", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
+                    List<MeterInfoCalculating> list = meterInfoCalculatingService.list(queryWrapper);
+                    if (list.size() > 0) {
+                        meterInfoCalculating.update(queryWrapper);
+                    } else {
+                        meterInfoCalculating.insert();
                     }
 
+                } catch (Exception e) {
+                    System.out.println("存入异常  :" + e.getMessage());
+
+
+                }
+
             }
         }
     }
 
     //调用上面4个,第四个需要3-4次
     @Test
-    void saveCalculating3() {
+    void saveFJ() {
         this.saveEquipmentRfdl();
         this.saveBottomCode();
         this.saveCalculatingProjectFDL();
@@ -425,8 +452,392 @@ class SaveMeterInfoHistoryDayTest {
         this.saveCalculating();
         this.saveCalculating();
         this.saveCalculating();
+    }
+
+
+    //光伏日发电量
+    @Test
+    void saveEquipmentRfdl_GF() {
+
+
+        //1,在testingpoint中根据 uniform_code=AI064 和code like "%_G_IN_%" 取出所有光伏的电量测点code
+        List<TestingPoint> testingPointList = testingPointService.list(new QueryWrapper<TestingPoint>()
+                .eq("uniform_code", "AI064")
+                .like("thing_id", "%_G_IN_%")
+        );
+
+        //2,遍历list,每次取出一个code
+        for (TestingPoint testingPoint : testingPointList) {
+            //获取测点code
+            String pointcode = testingPoint.getCode();
+            //获取设备ID
+            String thingId = testingPoint.getThingId();
+
+            //设置取值开始时间
+            String startString = startTimeString;
+            DateTime startDateTime = DateUtil.parse(startString);
+
+            //设置取值结束时间
+            String endDateString = endTimeString;
+            DateTime endDateTime = DateUtil.parse(endDateString);
+
+            //指定开始日期到结束日期的天数
+            LocalDateTime day1 = LocalDateTimeUtil.of(startDateTime);
+            LocalDateTime day2 = LocalDateTimeUtil.of(endDateTime);
+            long between = ChronoUnit.DAYS.between(day1, day2);
+
+            for (int i = 0; i <= between; i++) {
+
+                DateTime dateTime0 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i), -1);
+                DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
+//                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i + 1), -1);
+
+                //8,结束点发电量减去开始点发电量得到日发电量(单位Kwh)
+                Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                double value0 = 0;
+                if (!historySection.isEmpty()) {
+                    value0 = historySection.get(pointcode).getValue();
+                }
+                BigDecimal bigDecimal1 = new BigDecimal(Double.toString(value0));
+
+
+                List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
+
+                BigDecimal rfdl = new BigDecimal(0);
+
+                if (historyRaw.size() > 0) {
+//                    BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+                    BigDecimal bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
+                    rfdl = bigDecimal2.subtract(bigDecimal1);
+
+                    if (rfdl.doubleValue() > 15000 || rfdl.doubleValue() < 0) {
+
+                        ArrayList<Double> arrayList = new ArrayList<>();
+                        for (PointData pointData : historyRaw) {
+                            arrayList.add(pointData.getValue());
+                        }
+
+                        int index = -1;
+                        for (int j = 1; j < arrayList.size(); j++) {
+                            double current = arrayList.get(j);
+                            double previous = arrayList.get(j - 1);
+                            double difference = current - previous;
+                            if (difference > 15000 || difference < -1) {
+                                index = j;
+                                break;
+                            }
+                        }
+                        if (index != -1) {
+                            double valueGrow2 = arrayList.get(index);
+                            BigDecimal bigDecimalGrow2 = new BigDecimal(Double.toString(valueGrow2));
+                            double valueGrow1 = arrayList.get(index - 1);
+                            BigDecimal bigDecimalGrow1 = new BigDecimal(Double.toString(valueGrow1));
+                            rfdl = (bigDecimal2.subtract(bigDecimalGrow2)).add(bigDecimalGrow1.subtract(bigDecimal1));
+                        }
+                    }
+                }
+                //9,company_nem_code   (powerstation_nem_code project_nem_code line_nem_code equipment_nem_code )都在basic equipment中叫project_id    name date rfdl 存入meterInfo表中
+                Equipment thingId1 = equipmentService.getOne(new QueryWrapper<Equipment>().eq("nem_code", thingId));
+
+                MeterInfoEquipment meterInfoEquipment = new MeterInfoEquipment();
+                meterInfoEquipment.setPowerstationNemCode(thingId1.getWindpowerstationId());
+                meterInfoEquipment.setProjectNemCode(thingId1.getProjectId());
+                meterInfoEquipment.setLineNemCode(thingId1.getLineId());
+                meterInfoEquipment.setEquipmentNemCode(thingId1.getNemCode());
+                meterInfoEquipment.setName(thingId1.getName());
+                meterInfoEquipment.setDate(dateTime1.toLocalDateTime());
+                meterInfoEquipment.setRfdl(rfdl);
+                meterInfoEquipment.setUpdateTime(LocalDateTime.now());
+                QueryWrapper<MeterInfoEquipment> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("equipment_nem_code", thingId1.getNemCode()).eq("date", dateTime1.toLocalDateTime());
+                List<MeterInfoEquipment> list = meterInfoEquipmentService.list(queryWrapper);
+                if (list.size() > 0) {
+                    meterInfoEquipment.update(queryWrapper);
+                } else {
+                    meterInfoEquipment.insert();
+                }
+            }
+        }
+    }
+
+    //光伏底码数据
+    @Test
+    void saveBottomCode_GF() {
+
+        //1,查询所有风电场
+        List<PowerStation> powerStationList = powerStationService.list(new QueryWrapper<PowerStation>().like("nem_code", "_GDC_"));
+
+        for (PowerStation powerStation : powerStationList) {
+
+            //2,根据场站ID得到场站下所有测点
+            List<MeterPoint> meterPointList = meterPointService.list(new QueryWrapper<MeterPoint>()
+                    .eq("windpowerstation_id", powerStation.getId())
+                    .eq("property", "CD")
+            );
+
+            //3,遍历测点,拿到每个测点的nem_code
+            for (MeterPoint meterPoint : meterPointList) {
+                System.out.println(meterPoint);
+                //获取测点code
+                String pointcode = meterPoint.getNemCode();
+
+                //设置取值开始时间
+                String startString = startTimeString;
+                DateTime startDateTime = DateUtil.parse(startString);
+
+                //设置取值结束时间
+                String endDateString = endTimeString;
+                DateTime endDateTime = DateUtil.parse(endDateString);
+
+                //指定开始日期到结束日期的天数
+                LocalDateTime day1 = LocalDateTimeUtil.of(startDateTime);
+                LocalDateTime day2 = LocalDateTimeUtil.of(endDateTime);
+                long between = ChronoUnit.DAYS.between(day1, day2);
+
+                for (int i = 0; i <= between; i++) {
+
+                    DateTime dateTime0 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i), -1);
+                    //开始时间00:00:01
+                    DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
+                    //结束时间第二天00:00:01
+//                    DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                    DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i + 1), -1);
+
+                    BigDecimal bigDecimal1 = new BigDecimal(0);
+                    BigDecimal bigDecimal2 = new BigDecimal(0);
+                    BigDecimal rfdl = new BigDecimal(0);
+
+                    Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                    double value0 = 0;
+                    if (!historySection.isEmpty()) {
+                        value0 = historySection.get(pointcode).getValue();
+                    }
+                    bigDecimal1 = new BigDecimal(Double.toString(value0));
+
+                    List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
+
+                    if (historyRaw.size() > 0) {
+//                        bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+                        bigDecimal1 = bigDecimal1.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
+                        bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
+                        bigDecimal2 = bigDecimal2.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
+                        rfdl = bigDecimal2.subtract(bigDecimal1).multiply(meterPoint.getMagnification());
+
+                        if (rfdl.doubleValue() > 5000000 || rfdl.doubleValue() < 0) {
+
+                            ArrayList<Double> arrayList = new ArrayList<>();
+                            for (PointData pointData : historyRaw) {
+                                arrayList.add(pointData.getValue());
+                            }
+                            int index = -1;
+                            // 定义增长阈值
+                            double threshold = 50000.0;
 
+                            for (int j = 1; j < arrayList.size(); j++) {
+                                double current = arrayList.get(j);
+                                double previous = arrayList.get(j - 1);
+                                double difference = current - previous;
+                                if (difference > threshold) {
+                                    index = j;
+                                    break;
+                                }
+                            }
+                            if (index != -1) {
+                                double valueGrow2 = arrayList.get(index);
+                                BigDecimal bigDecimalGrow2 = new BigDecimal(Double.toString(valueGrow2));
+                                double valueGrow1 = arrayList.get(index - 1);
+                                BigDecimal bigDecimalGrow1 = new BigDecimal(Double.toString(valueGrow1));
+                                rfdl = (bigDecimal2.subtract(bigDecimalGrow2).add(bigDecimalGrow1).subtract(bigDecimal1)).multiply(meterPoint.getMagnification());
+                            }
+                        }
+                    }
 
+                    MeterInfoBottomcode meterInfoBottomcode = new MeterInfoBottomcode();
+                    meterInfoBottomcode.setName(meterPoint.getName());
+                    meterInfoBottomcode.setStartTime(dateTime1.toLocalDateTime());
+                    meterInfoBottomcode.setStartValue(bigDecimal1);
+                    meterInfoBottomcode.setEndTime(dateTime2.toLocalDateTime());
+                    meterInfoBottomcode.setEndValue(bigDecimal2);
+                    meterInfoBottomcode.setDayValue(rfdl);
+                    meterInfoBottomcode.setCode(pointcode);
+                    meterInfoBottomcode.setWindpowerstationId(meterPoint.getWindpowerstationId());
+
+                    QueryWrapper<MeterInfoBottomcode> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("start_time", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
+                    List<MeterInfoBottomcode> list = meterInfoBottomcodeService.list(queryWrapper);
+                    if (list.size() > 0) {
+                        meterInfoBottomcode.update(queryWrapper);
+                    } else {
+                        meterInfoBottomcode.insert();
+                    }
+                }
+            }
+        }
+    }
+
+    //有公式的计算光伏电量
+    @Test
+    void saveCalculating_GF() {
+
+        //设置取值开始时间
+        String startString = startTimeString;
+        DateTime startDateTime = DateUtil.parse(startString);
+
+        //设置取值结束时间
+        String endDateString = endTimeString;
+        DateTime endDateTime = DateUtil.parse(endDateString);
+
+        //指定开始日期到结束日期的天数
+        LocalDateTime day1 = LocalDateTimeUtil.of(startDateTime);
+        LocalDateTime day2 = LocalDateTimeUtil.of(endDateTime);
+        long between = ChronoUnit.DAYS.between(day1, day2);
+
+        List<MeterPoint> meterPointJSDList = meterPointService.list(new QueryWrapper<MeterPoint>()
+                .eq("property", "JSD_GF")
+                .ne("formula", ""));
+
+
+        //时间集合,以便后面批量查询
+        List<DateTime> dateTimes = new ArrayList<>();
+        for (int i = 0; i <= between; i++) {
+            DateTime dateTime4 = DateUtil.offsetDay(startDateTime, i);
+            dateTimes.add(dateTime4);
+        }
+        //code集合,以便后面批量查询
+        List<String> codes = new ArrayList<>();
+        for (MeterPoint meterPoint : meterPointJSDList) {
+            String formula1 = meterPoint.getFormula();
+            System.out.println("转换前的公式:" + formula1);
+            String formula2 = formula1.replaceAll("DL.NX", "DL_NX").replaceAll("DJL.", "DJL_");
+            System.out.println("转换后的公式字符串:" + formula2);
+
+
+            String[] meterPointCodes = StringUtils.split(formula1, "[+-*/()]");
+            meterPointCodes = Arrays.stream(meterPointCodes)
+                    .filter(meterPointCode -> !(meterPointCode.length() < 8))
+                    .toArray(String[]::new);
+            System.out.println("过滤后公式中的测点数:" + meterPointCodes.length);
+            System.out.println(Arrays.toString(meterPointCodes));
+            codes.addAll(Arrays.asList(meterPointCodes));
+        }
+
+        //批量查询
+        List<MeterInfoCalculating> list1 = meterInfoCalculatingService.list(new QueryWrapper<MeterInfoCalculating>()
+                .in("code", codes)
+                .in("date", dateTimes)
+        );
+        List<MeterInfoBottomcode> list2 = meterInfoBottomcodeService.list(new QueryWrapper<MeterInfoBottomcode>()
+                .in("code", codes)
+                .in("start_time", dateTimes));
+
+
+        for (MeterPoint meterPoint : meterPointJSDList) {
+            String formula1 = meterPoint.getFormula();
+            System.out.println("转换前的公式:" + formula1);
+            String formula2 = formula1.replaceAll("DL.NX", "DL_NX").replaceAll("DJL.", "DJL_");
+            System.out.println("转换后的公式字符串:" + formula2);
+
+
+            String[] meterPointCodes = StringUtils.split(formula1, "[+-*/()]");
+            meterPointCodes = Arrays.stream(meterPointCodes)
+                    .filter(meterPointCode -> !(meterPointCode.length() < 8))
+                    .toArray(String[]::new);
+            System.out.println("过滤后公式中的测点数:" + meterPointCodes.length);
+            System.out.println(Arrays.toString(meterPointCodes));
+
+
+            for (int i = 0; i <= between; i++) {
+                HashMap<String, Object> map = new HashMap<>();
+                //开始时间
+                DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
+//                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                //遍历code数据,拿到每一个code,用code和时间,在meter_info_bottom中拿到dayValue
+                for (String meterPointCode : meterPointCodes) {
+//                    String meterPointCode_ = meterPointCode.replaceAll("\\.", "_");
+                    String meterPointCode_ = meterPointCode.replaceAll("DL.", "DL_").replaceAll("DJL.", "DJL_");
+                    System.out.println("要查询的点code:" + meterPointCode);
+                    System.out.println("替换后的点code:" + meterPointCode_);
+//
+                    try {
+                        if (meterPointCode.startsWith("DL")) {
+                            System.out.println("计算测点DL:" + meterPointCode);
+                            for (MeterInfoCalculating meterInfoCalculating : list1) {
+                                if(meterInfoCalculating.getCode().equals(meterPointCode)&&meterInfoCalculating.getDate().equals(dateTime1.toLocalDateTime())){
+
+                                    System.out.println("DL点数据:" + meterInfoCalculating.getValue());
+                                    map.put(meterPointCode_, meterInfoCalculating.getValue());
+
+                                }
+                            }
+//                            MeterInfoCalculating meterInfoCalculating = meterInfoCalculatingService.getOne(new QueryWrapper<MeterInfoCalculating>().eq("code", meterPointCode).eq("date", dateTime1));
+                        } else {
+                            System.out.println("计算测点Bottom:" + meterPointCode);
+
+                            for (MeterInfoBottomcode meterInfoBottomcode : list2) {
+                                if(meterInfoBottomcode.getCode().equals(meterPointCode)&&meterInfoBottomcode.getStartTime().equals(dateTime1.toLocalDateTime())){
+
+                                    System.out.println("Bottom点数据日电量:" + meterInfoBottomcode.getDayValue());
+                                    map.put(meterPointCode_, meterInfoBottomcode.getDayValue());
+                                }
+                            }
+//                            MeterInfoBottomcode meterInfoBottomcode = meterInfoBottomcodeService.getOne(new QueryWrapper<MeterInfoBottomcode>().eq("code", meterPointCode).eq("start_time", dateTime1));
+
+                        }
+
+                    } catch (Exception e) {
+                        System.out.println("获取数据异常:" + e.getMessage());
+
+                    }
+                }
+                System.out.println("map集合:" + map);
+                try {
+                    BigDecimal bigDecimal1 = (BigDecimal) ScriptShell.parseExpr(formula2, map);
+                    System.out.println("公式计算后数据:" + bigDecimal1);
+                    MeterInfoCalculating meterInfoCalculating = new MeterInfoCalculating();
+                    meterInfoCalculating.setName(meterPoint.getName());
+                    meterInfoCalculating.setCode(meterPoint.getNemCode());
+                    meterInfoCalculating.setDate(dateTime1.toLocalDateTime());
+                    meterInfoCalculating.setValue(bigDecimal1);
+                    meterInfoCalculating.setUpdateTime(LocalDateTime.now());
+                    meterInfoCalculating.setWindpowerstationId(meterPoint.getWindpowerstationId());
+
+                    QueryWrapper<MeterInfoCalculating> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("date", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
+                    List<MeterInfoCalculating> list = meterInfoCalculatingService.list(queryWrapper);
+                    if (list.size() > 0) {
+                        meterInfoCalculating.update(queryWrapper);
+                    } else {
+                        meterInfoCalculating.insert();
+                    }
+
+                } catch (ArithmeticException e) {
+
+                    MeterInfoCalculating meterInfoCalculating = new MeterInfoCalculating();
+                    meterInfoCalculating.setName(meterPoint.getName());
+                    meterInfoCalculating.setCode(meterPoint.getNemCode());
+                    meterInfoCalculating.setDate(dateTime1.toLocalDateTime());
+                    meterInfoCalculating.setValue(BigDecimal.valueOf(0));
+                    meterInfoCalculating.setUpdateTime(LocalDateTime.now());
+                    meterInfoCalculating.setWindpowerstationId(meterPoint.getWindpowerstationId());
+
+                    QueryWrapper<MeterInfoCalculating> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("date", dateTime1.toLocalDateTime()).eq("code", meterPoint.getNemCode());
+                    List<MeterInfoCalculating> list = meterInfoCalculatingService.list(queryWrapper);
+                    if (list.size() > 0) {
+                        meterInfoCalculating.update(queryWrapper);
+                    } else {
+                        meterInfoCalculating.insert();
+                    }
+
+                } catch (Exception e) {
+                    System.out.println("存入异常  :" + e.getMessage());
+
+
+                }
+
+            }
+        }
     }
 
 

+ 18 - 6
electricity/meter/src/main/java/com/gyee/gaia/meter/service/meter/SaveBottomcode.java

@@ -19,6 +19,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Author: malijun
@@ -62,20 +63,31 @@ public class SaveBottomcode {
                 //开始时间00:00:01
                 DateTime dateTime1 = startDateTime;
 
-                //结束时间第二天00:00:01
-                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, 1);
-
-                //从适配器拿当日数据
-                List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
+                //结束时间第
+//                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, 1);
+                DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, 1), -1);
+                DateTime dateTime0 = DateUtil.offsetMillisecond(startDateTime, -1);
 
                 //定义开始值,结束值,日发电量值,给0,避免适配器拿不到数
                 BigDecimal bigDecimal1 = new BigDecimal(0);
                 BigDecimal bigDecimal2 = new BigDecimal(0);
                 BigDecimal rfdl = new BigDecimal(0);
 
+                Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                double value0 = 0;
+                if (!historySection.isEmpty()) {
+                    value0 = historySection.get(pointcode).getValue();
+                    bigDecimal1 = new BigDecimal(Double.toString(value0));
+                }
+
+                //从适配器拿当日数据
+                List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
+
+
+
                 //适配器拿到开始值和结束值,除以系数(四舍五入保留4位),乘倍率得到日电量
                 if (historyRaw.size() > 0) {
-                    bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+//                    bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
                     bigDecimal1 = bigDecimal1.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
                     bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
                     bigDecimal2 = bigDecimal2.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);

+ 20 - 5
electricity/meter/src/main/java/com/gyee/gaia/meter/service/meter/SaveEquipmentFDL.java

@@ -13,6 +13,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Author: malijun
@@ -53,19 +54,30 @@ public class SaveEquipmentFDL {
             DateTime startDateTime = DateUtil.beginOfDay(nowDateTime);
 
 
-            //开始时间00:00:01
-            //结束时间第二天00:00:01
-            DateTime dateTime2 = DateUtil.offsetDay(startDateTime, 1);
+
+            DateTime dateTime0 = DateUtil.offsetMillisecond(startDateTime, -1);
+//            DateTime dateTime2 = DateUtil.offsetDay(startDateTime, 1);
+            DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, 1), -1);
+
+
+            Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+            double value0 = 0;
+            if (!historySection.isEmpty()) {
+                value0 = historySection.get(pointcode).getValue();
+            }
+            BigDecimal bigDecimal1 = new BigDecimal(Double.toString(value0));
 
             //8,通过适配器拿到一天的发电量数据,
             List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, startDateTime.getTime(), dateTime2.getTime());
 
+
+
             //定义日发电量,先给0
             BigDecimal rfdl = new BigDecimal(0);
 
             //如果适配器拿到数据,计算日发电量
             if (historyRaw.size() > 0) {
-                BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+//                BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
                 BigDecimal bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
                 rfdl = bigDecimal2.subtract(bigDecimal1);
 
@@ -151,7 +163,10 @@ public class SaveEquipmentFDL {
             //开始时间00:00:01
 
             //根据时间和项目期次ID查询设备日发电量表
-            List<MeterInfoEquipment> meterInfoEquipments = meterInfoEquipmentService.list(new QueryWrapper<MeterInfoEquipment>().eq("project_nem_code", projectId).eq("date", startDateTime));
+            List<MeterInfoEquipment> meterInfoEquipments = meterInfoEquipmentService.list(new QueryWrapper<MeterInfoEquipment>()
+                    .eq("project_nem_code", projectId)
+                    .eq("date", startDateTime)
+            );
 
             //遍历累加取出的数据
             BigDecimal bigDecimal = BigDecimal.valueOf(0);

+ 29 - 9
electricity/meter/src/main/java/com/gyee/gaia/meter/service/meter/SaveMeterInfoYesterday.java

@@ -16,10 +16,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 
 /**
  * Author: malijun
@@ -78,8 +75,18 @@ class SaveMeterInfoYesterday {
 
             for (int i = 0; i <= between; i++) {
 
+                DateTime dateTime0 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i), -1);
                 DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
-                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+//                DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i+1), -1);
+
+
+                Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                double value0 = 0;
+                if (!historySection.isEmpty()) {
+                    value0 = historySection.get(pointcode).getValue();
+                }
+                BigDecimal bigDecimal1 = new BigDecimal(Double.toString(value0));
 
                 //8,结束点发电量减去开始点发电量得到日发电量(单位Kwh)
                 List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
@@ -87,7 +94,7 @@ class SaveMeterInfoYesterday {
                 BigDecimal rfdl = new BigDecimal(0);
 
                 if (historyRaw.size() > 0) {
-                    BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+//                    BigDecimal bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
                     BigDecimal bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
                     rfdl = bigDecimal2.subtract(bigDecimal1);
 
@@ -228,18 +235,31 @@ class SaveMeterInfoYesterday {
 
                 for (int i = 0; i <= between; i++) {
 
+                    DateTime dateTime0 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i), -1);
+
                     //开始时间00:00:01
                     DateTime dateTime1 = DateUtil.offsetDay(startDateTime, i);
                     //结束时间第二天00:00:01
-                    DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+//                    DateTime dateTime2 = DateUtil.offsetDay(startDateTime, i + 1);
+                    DateTime dateTime2 = DateUtil.offsetMillisecond(DateUtil.offsetDay(startDateTime, i+1), -1);
+
 
-                    List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
                     BigDecimal bigDecimal1 = new BigDecimal(0);
                     BigDecimal bigDecimal2 = new BigDecimal(0);
                     BigDecimal rfdl = new BigDecimal(0);
 
+                    Map<String, PointData> historySection = adapter.getHistorySection(pointcode, dateTime0.getTime());
+                    double value0 = 0;
+                    if (!historySection.isEmpty()) {
+                        value0 = historySection.get(pointcode).getValue();
+                         bigDecimal1 = new BigDecimal(Double.toString(value0));
+                    }
+
+                    List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
+
+
                     if (historyRaw.size() > 0) {
-                        bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
+//                        bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
                         bigDecimal1 = bigDecimal1.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
                         bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
                         bigDecimal2 = bigDecimal2.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);