Просмотр исходного кода

新增设备公共方法调用

liuyaowen 1 год назад
Родитель
Сommit
538de7f526

+ 18 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/common/domin/IotDeviceBaseFunReqVo.java

@@ -0,0 +1,18 @@
+package com.yunfeiyun.agmp.iotm.device.common.domin;
+
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import lombok.Data;
+
+@Data
+public class IotDeviceBaseFunReqVo {
+    private String devBid;
+    private IotDevice iotDevice;
+    /**
+     * 操作类型-》对应所有的DeviceBaseService接口实现类中的所有的方法名称
+     * */
+    private String methodName;
+    /**
+     * 调用方法的参数
+     * */
+    private Object param;
+}

+ 5 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/common/service/IotDeviceBaseService.java

@@ -1,6 +1,7 @@
 package com.yunfeiyun.agmp.iotm.device.common.service;
 
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseCtlReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseFunReqVo;
 
 import java.util.List;
 
@@ -62,4 +63,8 @@ public interface IotDeviceBaseService {
      * 设备信息删除接口
      * */
     public <T> T delete(Object... deleteParams);
+    /**
+     * 通用调用接口
+     * */
+    public <T> T func(IotDeviceBaseFunReqVo iotDeviceBaseFunReqVo);
 }

+ 3 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/common/service/IotDeviceCommonService.java

@@ -1,6 +1,7 @@
 package com.yunfeiyun.agmp.iotm.device.common.service;
 
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseCtlReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseFunReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseListReqVo;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Service;
@@ -13,4 +14,6 @@ public interface IotDeviceCommonService {
     public <T> String ctl(IotDeviceBaseCtlReqVo iotDeviceBaseCtlReqVo);
 
     public <T> T info(String devBid);
+
+    public <T> T func(IotDeviceBaseFunReqVo iotDeviceBaseFunReqVo);
 }

+ 69 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/common/service/impl/IotDeviceBaseServiceImpl.java

@@ -6,6 +6,7 @@ import com.yunfeiyun.agmp.common.exception.BizException;
 import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
 import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseCtlReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseFunReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceBaseService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.functions.T;
@@ -249,6 +250,47 @@ public abstract class IotDeviceBaseServiceImpl implements IotDeviceBaseService {
         }
     }
 
+    @Override
+    public <T> T func(IotDeviceBaseFunReqVo iotDeviceBaseFunReqVo) {
+        // 获取将要执行的方法
+        String methodName = iotDeviceBaseFunReqVo.getMethodName();
+        // 获取类下所有的方法
+        Method[] methods = this.getClass().getDeclaredMethods();
+        Method method = null;
+        T param = null;
+        // 根据methodName通过反射获取对应方法,并对参数进行预处理
+        for (Method item : methods) {
+            // 判断方法名称与参数数量
+            if (!item.getName().equals(methodName) || item.getParameterCount() > 1) {
+                continue;
+            }
+            method = item;
+            // 获取方法的参数类型
+            Class<?>[] paramClass = item.getParameterTypes();
+            // 方法若是无参,则无需进行转化
+            if (paramClass.length == 1) {
+                param = transFuncParm(paramClass[0], iotDeviceBaseFunReqVo);
+            }
+            break;
+        }
+        try {
+            return (T) method.invoke(getProxy(method), param);
+        } catch (InvocationTargetException e) {
+            Throwable throwable = e.getTargetException();
+            if (throwable instanceof IotBizException) {
+                throw (IotBizException) throwable;
+            }
+            if (throwable instanceof BizException) {
+                throw (BizException) throwable;
+            }
+            log.error("", e);
+            throw new BizException(ErrorCode.SYSTEM_ERROR.getCode(), "执行失败,错误原因未知");
+        } catch (IllegalAccessException e) {
+            log.error("", e);
+            throw new BizException(ErrorCode.SYSTEM_ERROR.getCode(), "未实现方法");
+        }
+    }
+
     private void setIotDeviceInParams(IotDevice iotDevice, Object param) {
         try {
             Method method = param.getClass().getDeclaredMethod("setIotDevice", IotDevice.class);
@@ -285,6 +327,33 @@ public abstract class IotDeviceBaseServiceImpl implements IotDeviceBaseService {
         return (T) ctlMethodParam;
     }
 
+    private <T> T transFuncParm(Class ctlMethodParamClass, IotDeviceBaseFunReqVo iotDeviceBaseFunReqVo) {
+        Object ctlMethodParam;
+        Object reqParam = iotDeviceBaseFunReqVo.getParam();
+        if (reqParam instanceof String && !ctlMethodParamClass.equals(String.class)) {
+            // 如果参数类型是String,且接口入参是非String类,则将字符串参数转化为对应类型
+            ctlMethodParam = JSONObject.parseObject((String) reqParam, ctlMethodParamClass);
+            setIotDeviceInParams(iotDeviceBaseFunReqVo.getIotDevice(), ctlMethodParam);
+        } else if (reqParam instanceof JSONObject && !ctlMethodParamClass.equals(JSONObject.class)) {
+            // 如果参数类型是JSONObject,且接口入参是非JSONObject类,则将JSONObject参数转化为对应类型
+            ctlMethodParam = ((JSONObject) reqParam).to(ctlMethodParamClass);
+            setIotDeviceInParams(iotDeviceBaseFunReqVo.getIotDevice(), ctlMethodParam);
+        } else if (reqParam instanceof JSONObject) {
+            ((JSONObject) reqParam).put("IotDevice", iotDeviceBaseFunReqVo.getIotDevice());
+            ctlMethodParam = reqParam;
+        } else if (reqParam instanceof LinkedHashMap && !ctlMethodParamClass.equals(JSONObject.class)) {
+            ctlMethodParam = JSONObject.parseObject(JSONObject.toJSONString(reqParam), ctlMethodParamClass);
+            setIotDeviceInParams(iotDeviceBaseFunReqVo.getIotDevice(), ctlMethodParam);
+        } else if (reqParam instanceof LinkedHashMap) {
+            ((LinkedHashMap) reqParam).put("IotDevice", iotDeviceBaseFunReqVo.getIotDevice());
+            ctlMethodParam = JSONObject.parseObject(JSONObject.toJSONString(reqParam), ctlMethodParamClass);
+        } else {
+            // 无需转化,则直接赋值
+            ctlMethodParam = reqParam;
+        }
+        return (T) ctlMethodParam;
+    }
+
     private Object getProxy(Method method){
         if (AopUtils.isAopProxy(method) || AopUtils.isAopProxy(this)) {
             return AopContext.currentProxy();

+ 14 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/common/service/impl/IotDeviceCommonServiceImpl.java

@@ -9,6 +9,7 @@ import com.yunfeiyun.agmp.iot.common.domain.TosDevicetype;
 import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
 import com.yunfeiyun.agmp.iot.common.service.TypeCacheService;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseCtlReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseFunReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseListReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceBaseService;
 import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceCommonService;
@@ -64,5 +65,18 @@ public class IotDeviceCommonServiceImpl implements IotDeviceCommonService {
         IotDeviceBaseService iotDeviceBaseService = iotDeviceBaseServiceMap.get(typeCacheService.getServiceNameByDevTypeBid(iotDevice.getDevtypeBid()));
         return iotDeviceBaseService.ctl(iotDeviceBaseCtlReqVo);
     }
+    @Override
+    public <T> T func(IotDeviceBaseFunReqVo iotDeviceBaseFunReqVo) {
+        if(StringUtils.isEmpty(iotDeviceBaseFunReqVo.getDevBid())){
+            throw new IotBizException(ErrorCode.INVALID_PARAMETER.getCode(),"设备标识为空");
+        }
+        IotDevice iotDevice = iotDeviceMapper.selectIotDeviceByDevBid(iotDeviceBaseFunReqVo.getDevBid());
+        if(ObjectUtils.isNull(iotDevice)){
+            throw new IotBizException(ErrorCode.INVALID_PARAMETER.getCode(),"设备信息不存在");
+        }
+        iotDeviceBaseFunReqVo.setIotDevice(iotDevice);
+        IotDeviceBaseService iotDeviceBaseService = iotDeviceBaseServiceMap.get(typeCacheService.getServiceNameByDevTypeBid(iotDevice.getDevtypeBid()));
+        return iotDeviceBaseService.func(iotDeviceBaseFunReqVo);
+    }
 
 }

+ 17 - 3
src/main/java/com/yunfeiyun/agmp/iotm/device/monitor/controller/IotMonitorController.java

@@ -1,8 +1,11 @@
 package com.yunfeiyun.agmp.iotm.device.monitor.controller;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
 import com.yunfeiyun.agmp.common.core.page.TableDataInfo;
+import com.yunfeiyun.agmp.common.framework.mq.rabbitmq.model.SynGlobalTenantInfoDto;
 import com.yunfeiyun.agmp.common.utils.SecurityUtils;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
 import com.yunfeiyun.agmp.iotm.common.controller.BaseController;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseCtlReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseListReqVo;
@@ -12,6 +15,7 @@ import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotMonitorCaptureReqVo;
 import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotMonitorPtzReqVo;
 import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotMonitorVideoReqVo;
 import com.yunfeiyun.agmp.iotm.device.monitor.service.IotMonitorService;
+import org.checkerframework.checker.units.qual.C;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -26,9 +30,19 @@ public class IotMonitorController extends BaseController {
 
     @GetMapping("/page")
     public TableDataInfo page(IotDeviceBaseListReqVo iotDeviceBaseListReqVo){
-      startPage();
-      iotDeviceBaseListReqVo.setTid(SecurityUtils.getTid());
-      return getDataTable(iotMonitorService.list(iotDeviceBaseListReqVo));
+        startPage();
+        iotDeviceBaseListReqVo.setTid(SecurityUtils.getTid());
+        return getDataTable(iotMonitorService.list(iotDeviceBaseListReqVo));
+    }
+    @GetMapping("/test")
+    public TableDataInfo test(IotDeviceBaseListReqVo iotDeviceBaseListReqVo){
+        CmdGroupModel cmdGroupModel = new CmdGroupModel();
+        SynGlobalTenantInfoDto synGlobalTenantInfoDto = new SynGlobalTenantInfoDto();
+        synGlobalTenantInfoDto.setData(new JSONObject());
+        synGlobalTenantInfoDto.setData(JSONObject.from(cmdGroupModel));
+        startPage();
+        iotDeviceBaseListReqVo.setTid(SecurityUtils.getTid());
+        return getDataTable(iotMonitorService.list(iotDeviceBaseListReqVo));
     }
     @PostMapping("/address")
     public AjaxResult address(@RequestBody IotMonitorAddressGetReqVo iotMonitorAddressGetReqVo){

+ 9 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/controller/IotDeviceCommonController.java

@@ -7,6 +7,7 @@ import com.yunfeiyun.agmp.common.utils.SecurityUtils;
 import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
 import com.yunfeiyun.agmp.iotm.common.controller.BaseController;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseCtlReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseFunReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseListReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceCommonService;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -46,5 +47,13 @@ public class IotDeviceCommonController extends BaseController {
     public AjaxResult info(@PathVariable("devBid") String devBid){
         return success(iotDeviceCommonService.info(devBid));
     }
+    /**
+     * 设备内部方法公共调用接口
+     * */
+    @PreAuthorize("@ss.hasPermi('iot:device:common:func')")
+    @PostMapping("/func")
+    public AjaxResult info(@RequestBody IotDeviceBaseFunReqVo iotDeviceBaseFunReqVo){
+        return success(iotDeviceCommonService.func(iotDeviceBaseFunReqVo));
+    }
 
 }