learshaw 4 kuukautta sitten
vanhempi
commit
39aa59fff1

+ 17 - 11
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/MqttBaseHandler.java

@@ -70,8 +70,6 @@ public abstract class MqttBaseHandler {
      */
     protected static final Map<String, Map<String, String>> attrCache = new ConcurrentHashMap<>();
 
-    protected static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-
     /**
      * 最后一次消息时间缓存key
      */
@@ -217,11 +215,16 @@ public abstract class MqttBaseHandler {
         try {
             List<MeterDevice> deviceList = getMeterDeviceList();
             List<ElecMeterH> meterHList = new ArrayList<>();
+            Map<String, Price> priceMap = new ConcurrentHashMap<>();
+            Date date = DateUtils.adjustHour(new Date(), -1);
 
             for (MeterDevice device : deviceList) {
                 ElecMeterH elecMeterH = meterHourProdSub(device);
 
                 if (null != elecMeterH) {
+                    Price price = priceMap.computeIfAbsent(device.getAreaCode(),
+                        k -> priceService.getElecHourPrice(device.getAreaCode(), date));
+                    completePrice(device, elecMeterH, price);
                     meterHList.add(elecMeterH);
                 }
             }
@@ -237,6 +240,16 @@ public abstract class MqttBaseHandler {
         return cnt;
     }
 
+    private void completePrice(MeterDevice device, ElecMeterH elecMeterH, Price price) {
+        if (null != price) {
+            BigDecimal useQuantity = new BigDecimal(String.valueOf(elecMeterH.getElecQuantity()));
+            BigDecimal cost = useQuantity.multiply(new BigDecimal(String.valueOf(price.getPriceValue())));
+            elecMeterH.setMeterType(price.getMeterType());
+            elecMeterH.setMeterUnitPrice(price.getPriceValue());
+            elecMeterH.setUseElecCost(cost.doubleValue());
+        }
+    }
+
     private ElecMeterH meterHourProdSub(MeterDevice device) {
         ElecMeterH elecMeterH = null;
 
@@ -246,9 +259,11 @@ public abstract class MqttBaseHandler {
         String lastMeterReading = attrMap.get(LAST_HOUR_READING);
         String newMeterReading = attrMap.get("energy");
 
+        // 缓存不为空,使用缓存抄表计算
         if (StringUtils.isNotEmpty(lastMeterReading)) {
             elecMeterH = execHourMeter(device, lastMeterReading, newMeterReading);
         }
+        // 缓存为空,使用数据库记录计算
         else {
             ElecMeterH dbElecMeterH = elecMeterHService.selectLatelyItem(device.getDeviceCode());
 
@@ -302,15 +317,6 @@ public abstract class MqttBaseHandler {
         elecMeterH.setElecQuantity(useQuantity.doubleValue());
         elecMeterH.setMeterReading(newEngValue.doubleValue());
 
-        Price price = priceService.getElecHourPrice(device.getAreaCode(), date);
-
-        if (null != price) {
-            BigDecimal cost = useQuantity.multiply(new BigDecimal(String.valueOf(price.getPriceValue())));
-            elecMeterH.setMeterType(price.getMeterType());
-            elecMeterH.setMeterUnitPrice(price.getPriceValue());
-            elecMeterH.setUseElecCost(cost.doubleValue());
-        }
-
         return elecMeterH;
     }