Преглед изворни кода

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

zhulu пре 1 година
родитељ
комит
6f8fd8fce1
21 измењених фајлова са 497 додато и 28 уклоњено
  1. 44 0
      project_data/sql/0.1.1/soc/soc.sql
  2. 36 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysDevice.java
  3. 83 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/device/domain/SysMultiLayerDictionary.java
  4. 39 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/device/vo/DictionaryTreeVo.java
  5. 5 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotDailyCheckData.java
  6. 3 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/BaseDeviceTypeEnum.java
  7. 1 1
      soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java
  8. 11 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/mapper/SysDeviceMapper.java
  9. 17 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/SysDeviceService.java
  10. 34 9
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceInfoServiceImpl.java
  11. 64 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/SysDeviceServiceImpl.java
  12. 1 2
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/protection/service/impl/IotAlarmHostServiceImpl.java
  13. 1 1
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/handler/SocWebSocketHandler.java
  14. 1 1
      soc-modules/soc-modules-host/src/main/resources/logback.xml
  15. 4 0
      soc-modules/soc-modules-host/src/main/resources/mapper/SysDeviceMapper.xml
  16. 13 14
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeviceController.java
  17. 42 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysMultiLayerDictionaryController.java
  18. 16 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysMultiLayerDictionaryMapper.java
  19. 23 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysMultiLayerDictionaryService.java
  20. 2 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java
  21. 57 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysMultiLayerDictionaryServiceImpl.java

+ 44 - 0
project_data/sql/0.1.1/soc/soc.sql

@@ -1007,3 +1007,47 @@ INSERT INTO `iot_server_product`(`id`, `name`, `display_name`, `enabled`, `categ
 INSERT INTO `iot_server_product`(`id`, `name`, `display_name`, `enabled`, `categories`) VALUES ('f6a73ea2-1cc7-d7ff-8018-3a0ad3408d98', 'DaHuaAlarmHost', 'DaHua报警主机', 1, '[\r\n  \"AlarmHost\"\r\n]');
 INSERT INTO `iot_server_product`(`id`, `name`, `display_name`, `enabled`, `categories`) VALUES ('f81d4fae-7dec-11d0-a765-00a0c91e6bf6', 'FSU_RollingShutterDoor', 'FSU 卷帘门传感器', 1, '[\r\n  \"FSU\"\r\n]');
 INSERT INTO `iot_server_product`(`id`, `name`, `display_name`, `enabled`, `categories`) VALUES ('f9c5d636-dac4-d515-dfbe-3a0d3da7d805', 'BOSCH_CMS', 'BOSCH_CMS报警主机', 1, '[\r\n  \"AlarmHost\"\r\n]');
+
+
+DELIMITER ??
+DROP PROCEDURE IF EXISTS schema_change ??
+CREATE PROCEDURE schema_change()
+BEGIN
+
+    -- 磁盘表增加磁盘原始状态值
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'sys_device'
+                    AND column_name = 'asset_no') THEN
+        ALTER TABLE `sys_device`
+            ADD COLUMN `asset_no` varchar(125) NULL COMMENT '资产编号' AFTER `device_name`,
+            MODIFY COLUMN `device_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备类型' AFTER `asset_type`,
+            ADD COLUMN `device_status` int(2) NULL COMMENT '设备状态' AFTER `device_type`,
+            ADD COLUMN `device_model` varchar(255) NULL COMMENT '设备型号' AFTER `device_brand`,
+            ADD COLUMN `address` varchar(255) NULL COMMENT '安装位置' AFTER `device_model`,
+            ADD COLUMN `purchasing_time` date NULL COMMENT '采购时间' AFTER `address`,
+            ADD COLUMN `use_time` datetime NULL COMMENT '开始使用时间' AFTER `maintenance_term`,
+            ADD COLUMN `remove _time` datetime NULL COMMENT '移除时间' AFTER `use_time`,
+            ADD COLUMN `scrap_time` datetime NULL COMMENT '报废时间' AFTER `remove _time`,
+            ADD COLUMN `business_device_id` bigint NULL COMMENT '业务设备id' AFTER `definition`;
+    END IF;
+	IF NOT EXISTS(SELECT *
+					  FROM information_schema.columns
+					  WHERE table_schema = DATABASE()
+						AND table_name = 'iot_daily_check_data'
+						AND column_name = 'score') THEN
+		ALTER TABLE `iot_daily_check_data` 
+			ADD COLUMN `score` float NULL COMMENT '分数' AFTER `data`;				
+	end if;
+END ??
+DELIMITER ;
+CALL schema_change();
+
+delete from sys_dict_type where dict_type='asset_status';
+delete from sys_dict_data where dict_type='asset_status';
+INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark) VALUES ('资产状态', 'asset_status', '0', '超级管理员', '2024-09-27 15:57:25', '', 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 (0, '待安装', '0', 'asset_status', null, 'default', 'N', '0', '超级管理员', '2024-09-27 15:58:39', '', 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 (1, '使用中', '1', 'asset_status', null, 'default', 'N', '0', '超级管理员', '2024-09-27 15:59:01', '', 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, '移除', '2', 'asset_status', null, 'default', 'N', '0', '超级管理员', '2024-09-27 15:59:11', '', 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, '报废', '3', 'asset_status', null, 'default', 'N', '0', '超级管理员', '2024-09-27 15:59:22', '', null, null);

+ 36 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysDevice.java

@@ -42,6 +42,42 @@ public class SysDevice extends BaseEntity {
     @ApiModelProperty(value = "设备名称")
     private String deviceName;
 
+    @ApiModelProperty(value = "资产编号")
+    @TableField("asset_no")
+    private String assetNo;
+
+    @ApiModelProperty(value = "设备状态")
+    @TableField("device_status")
+    private Integer deviceStatus;
+
+    @ApiModelProperty(value = "设备型号")
+    @TableField("device_model")
+    private String deviceModel;
+
+    @ApiModelProperty(value = "安装位置")
+    @TableField("address")
+    private String address;
+
+    @ApiModelProperty(value = "采购时间")
+    @TableField("purchasing_time")
+    private Date purchasingTime;
+
+    @ApiModelProperty(value = "开始使用时间")
+    @TableField("use_time")
+    private Date useTime;
+
+    @ApiModelProperty(value = "移除时间")
+    @TableField("remove_time")
+    private Date removeTime;
+
+    @ApiModelProperty(value = "报废时间")
+    @TableField("scrap_time")
+    private Date scrapTime;
+
+    @ApiModelProperty(value = "业务设备id")
+    @TableField("business_device_id")
+    private Long businessDeviceId;
+
     @ApiModelProperty(value = "资产类别")
     private String assetType;
 

+ 83 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/device/domain/SysMultiLayerDictionary.java

@@ -0,0 +1,83 @@
+package com.xunmei.common.core.domain.device.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sys_multi_layer_dictionary")
+@ApiModel(value="SysMultiLayerDictionary对象", description="")
+public class SysMultiLayerDictionary implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "编号")
+    @TableField("code")
+    private String code;
+
+    @ApiModelProperty(value = "名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty(value = "上级")
+    @TableField("parent_id")
+    private Long parentId;
+
+    @ApiModelProperty(value = "分类")
+    @TableField("type")
+    private String type;
+
+    @ApiModelProperty(value = "分类名称")
+    @TableField("type_name")
+    private String typeName;
+
+    @ApiModelProperty(value = "层级")
+    @TableField("level")
+    private Integer level;
+
+    @ApiModelProperty(value = "排序")
+    @TableField("sort")
+    private Integer sort;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "修改人名称")
+    @TableField("modified_name")
+    private String modifiedName;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "最后修改人id")
+    @TableField("modified_id")
+    private Long modifiedId;
+
+    @ApiModelProperty(value = "删除")
+    @TableField("deleted")
+    private Integer deleted;
+
+
+}

+ 39 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/device/vo/DictionaryTreeVo.java

@@ -0,0 +1,39 @@
+package com.xunmei.common.core.domain.device.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2024/9/26 16:02
+ */
+@Data
+public class DictionaryTreeVo {
+    private Long id;
+
+    @ApiModelProperty(value = "编号")
+    private String code;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "上级")
+    private Long parentId;
+
+    @ApiModelProperty(value = "分类")
+    private String type;
+
+    @ApiModelProperty(value = "分类名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "层级")
+    private Integer level;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    private List<DictionaryTreeVo> children;
+
+}

+ 5 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotDailyCheckData.java

@@ -63,6 +63,11 @@ public class IotDailyCheckData implements Serializable {
     @TableField("data")
     private String data;
 
+
+    @ApiModelProperty(value = "分数")
+    @TableField("score")
+    private Float score;
+
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
     private LocalDateTime createTime;

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

@@ -52,6 +52,9 @@ public enum BaseDeviceTypeEnum {
     AlarmHostInput_IMDualIdentification("IMDualIdentification","红外微波双鉴传感器"),
     AlarmHostInput_Microwave("Microwave","微波传感器"),
     AlarmHostInput_EmergencyButton("EmergencyButton","紧急按钮传感器"),
+
+    Talk("23","对讲主机"),
+    door("24","门禁主机"),
     ;
     private String code;
     private String desc;

+ 1 - 1
soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java

@@ -30,7 +30,7 @@ public class CodeGenerators {
     }*/
 
     public static final String moduleName="com.xunmei.host";
-    public static final String tableNames="iot_server_product";
+    public static final String tableNames="sys_multi_layer_dictionary";
 
     public static void main(String[] args) {
         // 代码生成器

+ 11 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/mapper/SysDeviceMapper.java

@@ -0,0 +1,11 @@
+package com.xunmei.host.iot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.system.api.domain.SysDevice;
+
+/**
+ * @author jingyuanchao
+ * @date 2024/9/26 11:20
+ */
+public interface SysDeviceMapper extends BaseMapper<SysDevice> {
+}

+ 17 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/SysDeviceService.java

@@ -0,0 +1,17 @@
+package com.xunmei.host.iot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.system.api.domain.SysDevice;
+import com.xunmei.system.api.domain.iot.IotDeviceInfo;
+
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2024/9/26 11:19
+ */
+public interface SysDeviceService extends IService<SysDevice> {
+
+
+    void addDevice(List<IotDeviceInfo> deviceInfoList);
+}

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

@@ -22,6 +22,7 @@ import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.host.iot.mapper.IotDeviceInfoMapper;
 import com.xunmei.host.iot.service.IIotDeviceInfoExtendService;
 import com.xunmei.host.iot.service.IIotDeviceInfoService;
+import com.xunmei.host.iot.service.SysDeviceService;
 import com.xunmei.host.protection.service.IotAlarmDefenceAreaService;
 import com.xunmei.host.protection.service.IotAlarmSubsystemService;
 import com.xunmei.host.server.service.IotServerInfoService;
@@ -70,6 +71,9 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     @Autowired
     private IotAlarmSubsystemService iotAlarmSubsystemService;
 
+    @Autowired
+    private SysDeviceService sysDeviceService;
+
     /**
      * 根据设备类型和设备编码,获取设备信息
      *
@@ -329,8 +333,13 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
             case WebSocketConstants.DEVICES_EVENT:
             case WebSocketConstants.GET_DEVICES_SERVICES:
                 List<DvsBaseInfo> dataList = dataArray.toJavaList(DvsBaseInfo.class);
-                handleDvsAndFSUDeviceInfo(dataList, serverInfo);
-                handleAlarmHostDeviceInfo(dataList, serverInfo);
+
+                List<IotDeviceInfo> syncToAssetDeviceList = new ArrayList<>();
+                handleDvsAndFSUDeviceInfo(dataList, serverInfo, syncToAssetDeviceList);
+                handleAlarmHostDeviceInfo(dataList, serverInfo, syncToAssetDeviceList);
+
+                handelAssetDeviceInfo(syncToAssetDeviceList);
+
                 return WebsocketResult.replySuccess(req.getTopic(), req.getId(), req.getProductName(), req.getDeviceName());
             case WebSocketConstants.DEVICES_STATUS_EVENT:
                 List<DeviceStatusInfo> statusInfos = dataArray.toJavaList(DeviceStatusInfo.class);
@@ -342,8 +351,17 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         return null;
     }
 
+    private void handelAssetDeviceInfo(List<IotDeviceInfo> syncToAssetDeviceList) {
+        if (syncToAssetDeviceList.isEmpty()) {
+            return;
+        }
+        sysDeviceService.addDevice(syncToAssetDeviceList);
+
+
+    }
+
     @Transactional(rollbackFor = Exception.class)
-    public void handleAlarmHostDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo) {
+    public void handleAlarmHostDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo, List<IotDeviceInfo> syncToAssetDeviceList) {
         List<DvsBaseInfo> alarmHostList = dataList.stream().filter(r -> ObjectUtil.equal(r.getType(), BaseDeviceTypeEnum.AlarmHost.name())).collect(Collectors.toList());
         if (ObjectUtil.isEmpty(alarmHostList)) {
             return;
@@ -384,7 +402,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
                 updateHostInfo(dvsBaseInfo, hostInfo, BaseDeviceTypeEnum.AlarmHost.getCode());
                 updateHostList.add(hostInfo);
             }
-
+            syncToAssetDeviceList.add(hostInfo);
             //处理报警主机扩展信息
             IotDeviceInfoExtend extend = iIotDeviceInfoExtendService.selectByProductDeviceNameAndToken(serverInfo.getIotCode(), BaseDeviceTypeEnum.AlarmHost.getCode(), dvsBaseInfo.getDeviceCode());
             if (extend == null) {
@@ -422,6 +440,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
                         dealDefenceArea(defenceAreaInfo, defenceArea, serverInfo);
                         updateDefenceAreaList.add(defenceArea);
                     }
+                    // syncToAssetDeviceList.add(defenceArea);
                 }
 
             }
@@ -457,7 +476,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     }
 
     @Transactional
-    public void handleDvsAndFSUDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo) {
+    public void handleDvsAndFSUDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo, List<IotDeviceInfo> syncToAssetDeviceList) {
 
         //逻辑删除所有设备
         deleteDeviceByToken(serverInfo.getIotCode());
@@ -495,6 +514,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
                 updateHostInfo(dvsBaseInfo, hostInfo, code);
                 updateHostList.add(hostInfo);
             }
+            syncToAssetDeviceList.add(hostInfo);
             if (BaseDeviceTypeEnum.Dvs.name().equals(dvsBaseInfo.getType())) {
                 //处理主机扩展信息
                 IotDeviceInfoExtend extend = iIotDeviceInfoExtendService.selectByProductDeviceNameAndToken(serverInfo.getIotCode(), BaseDeviceTypeEnum.Dvs.getCode(), dvsBaseInfo.getDeviceCode());
@@ -513,16 +533,21 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
             }
             //处理通道或者动环传感器信息
             for (SubDeviceInfo subDeviceInfo : subDeviceList) {
-                String productName = ProductEnums.FSU_GATEWAY.getProductName().contains(dvsBaseInfo.getProductName()) ? subDeviceInfo.getType() : dvsBaseInfo.getProductName();
+                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());
 
                 if (ObjectUtil.isNull(channelInfo)) {
-                    IotDeviceInfo channel = createChannelInfo(subDeviceInfo, serverInfo, hostInfo);
-                    addChnnelList.add(channel);
+                    channelInfo = createChannelInfo(subDeviceInfo, serverInfo, hostInfo);
+                    addChnnelList.add(channelInfo);
                 } else {
                     updateChannelInfo(subDeviceInfo, channelInfo, hostInfo);
                     updateChnnelList.add(channelInfo);
                 }
+                if (isFusDevice) {
+                    syncToAssetDeviceList.add(channelInfo);
+                }
+
             }
         }
 
@@ -766,7 +791,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
 
         final IotServerInfo serverInfo = iotServerInfoService.selectByOrgId(eto.getOrgId());
         final String iotCode = serverInfo.getIotCode();
-        final String topic = TopicTypeEnums.formatUrl(TopicTypeEnums.PRODUCT_SERVICE_INVOKE.getUrl(),WebSocketConstants.DETECTION_HOST, WebSocketConstants.DETECTION_HOST_DEVICE);
+        final String topic = TopicTypeEnums.formatUrl(TopicTypeEnums.PRODUCT_SERVICE_INVOKE.getUrl(), WebSocketConstants.DETECTION_HOST, WebSocketConstants.DETECTION_HOST_DEVICE);
         final JSONObject object = new JSONObject();
         object.put("dataType", eto.getDataType());
         final WebsocketResult result = IotServerUtils.invokeHostServer(topic, new JSONObject(), WebSocketConstants.DO_WORK, object);

+ 64 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/SysDeviceServiceImpl.java

@@ -0,0 +1,64 @@
+package com.xunmei.host.iot.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
+import com.xunmei.host.iot.mapper.SysDeviceMapper;
+import com.xunmei.host.iot.service.SysDeviceService;
+import com.xunmei.system.api.domain.SysDevice;
+import com.xunmei.system.api.domain.iot.IotDeviceInfo;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2024/9/26 11:19
+ */
+@Service
+public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice> implements SysDeviceService {
+
+    @Override
+    public void addDevice(List<IotDeviceInfo> deviceInfoList) {
+        for (IotDeviceInfo deviceInfo : deviceInfoList) {
+            final SysDevice sysDevice = getByBusinessDeviceId(deviceInfo.getId());
+            if (sysDevice == null) {
+                final SysDevice device = build(deviceInfo);
+                save(device);
+            } else {
+                sysDevice.setDeviceName(deviceInfo.getDeviceName());
+                sysDevice.setUpdateTime(new Date());
+                updateById(sysDevice);
+            }
+        }
+    }
+
+    public SysDevice getByBusinessDeviceId(Long businessDeviceId) {
+        LambdaQueryWrapper<SysDevice> lambdaQuery = new LambdaQueryWrapper<>();
+        lambdaQuery.eq(SysDevice::getBusinessDeviceId, businessDeviceId);
+        //设备状态 != 报废
+        lambdaQuery.ne(SysDevice::getDeviceStatus, 3);
+        lambdaQuery.eq(SysDevice::getDelFlag, 0);
+        lambdaQuery.last(Constants.LIMIT1);
+        return baseMapper.selectOne(lambdaQuery);
+    }
+
+    private SysDevice build(IotDeviceInfo deviceInfo) {
+        final Date now = new Date();
+        SysDevice sysDevice = new SysDevice();
+        sysDevice.setDeviceName(deviceInfo.getDeviceName());
+        sysDevice.setUseTime(now);
+        sysDevice.setDeviceStatus(0);
+        sysDevice.setDelFlag("0");
+        sysDevice.setOrgId(deviceInfo.getOrgId());
+        sysDevice.setOrgName(deviceInfo.getOrgName());
+        sysDevice.setOrgPath(deviceInfo.getOrgPath());
+        sysDevice.setCreateTime(now);
+        sysDevice.setUpdateTime(now);
+        sysDevice.setBusinessDeviceId(deviceInfo.getId());
+        return sysDevice;
+
+
+    }
+}

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

@@ -10,7 +10,6 @@ import com.xunmei.common.core.domain.iot.domain.*;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmData;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmSystemField;
 import com.xunmei.common.core.enums.iot.DeviceTypeEnum;
-import com.xunmei.common.core.enums.iot.SensorType;
 import com.xunmei.common.core.util.BeanHelper;
 import com.xunmei.common.core.utils.IDHelper;
 import com.xunmei.common.core.utils.JacksonUtils;
@@ -18,7 +17,6 @@ import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.host.alarm.mapper.IotAlarmDataMapper;
 import com.xunmei.host.alarm.mapper.IotAlarmSystemFieldMapper;
 import com.xunmei.host.enums.AlarmDataTypeEnum;
-import com.xunmei.host.enums.IotInputSensorTypeEnum;
 import com.xunmei.host.enums.IotInputStatusEnum;
 import com.xunmei.host.iot.mapper.IotDeviceStatusLogMapper;
 import com.xunmei.host.iot.mapper.IotDeviceStatusMapper;
@@ -458,6 +456,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
         IotDeviceStatusLog log = new IotDeviceStatusLog();
         BeanUtils.copyProperties(status,log);
         log.setDeviceStatusId(status.getId());
+        log.setCreateTime(now);
         log.setId(null);
         iotDeviceStatusLogMapper.insert(log);
 

+ 1 - 1
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/handler/SocWebSocketHandler.java

@@ -194,7 +194,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
                     if (routeService == null) {
                         return;
                     }
-                    result = (WebsocketResult) routeService.execute(executeReq);
+                        result = (WebsocketResult) routeService.execute(executeReq);
                     break;
                 default:
                     break;

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

@@ -171,7 +171,7 @@
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
         </encoder>
     </appender>
-    <!-- 主机上报一键上下班操作数据  -->
+    <!-- 视频质量  -->
     <appender name="videoDiagnosisLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <maxFileSize>${max.file.size}</maxFileSize>

+ 4 - 0
soc-modules/soc-modules-host/src/main/resources/mapper/SysDeviceMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.xunmei.host.iot.mapper.SysDeviceMapper">
+</mapper>

+ 13 - 14
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeviceController.java

@@ -1,44 +1,43 @@
 package com.xunmei.system.controller;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
-
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.R;
 import com.xunmei.common.core.vo.IdNameVo;
+import com.xunmei.common.core.web.controller.BaseController;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.log.annotation.Log;
+import com.xunmei.common.log.enums.BusinessType;
 import com.xunmei.common.security.annotation.InnerAuth;
+import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.system.api.RemoteProtectionService;
 import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.domain.SysDictData;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.dto.ProtectionDTO;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
+import com.xunmei.system.service.ISysDeviceService;
 import com.xunmei.system.service.ISysDictDataService;
 import com.xunmei.system.service.ISysDictTypeService;
 import com.xunmei.system.service.ISysOrgService;
 import com.xunmei.system.util.DeviceExport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
-import com.xunmei.common.log.annotation.Log;
-import com.xunmei.common.log.enums.BusinessType;
-import com.xunmei.common.security.annotation.RequiresPermissions;
-import com.xunmei.system.service.ISysDeviceService;
-import com.xunmei.common.core.web.controller.BaseController;
-import com.xunmei.common.core.web.domain.AjaxResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import com.xunmei.common.core.web.page.TableDataInfo;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 【请填写功能名称】Controller

+ 42 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysMultiLayerDictionaryController.java

@@ -0,0 +1,42 @@
+package com.xunmei.system.controller;
+
+
+import com.xunmei.common.core.domain.device.vo.DictionaryTreeVo;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.system.service.ISysMultiLayerDictionaryService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-26
+ */
+@RestController
+@RequestMapping("/dictionary")
+public class SysMultiLayerDictionaryController {
+
+    @Resource
+    private ISysMultiLayerDictionaryService sysMultiLayerDictionaryService;
+
+    @GetMapping("/list")
+    private AjaxResult getDictionaryList(){
+        final List<DictionaryTreeVo> list = sysMultiLayerDictionaryService.getDictionaryTree();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/getDictTreeByParentId")
+    private AjaxResult getDictTreeByParentId(Long parentId){
+        final List<DictionaryTreeVo> list = sysMultiLayerDictionaryService.getDictTreeByParentId(parentId);
+        return AjaxResult.success(list);
+    }
+}
+

+ 16 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysMultiLayerDictionaryMapper.java

@@ -0,0 +1,16 @@
+package com.xunmei.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.device.domain.SysMultiLayerDictionary;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-26
+ */
+public interface SysMultiLayerDictionaryMapper extends BaseMapper<SysMultiLayerDictionary> {
+
+}

+ 23 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysMultiLayerDictionaryService.java

@@ -0,0 +1,23 @@
+package com.xunmei.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.device.domain.SysMultiLayerDictionary;
+import com.xunmei.common.core.domain.device.vo.DictionaryTreeVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-26
+ */
+public interface ISysMultiLayerDictionaryService extends IService<SysMultiLayerDictionary> {
+
+
+    List<DictionaryTreeVo> getDictionaryTree();
+
+    List<DictionaryTreeVo> getDictTreeByParentId(Long parentId);
+}

+ 2 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java

@@ -260,7 +260,9 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
     @Override
     public int insertSysDevice(SysDevice sysDevice) {
         sysDevice.setCreateTime(DateUtils.getNowDate());
+        sysDevice.setUpdateTime(DateUtils.getNowDate());
         sysDevice.setCreateBy(SecurityUtils.getUsername());
+        sysDevice.setUpdateBy(SecurityUtils.getUsername());
         SysOrg sysOrg = orgService.selectSysOrgById(sysDevice.getOrgId());
         sysDevice.setOrgName(sysOrg.getShortName());
         SysDevice sysDevice1 = this.checkName(sysDevice.getOrgId(), sysDevice.getDeviceName());

+ 57 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysMultiLayerDictionaryServiceImpl.java

@@ -0,0 +1,57 @@
+package com.xunmei.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.device.domain.SysMultiLayerDictionary;
+import com.xunmei.common.core.domain.device.vo.DictionaryTreeVo;
+import com.xunmei.common.core.util.BeanHelper;
+import com.xunmei.system.mapper.SysMultiLayerDictionaryMapper;
+import com.xunmei.system.service.ISysMultiLayerDictionaryService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-26
+ */
+@Service
+public class SysMultiLayerDictionaryServiceImpl extends ServiceImpl<SysMultiLayerDictionaryMapper, SysMultiLayerDictionary> implements ISysMultiLayerDictionaryService {
+
+
+    @Override
+    public List<DictionaryTreeVo> getDictionaryTree() {
+        LambdaQueryWrapper<SysMultiLayerDictionary> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysMultiLayerDictionary::getDeleted, 0);
+        final List<SysMultiLayerDictionary> dictionaryList = baseMapper.selectList(wrapper);
+        final List<DictionaryTreeVo> treeVoList = BeanHelper.copyProperties(dictionaryList, DictionaryTreeVo.class);
+        return buildTree(treeVoList, -1L);
+    }
+
+    @Override
+    public List<DictionaryTreeVo> getDictTreeByParentId(Long parentId) {
+        LambdaQueryWrapper<SysMultiLayerDictionary> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysMultiLayerDictionary::getDeleted, 0);
+        wrapper.eq(SysMultiLayerDictionary::getParentId, parentId);
+        final List<SysMultiLayerDictionary> dictionaryList = baseMapper.selectList(wrapper);
+        return BeanHelper.copyProperties(dictionaryList, DictionaryTreeVo.class);
+    }
+
+    //递归构建
+    private List<DictionaryTreeVo> buildTree(List<DictionaryTreeVo> treeVoList, Long parentId) {
+        List<DictionaryTreeVo> tree = new ArrayList<>();
+        for (DictionaryTreeVo node : treeVoList) {
+            if (node.getParentId().equals(parentId)) {
+                node.setChildren(buildTree(treeVoList, node.getId()));
+                tree.add(node);
+            }
+        }
+        return tree;
+
+    }
+}