Jelajahi Sumber

设备、产品接口自测

xucaiqin 2 tahun lalu
induk
melakukan
f6d26908a4
16 mengubah file dengan 392 tambahan dan 53 penghapusan
  1. 10 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/constant/UrlType.java
  2. 35 1
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotDeviceController.java
  3. 15 3
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotProductController.java
  4. 1 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/DevicePage.java
  5. 1 32
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotDevicePara.java
  6. 1 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotUrlPara.java
  7. 4 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/ProductPage.java
  8. 54 1
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotDeviceDetailVo.java
  9. 5 1
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotDeviceVo.java
  10. 82 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotProductDetailVo.java
  11. 27 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotProductDownVo.java
  12. 14 1
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/mapper/IotDeviceMapper.java
  13. 3 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/mapper/IotProductMapper.java
  14. 53 2
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotDeviceService.java
  15. 26 6
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotProductService.java
  16. 61 6
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotUrlService.java

+ 10 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/constant/UrlType.java

@@ -0,0 +1,10 @@
+package com.middle.platform.manage.biz.constant;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-21 09:23:36
+ */
+public interface UrlType {
+    Integer MQTT = 1;
+    Integer HTTP = 2;
+}

+ 35 - 1
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotDeviceController.java

@@ -7,6 +7,7 @@ import com.middle.platform.manage.biz.domain.req.IotDeviceFlag;
 import com.middle.platform.manage.biz.domain.req.IotDevicePara;
 import com.middle.platform.manage.biz.domain.vo.DeviceImportExcelVo;
 import com.middle.platform.manage.biz.service.IotDeviceService;
+import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -50,6 +51,28 @@ public class IotDeviceController {
         return Result.ok(iotDeviceService.save(iotDevicePara));
     }
 
+    /**
+     * 设备详情
+     *
+     * @param id 设备id
+     * @return
+     */
+    @GetMapping("/detail")
+    public Result<Object> detail(@NotNull(message = "id不能为空") @Validated Long id) {
+        return Result.ok(iotDeviceService.detail(id));
+    }
+
+    /**
+     * 设备物模型数据详情
+     *
+     * @param id 设备id
+     * @return
+     */
+    @GetMapping("/modDetail")
+    public Result<Object> modDetail(@NotNull(message = "id不能为空") @Validated Long id) {
+        return Result.ok(iotDeviceService.detail(id));
+    }
+
     /**
      * 导入设备
      *
@@ -79,8 +102,19 @@ public class IotDeviceController {
      * @param iotDeviceFlag 启用禁用设备
      * @return
      */
-    @DeleteMapping("/enable")
+    @PostMapping("/enable")
     public Result<Object> enable(@RequestBody IotDeviceFlag iotDeviceFlag) {
         return Result.ok(iotDeviceService.enable(iotDeviceFlag), "操作成功");
     }
+
+    /**
+     * 设备统计
+     *
+     * @param productId
+     * @return 设备总数、当前在线
+     */
+    @GetMapping("/count")
+    public Result<Object> count(Long productId) {
+        return Result.ok(iotDeviceService.count(productId), "查询成功");
+    }
 }

+ 15 - 3
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotProductController.java

@@ -6,6 +6,7 @@ import com.middle.platform.manage.biz.service.IotCloudService;
 import com.middle.platform.manage.biz.service.IotModService;
 import com.middle.platform.manage.biz.service.IotProductService;
 import com.middle.platform.manage.biz.service.IotUrlService;
+import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
@@ -21,11 +22,22 @@ import org.springframework.web.bind.annotation.*;
 @RequiredArgsConstructor
 @Validated
 public class IotProductController {
-    private final IotProductService iotProductService;
+    @Resource
+    private IotProductService iotProductService;
     private final IotModService iotModService;
     private final IotCloudService iotCloudService;
     private final IotUrlService iotUrlService;
 
+    /**
+     * 产品下拉选(设备筛选)
+     *
+     * @return
+     */
+    @GetMapping("/list")
+    public Result<Object> list() {
+        return Result.ok(iotProductService.list(), "查询成功");
+    }
+
     /**
      * 分页查询产品数据
      *
@@ -146,8 +158,8 @@ public class IotProductController {
      * @param iotUrlPara
      * @return
      */
-    @PostMapping("/save")
-    public Result<Object> save(@RequestBody @Valid IotUrlPara iotUrlPara) {
+    @PostMapping("/saveUrl")
+    public Result<Object> saveUrl(@RequestBody @Valid IotUrlPara iotUrlPara) {
         return Result.ok(iotUrlService.saveUrl(iotUrlPara), "保存成功");
     }
 

+ 1 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/DevicePage.java

@@ -11,4 +11,5 @@ import lombok.Setter;
 @Getter
 @Setter
 public class DevicePage extends BasePara {
+    private Long productId;
 }

+ 1 - 32
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotDevicePara.java

@@ -15,7 +15,7 @@ import java.time.LocalDateTime;
  */
 @Getter
 @Setter
-public class IotDevicePara{
+public class IotDevicePara {
 
     /**
      * 所属产品
@@ -38,37 +38,6 @@ public class IotDevicePara{
      */
     private String subtitle;
 
-    /**
-     * 经度
-     */
-    private BigDecimal lon;
-
-    /**
-     * 纬度
-     */
-    private BigDecimal lat;
-
-    /**
-     * 所属区域
-     */
-    private String address;
-
-    /**
-     * 最后在线时间
-     */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime onlineTime;
-
-    /**
-     * 设备状态 1-在线 0-离线
-     */
-    private Integer status;
-
-    /**
-     * 启用状态 1-启用 0-禁用
-     */
-    private Integer enableFlag;
-
     /**
      * 备注
      */

+ 1 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotUrlPara.java

@@ -17,6 +17,7 @@ public class IotUrlPara {
     /**
      * 产品id
      */
+    @NotNull(message = "产品id不能为空")
     private Long productId;
 
     /**

+ 4 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/ProductPage.java

@@ -11,4 +11,8 @@ import lombok.Setter;
 @Getter
 @Setter
 public class ProductPage extends BasePara {
+    /**
+     * 产品id
+     */
+    private Long productId;
 }

+ 54 - 1
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotDeviceDetailVo.java

@@ -17,6 +17,9 @@ import java.time.LocalDateTime;
 @Getter
 @Setter
 public class IotDeviceDetailVo extends BaseVO {
+    /**
+     * 设备id
+     */
     private Long id;
 
     /**
@@ -62,7 +65,7 @@ public class IotDeviceDetailVo extends BaseVO {
     /**
      * 最后在线时间
      */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime onlineTime;
 
     /**
@@ -79,4 +82,54 @@ public class IotDeviceDetailVo extends BaseVO {
      * 备注
      */
     private String remark;
+
+
+
+    private String productCode;
+    private String productName;
+    /**
+     * 密匙(未知作用)
+     */
+    private String secret;
+
+    /**
+     * 节点类型:1网关、2子设备
+     */
+    private Integer nodeType;
+    private String nodeTypeLabel;
+
+    /**
+     * 联网类型
+     */
+    private Integer networkType;
+    private String networkTypeLabel;
+
+    /**
+     * 上报协议
+     */
+    private Integer reportProtocol;
+    private String reportProtocolLabel;
+    /**
+     * 设备厂商
+     */
+    private Integer vendors;
+    private String vendorsLabel;
+
+    /**
+     * 数据格式
+     */
+    private Integer dataFormat;
+    private String dataFormatLabel;
+
+    /**
+     * 认证方式
+     */
+    private Integer authType;
+    private String authTypeLabel;
+
+    /**
+     * 产品标签
+     */
+    private String tag;
+
 }

+ 5 - 1
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotDeviceVo.java

@@ -23,6 +23,10 @@ public class IotDeviceVo extends BaseVO {
      * 所属产品
      */
     private Long productId;
+    /**
+     * 产品名称
+     */
+    private String productName;
 
     /**
      * 设备名称
@@ -62,7 +66,7 @@ public class IotDeviceVo extends BaseVO {
     /**
      * 最后在线时间
      */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime onlineTime;
 
     /**

+ 82 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotProductDetailVo.java

@@ -0,0 +1,82 @@
+package com.middle.platform.manage.biz.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.middle.platform.mybatis.core.dataobject.BaseVO;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 产品
+ *
+ * @author xucaiqin
+ * @date 2023-12-19 13:43:38
+ */
+@Getter
+@Setter
+public class IotProductDetailVo extends BaseVO {
+    private Long id;
+
+    /**
+     * 所属产品
+     */
+    private Long productId;
+
+    /**
+     * 设备名称
+     */
+    private String name;
+
+    /**
+     * 设备sn码
+     */
+    private String sn;
+
+    /**
+     * 设备guid
+     */
+    private String guid;
+
+    /**
+     * 备注名称
+     */
+    private String subtitle;
+
+    /**
+     * 经度
+     */
+    private BigDecimal lon;
+
+    /**
+     * 纬度
+     */
+    private BigDecimal lat;
+
+    /**
+     * 所属区域
+     */
+    private String address;
+
+    /**
+     * 最后在线时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime onlineTime;
+
+    /**
+     * 设备状态 1-在线 0-离线
+     */
+    private Integer status;
+
+    /**
+     * 启用状态 1-启用 0-禁用
+     */
+    private Integer enableFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 27 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/IotProductDownVo.java

@@ -0,0 +1,27 @@
+package com.middle.platform.manage.biz.domain.vo;
+
+import com.middle.platform.mybatis.core.dataobject.BaseVO;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品表
+ *
+ * @author xucaiqin
+ * @date 2023-12-19 13:43:38
+ */
+@Getter
+@Setter
+public class IotProductDownVo {
+    private Long id;
+
+    /**
+     * 产品编码
+     */
+    private String code;
+
+    /**
+     * 产品名称
+     */
+    private String name;
+}

+ 14 - 1
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/mapper/IotDeviceMapper.java

@@ -2,11 +2,14 @@ package com.middle.platform.manage.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.middle.platform.manage.biz.domain.req.DevicePage;
+import com.middle.platform.manage.biz.domain.vo.IotDeviceDetailVo;
 import com.middle.platform.manage.biz.domain.vo.IotDeviceVo;
 import com.middle.platform.manage.biz.entity.IotDevice;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author xucaiqin
@@ -20,7 +23,7 @@ public interface IotDeviceMapper extends BaseMapper<IotDevice> {
      * @param id 产品id
      * @return
      */
-    Long queryByProduct(Long id);
+    Long queryByProduct(@Param("id") Long id);
 
     /**
      * 分页查询
@@ -29,4 +32,14 @@ public interface IotDeviceMapper extends BaseMapper<IotDevice> {
      * @return
      */
     List<IotDeviceVo> pageQuery(DevicePage devicePage);
+
+    Map<String, String> count(@Param("productId") Long productId);
+
+    /**
+     * 设备详情
+     *
+     * @param id
+     * @return
+     */
+    IotDeviceDetailVo detail(@Param("id") Long id);
 }

+ 3 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/mapper/IotProductMapper.java

@@ -2,6 +2,7 @@ package com.middle.platform.manage.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.middle.platform.manage.biz.domain.req.ProductPage;
+import com.middle.platform.manage.biz.domain.vo.IotProductDownVo;
 import com.middle.platform.manage.biz.domain.vo.IotProductVo;
 import com.middle.platform.manage.biz.entity.IotProduct;
 import org.apache.ibatis.annotations.Mapper;
@@ -21,4 +22,6 @@ public interface IotProductMapper extends BaseMapper<IotProduct> {
      * @return
      */
     List<IotProductVo> pageQuery(ProductPage devicePage);
+
+    List<IotProductDownVo> list();
 }

+ 53 - 2
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotDeviceService.java

@@ -1,20 +1,29 @@
 package com.middle.platform.manage.biz.service;
 
 import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.utils.PageRes;
 import com.middle.platform.manage.biz.domain.req.DevicePage;
 import com.middle.platform.manage.biz.domain.req.IotDeviceFlag;
 import com.middle.platform.manage.biz.domain.req.IotDevicePara;
+import com.middle.platform.manage.biz.domain.vo.IotDeviceDetailVo;
 import com.middle.platform.manage.biz.domain.vo.IotDeviceVo;
 import com.middle.platform.manage.biz.entity.IotDevice;
 import com.middle.platform.manage.biz.mapper.IotDeviceMapper;
+import com.middle.platform.system.api.enums.DictType;
+import com.middle.platform.system.api.feign.DictApi;
+import com.middle.platform.system.api.feign.UserApi;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * @author xucaiqin
@@ -24,6 +33,8 @@ import java.util.Objects;
 @RequiredArgsConstructor
 public class IotDeviceService {
     private final IotDeviceMapper iotDeviceMapper;
+    private final DictApi dictApi;
+    private final UserApi userApi;
 
     /**
      * 设备分页查询
@@ -34,7 +45,12 @@ public class IotDeviceService {
     public Object pageQuery(DevicePage devicePage) {
         PageHelper.startPage(devicePage.getPage(), devicePage.getPageSize());
         List<IotDeviceVo> iotProductVos = iotDeviceMapper.pageQuery(devicePage);
-        return new PageRes<>(iotProductVos);
+        PageInfo<IotDeviceVo> pageInfo = new PageInfo<>(iotProductVos);
+        iotProductVos.forEach(a -> {
+            Optional.ofNullable(userApi.queryUser(a.getCreateBy())).ifPresent(userCache -> a.setCreateByLabel(userCache.getName()));
+            Optional.ofNullable(userApi.queryUser(a.getUpdateBy())).ifPresent(userCache -> a.setUpdateByLabel(userCache.getName()));
+        });
+        return new PageRes<>(pageInfo, iotProductVos);
     }
 
     /**
@@ -64,7 +80,10 @@ public class IotDeviceService {
      * @return
      */
     public Object remove(Long id) {
-        iotDeviceMapper.deleteById(id);
+        IotDevice iotDevice = new IotDevice();
+        iotDevice.setDeleteTime(LocalDateTime.now());
+        iotDevice.setDelFlag(Global.DEL);
+        iotDeviceMapper.update(iotDevice, new LambdaQueryWrapper<IotDevice>().eq(IotDevice::getId, id).eq(IotDevice::getDelFlag, Global.UN_DEL));
         return true;
     }
 
@@ -83,4 +102,36 @@ public class IotDeviceService {
         iotDeviceMapper.updateById(iotDevice);
         return true;
     }
+
+    /**
+     * 设备详情
+     *
+     * @param id
+     * @return
+     */
+    public IotDeviceDetailVo detail(Long id) {
+        IotDeviceDetailVo detail = iotDeviceMapper.detail(id);
+        if (Objects.isNull(detail)) {
+            throw new BusinessException("设备不存在");
+        }
+        Optional.ofNullable(userApi.queryUser(detail.getCreateBy())).ifPresent(userCache -> detail.setCreateByLabel(userCache.getName()));
+        Optional.ofNullable(userApi.queryUser(detail.getUpdateBy())).ifPresent(userCache -> detail.setUpdateByLabel(userCache.getName()));
+        Optional.ofNullable(dictApi.query(DictType.AUTH_TYPE, String.valueOf(detail.getAuthType()))).ifPresent(cache -> detail.setAuthTypeLabel(cache.getLabel()));
+        Optional.ofNullable(dictApi.query(DictType.NODE_TYPE, String.valueOf(detail.getNodeType()))).ifPresent(cache -> detail.setNodeTypeLabel(cache.getLabel()));
+        Optional.ofNullable(dictApi.query(DictType.NETWORK_TYPE, String.valueOf(detail.getNetworkType()))).ifPresent(cache -> detail.setNetworkTypeLabel(cache.getLabel()));
+        Optional.ofNullable(dictApi.query(DictType.REPORT_PROTOCOL_TYPE, String.valueOf(detail.getReportProtocol()))).ifPresent(cache -> detail.setReportProtocolLabel(cache.getLabel()));
+        Optional.ofNullable(dictApi.query(DictType.VENDORS_TYPE, String.valueOf(detail.getVendors()))).ifPresent(cache -> detail.setVendorsLabel(cache.getLabel()));
+        Optional.ofNullable(dictApi.query(DictType.DATA_FORMAT_TYPE, String.valueOf(detail.getDataFormat()))).ifPresent(cache -> detail.setDataFormatLabel(cache.getLabel()));
+        return detail;
+    }
+
+    /**
+     * 统计设备
+     *
+     * @param productId
+     * @return
+     */
+    public Object count(Long productId) {
+        return iotDeviceMapper.count(productId);
+    }
 }

+ 26 - 6
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotProductService.java

@@ -5,10 +5,9 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.utils.PageRes;
-import com.middle.platform.data.api.feign.DynamicTopicApi;
 import com.middle.platform.manage.biz.domain.req.IotProductPara;
 import com.middle.platform.manage.biz.domain.req.ProductPage;
-import com.middle.platform.manage.biz.domain.vo.IotDeviceDetailVo;
+import com.middle.platform.manage.biz.domain.vo.IotProductDetailVo;
 import com.middle.platform.manage.biz.domain.vo.IotProductVo;
 import com.middle.platform.manage.biz.entity.IotDevice;
 import com.middle.platform.manage.biz.entity.IotProduct;
@@ -17,6 +16,7 @@ import com.middle.platform.manage.biz.mapper.IotProductMapper;
 import com.middle.platform.system.api.enums.DictType;
 import com.middle.platform.system.api.feign.DictApi;
 import com.middle.platform.system.api.feign.UserApi;
+import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -34,7 +34,8 @@ import java.util.Optional;
 public class IotProductService {
     private final IotProductMapper iotProductMapper;
     private final IotDeviceMapper iotDeviceMapper;
-    private final IotUrlService iotUrlService;
+    @Resource
+    private IotUrlService iotUrlService;
     private final IotModService iotModService;
     private final IotCloudService iotCloudService;
 
@@ -126,8 +127,27 @@ public class IotProductService {
      */
     public Object detail(Long id) {
         IotDevice iotDevice = iotDeviceMapper.selectById(id);
-        IotDeviceDetailVo iotDeviceDetailVo = new IotDeviceDetailVo();
-        BeanUtils.copyProperties(iotDevice, iotDeviceDetailVo);
-        return iotDeviceDetailVo;
+        IotProductDetailVo iotProductDetailVo = new IotProductDetailVo();
+        BeanUtils.copyProperties(iotDevice, iotProductDetailVo);
+        return iotProductDetailVo;
+    }
+
+    /**
+     * 根据id查询产品信息
+     *
+     * @param productId 产品id
+     * @return
+     */
+    public IotProduct query(Long productId) {
+        return iotProductMapper.selectById(productId);
+    }
+
+    /**
+     * 下拉列表
+     *
+     * @return
+     */
+    public Object list() {
+        return iotProductMapper.list();
     }
 }

+ 61 - 6
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotUrlService.java

@@ -3,17 +3,24 @@ package com.middle.platform.manage.biz.service;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
+import com.middle.platform.data.api.constant.TopicType;
 import com.middle.platform.data.api.feign.DynamicTopicApi;
+import com.middle.platform.data.api.pojo.TopicDto;
 import com.middle.platform.manage.biz.constant.UrlCategory;
 import com.middle.platform.manage.biz.constant.UrlInit;
 import com.middle.platform.manage.biz.constant.UrlProtocol;
+import com.middle.platform.manage.biz.constant.UrlType;
 import com.middle.platform.manage.biz.domain.req.IotUrlPara;
 import com.middle.platform.manage.biz.entity.IotProduct;
 import com.middle.platform.manage.biz.entity.IotUrl;
 import com.middle.platform.manage.biz.mapper.IotUrlMapper;
+import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.util.Objects;
 
 /**
@@ -24,7 +31,10 @@ import java.util.Objects;
 @RequiredArgsConstructor
 public class IotUrlService {
     private final IotUrlMapper iotUrlMapper;
+    @Resource
+    private IotProductService iotProductService;
     private final DynamicTopicApi dynamicTopicApi;
+    private String topicPrefix = "/device/%s/*/";
 
     /**
      * 新增topic
@@ -33,9 +43,8 @@ public class IotUrlService {
      * @return
      */
     public Object saveUrl(IotUrlPara iotUrlPara) {
-        if (Objects.isNull(iotUrlPara.getProductId())) {
-            throw new BusinessException("产品id不能为空");
-        }
+        //topi规则校验
+        checkTopic(iotUrlPara);
         IotUrl iotUrl = new IotUrl();
         iotUrl.setProductId(iotUrlPara.getProductId());
         iotUrl.setCategory(iotUrlPara.getCategory());
@@ -46,20 +55,49 @@ public class IotUrlService {
         iotUrl.setRemark(iotUrlPara.getRemark());
         iotUrlMapper.insert(iotUrl);
         //新增订阅的topic
-//        dynamicTopicApi
+        if (Objects.equals(iotUrlPara.getType(), UrlType.MQTT) && (Objects.equals(iotUrlPara.getPermission(), TopicType.PUB) || Objects.equals(iotUrlPara.getPermission(), TopicType.BOTH))) {
+            dynamicTopicApi.saveTopic(new TopicDto(iotUrlPara.getUrl(), 0));
+        }
         return true;
     }
 
+    /**
+     * 校验topic
+     *
+     * @param iotUrlPara
+     */
+    private void checkTopic(IotUrlPara iotUrlPara) {
+        //校验前缀是否为 /device/{productKey}/*/
+        IotProduct query = iotProductService.query(iotUrlPara.getProductId());
+        if (Objects.isNull(query)) {
+            throw new BusinessException("产品不存在");
+        }
+        //产品key
+        String code = query.getCode();
+        if (!StringUtils.startsWith(iotUrlPara.getUrl(), String.format(topicPrefix, code))) {
+            throw new BusinessException("topic必须以+" + String.format(topicPrefix, code) + "为前缀");
+        }
+        //todo topic合规校验
+
+    }
+
     /**
      * 修改topic
      *
      * @param iotUrlPara
      * @return
      */
+    @Transactional(rollbackFor = Exception.class)
     public Object update(IotUrlPara iotUrlPara) {
         if (Objects.isNull(iotUrlPara.getId())) {
             throw new BusinessException("id不能为空");
         }
+        checkTopic(iotUrlPara);
+        IotUrl iotUrlCheck = iotUrlMapper.selectById(iotUrlPara.getId());
+        if (Objects.isNull(iotUrlCheck)) {
+            throw new BusinessException("设备不存在");
+        }
+
         IotUrl iotUrl = new IotUrl();
         iotUrl.setId(iotUrlPara.getId());
         iotUrl.setCategory(iotUrlPara.getCategory());
@@ -69,6 +107,12 @@ public class IotUrlService {
         iotUrl.setType(iotUrlPara.getType());
         iotUrl.setRemark(iotUrlPara.getRemark());
         iotUrlMapper.updateById(iotUrl);
+        //取消订阅原topic 订阅topic
+        if (Objects.equals(iotUrlPara.getType(), UrlType.MQTT) && (Objects.equals(iotUrlPara.getPermission(), TopicType.PUB) || Objects.equals(iotUrlPara.getPermission(), TopicType.BOTH))) {
+            dynamicTopicApi.removeTopic(new TopicDto(iotUrlPara.getUrl(), 0));
+            dynamicTopicApi.saveTopic(new TopicDto(iotUrlPara.getUrl(), 0));
+
+        }
         return true;
     }
 
@@ -79,7 +123,18 @@ public class IotUrlService {
      * @return
      */
     public Object remove(Long id) {
-        iotUrlMapper.deleteById(id);
+        IotUrl iotUrlCheck = iotUrlMapper.selectById(id);
+        if (Objects.isNull(iotUrlCheck)) {
+            return true;
+        }
+        IotUrl iotUrl = new IotUrl();
+        iotUrl.setDeleteTime(LocalDateTime.now());
+        iotUrl.setDelFlag(Global.DEL);
+        iotUrlMapper.update(iotUrl, new LambdaQueryWrapper<IotUrl>().eq(IotUrl::getId, id).eq(IotUrl::getDelFlag, Global.UN_DEL));
+        //取消订阅
+        if (Objects.equals(iotUrlCheck.getType(), UrlType.MQTT) && (Objects.equals(iotUrlCheck.getPermission(), TopicType.PUB) || Objects.equals(iotUrlCheck.getPermission(), TopicType.BOTH))) {
+            dynamicTopicApi.removeTopic(new TopicDto(iotUrlCheck.getUrl(), 0));
+        }
         return true;
     }
 
@@ -91,7 +146,7 @@ public class IotUrlService {
      * @return
      */
     public Object getUrl(Long productId, Integer type) {
-        return iotUrlMapper.selectList(new LambdaQueryWrapper<IotUrl>().eq(IotUrl::getProductId, productId).eq(IotUrl::getType, type));
+        return iotUrlMapper.selectList(new LambdaQueryWrapper<IotUrl>().eq(IotUrl::getProductId, productId).eq(IotUrl::getType, type).eq(IotUrl::getDelFlag, Global.UN_DEL));
     }