Ver Fonte

Merge branch 'V0.1.1_alarm' of http://10.87.21.221:8000/jzyd_yyds/soc into V0.1.1_alarm

zhulu há 1 ano atrás
pai
commit
7038a0cd62
32 ficheiros alterados com 339 adições e 75 exclusões
  1. 43 2
      project_data/sql/0.1.1/soc/soc.sql
  2. 10 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteSmsService.java
  3. 4 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteSmsFallbackFactory.java
  4. 5 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/util/LogUtils.java
  5. 5 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/SystemParameterConstant.java
  6. 2 2
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/notice/WebsocketNoticeLog.java
  7. 1 1
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/BaseDeviceTypeEnum.java
  8. 1 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/IotAlarmRuleExpressService.java
  9. 1 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/IotAlarmRuleSourceService.java
  10. 8 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmRuleExpressServiceImpl.java
  11. 3 1
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmRuleServiceImpl.java
  12. 8 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmRuleSourceServiceImpl.java
  13. 41 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/enums/AlarmHostProductToFsuProductEnum.java
  14. 11 7
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/enums/SmsNotifyType.java
  15. 3 2
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceInfoServiceImpl.java
  16. 2 6
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceStatusServiceImpl.java
  17. 1 1
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/notice/service/IWebsocketNoticeLogService.java
  18. 50 8
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/notice/service/impl/WebsocketNoticeLogServiceImpl.java
  19. 9 5
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/protection/service/impl/IotAlarmHostServiceImpl.java
  20. 17 5
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/VideoIntegrityCheckServiceImpl.java
  21. 20 0
      soc-modules/soc-modules-host/src/main/resources/logback.xml
  22. 1 1
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarmData/AppAlarmPageDto.java
  23. 3 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmInfoVo.java
  24. 4 4
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmDataMapper.xml
  25. 7 7
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/enums/SmsNotifyType.java
  26. 5 1
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/controller/SmsController.java
  27. 10 0
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/ISmsService.java
  28. 32 0
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/SmsService.java
  29. 12 7
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/utils/SmsNotifyType.java
  30. 11 4
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/NoticeServiceImpl.java
  31. 3 5
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java
  32. 6 6
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/util/DeviceExport.java

+ 43 - 2
project_data/sql/0.1.1/soc/soc.sql

@@ -1222,7 +1222,7 @@ drop table if exists websocket_notice_log;
 CREATE TABLE `websocket_notice_log` (
                                         `id` bigint NOT NULL,
                                         `iot_alarm_id` bigint DEFAULT NULL,
-                                        `org_id` bigint DEFAULT NULL,
+                                        `org_ids` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
                                         `user_ids` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
                                         `is_do` int DEFAULT NULL COMMENT '是否处理:0.否 1.是',
                                         `create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -1407,4 +1407,45 @@ ALTER TABLE `iot_alarm_data`
     MODIFY COLUMN `source_type` varchar(64) NULL DEFAULT NULL COMMENT '报警源类型(设备类型)' AFTER `device_id`;
 
 ALTER TABLE `iot_alarm_data`
-    MODIFY COLUMN `source_type_des` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报警源类型(设备类型) 中文' AFTER `source_type`;
+    MODIFY COLUMN `source_type_des` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报警源类型(设备类型) 中文' AFTER `source_type`;
+
+delete from sys_config where config_key='ALARM_LOSE_DURATION';
+INSERT INTO `sys_config`(`config_name`, `config_key`, `config_value`, `config_type`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('判定为完整录像的丢失时长', 'ALARM_LOSE_DURATION', '5', 'Y', '超级管理员', '2024-10-15 10:21:10', '', NULL, NULL);
+
+-- 刷iot_alarm_data的历史数据,source_type和field_code字段
+update iot_alarm_data set source_type = 'FSU_TemperatureAndHumidity',field_code='temperature' where source_type = '4183' and field_code = '4183_1';
+update iot_alarm_data set source_type = 'FSU_TemperatureAndHumidity',field_code='humidity' where source_type = '4183' and field_code = '4183_2';
+update iot_alarm_data set source_type = 'FSU_Smoke',field_code='alarm' where source_type = '4182' and field_code = '4182';
+update iot_alarm_data set source_type = 'FSU_Water',field_code='alarm' where source_type = '4184' and field_code = '4184';
+update iot_alarm_data set source_type = 'FSU_Infrared',field_code='alarm' where source_type = '4181' and field_code = '4181';
+update iot_alarm_data set source_type = 'FSU_DoorMagnetic',field_code='alarm' where source_type = '4188' and field_code = '4188';
+update iot_alarm_data set source_type = 'FSU_Gas',field_code='alarm' where source_type = '41885' and field_code = '41885';
+update iot_alarm_data set source_type = 'FSU_Theft',field_code='alarm' where source_type = '41881' and field_code = '41881';
+
+-- 删除脏数据
+delete from iot_device_info where deleted= 1;
+
+-- 修改短信发送表的type字段,将4181-41885修改为对应的productType
+update sms_send_record set type = 'FSU_Infrared' where type = '4181';
+update sms_send_record set type = 'FSU_Smoke' where type = '4182';
+update sms_send_record set type = 'FSU_TemperatureAndHumidity' where type = '4183';
+update sms_send_record set type = 'FSU_Water' where type = '4184';
+update sms_send_record set type = 'FSU_DoorMagnetic' where type = '4188';
+update sms_send_record set type = 'FSU_Theft' where type = '41881';
+update sms_send_record set type = 'FSU_Gas' where type = '41885';
+
+-- 短信提醒类型字典表修改
+delete from sys_dict_type where dict_type = 'sms_notify_type';
+INSERT INTO `sys_dict_type`(`dict_name`, `dict_type`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('短信提醒类型', 'sms_notify_type', '0', '超级管理员', '2024-06-06 14:15:13', '', NULL, NULL);
+
+delete from sys_dict_data where dict_type = 'sms_notify_type';
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1, '临期提醒', '10100', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:15:50', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2, '逾期提醒', '10200', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:16:03', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (3, '水浸告警', 'FSU_Water', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:17:15', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (4, '温湿度告警', 'FSU_TemperatureAndHumidity', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:17:42', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (5, '烟感告警', 'FSU_Smoke', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:18:09', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (6, '红外告警', 'FSU_Infrared', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:18:28', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (7, '燃气告警', 'FSU_Gas', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:18:53', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (8, '防盗告警', 'FSU_Theft', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:19:44', '', NULL, NULL);
+INSERT INTO `sys_dict_data`(`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (9, '门磁告警', 'FSU_DoorMagnetic', 'sms_notify_type', NULL, 'default', 'N', '0', '超级管理员', '2024-06-06 14:20:53', '', NULL, NULL);
+

+ 10 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteSmsService.java

@@ -52,4 +52,14 @@ public interface RemoteSmsService {
      */
     @PostMapping("/api/sms/sendReminderSms")
     List<ReminderScheduleMsgVo> sendReminderSms(@RequestBody List<ReminderScheduleMsgDto> msgDto);
+
+    /**
+     * 发送动环告警和报警主机传感器告警
+     * @param userId
+     * @param alarmContent
+     * @return
+     */
+    @PostMapping("/api/sms/sendSmsSensor")
+    void sendSmsSensor(@RequestParam("userId") Long userId,@RequestParam("alarmTypeDesc") String alarmTypeDesc,@RequestParam("alarmContent") String alarmContent,@RequestParam("alarmTime") String alarmTime);
+
 }

+ 4 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteSmsFallbackFactory.java

@@ -46,6 +46,10 @@ public class RemoteSmsFallbackFactory implements FallbackFactory<RemoteSmsServic
             public List<ReminderScheduleMsgVo> sendReminderSms(List<ReminderScheduleMsgDto> msgDto) {
                 return new ArrayList<>();
             }
+
+            @Override
+            public void sendSmsSensor(Long userId,String alarmType, String alarmContent, String alarmTime) {
+            }
         };
     }
 }

+ 5 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/util/LogUtils.java

@@ -172,4 +172,9 @@ public class LogUtils {
      * websocket 主机上报上下班规则
      */
     public  static  final Logger SOCKET_WORK_RULE_DATA=LoggerFactory.getLogger("socketWorkRuleData");
+
+    /**
+     * fsu动环和报警主机传感器短信日志
+     */
+    public  static  final Logger SMS_NOTICE_LOG=LoggerFactory.getLogger("smsNoticeLog");
 }

+ 5 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/SystemParameterConstant.java

@@ -184,4 +184,9 @@ public class SystemParameterConstant {
      */
     public static final String ALARM_DATA_TERMINAL_NOTICE_FREQUENCY = "ALARM_DATA_TERMINAL_NOTICE_FREQUENCY";
 
+    /**
+     *  N分钟内的丢失时长判定为录像完整,未丢失
+     */
+    public static final String ALARM_LOSE_DURATION = "ALARM_LOSE_DURATION";
+
 }

+ 2 - 2
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/notice/WebsocketNoticeLog.java

@@ -34,8 +34,8 @@ public class WebsocketNoticeLog implements Serializable {
     @TableField("iot_alarm_id")
     private Long iotAlarmId;
 
-    @TableField("org_id")
-    private Long orgId;
+    @TableField("org_ids")
+    private String orgIds;
 
     @TableField("user_ids")
     private String userIds;

+ 1 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/BaseDeviceTypeEnum.java

@@ -43,7 +43,7 @@ public enum BaseDeviceTypeEnum {
     AlarmHostInput_Infrared("Infrared","红外传感器"),
     AlarmHostInput_Soaking("Soaking","水浸传感器"),
     AlarmHostInput_DoorSensor("DoorSensor","门磁传感器"),
-    AlarmHostInput_Other("Other(","其他传感器"),
+    AlarmHostInput_Other("Other","其他传感器"),
     AlarmHostInput_Displacement("Displacement","位移传感器"),
     AlarmHostInput_Broken("Broken","破碎传感器"),
     AlarmHostInput_Shock("Shock","震动传感器"),

+ 1 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/IotAlarmRuleExpressService.java

@@ -8,4 +8,5 @@ import java.util.List;
 public interface IotAlarmRuleExpressService extends IService<IotAlarmRuleExpress> {
 
     List<IotAlarmRuleExpress> selectByRuleId(Long ruleId);
+    void delByRuleId(Long ruleId);
 }

+ 1 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/IotAlarmRuleSourceService.java

@@ -10,5 +10,6 @@ public interface IotAlarmRuleSourceService  extends IService<IotAlarmRuleSource>
 
 
     List<IotAlarmRuleSource> selectByRuleId(Long ruleId);
+    void deleteByRuleId(Long ruleId);
 
 }

+ 8 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmRuleExpressServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xunmei.host.alarm.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleExpress;
 import com.xunmei.host.alarm.mapper.IotAlarmRuleExpressMapper;
@@ -15,4 +16,11 @@ public class IotAlarmRuleExpressServiceImpl extends ServiceImpl<IotAlarmRuleExpr
     public List<IotAlarmRuleExpress> selectByRuleId(Long ruleId) {
         return lambdaQuery().eq(IotAlarmRuleExpress::getRuleId, ruleId).list();
     }
+
+    @Override
+    public void delByRuleId(Long ruleId) {
+        final LambdaQueryWrapper<IotAlarmRuleExpress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(IotAlarmRuleExpress::getRuleId, ruleId);
+        remove(wrapper);
+    }
 }

+ 3 - 1
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmRuleServiceImpl.java

@@ -94,8 +94,10 @@ public class IotAlarmRuleServiceImpl extends ServiceImpl<IotAlarmRuleMapper, Iot
 
         final Object rs = jsb.get("ruleSourceList");
         final Object re = jsb.get("ruleExpresses");
+        final Long ruleId = rule.getId();
         if (rs != null) {
             final List<JSONObject> list = JSON.parseArray(rs.toString(), JSONObject.class);
+            ruleSourceService.deleteByRuleId(ruleId);
             for (JSONObject j : list) {
                 final IotAlarmRuleSource ruleSource = j.toJavaObject(IotAlarmRuleSource.class);
                 final IotAlarmRuleSource source = new IotAlarmRuleSource();
@@ -109,8 +111,8 @@ public class IotAlarmRuleServiceImpl extends ServiceImpl<IotAlarmRuleMapper, Iot
         }
         if (re != null) {
             final List<IotAlarmRuleExpress> list = JSON.parseArray(re.toString(), IotAlarmRuleExpress.class);
+            ruleExpressService.delByRuleId(ruleId);
             ruleExpressService.saveOrUpdateBatch(list);
         }
-
     }
 }

+ 8 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmRuleSourceServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xunmei.host.alarm.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
 import com.xunmei.host.alarm.mapper.IotAlarmRuleSourceMapper;
@@ -17,4 +18,11 @@ public class IotAlarmRuleSourceServiceImpl extends ServiceImpl<IotAlarmRuleSourc
         return lambdaQuery().eq(IotAlarmRuleSource::getRuleId, ruleId).list();
 
     }
+
+    @Override
+    public void deleteByRuleId(Long ruleId) {
+        final LambdaQueryWrapper<IotAlarmRuleSource> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(IotAlarmRuleSource::getRuleId, ruleId);
+        remove(wrapper);
+    }
 }

+ 41 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/enums/AlarmHostProductToFsuProductEnum.java

@@ -0,0 +1,41 @@
+package com.xunmei.host.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum AlarmHostProductToFsuProductEnum {
+
+    INFRARED("Infrared", "FSU_Infrared","红外"),
+    WATER("Soaking", "FSU_Water","水浸"),
+    SMOKE("Smoke", "FSU_Smoke","烟感"),
+    Temperature("Temperature", "FSU_TemperatureAndHumidity","温度"),
+    Humidity("Humidity", "FSU_TemperatureAndHumidity","温度"),
+    DOOR("DoorSensor", "FSU_DoorMagnetic","门磁"),
+
+    ;
+
+    private String alarmHostProductType;
+
+    private String fsuProductType;
+
+    private String desc;
+
+    private static final Map<String, AlarmHostProductToFsuProductEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (AlarmHostProductToFsuProductEnum enumNode : AlarmHostProductToFsuProductEnum.values()) {
+            enumMap.put(enumNode.alarmHostProductType, enumNode);
+        }
+    }
+    //根据key找value
+    public static String getFsuProductType(String alarmHostProductType) {
+        AlarmHostProductToFsuProductEnum e = enumMap.get(alarmHostProductType);
+        return e != null ? e.getFsuProductType() : "";
+    }
+
+}

+ 11 - 7
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/enums/SmsNotifyType.java

@@ -18,20 +18,24 @@ public enum SmsNotifyType {
 
     OVERDUE_REMINDER("10200", "逾期提醒"),
 
-    WATER_DRAINAGE_ALARM("4184", "水浸告警"),
+    WATER_DRAINAGE_ALARM("FSU_Water", "水浸告警"),
 
-    HUMIDITY_TEMPERATURE_ALARM("4183", "温湿度告警"),
+    HUMIDITY_TEMPERATURE_ALARM("FSU_TemperatureAndHumidity", "温湿度告警"),
 
-    SMOKE_ALARM("4182", "烟感告警"),
+    SMOKE_ALARM("FSU_Smoke", "烟感告警"),
 
-    Infrared_Alarm("4181", "红外告警"),
+    Infrared_Alarm("FSU_Infrared", "红外告警"),
 
-    GAS_ALARM("41885", "燃气告警"),
+    GAS_ALARM("FSU_Gas", "燃气告警"),
 
-    ALARM_OF_THEFT("41881", "盗情告警"),
+    ALARM_OF_THEFT("FSU_Theft", "防盗告警"),
 
-    DOOR_MAGNET_ALARM("4188", "门磁告警"),
+    DOOR_MAGNET_ALARM("FSU_DoorMagnetic", "门磁告警"),
 
+
+    TEMPERATURE_HOST_ALARM("Temperature", "温度告警"),
+
+    HUMIDITY_HOST_ALARM("Humidity", "湿度告警"),
     ;
 
     private final String code;

+ 3 - 2
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceInfoServiceImpl.java

@@ -543,7 +543,8 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
             //处理通道或者动环传感器信息
             for (SubDeviceInfo subDeviceInfo : subDeviceList) {
                 //动环中 控电箱按钮与 市电总回路/八小时总回路通电状态不同步
-                boolean isFusDevice = ProductEnums.FSU_GATEWAY.getProductName().contains(dvsBaseInfo.getProductName()) && (!list.contains(dvsBaseInfo.getProductName()));
+                boolean needSyncTpAsset = ProductEnums.FSU_GATEWAY.getProductName().contains(dvsBaseInfo.getProductName()) && (!list.contains(subDeviceInfo.getType()));
+                boolean isFusDevice = ProductEnums.FSU_GATEWAY.getProductName().contains(dvsBaseInfo.getProductName());
                 String productName = isFusDevice ? subDeviceInfo.getType() : dvsBaseInfo.getProductName();
                 IotDeviceInfo channelInfo = selectByTypeAndHostAndCode(serverInfo.getIotCode(), subDeviceInfo.getParentCode(), productName, subDeviceInfo.getDeviceCode());
 
@@ -554,7 +555,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
                     updateChannelInfo(subDeviceInfo, channelInfo, hostInfo);
                     updateChnnelList.add(channelInfo);
                 }
-                if (isFusDevice) {
+                if (needSyncTpAsset) {
                     syncToAssetDeviceList.add(channelInfo);
                 }
 

+ 2 - 6
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceStatusServiceImpl.java

@@ -207,18 +207,14 @@ public class IotDeviceStatusServiceImpl extends ServiceImpl<IotDeviceStatusMappe
             if (ObjectUtil.isNotNull(dataReq.getStartTime()) && ObjectUtil.isNull(dataReq.getEndTime())) {
                 updateStatusByDevicePrimaryId(deviceInfo.getId(), DeviceStatusEnum.ALARM.getValue());
                 //判断是否通知app
-                websocketNoticeLogService.noticeAlarm(deviceInfo,iotAlarmData);
+                websocketNoticeLogService.noticeAlarm(deviceInfo,iotAlarmData,false);
             }
             // 报警结束
             if (ObjectUtil.isNotNull(dataReq.getStartTime()) && ObjectUtil.isNotNull(dataReq.getEndTime())) {
                 updateStatusByDevicePrimaryId(deviceInfo.getId(), DeviceStatusEnum.NORMAL.getValue());
-                //todo 告警结束需要结束通知
+                //告警结束需要结束通知
                 websocketNoticeLogService.endNoticeAlarm(deviceInfo,iotAlarmData);
             }
-            if (Boolean.TRUE.equals(dataReq.getSmsType())) {
-                //todo  发送短信
-            }
-
         }
 
 

+ 1 - 1
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/notice/service/IWebsocketNoticeLogService.java

@@ -19,5 +19,5 @@ public interface IWebsocketNoticeLogService extends IService<WebsocketNoticeLog>
 
     void endNoticeAlarm(IotDeviceInfo deviceInfo, IotAlarmData iotAlarmData);
 
-    void noticeAlarm(IotDeviceInfo deviceInfo,IotAlarmData iotAlarmData);
+    void noticeAlarm(IotDeviceInfo deviceInfo,IotAlarmData iotAlarmData,boolean alarmHost);
 }

+ 50 - 8
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/notice/service/impl/WebsocketNoticeLogServiceImpl.java

@@ -9,19 +9,25 @@ import com.xunmei.common.core.domain.notice.CoreNoticeRuleItem;
 import com.xunmei.common.core.domain.notice.WebsocketNoticeLog;
 import com.xunmei.common.core.enums.iot.BaseDeviceTypeEnum;
 import com.xunmei.common.core.vo.notice.WebSocketNoticeVo;
+import com.xunmei.host.enums.AlarmHostProductToFsuProductEnum;
+import com.xunmei.host.enums.SmsNotifyType;
 import com.xunmei.host.notice.mapper.WebsocketNoticeLogMapper;
 import com.xunmei.host.notice.service.ICoreNoticeRuleItemService;
 import com.xunmei.host.notice.service.IWebsocketNoticeLogService;
 import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.RemoteSmsService;
 import com.xunmei.system.api.RemoteWebsocketSendService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.iot.IotDeviceInfo;
+import com.xunmei.system.api.util.LogUtils;
 import com.xunmei.system.api.vo.WebSocketSendVo;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 
@@ -45,6 +51,9 @@ public class WebsocketNoticeLogServiceImpl extends ServiceImpl<WebsocketNoticeLo
     @Resource
     private RemoteOrgService orgService;
 
+    @Resource
+    private RemoteSmsService remoteSmsService;
+
     @Override
     public void endNoticeAlarm(IotDeviceInfo deviceInfo, IotAlarmData iotAlarmData){
         QueryWrapper<WebsocketNoticeLog> wrapper = new QueryWrapper<>();
@@ -77,9 +86,20 @@ public class WebsocketNoticeLogServiceImpl extends ServiceImpl<WebsocketNoticeLo
 
 
     @Override
-    public void noticeAlarm(IotDeviceInfo deviceInfo,IotAlarmData iotAlarmData) {
+    public void noticeAlarm(IotDeviceInfo deviceInfo,IotAlarmData iotAlarmData,boolean alarmHost) {
         try {
-            List<CoreNoticeRuleItem> itemList = coreNoticeRuleItemService.getByOrgIdAndProductType(deviceInfo.getOrgId(),deviceInfo.getDeviceProduct());
+            String productType = deviceInfo.getDeviceProduct();
+            //是报警主机的传感器时,需要转换类型
+            if (alarmHost){
+                String fsuProductType = AlarmHostProductToFsuProductEnum.getFsuProductType(productType);
+                if (ObjectUtil.isEmpty(fsuProductType)){
+                    LogUtils.SMS_NOTICE_LOG.error("报警主机设备类型转换fsu设备类型为空,设备类型:{}",productType);
+                    return;
+                }
+                productType = fsuProductType;
+            }
+
+            List<CoreNoticeRuleItem> itemList = coreNoticeRuleItemService.getByOrgIdAndProductType(deviceInfo.getOrgId(),productType);
             /**
              * 通知人员:
              * 1.角色为空,有具体人员->发送到该机构下具体人员
@@ -88,12 +108,20 @@ public class WebsocketNoticeLogServiceImpl extends ServiceImpl<WebsocketNoticeLo
              */
             if (itemList != null && itemList.size() > 0) {
                 HashSet<Long> userSet = new HashSet<>();
+                HashSet<Long> sendSmsUserSet = new HashSet<>();
+                HashMap<Long, Long> hashMap = new HashMap<>();
                 for (CoreNoticeRuleItem item : itemList) {
                     //根据角色查询人员
                     if(item.getRoleId() != null){
-                        List<Long> roleUserIdList = coreNoticeRuleItemService.getUserIdsByRoleId(item.getRoleId(), deviceInfo.getOrgId());
+                        List<Long> roleUserIdList = coreNoticeRuleItemService.getUserIdsByRoleId(item.getRoleId(), item.getOrgId());
                         if (roleUserIdList != null && roleUserIdList.size() > 0) {
                             userSet.addAll(roleUserIdList);
+                            if (item.getSendSms() == 1){
+                                sendSmsUserSet.addAll(roleUserIdList);
+                            }
+                            for (Long userId : roleUserIdList) {
+                                hashMap.put(userId, item.getOrgId());
+                            }
                         }
                     }
                     //根据人员id查询该机构下人员
@@ -101,11 +129,14 @@ public class WebsocketNoticeLogServiceImpl extends ServiceImpl<WebsocketNoticeLo
                         String[] userIds = item.getUserIds().split(",");
                         for (String userId : userIds) {
                             userSet.add(Long.valueOf(userId));
+                            hashMap.put(Long.valueOf(userId), item.getOrgId());
+                            if (item.getSendSms() == 1){
+                                sendSmsUserSet.add(Long.valueOf(userId));
+                            }
                         }
                     }
                 }
                 if(!userSet.isEmpty()){
-                    Long orgId = deviceInfo.getOrgId();
                     WebSocketNoticeVo noticeVo = new WebSocketNoticeVo();
                     noticeVo.setIotAlarmDataId(iotAlarmData.getId());
                     noticeVo.setAlarmTime(iotAlarmData.getTime());
@@ -117,8 +148,8 @@ public class WebsocketNoticeLogServiceImpl extends ServiceImpl<WebsocketNoticeLo
                             ? BaseDeviceTypeEnum.getDescByCode(deviceInfo.getDeviceType()) : BaseDeviceTypeEnum.getDescByCode(deviceInfo.getDeviceProduct());
                     noticeVo.setProductTypeName(productTypeName);
                     noticeVo.setIsDo(0);
-                    noticeVo.setOrgId(orgId);
-                    SysOrg sysOrg = orgService.selectOrgById(orgId, SecurityConstants.INNER);
+                    noticeVo.setOrgId(deviceInfo.getOrgId());
+                    SysOrg sysOrg = orgService.selectOrgById(deviceInfo.getOrgId(), SecurityConstants.INNER);
                     if (null != sysOrg) {
                         noticeVo.setOrgName(sysOrg.getShortName());
                     }
@@ -126,13 +157,24 @@ public class WebsocketNoticeLogServiceImpl extends ServiceImpl<WebsocketNoticeLo
                     for (Long userId : userSet) {
                         WebSocketSendVo sendVo = new WebSocketSendVo();
                         sendVo.setUserId(userId);
-                        sendVo.setOrgId(orgId);
+                        //通知机构
+                        sendVo.setOrgId(hashMap.get(userId));
                         sendVo.setContent(noticeVo);
                         list.add(sendVo);
                     }
                     //调用system接口发送通知
                     websocketSendService.sendMessages(list);
                 }
+                if (!sendSmsUserSet.isEmpty()){
+                    //调用接口发送短信
+                    for (Long userId : sendSmsUserSet) {
+                        LocalDateTime localDateTime = iotAlarmData.getTime();
+                        String alarmTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+                        remoteSmsService.sendSmsSensor(userId, SmsNotifyType.getDesc(productType), iotAlarmData.getContent(), alarmTime);
+                        LogUtils.SMS_NOTICE_LOG.info("发送传感器报警短信:用户id:{},传感器类型:{},报警id:{},报警时间:{},报警内容:{}",userId,productType,iotAlarmData.getId(), alarmTime,iotAlarmData.getContent());
+                    }
+                }
             }
         }catch (Exception e){
             e.printStackTrace();

+ 9 - 5
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/protection/service/impl/IotAlarmHostServiceImpl.java

@@ -400,11 +400,11 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
             LogUtils.STATUS_INFO_STATUS_SENSOR.error("接收报警主机传感器状态事件:未查询到报警主机传感器信息,token:{},alarmHostId:{},zoneId:{},inputIndex:{}",token,deviceName,subsystemId,index);
             return;
         }
-        String sensorType = input.getSensorType();
+        String sensorType = "AlarmHostInput_" + input.getSensorType();
         Long vipDeviceCode = input.getId();
 
         QueryWrapper<IotAlarmSystemField> fieldWrapper = new QueryWrapper<>();
-        fieldWrapper.eq("sys_field_code",sensorType);
+        fieldWrapper.eq("product_type",sensorType);
         fieldWrapper.eq("enable",1);
         List<IotAlarmSystemField> fieldList = alarmSystemFieldMapper.selectList(fieldWrapper);
         IotPropertiesRes resParam = new IotPropertiesRes();
@@ -470,7 +470,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
         String infos = status.getInfo();
         Map<String, String> dataMap = dealInfos(infos);
 
-        String sensorValue = dataMap.get(field.getProductProperty());
+        String sensorValue = dataMap.get(field.getProductPropertyDisplayName());
         if (StringUtils.isBlank(sensorValue)) {
             return ;
         }
@@ -492,7 +492,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
             dataList.add(alarmData);
             //todo 产生告警通知
             IotDeviceInfo deviceInfo = changeToDeviceInfo(input);
-            websocketNoticeLogService.noticeAlarm(deviceInfo,alarmData);
+            websocketNoticeLogService.noticeAlarm(deviceInfo,alarmData,true);
         }else{
             // 本次上传的设备状态数据 没有生成告警
             if (!isAlarm) {
@@ -503,13 +503,16 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
                         for (IotAlarmData oldAlarm : alarms) {
                             oldAlarm.setEndTime(LocalDateTime.now());
                             iotAlarmDataMapper.updateById(oldAlarm);
+
+                            IotDeviceInfo deviceInfo = changeToDeviceInfo(input);
+                            websocketNoticeLogService.endNoticeAlarm(deviceInfo,oldAlarm);
                         }
                     } else {
                         IotAlarmData iotAlarmData = alarms.get(0);
                         iotAlarmData.setEndTime(LocalDateTime.now());
                         iotAlarmDataMapper.updateById(iotAlarmData);
 
-                        //todo 结束告警通知 , 只有6种传感器需要走这个逻辑
+                        //结束告警通知 , 只有6种传感器需要走这个逻辑
                         IotDeviceInfo deviceInfo = changeToDeviceInfo(input);
                         websocketNoticeLogService.endNoticeAlarm(deviceInfo,iotAlarmData);
                     }
@@ -628,6 +631,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
                     .eq(IotAlarmDefenceArea::getAlarmHostCode, deviceCode)
                     .eq(IotAlarmDefenceArea::getModuleAddress, moduleAddress)
                     .eq(IotAlarmDefenceArea::getDefenceAreaIndex, index)
+                    .eq(IotAlarmDefenceArea::getDeleted,0)
                     .last("limit 1");
             IotAlarmDefenceArea one = iotAlarmDefenceAreaMapper.selectOne(qw);
             if (one != null) {

+ 17 - 5
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/VideoIntegrityCheckServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.constant.SystemParameterConstant;
 import com.xunmei.common.core.domain.host.remote.VideoIntegrityGetReq;
 import com.xunmei.common.core.domain.video.MediatorVideoDaysCheck;
 import com.xunmei.common.core.domain.video.MediatorVideoIntegrityCheck;
@@ -33,7 +34,9 @@ import com.xunmei.host.websocket.enums.TopicTypeEnums;
 import com.xunmei.host.websocket.service.RouterService;
 import com.xunmei.host.websocket.utils.IotServerUtils;
 import com.xunmei.host.websocket.utils.WebSocketUtils;
+import com.xunmei.system.api.RemoteConfigService;
 import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysConfig;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.iot.IotDeviceInfo;
 import com.xunmei.system.api.domain.north.NorthError;
@@ -78,6 +81,9 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
     @Resource
     IIotDeviceInfoService iotDeviceInfoService;
 
+    @Resource
+    RemoteConfigService remoteConfigService;
+
     @Override
     public ProductEnums product() {
         return ProductEnums.DVS;
@@ -142,7 +148,7 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         object.put("index", req.getIndex());
         object.put("recordDate", req.getRecordDate());
         final WebsocketResult result = IotServerUtils.invokeHostServer(topic, new JSONObject(), WebSocketConstants.GET_RECORD_INFOS_SERVICES, object);
-        WebSocketUtils.sendMessage(req.getIotCode(),JacksonUtils.toJSONString(result));
+        WebSocketUtils.sendMessage(req.getIotCode(), JacksonUtils.toJSONString(result));
     }
 
     @Override
@@ -228,8 +234,8 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         videoIntegrityCheck.setOrgId(org.getId());
         videoIntegrityCheck.setOrgName(org.getShortName());
         videoIntegrityCheck.setOrgPath(org.getPath());
-        videoIntegrityCheck.setStatus(getStatus(videoIntegrityCheckDto));
         videoIntegrityCheck.setLoseDuration(calculateLoseMinute(videoIntegrityCheck.getLoseSpan()));
+        videoIntegrityCheck.setStatus(getStatus(videoIntegrityCheckDto, videoIntegrityCheck.getLoseDuration()));
         videoIntegrityCheck.setRecordType(videoIntegrityCheckDto.getRecordType());
         videoIntegrityCheck.setRecordSpan(dealSpan(videoIntegrityCheckDto.getRecordSpan()));
         if (!isCompensate) {
@@ -327,10 +333,16 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         return StringUtil.EMPTY_STRING;
     }
 
-    private Integer getStatus(VideoIntegrityCheckDto videoIntegrityCheckDto) {
-        if (ObjectUtil.isEmpty(videoIntegrityCheckDto.getLoseSpan())) return VideoIntegrityStatus.Full.getId();
+    private Integer getStatus(VideoIntegrityCheckDto videoIntegrityCheckDto, Integer loseDuration) {
+        final List loseSpan = videoIntegrityCheckDto.getLoseSpan();
+        final SysConfig config = remoteConfigService.findSysConfigByCode(SystemParameterConstant.ALARM_LOSE_DURATION, SecurityConstants.INNER);
+        if (ObjectUtil.isNotEmpty(config) && loseDuration <= Integer.parseInt(config.getConfigValue())) {
+            //如果丢失时长小于等于配置的时长,则判定为录像正常
+            loseSpan.clear();
+        }
+        if (ObjectUtil.isEmpty(loseSpan)) return VideoIntegrityStatus.Full.getId();
         String checkSpanStr = JSON.toJSONString(videoIntegrityCheckDto.getCheckSpan());
-        String loseSpanStr = JSON.toJSONString(videoIntegrityCheckDto.getLoseSpan());
+        String loseSpanStr = JSON.toJSONString(loseSpan);
         return checkSpanStr.equals(loseSpanStr) ? VideoIntegrityStatus.AllLoss.getId() : VideoIntegrityStatus.PartialLoss.getId();
 
     }

+ 20 - 0
soc-modules/soc-modules-host/src/main/resources/logback.xml

@@ -188,6 +188,21 @@
         </encoder>
     </appender>
 
+    <appender name="statusSensorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <maxFileSize>${max.file.size}</maxFileSize>
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/status_info_sensor/%d{yyyy-MM-dd}-%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <maxHistory>${max.history}</maxHistory>
+            <totalSizeCap>${total.size.cap}</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
 
     <logger name="websocketMsgLog" additivity="false" level="info">
         <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
@@ -227,6 +242,11 @@
         <appender-ref ref="videoDiagnosisLog"/>
     </logger>
 
+    <logger name="statusSensorLog" additivity="false" level="info">
+        <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
+        <appender-ref ref="statusSensorLog"/>
+    </logger>
+
     <!-- 日志输出级别 -->
     <root level="INFO">
         <appender-ref ref="STDOUT"/>

+ 1 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarmData/AppAlarmPageDto.java

@@ -15,7 +15,7 @@ import java.util.Map;
 public class AppAlarmPageDto extends PageDto {
     private String deviceName;
 
-    private Integer alarmType;
+    private String alarmType;
 
     private  Integer state;
 

+ 3 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmInfoVo.java

@@ -2,6 +2,7 @@ package com.xunmei.iot.vo.webStatisticBoard;
 
 import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -14,9 +15,11 @@ public class BoardAlarmInfoVo {
     private String deviceName;
 
     @ApiModelProperty("报警开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date alarmStartTime;
 
     @ApiModelProperty("报警结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date alarmEndTime;
 
     @ApiModelProperty("报警信息")

+ 4 - 4
soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmDataMapper.xml

@@ -129,7 +129,7 @@
     </select>
 
     <select id="selectDeviceTypeCount" resultType="com.xunmei.iot.vo.alarmData.DeviceTypeCountVo">
-        SELECT
+        SELECT a.id,
             a.device_type as deviceType,
             count(1) as deviceTypeCount,
             t.alarmNums as deviceTypeAlarmCount
@@ -149,9 +149,9 @@
         <if test="  query.checkSub != null and query.checkSub == false">
             and a.org_id = #{query.orgId}
         </if>
-        GROUP BY a.device_type
+        GROUP BY a.id
         union all
-        SELECT
+        SELECT a.id,
             a.sensor_type as deviceType,
             count(1) as deviceTypeCount,
             t.alarmNums as deviceTypeAlarmCount
@@ -166,7 +166,7 @@
         <if test="  query.checkSub != null and query.checkSub == false">
             and a.org_id = #{query.orgId}
         </if>
-        GROUP BY a.sensor_type;
+        GROUP BY a.id;
     </select>
     <select id="selectSensorAlarmPageList" resultType="com.xunmei.iot.vo.alarm.IotAlarmDataVo">
         SELECT

+ 7 - 7
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/enums/SmsNotifyType.java

@@ -18,19 +18,19 @@ public enum SmsNotifyType {
 
     OVERDUE_REMINDER("10200", "逾期提醒"),
 
-    WATER_DRAINAGE_ALARM("4184", "水浸告警"),
+    WATER_DRAINAGE_ALARM("FSU_Water", "水浸告警"),
 
-    HUMIDITY_TEMPERATURE_ALARM("4183", "温湿度告警"),
+    HUMIDITY_TEMPERATURE_ALARM("FSU_TemperatureAndHumidity", "温湿度告警"),
 
-    SMOKE_ALARM("4182", "烟感告警"),
+    SMOKE_ALARM("FSU_Smoke", "烟感告警"),
 
-    Infrared_Alarm("4181", "红外告警"),
+    Infrared_Alarm("FSU_Infrared", "红外告警"),
 
-    GAS_ALARM("41885", "燃气告警"),
+    GAS_ALARM("FSU_Gas", "燃气告警"),
 
-    ALARM_OF_THEFT("41881", "防盗告警"),
+    ALARM_OF_THEFT("FSU_Theft", "防盗告警"),
 
-    DOOR_MAGNET_ALARM("4188", "门磁告警"),
+    DOOR_MAGNET_ALARM("FSU_DoorMagnetic", "门磁告警"),
 
     ;
 

+ 5 - 1
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/controller/SmsController.java

@@ -44,7 +44,7 @@ public class SmsController extends BaseController {
     @PostMapping("/sendSmsIot")
     public void sendSmsIot(Long orgId,String alarmType,String alarmContent,String alarmTime){
         smsService.sendSmsIot(orgId,alarmType,alarmContent,alarmTime);
-    };
+    }
 
     @PostMapping("/sendSmsTodo")
     public void sendSmsTodo(Long orgId,String type, String content, Date time){
@@ -58,5 +58,9 @@ public class SmsController extends BaseController {
 
     }
 
+    @PostMapping("/sendSmsSensor")
+    public void sendSmsSensor(Long userId,String alarmTypeDesc,String alarmContent,String alarmTime){
+        smsService.sendSmsSensor(userId,alarmTypeDesc,alarmContent,alarmTime);
+    }
 
 }

+ 10 - 0
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/ISmsService.java

@@ -40,4 +40,14 @@ public interface ISmsService {
 
     List<ReminderScheduleMsgVo> sendReminderSms(List<ReminderScheduleMsgDto> msgDto);
 
+
+    /**
+     * 发送动环传感器和报警主机传感器短信
+     * @param userId
+     * @param alarmTypeDesc
+     * @param alarmContent
+     * @return
+     */
+    void sendSmsSensor(Long userId,String alarmTypeDesc,String alarmContent,String alarmTime);
+
 }

+ 32 - 0
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/SmsService.java

@@ -15,6 +15,7 @@ import com.xunmei.sms.utils.SmsNotifyType;
 import com.xunmei.sms.utils.SmsUtil;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.RemoteRoleService;
+import com.xunmei.system.api.RemoteUserService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
@@ -46,6 +47,9 @@ public class SmsService implements ISmsService {
     @Autowired
     private ISmsSendRecordService recordService;
 
+    @Autowired
+    private RemoteUserService remoteUserService;
+
     //告警代码
     private static final String ALARM_CODE = "854002";
     //逾期提醒代码
@@ -149,6 +153,33 @@ public class SmsService implements ISmsService {
         }
     }
 
+    /**
+     * 给指定人员发送告警短信
+     *
+     * @param userId
+     * @param alarmContent
+     * @return
+     */
+    @Override
+    public void sendSmsSensor(Long userId, String alarmTypeDesc, String alarmContent, String alarmTime) {
+        SysUser sysUser = remoteUserService.getUserById(userId, SecurityConstants.INNER);
+        if (sysUser != null){
+            SysOrg sysOrg = remoteOrgService.selectOrgById(sysUser.getOrgId(), SecurityConstants.INNER);
+            Date now = new Date();
+            String date = DateUtil.format(now, "yyyy-MM-dd");
+            String time = DateUtil.format(now, "HH:mm:ss");
+            SmsInfoVo smsInfoVo = new SmsInfoVo();
+            smsInfoVo.setBelongBranchId(sysOrg.getGuid());
+            smsInfoVo.setMobile(sysUser.getPhone());
+            smsInfoVo.setTranType(ALARM_CODE);
+            smsInfoVo.setOccurDate(date);
+            smsInfoVo.setOccurTime(time);
+            smsInfoVo.setRetMsg(alarmTypeDesc);
+            smsInfoVo.setBak3(alarmContent);
+            deal(sysOrg, sysUser, smsInfoVo);
+        }
+    }
+
     private void deal(SysOrg sysOrg, SysUser sysUser, SmsInfoVo smsInfoVo) {
         if (ObjectUtil.isEmpty(sysUser.getPhone())) {
             AjaxResult result = AjaxResult.error("用户" + sysUser.getName() + "手机号为空");
@@ -159,6 +190,7 @@ public class SmsService implements ISmsService {
         CompositeData rspData = null;
         try {
             rspData = ESBClient.request(smsCompositeData);
+            logger.info("短信发送返回结果: {}", JSONObject.toJSONString(rspData));
         } catch (Exception e) {
             logger.error("短信发送时发生异常 :", e);
         }

+ 12 - 7
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/utils/SmsNotifyType.java

@@ -18,19 +18,24 @@ public enum SmsNotifyType {
 
     OVERDUE_REMINDER("10200", "逾期提醒"),
 
-    WATER_DRAINAGE_ALARM("4184", "水浸告警"),
+    WATER_DRAINAGE_ALARM("FSU_Water", "水浸告警"),
 
-    HUMIDITY_TEMPERATURE_ALARM("4183", "温湿度告警"),
+    HUMIDITY_TEMPERATURE_ALARM("FSU_TemperatureAndHumidity", "温湿度告警"),
 
-    SMOKE_ALARM("4182", "烟感告警"),
+    SMOKE_ALARM("FSU_Smoke", "烟感告警"),
 
-    Infrared_Alarm("4181", "红外告警"),
+    Infrared_Alarm("FSU_Infrared", "红外告警"),
 
-    GAS_ALARM("41885", "燃气告警"),
+    GAS_ALARM("FSU_Gas", "燃气告警"),
 
-    ALARM_OF_THEFT("41881", "防盗告警"),
+    ALARM_OF_THEFT("FSU_Theft", "防盗告警"),
 
-    DOOR_MAGNET_ALARM("4188", "门磁告警"),
+    DOOR_MAGNET_ALARM("FSU_DoorMagnetic", "门磁告警"),
+
+
+    TEMPERATURE_HOST_ALARM("Temperature", "温度告警"),
+
+    HUMIDITY_HOST_ALARM("Humidity", "湿度告警"),
 
     ;
 

+ 11 - 4
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/NoticeServiceImpl.java

@@ -21,6 +21,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class NoticeServiceImpl extends ServiceImpl<NoticeLogMapper, WebsocketNoticeLog> implements INoticeService {
@@ -65,7 +66,6 @@ public class NoticeServiceImpl extends ServiceImpl<NoticeLogMapper, WebsocketNot
                     }
                     WebSocketSendVo sendVo = new WebSocketSendVo();
                     sendVo.setUserId(Long.valueOf(userId));
-                    sendVo.setOrgId(websocketNoticeLog.getOrgId());
                     sendVo.setContent(content);
                     list.add(sendVo);
                 }
@@ -86,10 +86,10 @@ public class NoticeServiceImpl extends ServiceImpl<NoticeLogMapper, WebsocketNot
             WebSocketNoticeVo noticeVo = object.toBean(WebSocketNoticeVo.class);
             noticeLog.setIotAlarmId(noticeVo.getIotAlarmDataId());
 
-            noticeLog.setOrgId(list.get(0).getOrgId());
+            noticeLog.setOrgIds(this.handOrgIdStr(list));
             noticeLog.setIsDo(0);
             noticeLog.setCreateTime(new Date());
-            noticeLog.setUserIds(this.handStr(list));
+            noticeLog.setUserIds(this.handUserIdStr(list));
             QueryWrapper<WebsocketNoticeLog> wrapper = new QueryWrapper<>();
             wrapper.lambda().eq(WebsocketNoticeLog::getIotAlarmId,noticeVo.getIotAlarmDataId());
             WebsocketNoticeLog websocketNoticeLog = baseMapper.selectOne(wrapper);
@@ -136,7 +136,7 @@ public class NoticeServiceImpl extends ServiceImpl<NoticeLogMapper, WebsocketNot
         }
     }
 
-    private String handStr(List<WebSocketSendVo> list){
+    private String handUserIdStr(List<WebSocketSendVo> list){
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < list.size(); i++) {
             sb.append(list.get(i).getUserId());
@@ -146,4 +146,11 @@ public class NoticeServiceImpl extends ServiceImpl<NoticeLogMapper, WebsocketNot
         }
         return sb.toString();
     }
+
+    private String handOrgIdStr(List<WebSocketSendVo> list){
+        List<Long> orgIdList = list.stream().map(WebSocketSendVo::getOrgId).distinct().collect(Collectors.toList());
+        String result = orgIdList.stream().map(String::valueOf).collect(Collectors.joining(","));
+
+        return result;
+    }
 }

+ 3 - 5
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java

@@ -1,7 +1,5 @@
 package com.xunmei.system.service.impl;
 
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.context.AnalysisContext;
@@ -495,7 +493,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
         String assetType = deviceExport.getAssetType();
         Optional<DictionaryTreeVo> assetOptional = dictionaryList.stream().filter(r -> ObjectUtil.equal(r.getName(), assetType)).findFirst();
         if (!assetOptional.isPresent()) {
-            msgList.add("资产分类未填写");
+            msgList.add("资产分类未填写或填写不正确");
         } else {
             device.setAssetType(assetOptional.get().getId().toString());
         }
@@ -511,7 +509,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
             }
         }
 
-        String deviceModel = deviceExport.getDeviceModel();
+        /*String deviceModel = deviceExport.getDeviceModel();
         if (StringUtils.isEmpty(deviceModel)) {
             msgList.add("设备型号未填写");
         } else {
@@ -590,7 +588,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
             } catch (Exception e) {
                 msgList.add("投产时间格式错误");
             }
-        }
+        }*/
         String deviceStatus = deviceExport.getDeviceStatus();
         if (StringUtils.isEmpty(deviceStatus)) {
             msgList.add("资产状态未填写");

+ 6 - 6
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/util/DeviceExport.java

@@ -16,15 +16,15 @@ import lombok.Data;
 @HeadRowHeight(16) //表头行高
 @ContentRowHeight(16) //数据行高
 public class DeviceExport {
-    @ExcelProperty(value = "所属机构", index = 0)
+    @ExcelProperty(value = "所属机构(必填)", index = 0)
     private String orgName;
-    @ExcelProperty(value = "资产编号", index = 1)
+    @ExcelProperty(value = "资产编号(必填)", index = 1)
     private String assetNo;
-    @ExcelProperty(value = "设备名称", index = 2)
+    @ExcelProperty(value = "设备名称(必填)", index = 2)
     private String deviceName;
-    @ExcelProperty(value = "资产分类", index = 3)
+    @ExcelProperty(value = "资产分类(必填)", index = 3)
     private String assetType;
-    @ExcelProperty(value = "设备分类", index = 4)
+    @ExcelProperty(value = "设备分类(必填)", index = 4)
     private String deviceType;
     @ExcelProperty(value = "设备品牌", index = 5)
     private String deviceBrand;
@@ -41,6 +41,6 @@ public class DeviceExport {
     private String maintenanceTerm;
     @ExcelProperty(value = "投产时间", index = 11)
     private String useTime;
-    @ExcelProperty(value = "资产状态", index = 12)
+    @ExcelProperty(value = "资产状态(必填)", index = 12)
     private String deviceStatus;
 }