Parcourir la source

Merge branch 'V0.0.6-iot' of http://10.87.21.221:8000/jzyd_yyds/soc into V0.0.6-iot

jiawuxian il y a 1 an
Parent
commit
6b8334997b
15 fichiers modifiés avec 640 ajouts et 16 suppressions
  1. 63 2
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotAlarmRuleSourceController.java
  2. 22 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceBatchJoin.java
  3. 32 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceDto.java
  4. 21 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceRuleDto.java
  5. 63 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/AlarmRuleExpressOperateEnum.java
  6. 53 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ProductTypeEnum.java
  7. 47 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ValueTypeEnum.java
  8. 19 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotAlarmRuleSourceMapper.java
  9. 8 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotCommonSensorMapper.java
  10. 37 1
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IotAlarmRuleSourceService.java
  11. 171 13
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotAlarmRuleSourceServiceImpl.java
  12. 17 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceRuleVo.java
  13. 27 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceVo.java
  14. 44 0
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmRuleSourceMapper.xml
  15. 16 0
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotSensorMapper.xml

+ 63 - 2
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotAlarmRuleSourceController.java

@@ -1,14 +1,25 @@
 package com.xunmei.iot.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDetailDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceBatchJoin;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceRuleDto;
+import com.xunmei.iot.service.IotAlarmRuleSourceService;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceRuleVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo;
 import io.swagger.annotations.ApiOperation;
+import org.aspectj.weaver.loadtime.Aj;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * @author 高雄
@@ -18,10 +29,60 @@ import javax.validation.Valid;
 @RequestMapping("/iot_alarm_device")
 public class IotAlarmRuleSourceController {
 
+    @Autowired
+    private IotAlarmRuleSourceService iotAlarmRuleSourceService;
+
     @ApiOperation(value = "查看动环告警规则详情")
     @PostMapping(value = "detail")
-    public AjaxResult detail(@RequestBody @Valid IotAlarmRuleSourceDetailDto detailDto){
-        return null;
+    public AjaxResult detail(@RequestBody @Valid IotAlarmRuleSourceDetailDto detailDto) {
+        try {
+            IotAlarmRuleSourceDetailVo detail = iotAlarmRuleSourceService.detail(detailDto);
+            return AjaxResult.success(detail);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "添加设备查询接口", notes = "设备列表接口")
+    @PostMapping(value = "device")
+    public AjaxResult deviceList(@RequestBody @Valid IotAlarmRuleSourceDeviceDto detailDto) {
+
+        try {
+            Page<IotAlarmRuleSourceDeviceVo> page = iotAlarmRuleSourceService.selectDeviceList(detailDto);
+            return AjaxResult.success(page);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "更新规则详情", notes = "更新规则详情接口")
+    @PostMapping(value = "update")
+    public AjaxResult updateList(@RequestBody @Valid IotAlarmRuleSourceDetailVo detailDto){
+
+        try {
+            iotAlarmRuleSourceService.updateRuleAndProductDevice(detailDto);
+            return AjaxResult.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+
+    @ApiOperation(value = "设备批量关联规则", notes = "单设备关联规则也走这个接口")
+    @PostMapping(value = "batchJoin")
+    public AjaxResult batchJoin(@RequestBody @Valid IotAlarmRuleSourceDeviceBatchJoin batchJoinDto) {
+        try {
+            iotAlarmRuleSourceService.batchJoin(batchJoinDto);
+            return AjaxResult.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error();
+        }
     }
 
+
+
 }

+ 22 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceBatchJoin.java

@@ -0,0 +1,22 @@
+package com.xunmei.iot.dto.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 15:08
+ */
+@Data
+public class IotAlarmRuleSourceDeviceBatchJoin {
+
+    @Size(min = 1,message = "请至少选择一台设备")
+    @ApiModelProperty(value = "设备id数组")
+    private List<String> deviceIdList;
+
+    @ApiModelProperty(value = "规则id数组")
+    private List<Long> ruleIdList;
+}

+ 32 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceDto.java

@@ -0,0 +1,32 @@
+package com.xunmei.iot.dto.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 10:51
+ */
+@Data
+public class IotAlarmRuleSourceDeviceDto {
+
+    @ApiModelProperty(value = "机构id")
+    @NotNull(message = "请至少选择一个机构进行查询")
+    private Long orgId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    /**
+     * @see ProductTypeEnum
+     */
+    @ApiModelProperty(value = "产品类型")
+    @NotNull(message = "请选择产品类型进行添加设备!")
+    private Integer type;
+
+    private int page;
+
+    private int size;
+}

+ 21 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceRuleDto.java

@@ -0,0 +1,21 @@
+package com.xunmei.iot.dto.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 15:08
+ */
+@Data
+public class IotAlarmRuleSourceDeviceRuleDto {
+
+    @NotNull(message = "请选择一台设备查看")
+    @ApiModelProperty(value = "设备id")
+    private String deviceId;
+
+    private Long orgId;
+
+}

+ 63 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/AlarmRuleExpressOperateEnum.java

@@ -0,0 +1,63 @@
+package com.xunmei.iot.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/8/1 12:52
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum AlarmRuleExpressOperateEnum {
+
+    /**
+     * 操作符,GT(大于)、GTE(大于等于)、LT(小于)、LTE(小于等
+     * 于)、EQUALS(等于)、STARTS_WITH(以什么开始)、
+     * ENDS_WITH(以什么结束)、CONTAIN(包含)
+     */
+    GT("GT"),
+    GTE("GTE"),
+    LT("LT"),
+    LTE("LTE"),
+    EQUALS("EQUALS"),
+    STARTS_WITH("STARTS_WITH"),
+    ENDS_WITH("ENDS_WITH"),
+    CONTAIN("CONTAIN");
+
+
+    private String text;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(String code) {
+        AlarmRuleExpressOperateEnum e = enumMap.get(code);
+        return e != null ? e.getText() : "";
+    }
+
+    /**
+     * 根据code获取枚举对象
+     */
+    public static AlarmRuleExpressOperateEnum getOperateEnum(String code) {
+        return enumMap.get(code);
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<String, AlarmRuleExpressOperateEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (AlarmRuleExpressOperateEnum typeEnum : AlarmRuleExpressOperateEnum.values()) {
+            enumMap.put(typeEnum.text, typeEnum);
+        }
+    }
+
+
+}

+ 53 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ProductTypeEnum.java

@@ -0,0 +1,53 @@
+package com.xunmei.iot.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 0:41
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum ProductTypeEnum {
+    SMOKE_SENSOR(4,"烟雾传感器"),
+    TEMPERATURE_HUMIDITY(5,"温湿度采集器"),
+    FLOODING(6,"水浸传感器"),
+    DOOR_SENSOR(7,"门磁、窗磁传感器(Lora无线)"),
+    SHUTTER_DOORS(8,"卷帘门门磁"),
+    GEOMAGNETIC(9,"地磁传感器"),
+    GAS_ALARM(10,"燃气报警器"),
+    ALARM_ZONE(50,"报警防区"),
+    UPS(51,"UPS"),
+    ALARM_LOOP(52,"回路"),
+    ZNDB(53,"智能电表");
+    ;
+
+    private int num;
+
+    private String text;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(Integer num) {
+        ProductTypeEnum e = enumMap.get(num);
+        return e != null ? e.getText() : "";
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, ProductTypeEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (ProductTypeEnum typeEnum : ProductTypeEnum.values()) {
+            enumMap.put(typeEnum.num, typeEnum);
+        }
+    }
+}

+ 47 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ValueTypeEnum.java

@@ -0,0 +1,47 @@
+package com.xunmei.iot.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/8/1 10:26
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum ValueTypeEnum {
+
+    Device(0,"Device"),
+
+    AllDevice(1,"AllDevice");
+
+
+    private int code;
+
+    private String text;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(Integer num) {
+        ValueTypeEnum e = enumMap.get(num);
+        return e != null ? e.getText() : "";
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, ValueTypeEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (ValueTypeEnum typeEnum : ValueTypeEnum.values()) {
+            enumMap.put(typeEnum.code, typeEnum);
+        }
+    }
+
+}

+ 19 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotAlarmRuleSourceMapper.java

@@ -1,8 +1,12 @@
 package com.xunmei.iot.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
 import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo;
+import com.xunmei.iot.vo.alarm.ProductTypeDataVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -16,4 +20,19 @@ public interface IotAlarmRuleSourceMapper extends BaseMapper<IotAlarmRuleSource>
      * @return
      */
     List<IotAlarmRuleSourceDetailVo> selectDetailData(@Param("ruleId") Long ruleId);
+
+    /**
+     * 获取规则下设备绑定数据
+     * @param ruleId
+     * @return
+     */
+    List<ProductTypeDataVo> selectRuleDevice(@Param("ruleId") Long ruleId);
+
+    /**
+     * 获取要添加的设备列表
+     * @param page
+     * @param param
+     * @return
+     */
+    Page<IotAlarmRuleSourceDeviceVo> selectDeviceList(Page<IotAlarmRuleSourceDeviceVo> page, @Param("param")IotAlarmRuleSourceDeviceDto param);
 }

+ 8 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotCommonSensorMapper.java

@@ -7,6 +7,9 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.iot.dto.sensor.SensorPageDto;
 import com.xunmei.iot.vo.sensor.SensorPageVo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * <p>
@@ -16,10 +19,15 @@ import org.apache.ibatis.annotations.Param;
  * @author test
  * @since 2024-02-20
  */
+@Mapper
 public interface IotCommonSensorMapper extends BaseMapper<IotSensor> {
 
     Page<SensorPageVo> selectPageData(Page<SensorPageVo> pageRequest, @Param("request") SensorPageDto request);
 
     Page<SensorPageVo> selectSensorLogDataPage(Page<SensorPageVo> pageRequest, @Param("request") SensorPageDto request);
 
+
+    List<IotSensor> selectByIds(@Param("deviceIds") List<String> deviceIds);
+
+
 }

+ 37 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IotAlarmRuleSourceService.java

@@ -1,8 +1,18 @@
 package com.xunmei.iot.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDetailDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceBatchJoin;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceRuleDto;
 import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceRuleVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author 高雄
@@ -15,5 +25,31 @@ public interface IotAlarmRuleSourceService  extends IService<IotAlarmRuleSource>
      * @return
      * @throws Exception
      */
-    IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailVo detailVo)throws Exception;
+    IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailDto detailVo)throws Exception;
+
+
+    /**
+     * 获取列表分页数据
+     * @param param
+     * @return
+     */
+    Page<IotAlarmRuleSourceDeviceVo> selectDeviceList(IotAlarmRuleSourceDeviceDto param)throws Exception;
+
+
+    /**
+     * 更新数据
+     * @param detailDto
+     * @throws Exception
+     */
+    void updateRuleAndProductDevice(IotAlarmRuleSourceDetailVo detailDto)throws Exception;
+
+
+    /**
+     * 批量更新数据
+     * @param batchJoinDto
+     * @throws Exception
+     */
+    void batchJoin(IotAlarmRuleSourceDeviceBatchJoin batchJoinDto)throws Exception;
+
+
 }

+ 171 - 13
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotAlarmRuleSourceServiceImpl.java

@@ -1,19 +1,36 @@
 package com.xunmei.iot.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.iot.domain.IotSensor;
+import com.xunmei.common.core.domain.mediator.domain.IotAlarmRule;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
+import com.xunmei.common.core.utils.IDHelper;
+import com.xunmei.common.core.utils.StringUtils;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDetailDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceBatchJoin;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceRuleDto;
+import com.xunmei.iot.enums.ProductTypeEnum;
+import com.xunmei.iot.enums.ValueTypeEnum;
+import com.xunmei.iot.mapper.IotAlarmRuleExpressMapper;
+import com.xunmei.iot.mapper.IotAlarmRuleMapper;
 import com.xunmei.iot.mapper.IotAlarmRuleSourceMapper;
+import com.xunmei.iot.mapper.IotCommonSensorMapper;
 import com.xunmei.iot.service.IotAlarmRuleSourceService;
-import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
-import com.xunmei.iot.vo.alarm.ProductTypeDataVo;
+import com.xunmei.iot.vo.alarm.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
-import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -22,21 +39,162 @@ public class IotAlarmRuleSourceServiceImpl extends ServiceImpl<IotAlarmRuleSourc
     @Autowired
     private IotAlarmRuleSourceMapper iotAlarmRuleSourceMapper;
 
+    @Autowired
+    private IotAlarmRuleMapper iotAlarmRuleMapper;
+
+    @Autowired
+    private IotAlarmRuleExpressMapper iotAlarmRuleExpressMapper;
+
+    @Autowired
+    private IotCommonSensorMapper iotCommonSensorMapper;
+
+    @Override
+    public IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailDto detailVo) throws Exception {
+        IotAlarmRuleSourceDetailVo iotAlarmRuleSourceDetailVo = new IotAlarmRuleSourceDetailVo();
+        //1.获取告警规则数据
+        IotAlarmRule iotAlarmRule = iotAlarmRuleMapper.selectById(detailVo.getRuleId());
+        iotAlarmRuleSourceDetailVo.setRuleId(iotAlarmRule.getId());
+        iotAlarmRuleSourceDetailVo.setRuleName(iotAlarmRule.getName());
+        iotAlarmRuleSourceDetailVo.setRuleType(iotAlarmRule.getType());
+        iotAlarmRuleSourceDetailVo.setEnable(iotAlarmRule.getEnabled());
+        //2.获取告警规则对应有哪些设备的告警属性规则。
+        List<ProductTypeDataVo> productTypeDataVos = iotAlarmRuleSourceMapper.selectRuleDevice(detailVo.getRuleId());
+        //3.处理其他sql获取不了的数据
+        for (ProductTypeDataVo pdv : productTypeDataVos) {
+            pdv.setTypeText(ProductTypeEnum.getName(pdv.getType()));
+            dealDevice(pdv);
+        }
+        iotAlarmRuleSourceDetailVo.setTypeDataList(productTypeDataVos);
+        return iotAlarmRuleSourceDetailVo;
+    }
+
+    @Override
+    public Page<IotAlarmRuleSourceDeviceVo> selectDeviceList(IotAlarmRuleSourceDeviceDto param)throws Exception {
+        Page<IotAlarmRuleSourceDeviceVo> page = new Page<>();
+        page.setSize(param.getSize());
+        page.setCurrent(param.getPage());
+        Page<IotAlarmRuleSourceDeviceVo> result = iotAlarmRuleSourceMapper.selectDeviceList(page, param);
+        return result;
+    }
+
     @Override
-    public IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailVo detailVo) throws Exception {
-        //根据规则id获取,规则数据
-        List<IotAlarmRuleSourceDetailVo> detailVoList = iotAlarmRuleSourceMapper.selectDetailData(detailVo.getRuleId());
-        if(ObjectUtil.isEmpty(detailVoList)){
-            return new IotAlarmRuleSourceDetailVo();
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRuleAndProductDevice(IotAlarmRuleSourceDetailVo detailDto) throws Exception {
+        //删除设备绑定数据
+        LambdaQueryWrapper<IotAlarmRuleSource> qw = new LambdaQueryWrapper<IotAlarmRuleSource>();
+        qw.eq(IotAlarmRuleSource::getRuleId,detailDto.getRuleId());
+        iotAlarmRuleSourceMapper.delete(qw);
+
+        //重新绑定设置
+        List<ProductTypeDataVo> deviceData = detailDto.getTypeDataList();
+        if(ObjectUtil.isEmpty(deviceData)){
+            return;
         }
+        IotAlarmRuleSource ruleSource = null;
+        for (ProductTypeDataVo productType : deviceData) {
+            ruleSource = new IotAlarmRuleSource();
+            ruleSource.setRuleId(detailDto.getRuleId());
+            if (ValueTypeEnum.AllDevice.getText().equals(productType.getValueType()) && productType.getIsAllDeviceEnable()) {
+                ruleSource.setId(IDHelper.id());
+                ruleSource.setOrgId(null);
 
-        IotAlarmRuleSourceDetailVo iotAlarmRuleSourceDetailVo = detailVoList.get(0);
+                ruleSource.setSourceType(productType.getType());
+                ruleSource.setValue(null);
+                ruleSource.setValueType(ValueTypeEnum.AllDevice.getText());
+                iotAlarmRuleSourceMapper.insert(ruleSource);
+                continue;
+            }
+            if (productType.getDeviceTempList() != null) {
+                for (ProductDeviceTempVo deviceTempVo : productType.getDeviceTempList()) {
+                    ruleSource.setId(IDHelper.id());
+                    ruleSource.setOrgId(deviceTempVo.getOrgId());
+                    ruleSource.setSourceType(productType.getType());
+                    ruleSource.setValue(deviceTempVo.getDeviceId());
+                    ruleSource.setValueType(ValueTypeEnum.Device.getText());
+                    iotAlarmRuleSourceMapper.insert(ruleSource);
+                }
+            }
+        }
 
-        List<ProductTypeDataVo> list = new ArrayList<>();
-        Map<Integer, List<IotAlarmRuleSourceDetailVo>> listMap =
-                detailVoList.stream().sorted(Comparator.comparing(IotAlarmRuleSourceDetailVo::getSourceType)).collect(Collectors.groupingBy(IotAlarmRuleSourceDetailVo::getSourceType));
+    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchJoin(IotAlarmRuleSourceDeviceBatchJoin batchJoinDto) throws Exception {
+        final List<Long> ruleIdList = batchJoinDto.getRuleIdList();
+        final List<String> deviceIdList = batchJoinDto.getDeviceIdList();
+        Map<Object, Object> hashMap = new HashMap<>();
+        iotAlarmRuleSourceMapper.delete(new LambdaQueryWrapper<IotAlarmRuleSource>()
+                .in(IotAlarmRuleSource::getValue, deviceIdList));
+        for (Long ruleId : ruleIdList) {
+            for (String deviceId : deviceIdList) {
+                IotSensor productDevice = (IotSensor) hashMap.get(deviceId);
+                if (productDevice == null) {
+                    QueryWrapper<IotSensor> qw = new QueryWrapper<>();
+                    qw.lambda().eq(IotSensor::getDeviceCode,deviceId).eq(IotSensor::getDeleted,0);
+                    hashMap.put(deviceId, productDevice);
+                }
+                String code = productDevice.getDeviceType();
 
-        return null;
+                boolean isAllDevice = false;
+                final List<IotAlarmRuleSource> ruleSourceList = iotAlarmRuleSourceMapper.selectList(new LambdaQueryWrapper<IotAlarmRuleSource>()
+                        .eq(IotAlarmRuleSource::getRuleId, ruleId)
+                        .eq(IotAlarmRuleSource::getSourceType, Integer.parseInt(code)));
+                isAllDevice = ruleSourceList.stream().map(IotAlarmRuleSource::getValueType).anyMatch(ValueTypeEnum.AllDevice.getText()::equals);
+                if (isAllDevice) {
+                    //如果此前已经设置了 产品类型=AllDevice的  本次就无需再添加
+                    continue;
+                }
+                //isAllDevice = false 说明当前规则与当前的产品类型没有设置需要报警的设备信息,或者说是仅指定了具体的设备需要报警
+                //如果是仅指定了具体的设备需要报警,本次重新设置 需要覆盖之前的数据
+                IotAlarmRuleSource source = new IotAlarmRuleSource();
+                source.setId(IDHelper.id());
+                source.setOrgId(productDevice.getOrgId());
+                source.setRuleId(ruleId);
+                source.setSourceType(Integer.parseInt(code));
+                source.setValue(deviceId);
+                source.setValueType(ValueTypeEnum.Device.getText());
+                iotAlarmRuleSourceMapper.insert(source);
+
+            }
+        }
+    }
+
+    /**
+     * 处理每种类型的数据
+     * @param pdv
+     * @return
+     */
+    private void dealDevice(ProductTypeDataVo pdv){
+        String valueType = pdv.getValueType();
+
+        if(StringUtils.isEmpty(valueType)){
+            //未配置设备关联时
+            pdv.setIsAllDeviceEnable(false);
+            pdv.setValueType(ValueTypeEnum.AllDevice.getText());
+        }else{
+            if(ValueTypeEnum.AllDevice.getText().equals(valueType)){
+                //配置按设备类型关联时
+                pdv.setIsAllDeviceEnable(true);
+            }
+
+            if(ValueTypeEnum.Device.getText().equals(valueType)){
+                //配置具体设备关联时
+                List<ProductDeviceTempVo> deviceTempList = pdv.getDeviceTempList();
+                //获取对应的设备id
+                List<String> deviceIds = deviceTempList.stream().map(ProductDeviceTempVo::getDeviceId).collect(Collectors.toList());
+
+                List<IotSensor> iotSensors = iotCommonSensorMapper.selectByIds(deviceIds);
+                Map<String, IotSensor> deviceIdAndName = iotSensors.stream().collect(Collectors.toMap(IotSensor::getDeviceCode, Function.identity()));
+                for (ProductDeviceTempVo ptv : deviceTempList) {
+                    IotSensor iotSensor = deviceIdAndName.get(ptv.getDeviceId());
+                    if( iotSensor!= null){
+                        ptv.setDeviceName(iotSensor.getDeviceName());
+                        ptv.setOrgName(iotSensor.getOrgName());
+                    }
+
+                }
+            }
+        }
     }
 }

+ 17 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceRuleVo.java

@@ -0,0 +1,17 @@
+package com.xunmei.iot.vo.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/28 17:23
+ */
+@Data
+public class IotAlarmRuleSourceDeviceRuleVo {
+
+    @ApiModelProperty(value = "规则id")
+    private Long ruleId;
+    @ApiModelProperty(value = "是否可以取消绑定该规则",notes = "true:可以,false:不可以")
+    private Boolean flag;
+}

+ 27 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceVo.java

@@ -0,0 +1,27 @@
+package com.xunmei.iot.vo.alarm;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 10:51
+ */
+@Data
+public class IotAlarmRuleSourceDeviceVo {
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    @ApiModelProperty(value = "机构名称")
+    private String orgName;
+    private String orgPath;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+}

+ 44 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmRuleSourceMapper.xml

@@ -13,4 +13,48 @@
                  inner join t_app_alarm_rule_express e on r.id = e.rule_id
         where r.id = #{ruleId}
     </select>
+
+    <resultMap id="product_type_data" type="com.xunmei.iot.vo.alarm.ProductTypeDataVo">
+        <result property="type" column="type"/>
+        <result property="valueType" column="value_type"/>
+        <result property="valueType" column="value_type"/>
+        <collection property="deviceTempList" ofType="com.xunmei.iot.vo.alarm.ProductDeviceTempVo">
+            <result property="deviceId" column="device_id"/>
+            <result property="orgId" column="org_id"/>
+            <result property="orgName" column="org_name"/>
+        </collection>
+    </resultMap>
+
+
+    <select id="selectRuleDevice" resultMap="product_type_data">
+        SELECT
+            a.source_type AS type,
+            b.value_type,
+            b.`value` AS device_id,
+            b.org_id,
+            c.`name` AS org_name
+        FROM
+            (	select rule_id,source_type from iot_alarm_rule_express  GROUP BY source_type,rule_id) a
+                LEFT JOIN iot_alarm_rule_source b ON a.rule_id = b.rule_id and a.source_type=b.source_type
+                LEFT JOIN sys_org c ON b.org_id = c.id
+        where a.rule_id = #{ruleId}
+    </select>
+    <select id="selectDeviceList" resultType="com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo">
+        SELECT DISTINCT
+        d.device_code AS deviceId,
+        d.device_name AS deviceName,
+        d.org_id AS orgId,
+        d.org_path AS orgPath,
+        CONCAT(b.affiliated_area,'-',b.affiliated_bank,'-',b.short_name) as org_name
+        FROM
+        iot_sensor d
+        LEFT JOIN mediator_category c ON c.id = d.category_id
+        LEFT JOIN sys_org b ON d.org_id = b.id
+        where d.org_id = #{param.orgId}
+        and c.code = #{param.type}
+        <if test="param.deviceName != null and param.deviceName != ''">
+            and d.device_name like concat('%',#{param.deviceName},'%')
+        </if>
+
+    </select>
 </mapper>

+ 16 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotSensorMapper.xml

@@ -47,4 +47,20 @@
         </where>
         order by s.state_update_time desc
     </select>
+    <select id="selectByIds"  resultType="com.xunmei.common.core.domain.iot.domain.IotSensor">
+        SELECT
+            org_id,
+            CONCAT(b.affiliated_area,'-',b.affiliated_bank,'-',b.short_name) as org_name,
+            device_name,
+            category_id,
+            infos AS info,
+            device_code
+        FROM
+            iot_sensor a
+        LEFT JOIN sys_org b ON a.org_id = b.id
+        where device_code in
+        <foreach collection="deviceIds" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>