learshaw 4 ماه پیش
والد
کامیت
dfc833b4f2

+ 5 - 4
ems/ems-application/ems-admin/src/main/java/com/ruoyi/web/controller/ems/MeterDeviceController.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.ems.domain.MeterDevice;
+import com.ruoyi.ems.model.QueryDevice;
 import com.ruoyi.ems.service.IMeterDeviceService;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,9 +42,9 @@ public class MeterDeviceController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('ems:meterdevc:list')")
     @GetMapping("/list")
-    public TableDataInfo list(MeterDevice meterDevice) {
+    public TableDataInfo list(QueryDevice queryDevice) {
         startPage();
-        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(meterDevice);
+        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryDevice);
         return getDataTable(list);
     }
 
@@ -53,8 +54,8 @@ public class MeterDeviceController extends BaseController {
     @PreAuthorize("@ss.hasPermi('ems:meterdevc:export')")
     @Log(title = "计量设备", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, MeterDevice meterDevice) {
-        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(meterDevice);
+    public void export(HttpServletResponse response, QueryDevice queryDevice) {
+        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryDevice);
         ExcelUtil<MeterDevice> util = new ExcelUtil<MeterDevice>(MeterDevice.class);
         util.exportExcel(response, list, "计量设备数据");
     }

+ 52 - 0
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/TaskExecutor.java

@@ -0,0 +1,52 @@
+/*
+ * 文 件 名:  TaskHandler
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/3/18
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems;
+
+import com.ruoyi.ems.core.ObjectCache;
+import com.ruoyi.ems.handle.MqttBaseHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 任务调度
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/3/18]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+@Service
+public class TaskExecutor {
+    @Autowired
+    private ObjectCache objectCache;
+
+    @Qualifier("geekOpenCbHandler")
+    @Resource
+    private MqttBaseHandler geekOpenCbHandler;
+
+    /**
+     * 定时清理过期设备上报响应
+     */
+    @Scheduled(cron = "0 0/5 * * * ?")
+    public void cleanDevResCache() {
+        objectCache.cleanDevResCache();
+    }
+
+    @Scheduled(cron = "0 10 0/1 * * ?")
+    public void refreshOnline() {
+        geekOpenCbHandler.refreshOnline();
+    }
+}

+ 2 - 2
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/controller/CircuitBreakerController.java

@@ -50,7 +50,7 @@ public class CircuitBreakerController {
 
     @Qualifier("geekOpenCbHandler")
     @Resource
-    private MqttBaseHandler devAdapterService;
+    private MqttBaseHandler geekOpenCbHandler;
 
     /**
      * GeekOpen 断路器能力调用
@@ -66,7 +66,7 @@ public class CircuitBreakerController {
         CallResponse<Void> res = null;
 
         try {
-            res = devAdapterService.call(abilityPayload);
+            res = geekOpenCbHandler.call(abilityPayload);
         }
         catch (Exception e) {
             log.error("geekOpenCbAbilityCall fail!", e);

+ 9 - 11
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/core/MessageCache.java → ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/core/ObjectCache.java

@@ -11,7 +11,6 @@
 package com.ruoyi.ems.core;
 
 import com.ruoyi.ems.model.MqttCacheMsg;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -29,21 +28,20 @@ import java.util.concurrent.ConcurrentHashMap;
  * @since [产品/模块版本]
  */
 @Service
-public class MessageCache {
+public class ObjectCache {
     /**
      * 消息缓存队列
      */
-    private final static Map<String, MqttCacheMsg> mqttMessageMap = new ConcurrentHashMap<>();
+    private final static Map<String, MqttCacheMsg> devResCache = new ConcurrentHashMap<>();
 
     /**
-     * 定时清理过期的消息
+     * 清理过期的设备响应
      */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void cleanUpOldMessages() {
+    public void cleanDevResCache() {
         long currentTime = new Date().getTime();
         long threshold = 5 * 60 * 1000; // 分钟
 
-        Iterator<Map.Entry<String, MqttCacheMsg>> iterator = mqttMessageMap.entrySet().iterator();
+        Iterator<Map.Entry<String, MqttCacheMsg>> iterator = devResCache.entrySet().iterator();
         while (iterator.hasNext()) {
             Map.Entry<String, MqttCacheMsg> entry = iterator.next();
             MqttCacheMsg msg = entry.getValue();
@@ -54,11 +52,11 @@ public class MessageCache {
         }
     }
 
-    public void addMqttMessage(String messageId, MqttCacheMsg mqttMessage) {
-        mqttMessageMap.put(messageId, mqttMessage);
+    public void setDevResCache(String messageId, MqttCacheMsg mqttMessage) {
+        devResCache.put(messageId, mqttMessage);
     }
 
-    public MqttCacheMsg getAndRemoveMqttMessage(String messageId) {
-        return mqttMessageMap.remove(messageId);
+    public MqttCacheMsg readDevResponse(String messageId) {
+        return devResCache.remove(messageId);
     }
 }

+ 10 - 38
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/GeekOpenCbHandler.java

@@ -15,12 +15,11 @@ import com.huashe.common.exception.Assert;
 import com.huashe.common.exception.BusinessException;
 import com.huashe.common.utils.DateUtils;
 import com.huashe.common.utils.ThreadUtils;
-import com.ruoyi.ems.core.MessageCache;
+import com.ruoyi.ems.core.ObjectCache;
 import com.ruoyi.ems.domain.ElecMeterH;
 import com.ruoyi.ems.domain.EmsDevice;
 import com.ruoyi.ems.domain.EmsObjAbilityCallLog;
 import com.ruoyi.ems.domain.MeterDevice;
-import com.ruoyi.ems.enums.DevObjType;
 import com.ruoyi.ems.enums.DevOnlineStatus;
 import com.ruoyi.ems.model.AbilityPayload;
 import com.ruoyi.ems.model.CallResponse;
@@ -31,14 +30,11 @@ import com.ruoyi.ems.service.IElecMeterHService;
 import com.ruoyi.ems.service.IMeterDeviceService;
 import com.ruoyi.ems.service.IPriceService;
 import com.ruoyi.ems.util.IdUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -63,7 +59,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
     private static final Logger log = LoggerFactory.getLogger(GeekOpenCbHandler.class);
 
     @Autowired
-    private MessageCache messageCache;
+    private ObjectCache messageCache;
 
     @Autowired
     private IMeterDeviceService meterDeviceService;
@@ -92,7 +88,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
         String type = sendObject.getString("type");
         String system = sendObject.getString("system");
         String deviceCode = abilityParam.getObjCode();
-        String messageId = StringUtils.equals("syncStatistic", type) ? "auto" : ("CALL-" + IdUtils.generateMessageId());
+        String messageId = StringUtils.equals("statistic", type) ? "auto" : ("CALL-" + IdUtils.generateMessageId());
         String msgBody = addMsgId(abilityParam.getAbilityParam(), "messageId", messageId);
 
         // 发送消息到MQTT服务器
@@ -106,7 +102,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
             EmsObjAbilityCallLog logItem = saveCallLog(abilityParam, sendTime, 1);
 
             while (true) {
-                MqttCacheMsg cacheMsg = messageCache.getAndRemoveMqttMessage(messageId);
+                MqttCacheMsg cacheMsg = messageCache.readDevResponse(messageId);
 
                 if (null != cacheMsg) {
                     String receiveParam = cacheMsg.getPayload();
@@ -153,7 +149,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
                 // 前序调用的响应消息:1.写入消息队列,2.更新属性值
                 else if (StringUtils.isNotEmpty(messageId) && StringUtils.startsWith(messageId, "CALL-")) {
                     MqttCacheMsg mqttCacheMsg = new MqttCacheMsg(messageId, deviceCode, new Date(), payload);
-                    messageCache.addMqttMessage(messageId, mqttCacheMsg);
+                    messageCache.setDevResCache(messageId, mqttCacheMsg);
                     updateBaseAttr(device, msgBody);
                 }
                 // 设备同步数据(INFO类,协议类):更新基础属性值
@@ -176,39 +172,15 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
         }
     }
 
-    @Override
-    public int getObjType() {
-        return DevObjType.DEVC.getCode();
-    }
-
     /**
-     * 定时检测在线状态
-     * <br/>每小时执行一次,扫描2个小时无消息的设备,标记为离线状态
+     * 获取设备列表
+     * @return 设备列表
      */
-    @Scheduled(cron = "0 10 0/1 * * ?")
-    public void checkOnlineStatus() {
-        long currentTime = new Date().getTime();
-        long threshold = 2 * 60 * 60 * 1000; // 120分钟
-
+    @Override
+    public List<EmsDevice> getDeviceList() {
         QueryDevice queryDevice = new QueryDevice();
         queryDevice.setDeviceModel("M_W2_QF_GEEKOPEN");
-        List<EmsDevice> deviceList = deviceService.selectList(queryDevice);
-
-        if (CollectionUtils.isNotEmpty(deviceList)) {
-            for (EmsDevice device : deviceList) {
-                Map<String, String> attrMap = attrCache.get(device.getDeviceCode());
-
-                if (MapUtils.isNotEmpty(attrMap)) {
-                    String lastMsgTime = attrMap.get(MQTT_LAST_TIME);
-
-                    if (StringUtils.isNotEmpty(lastMsgTime)
-                        && (currentTime - DateUtils.stringToDate(lastMsgTime, DateUtils.YYYY_MM_DD_HH_MM_SS).getTime())
-                        > threshold) {
-                        refreshStatus(device, DevOnlineStatus.OFFLINE);
-                    }
-                }
-            }
-        }
+        return deviceService.selectList(queryDevice);
     }
 
     /**

+ 31 - 6
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/MqttBaseHandler.java

@@ -26,6 +26,7 @@ import com.ruoyi.ems.service.IEmsObjAbilityCallLogService;
 import com.ruoyi.ems.service.IEmsObjAttrValueService;
 import com.ruoyi.ems.service.IEmsObjReportLogService;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -99,13 +100,10 @@ public abstract class MqttBaseHandler {
     public abstract void msgHandle(String deviceCode, String payload);
 
     /**
-     * 获取设备对象类型
-     *
-     * @return 设备对象类型字符串
+     * 获取设备列表
+     * @return 设备列表
      */
-    public abstract int getObjType();
-
-
+    public abstract List<EmsDevice> getDeviceList();
 
     /**
      * 添加消息ID到消息中
@@ -151,6 +149,33 @@ public abstract class MqttBaseHandler {
     }
 
     /**
+     * 定时检测在线状态
+     * <br/>每小时执行一次,扫描2个小时无消息的设备,标记为离线状态
+     */
+    public void refreshOnline() {
+        long currentTime = new Date().getTime();
+        long threshold = 2 * 60 * 60 * 1000; // 120分钟
+
+        List<EmsDevice> deviceList = getDeviceList();
+
+        if (CollectionUtils.isNotEmpty(deviceList)) {
+            for (EmsDevice device : deviceList) {
+                Map<String, String> attrMap = attrCache.get(device.getDeviceCode());
+
+                if (MapUtils.isNotEmpty(attrMap)) {
+                    String lastMsgTime = attrMap.get(MQTT_LAST_TIME);
+
+                    if (StringUtils.isNotEmpty(lastMsgTime)
+                        && (currentTime - DateUtils.stringToDate(lastMsgTime, DateUtils.YYYY_MM_DD_HH_MM_SS).getTime())
+                        > threshold) {
+                        refreshStatus(device, DevOnlineStatus.OFFLINE);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
      * 校验是否需要更新属性值
      *
      * @param jsonBody jsonBody 消息体

+ 0 - 1
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/RootMsgHandler.java

@@ -11,7 +11,6 @@
 package com.ruoyi.ems.handle;
 
 import com.ruoyi.ems.core.MqttMessageHandler;
-import com.ruoyi.ems.core.MessageCache;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 40 - 5
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/MeterDeviceController.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.controller;
 
 import com.huashe.common.domain.AjaxResult;
+import com.huashe.common.exception.BusinessException;
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.page.TableDataInfo;
@@ -9,11 +10,14 @@ import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.ems.domain.Area;
 import com.ruoyi.ems.domain.MeterDevice;
+import com.ruoyi.ems.model.QueryDevice;
 import com.ruoyi.ems.model.TreeEntity;
 import com.ruoyi.ems.service.IAreaService;
 import com.ruoyi.ems.service.IMeterDeviceService;
+import com.ruoyi.ems.util.AreaUtils;
 import io.swagger.annotations.Api;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -52,13 +56,44 @@ public class MeterDeviceController extends BaseController {
      */
     @RequiresPermissions("ems:meterdevc:list")
     @GetMapping("/list")
-    public TableDataInfo list(MeterDevice meterDevice) {
+    public TableDataInfo list(QueryDevice queryDevice) {
         startPage();
-        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(meterDevice);
+        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryDevice);
         return getDataTable(list);
     }
 
     /**
+     * 递归查询 区域 下的设备(分页)
+     */
+    @RequiresPermissions("basecfg:device:list")
+    @GetMapping("/listRecursionByArea")
+    public TableDataInfo listRecursionByArea(QueryDevice queryDevice) {
+        TableDataInfo tabInfo = null;
+
+        try {
+            if (StringUtils.isNotEmpty(queryDevice.getLocationRef())) {
+                List<Area> areaTree = areaService.selectAreaTree(queryDevice.getLocationRef(), true);
+                List<String> areaCodes = new ArrayList<>();
+                areaCodes.add(queryDevice.getLocationRef());
+                // 递归取出区域子节点code做查询条件(需要将子节点区域关联设备一并取出)
+                AreaUtils.getCodeRecursion(areaTree, areaCodes);
+                queryDevice.setAreaCodes(areaCodes);
+            }
+
+            startPage();
+            List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryDevice);
+            tabInfo = getDataTable(list);
+        }
+        catch (BusinessException e) {
+            tabInfo = new TableDataInfo();
+            tabInfo.setCode(e.getCode());
+            tabInfo.setMsg(e.getMessage());
+        }
+
+        return tabInfo;
+    }
+
+    /**
      * 根据设施获取设备树结构
      *
      * @param parentCode 区域code
@@ -76,7 +111,7 @@ public class MeterDeviceController extends BaseController {
         List<Area> areas = areaService.selectAreaTree(parentCode, true);
 
         // 查询设备列表
-        MeterDevice queryParam = new MeterDevice();
+        QueryDevice queryParam = new QueryDevice();
         queryParam.setMeterCls(meterCls);
         queryParam.setColMode(colMode);
         List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryParam);
@@ -138,8 +173,8 @@ public class MeterDeviceController extends BaseController {
     @RequiresPermissions("ems:meterdevc:export")
     @Log(title = "计量设备", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, MeterDevice meterDevice) {
-        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(meterDevice);
+    public void export(HttpServletResponse response, QueryDevice queryDevice) {
+        List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryDevice);
         ExcelUtil<MeterDevice> util = new ExcelUtil<MeterDevice>(MeterDevice.class);
         util.exportExcel(response, list, "计量设备数据");
     }

+ 3 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/MeterDeviceMapper.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.MeterDevice;
+import com.ruoyi.ems.model.QueryDevice;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -35,10 +36,10 @@ public interface MeterDeviceMapper {
     /**
      * 查询计量设备列表
      *
-     * @param meterDevice 计量设备
+     * @param queryDevice 计量设备
      * @return 计量设备集合
      */
-    List<MeterDevice> selectMeterDeviceList(MeterDevice meterDevice);
+    List<MeterDevice> selectMeterDeviceList(QueryDevice queryDevice);
 
     /**
      * 新增计量设备

+ 3 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/service/IMeterDeviceService.java

@@ -2,6 +2,7 @@ package com.ruoyi.ems.service;
 
 import com.ruoyi.ems.domain.MeterDevice;
 import com.ruoyi.ems.enums.MeterObjType;
+import com.ruoyi.ems.model.QueryDevice;
 
 import java.util.List;
 
@@ -31,10 +32,10 @@ public interface IMeterDeviceService {
     /**
      * 查询计量设备列表
      *
-     * @param meterDevice 计量设备
+     * @param queryDevice 计量设备
      * @return 计量设备集合
      */
-    List<MeterDevice> selectMeterDeviceList(MeterDevice meterDevice);
+    List<MeterDevice> selectMeterDeviceList(QueryDevice queryDevice);
 
     /**
      * 查询区域计量表计

+ 4 - 3
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/MeterDeviceServiceImpl.java

@@ -3,6 +3,7 @@ package com.ruoyi.ems.service.impl;
 import com.ruoyi.ems.domain.MeterDevice;
 import com.ruoyi.ems.enums.MeterObjType;
 import com.ruoyi.ems.mapper.MeterDeviceMapper;
+import com.ruoyi.ems.model.QueryDevice;
 import com.ruoyi.ems.service.IMeterDeviceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -39,12 +40,12 @@ public class MeterDeviceServiceImpl implements IMeterDeviceService {
     /**
      * 查询计量设备列表
      *
-     * @param meterDevice 计量设备
+     * @param queryDevice 计量设备
      * @return 计量设备
      */
     @Override
-    public List<MeterDevice> selectMeterDeviceList(MeterDevice meterDevice) {
-        return meterDeviceMapper.selectMeterDeviceList(meterDevice);
+    public List<MeterDevice> selectMeterDeviceList(QueryDevice queryDevice) {
+        return meterDeviceMapper.selectMeterDeviceList(queryDevice);
     }
 
     @Override

+ 7 - 1
ems/ems-core/src/main/resources/mapper/ems/MeterDeviceMapper.xml

@@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select id, area_code, device_code, device_name, location, location_ref, meter_cls, obj_tag, col_cycle, col_mode, magnification, spec_desc from adm_meter_device
     </sql>
 
-    <select id="selectMeterDeviceList" parameterType="com.ruoyi.ems.domain.MeterDevice" resultMap="meterDeviceResult">
+    <select id="selectMeterDeviceList" parameterType="com.ruoyi.ems.model.QueryDevice" resultMap="meterDeviceResult">
         <include refid="selectMeterDeviceVo"/>
         <where>
             <if test="deviceCode != null and deviceCode != ''"> and device_code = #{deviceCode}</if>
@@ -32,6 +32,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="meterCls != null and meterCls != ''"> and meter_cls = #{meterCls}</if>
             <if test="objTag != null and objTag != ''"> and obj_tag = #{objTag}</if>
             <if test="colMode != null "> and col_mode = #{colMode}</if>
+            <if test="locationRef != null and locationRef != '' and areaCodes != null">
+                and `location_ref` in
+                <foreach item="areaCode" collection="areaCodes" open="(" separator="," close=")">
+                    #{areaCode}
+                </foreach>
+            </if>
         </where>
     </select>