Pārlūkot izejas kodu

1.新增上班数据上报入库;
2.修改websocket路由时将主机链接信息携带至具体service中

jingyuanchao 1 gadu atpakaļ
vecāks
revīzija
d04a325af9
22 mainītis faili ar 521 papildinājumiem un 34 dzēšanām
  1. 76 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/work/domain/IotDayWork.java
  2. 91 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/work/domain/IotDayWorkOperation.java
  3. 2 2
      soc-modules/soc-modules-gen/pom.xml
  4. 120 0
      soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java
  5. 3 2
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/dayilcheck/service/impl/IotDailyCheckDataServiceImpl.java
  6. 2 3
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceInfoServiceImpl.java
  7. 10 9
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceStatusServiceImpl.java
  8. 5 5
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/protection/service/impl/IotAlarmHostServiceImpl.java
  9. 1 3
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/IotDvrHardDiskDetectionServiceImpl.java
  10. 2 2
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/VideoDiagnosisRecordServiceImpl.java
  11. 5 6
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/VideoIntegrityCheckServiceImpl.java
  12. 10 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/constant/WebSocketConstants.java
  13. 2 1
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/dto/WebsocketExecuteReq.java
  14. 1 1
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/handler/SocWebSocketHandler.java
  15. 16 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/mapper/IotDayWorkMapper.java
  16. 16 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/mapper/IotDayWorkOperationMapper.java
  17. 16 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/IotDayWorkOperationService.java
  18. 18 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/IotDayWorkService.java
  19. 48 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/impl/IotDayWorkOperationServiceImpl.java
  20. 67 0
      soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/impl/IotDayWorkServiceImpl.java
  21. 5 0
      soc-modules/soc-modules-host/src/main/resources/mapper/IotDayWorkMapper.xml
  22. 5 0
      soc-modules/soc-modules-host/src/main/resources/mapper/IotDayWorkOperationMapper.xml

+ 76 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/work/domain/IotDayWork.java

@@ -0,0 +1,76 @@
+package com.xunmei.common.core.domain.work.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-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_day_work")
+@ApiModel(value="IotDayWork对象", description="一键上下班")
+public class IotDayWork implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "主机上报数据主键id,上下班id,可以为空,单个操作时可以为空")
+    @TableField("host_data_id")
+    private Long hostDataId;
+
+    @ApiModelProperty(value = "主机token")
+    @TableField("iot_code")
+    private String iotCode;
+
+    @ApiModelProperty(value = "机构id")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构path层级")
+    @TableField("org_path")
+    private String orgPath;
+
+    @ApiModelProperty(value = "数据状态:0、进行中;1、正常,2、异常")
+    @TableField("data_status")
+    private Integer dataStatus;
+
+    @ApiModelProperty(value = "数据类型:1:一键上班,2:一键下班")
+    @TableField("data_type")
+    private Integer dataType;
+
+    @ApiModelProperty(value = "数据创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "数据最后一次更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "数据生成 格式化字符串天:yyyy-MM-dd")
+    @TableField("work_date")
+    private String workDate;
+
+
+}

+ 91 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/work/domain/IotDayWorkOperation.java

@@ -0,0 +1,91 @@
+package com.xunmei.common.core.domain.work.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-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_day_work_operation")
+@ApiModel(value="IotDayWorkOperation对象", description="上下班操作控制表")
+public class IotDayWorkOperation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "机构id")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "主机token")
+    @TableField("iot_code")
+    private String iotCode;
+
+    @ApiModelProperty(value = "主机上报数据主键id,上下班id,可以为空,单个操作时可以为空")
+    @TableField("host_data_id")
+    private Long hostDataId;
+
+    @ApiModelProperty(value = "操作类型:0.布撤防,1控电")
+    @TableField("operation_type")
+    private Integer operationType;
+
+    @ApiModelProperty(value = "目标值:0 断电/撤防 1通电/布防")
+    @TableField("target_value")
+    private Integer targetValue;
+
+    @ApiModelProperty(value = "操作时间")
+    @TableField("operation_time")
+    private LocalDateTime operationTime;
+
+    @ApiModelProperty(value = "数据强制结束时间")
+    @TableField("force_end_time")
+    private LocalDateTime forceEndTime;
+
+    @ApiModelProperty(value = "实际结束时间")
+    @TableField("real_end_time")
+    private LocalDateTime realEndTime;
+
+    @ApiModelProperty(value = "数据状态:0 进行中,1已完成,2强制结束")
+    @TableField("operation_status")
+    private Integer operationStatus;
+
+    @ApiModelProperty(value = "设备id、code")
+    @TableField("device_id")
+    private String deviceId;
+
+    @ApiModelProperty(value = "iot 产品名称")
+    @TableField("product_name")
+    private String productName;
+
+    @ApiModelProperty(value = "iot 设备名称")
+    @TableField("device_name")
+    private String deviceName;
+
+    @ApiModelProperty(value = "操作对象名称")
+    @TableField("operation_name")
+    private String operationName;
+
+
+}

+ 2 - 2
soc-modules/soc-modules-gen/pom.xml

@@ -73,11 +73,11 @@
             <artifactId>soc-common-swagger</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
-     <!--   <dependency>
+        <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-generator</artifactId>
             <version>${generator.version}</version>
-        </dependency>-->
+        </dependency>
     </dependencies>
 
     <build>

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

@@ -0,0 +1,120 @@
+package com.xunmei.gen.util;
+
+
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CodeGenerators {
+
+    /**
+     * 读取控制填的内容
+     * @param tip
+     * @return
+     */
+  /*  public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        System.out.println("请输入" + tip + ":");
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+            if (ObjectUtils.isNotEmpty(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("请输入正确的" + tip + "!");
+    }*/
+
+    public static final String moduleName="com.xunmei.host.api";
+    public static final String tableNames="iot_day_work_operation,iot_day_work";
+
+    public static void main(String[] args) {
+        // 代码生成器
+        AutoGenerator mpg = new AutoGenerator();
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        // System.getProperty("user.dir");
+        String projectPath = "D:\\";
+        //生成文件输出目录
+        gc.setOutputDir(projectPath + "/java");
+        gc.setAuthor("jingYuanChao");
+        //生成代码后,是否打开文件夹
+        gc.setOpen(true);
+        // 实体属性 Swagger2 注解
+        gc.setSwagger2(true);
+        mpg.setGlobalConfig(gc);
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+       /* dsc.setUrl("jdbc:mysql://39.103.229.41:3306/isp_ah?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&characterSetResults=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("jinJie@2021");*/
+        dsc.setUrl("jdbc:mysql://10.87.23.57:3306/soc?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&characterSetResults=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("XM_zm2019");
+        mpg.setDataSource(dsc);
+
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName(moduleName);
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setController("controller");
+        mpg.setPackageInfo(pc);
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        // 如果模板引擎是 freemarker
+        //String templatePath = "/templates/mapper.xml.ftl";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+//        focList.add(new FileOutConfig(templatePath) {
+//            @Override
+//            pub String outputFile(TableInfo tableInfo) {
+//                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+//                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+//                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+//            }
+//        });
+        cfg.setFileOutConfigList(focList);
+        //这个必须要,需要提供一个默认的
+        mpg.setCfg(cfg);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        // 表名生成策略
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        // 实体字段生成策略
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        // 需要生成的表
+        strategy.setInclude(tableNames.split(","));
+        // 使用lombook
+        strategy.setEntityLombokModel(true);
+        strategy.setRestControllerStyle(true);
+        // 生成注解
+        strategy.setEntityTableFieldAnnotationEnable(true);
+        // 自动生成实体类继承基类(基类必须已存在)
+        strategy.setTablePrefix("t_","t_app_");
+        //strategy.setSuperEntityClass("com.isp.common.jpa.BaseEntity");
+        // 写于父类中的公共字段
+        //strategy.setSuperEntityColumns("create_time","update_time", "modified_id", "modified_name");
+        mpg.setStrategy(strategy);
+        //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+        mpg.execute();
+    }
+
+
+
+}

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

@@ -59,12 +59,13 @@ public class IotDailyCheckDataServiceImpl extends ServiceImpl<IotDailyCheckDataM
     @Transactional(rollbackFor = Exception.class)
     public Object execute(WebsocketExecuteReq req) {
         Object data = req.getData();
+        final String iotCode = req.getServerInfo().getIotCode();
         JSONObject obj = JSON.parseObject(data.toString());
         String type = obj.getString("id");
         String excelData = obj.getString("excelData");
-        IotServerInfo serverInfo = iotServerInfoService.selectByToken(req.getToken());
+        IotServerInfo serverInfo = iotServerInfoService.selectByToken(iotCode);
         if (ObjectUtil.isEmpty(serverInfo)) {
-            LogUtils.SOCKET_DAILY_HEALTH.error("未查询到token为 {} 的服务器信息", req.getToken());
+            LogUtils.SOCKET_DAILY_HEALTH.error("未查询到token为 {} 的服务器信息", iotCode);
             return null;
         }
         dealData(type, excelData, serverInfo);

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

@@ -310,10 +310,9 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         if (ObjectUtil.isEmpty(dataArray)) {
             return WebsocketResult.replySuccess(req.getTopic(), req.getId(), req.getProductName(), req.getDeviceName());
         }
-        String token = req.getToken();
-        IotServerInfo serverInfo = iotServerInfoService.selectByToken(token);
+        IotServerInfo serverInfo = req.getServerInfo();
         if (ObjectUtil.isEmpty(serverInfo)) {
-            LogUtils.WEBSOCKET_MSG.error("未查询到token为 {} 的服务器信息", token);
+            LogUtils.WEBSOCKET_MSG.error("未查询到token为 {} 的服务器信息", serverInfo.getIotCode());
             return null;
         }
         String event = req.getEvent();

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

@@ -113,7 +113,7 @@ public class IotDeviceStatusServiceImpl extends ServiceImpl<IotDeviceStatusMappe
     public void deviceStatusChangeDeal(WebsocketExecuteReq req) {
         final String productName = req.getProductName();
         final String deviceName = req.getDeviceName();
-        final String token = req.getToken();
+        final String token = req.getServerInfo().getIotCode();
         if (ObjectUtil.hasEmpty(productName, deviceName, token)) {
             LogUtils.WEBSOCKET_MSG.error("收到设备状态变更消息,存在参数为空,productName:{},deviceName:{},token:{}", productName, deviceName, token);
         }
@@ -166,9 +166,10 @@ public class IotDeviceStatusServiceImpl extends ServiceImpl<IotDeviceStatusMappe
     }
 
     private Object dealDeviceAlarm(WebsocketExecuteReq req) {
-        final SysOrg sysOrg = serverInfoService.selectOrgByToken(req.getToken());
+        final String iotCode = req.getServerInfo().getIotCode();
+        final SysOrg sysOrg = serverInfoService.selectOrgByToken(iotCode);
         if (ObjectUtil.isNull(sysOrg)) {
-            LogUtils.SOCKET_DEVICE_ALARM_DATA.error("收到设备报警消息,根据token:{}未查询到机构信息", req.getToken());
+            LogUtils.SOCKET_DEVICE_ALARM_DATA.error("收到设备报警消息,根据token:{}未查询到机构信息", iotCode);
             return null;
         }
         List<IotAlarmSystemField> fieldList = alarmSystemFieldMapper.selectList(new LambdaQueryWrapper<>());
@@ -176,9 +177,9 @@ public class IotDeviceStatusServiceImpl extends ServiceImpl<IotDeviceStatusMappe
         final JSONArray data = (JSONArray) req.getData();
         final List<AlarmDataReq> dataReqList = data.toJavaList(AlarmDataReq.class);
         for (AlarmDataReq dataReq : dataReqList) {
-            IotDeviceInfo deviceInfo = iotDeviceInfoService.selectByTokenProductAndDeviceCode(req.getToken(), req.getProductName(), dataReq.getDeviceCode());
+            IotDeviceInfo deviceInfo = iotDeviceInfoService.selectByTokenProductAndDeviceCode(iotCode, req.getProductName(), dataReq.getDeviceCode());
             if (ObjectUtil.isNull(deviceInfo)) {
-                LogUtils.SOCKET_DEVICE_ALARM_DATA.error("收到设备报警消息,根据token:{},productName:{},deviceName:{}未查询到设备信息", req.getToken(), req.getProductName(), req.getDeviceName());
+                LogUtils.SOCKET_DEVICE_ALARM_DATA.error("收到设备报警消息,根据token:{},productName:{},deviceName:{}未查询到设备信息", iotCode, req.getProductName(), req.getDeviceName());
                 continue;
             }
             final IotAlarmData iotAlarmData = BeanHelper.copyProperties(dataReq, IotAlarmData.class);
@@ -220,20 +221,20 @@ public class IotDeviceStatusServiceImpl extends ServiceImpl<IotDeviceStatusMappe
     }
 
     private WebsocketResult dealDeviceStatus(WebsocketExecuteReq req) {
-
+        final String iotCode = req.getServerInfo().getIotCode();
         final JSONObject reqDataObj = (JSONObject) req.getData();
         final Object reqStatus = reqDataObj.get(WebSocketConstants.STATUS);
         if (ObjectUtil.isNull(reqStatus)) {
-            LogUtils.SOCKET_DEVICE_STATUS_INFO.error("设备状态同步时,参数异常,status为空,token:{}", req.getToken());
+            LogUtils.SOCKET_DEVICE_STATUS_INFO.error("设备状态同步时,参数异常,status为空,token:{}", iotCode);
             return new WebsocketResult();
         }
         final JSONArray data = (JSONArray) reqStatus;
         final String productName = req.getProductName();
         final BaseDeviceTypeEnum deviceTypeEnum = BaseDeviceTypeEnum.valueOf(productName);
 
-        final IotDeviceInfo code = iotDeviceInfoService.selectByTypeAndCode(req.getToken(), deviceTypeEnum.getCode(), req.getProductName(), req.getDeviceName());
+        final IotDeviceInfo code = iotDeviceInfoService.selectByTypeAndCode(iotCode, deviceTypeEnum.getCode(), req.getProductName(), req.getDeviceName());
         if (code == null) {
-            LogUtils.SOCKET_DEVICE_STATUS_INFO.error("设备状态同步时,未能找到对应设备,token:{},productName:{},deviceNane:{}", req.getToken(), req.getProductName(), req.getDeviceName());
+            LogUtils.SOCKET_DEVICE_STATUS_INFO.error("设备状态同步时,未能找到对应设备,token:{},productName:{},deviceNane:{}", iotCode, req.getProductName(), req.getDeviceName());
             return new WebsocketResult();
         }
         String deviceType = SensorType.getCodeByProduct(productName);

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

@@ -57,7 +57,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
     @Transactional(rollbackFor = Exception.class)
     public void changeSubSystemStatus(WebsocketExecuteReq req) {
         try {
-            LogUtils.STATUS_INFO_DEFENCEAREA.info("【报警主机布撤防状态变更事件】【token:{}】【msgId:{}】【接收参数:{}】", req.getToken(), req.getId(), JSON.toJSONString(req));
+            LogUtils.STATUS_INFO_DEFENCEAREA.info("【报警主机布撤防状态变更事件】【token:{}】【msgId:{}】【接收参数:{}】", req.getServerInfo().getIotCode(), req.getId(), JSON.toJSONString(req));
             if (req.getData() != null) {
                 JSONObject object = (JSONObject) req.getData();
                 Integer subSystemId = object.getInteger("id");
@@ -67,7 +67,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
                 wrapper.lambda()
                         .eq(IotAlarmSubsystem::getAlarmHostCode, req.getDeviceName())
                         .eq(IotAlarmSubsystem::getCode, String.valueOf(subSystemId))
-                        .eq(IotAlarmSubsystem::getIotToken, req.getToken())
+                        .eq(IotAlarmSubsystem::getIotToken, req.getServerInfo().getIotCode())
                         .eq(IotAlarmSubsystem::getDeleted, 0);
                 IotAlarmSubsystem subsystem = subsystemService.getOne(wrapper);
 
@@ -101,7 +101,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
     @Transactional(rollbackFor = Exception.class)
     public void changeAlarmHostSensorStatus(WebsocketExecuteReq req) {
         try {
-            LogUtils.STATUS_INFO_STATUS_SENSOR.info("【报警主机传感器状态事件】【token:{}】【msgId:{}】【接收参数:{}】", req.getToken(), req.getId(), JSON.toJSONString(req));
+            LogUtils.STATUS_INFO_STATUS_SENSOR.info("【报警主机传感器状态事件】【token:{}】【msgId:{}】【接收参数:{}】", req.getServerInfo().getIotCode(), req.getId(), JSON.toJSONString(req));
             if (req.getData() != null) {
                 JSONObject object = (JSONObject) req.getData();
                 Integer inputIndex = object.getInteger("index");
@@ -110,7 +110,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
                 String status = object.getString("status");
 
 
-                IotAlarmDefenceArea defenceArea = defenceAreaService.getBySubSystemCodeAndDeviceName(req.getToken(), req.getDeviceName(), String.valueOf(subSystemId), String.valueOf(inputIndex));
+                IotAlarmDefenceArea defenceArea = defenceAreaService.getBySubSystemCodeAndDeviceName(req.getServerInfo().getIotCode(), req.getDeviceName(), String.valueOf(subSystemId), String.valueOf(inputIndex));
                 if (defenceArea != null) {
                     defenceArea.setState(status);
                     defenceArea.setStateText(AlarmHostSensorStatus.getName(status));
@@ -159,7 +159,7 @@ public class IotAlarmHostServiceImpl implements IIotAlarmHostService, RouterServ
                     defenceAreaService.updateById(defenceArea);
                 }else {
                     LogUtils.STATUS_INFO_STATUS_SENSOR.info("【报警主机传感器状态事件,未找到对应传感器】【token:{}】【设备名称:{}】【子系统id:{}】【传感器index:{}】",
-                            req.getToken(), req.getDeviceName(),subSystemId,inputIndex);
+                            req.getServerInfo().getIotCode(), req.getDeviceName(),subSystemId,inputIndex);
                 }
             }
         } catch (Exception e) {

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

@@ -41,8 +41,6 @@ import com.xunmei.system.api.util.LogUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionSynchronizationAdapter;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
@@ -99,7 +97,7 @@ public class IotDvrHardDiskDetectionServiceImpl extends ServiceImpl<IotDvrHardDi
             dto.setCheckStatus(recorderHardDiskDetectionReq.getCheckStatus());
             dto.setCheckTime(recorderHardDiskDetectionReq.getCheckTime());
             dto.setDetailInfo(recorderHardDiskDetectionReq.getDetailInfo());
-            String token = req.getToken();
+            String token = req.getServerInfo().getIotCode();
             SysOrg sysOrg = iotServerInfoService.selectOrgByToken(token);
             dto.setOrganizationGuid(sysOrg.getCode());
             dto.setToken(token);

+ 2 - 2
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/VideoDiagnosisRecordServiceImpl.java

@@ -95,11 +95,11 @@ public class VideoDiagnosisRecordServiceImpl extends ServiceImpl<VideoDiagnosisR
             dto.setImgUrl(req.getImgUrl());
             dto.setAlarmTime(req.getAlarmTime());
             dto.setDetailInfo(req.getDetailInfo());
-            SysOrg sysOrg = iotServerInfoService.selectOrgByToken(obj.getToken());
+            SysOrg sysOrg = iotServerInfoService.selectOrgByToken(obj.getServerInfo().getIotCode());
             dto.setOrganizationGuid(sysOrg.getCode());
             dto.setProductName(obj.getProductName());
             dto.setDeviceName(obj.getDeviceName());
-            dto.setToken(obj.getToken());
+            dto.setToken(obj.getServerInfo().getIotCode());
             return WebsocketResult.of(saveData(dto, obj.getId()), obj.getTopic(), obj.getId());
         } catch (Exception e) {
             e.printStackTrace();

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

@@ -1,6 +1,5 @@
 package com.xunmei.host.video.service.impl;
 
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -14,7 +13,6 @@ 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;
 import com.xunmei.common.core.domain.video.MediatorVideoIntegrityCheckLog;
-import com.xunmei.common.core.enums.iot.BaseDeviceTypeEnum;
 import com.xunmei.common.core.enums.iot.DeviceTypeEnum;
 import com.xunmei.common.core.enums.iot.VideoIntegrityStatus;
 import com.xunmei.common.core.utils.JacksonUtils;
@@ -95,16 +93,17 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
 
     @Override
     public Object execute(WebsocketExecuteReq req) {
+        final String iotCode = req.getServerInfo().getIotCode();
         LogUtils.SOCKET_BASE_DEVICE_INFO.info("收到消息:{}", JacksonUtils.toJSONString(req));
         if (WebSocketConstants.GET_RECORD_INFOS_SERVICES.equals(req.getEvent())) {
             final JSONArray array = (JSONArray) req.getData();
             for (Object o : array) {
                 final VideoIntegrityCheckReq checkReq = JSON.parseObject(o.toString(), VideoIntegrityCheckReq.class);
                 VideoIntegrityCheckDto checkDto = transform(checkReq);
-                checkDto.setToken(req.getToken());
+                checkDto.setToken(iotCode);
                 checkDto.setDeviceName(req.getDeviceName());
                 checkDto.setProductName(req.getProductName());
-                SysOrg sysOrg = iotServerInfoService.selectOrgByToken(req.getToken());
+                SysOrg sysOrg = iotServerInfoService.selectOrgByToken(iotCode);
                 checkDto.setOrganizationGuid(sysOrg.getCode());
                 //执行业务
                 final ReceiveErrorDto dto = this.saveData(checkDto, req.getId());
@@ -118,10 +117,10 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
             JSONObject data = (JSONObject) req.getData();
             VideoIntegrityCheckReq checkReq = data.toJavaObject(VideoIntegrityCheckReq.class);
             VideoIntegrityCheckDto checkDto = transform(checkReq);
-            checkDto.setToken(req.getToken());
+            checkDto.setToken(iotCode);
             checkDto.setDeviceName(req.getDeviceName());
             checkDto.setProductName(req.getProductName());
-            SysOrg sysOrg = iotServerInfoService.selectOrgByToken(req.getToken());
+            SysOrg sysOrg = iotServerInfoService.selectOrgByToken(iotCode);
             checkDto.setOrganizationGuid(sysOrg.getCode());
             //执行业务
             final ReceiveErrorDto dto = this.saveData(checkDto, req.getId());

+ 10 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/constant/WebSocketConstants.java

@@ -150,6 +150,16 @@ public interface WebSocketConstants {
      */
     String BREAKER_CONTROL = "breakerControl";
 
+    /**
+     * 上下班主表数据
+     */
+    String WORK = "work";
+
+    /**
+     * 上下班操作数据
+     */
+    String WORK_OPERATION = "workOperation";
+
     // ------------------ IOT提供的服务能力结束 ------------------
 
     /**

+ 2 - 1
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/dto/WebsocketExecuteReq.java

@@ -1,6 +1,7 @@
 package com.xunmei.host.websocket.dto;
 
 import com.alibaba.fastjson.JSONObject;
+import com.xunmei.common.core.domain.iot.domain.IotServerInfo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -18,7 +19,7 @@ public class WebsocketExecuteReq {
     private Object data;
 
     @ApiModelProperty(value = "token")
-    private String token;
+    private IotServerInfo serverInfo;
 
     @ApiModelProperty(value = "消息中的id,以此作为msgId")
     private String id;

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

@@ -183,7 +183,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
             }
             //上报消息内容
             final Object args = payloadResolve.getData();
-            WebsocketExecuteReq executeReq = new WebsocketExecuteReq(payloadResolve.getRoutingKey(), args, token, websocketResult.getId(), topic, payloadResolve.getHeader(), typeEnums.getProductName(), typeEnums.getDeviceName());
+            WebsocketExecuteReq executeReq = new WebsocketExecuteReq(payloadResolve.getRoutingKey(), args, serverInfo, websocketResult.getId(), topic, payloadResolve.getHeader(), typeEnums.getProductName(), typeEnums.getDeviceName());
             WebsocketResult result = null;
             switch (typeEnums) {
 

+ 16 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/mapper/IotDayWorkMapper.java

@@ -0,0 +1,16 @@
+package com.xunmei.host.work.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.work.domain.IotDayWork;
+
+/**
+ * <p>
+ * 一键上下班 Mapper 接口
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-09
+ */
+public interface IotDayWorkMapper extends BaseMapper<IotDayWork> {
+
+}

+ 16 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/mapper/IotDayWorkOperationMapper.java

@@ -0,0 +1,16 @@
+package com.xunmei.host.work.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.work.domain.IotDayWorkOperation;
+
+/**
+ * <p>
+ * 上下班操作控制表 Mapper 接口
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-09
+ */
+public interface IotDayWorkOperationMapper extends BaseMapper<IotDayWorkOperation> {
+
+}

+ 16 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/IotDayWorkOperationService.java

@@ -0,0 +1,16 @@
+package com.xunmei.host.work.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.work.domain.IotDayWorkOperation;
+
+/**
+ * <p>
+ * 上下班操作控制表 服务类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-09
+ */
+public interface IotDayWorkOperationService extends IService<IotDayWorkOperation> {
+
+}

+ 18 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/IotDayWorkService.java

@@ -0,0 +1,18 @@
+package com.xunmei.host.work.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.work.domain.IotDayWork;
+
+/**
+ * <p>
+ * 一键上下班 服务类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-09
+ */
+public interface IotDayWorkService extends IService<IotDayWork> {
+
+    IotDayWork findByIdAndIotCode(Long id, String iotCode);
+
+}

+ 48 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/impl/IotDayWorkOperationServiceImpl.java

@@ -0,0 +1,48 @@
+package com.xunmei.host.work.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.work.domain.IotDayWorkOperation;
+import com.xunmei.host.websocket.constant.WebSocketConstants;
+import com.xunmei.host.websocket.dto.WebsocketExecuteReq;
+import com.xunmei.host.websocket.enums.ProductEnums;
+import com.xunmei.host.websocket.service.RouterService;
+import com.xunmei.host.work.mapper.IotDayWorkOperationMapper;
+import com.xunmei.host.work.service.IotDayWorkOperationService;
+import org.springframework.stereotype.Service;
+
+import java.util.StringJoiner;
+
+/**
+ * <p>
+ * 上下班操作控制表 服务实现类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-09
+ */
+@Service
+public class IotDayWorkOperationServiceImpl extends ServiceImpl<IotDayWorkOperationMapper, IotDayWorkOperation> implements IotDayWorkOperationService, RouterService {
+
+
+    @Override
+    public ProductEnums product() {
+        return ProductEnums.DETECTION_HOST;
+    }
+
+    @Override
+    public String routerKey() {
+
+        StringJoiner sj = new StringJoiner(",");
+        //上下班操作数据
+        sj.add(WebSocketConstants.WORK_OPERATION);
+
+        return sj.toString();
+    }
+
+    @Override
+    public Object execute(WebsocketExecuteReq req) {
+
+
+        return null;
+    }
+}

+ 67 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/work/service/impl/IotDayWorkServiceImpl.java

@@ -0,0 +1,67 @@
+package com.xunmei.host.work.service.impl;
+
+import com.alibaba.fastjson.JSON;
+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.common.core.domain.work.domain.IotDayWork;
+import com.xunmei.host.websocket.constant.WebSocketConstants;
+import com.xunmei.host.websocket.dto.WebsocketExecuteReq;
+import com.xunmei.host.websocket.enums.ProductEnums;
+import com.xunmei.host.websocket.service.RouterService;
+import com.xunmei.host.work.mapper.IotDayWorkMapper;
+import com.xunmei.host.work.service.IotDayWorkService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.StringJoiner;
+
+/**
+ * <p>
+ * 一键上下班 服务实现类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-09-09
+ */
+@Service
+public class IotDayWorkServiceImpl extends ServiceImpl<IotDayWorkMapper, IotDayWork> implements IotDayWorkService, RouterService {
+
+    @Override
+    public ProductEnums product() {
+        return null;
+    }
+
+    @Override
+    public String routerKey() {
+        StringJoiner sj = new StringJoiner(",");
+        //上下班主表数据
+        sj.add(WebSocketConstants.WORK);
+
+        return sj.toString();
+    }
+
+    @Override
+    public Object execute(WebsocketExecuteReq req) {
+        final Object data = req.getData();
+        final IotDayWork work = JSON.parseObject(data.toString(), IotDayWork.class);
+        final IotDayWork dayWork = findByIdAndIotCode(work.getId(), req.getServerInfo().getIotCode());
+        if (dayWork != null) {
+            BeanUtils.copyProperties(work,dayWork);
+            //updateById(dayWork)
+        }else {
+            dayWork.setId(work.getId());
+            this.save(work);
+        }
+        return null;
+    }
+
+    @Override
+    public IotDayWork findByIdAndIotCode(Long id, String iotCode) {
+        LambdaQueryWrapper<IotDayWork> wrapper= new LambdaQueryWrapper<>();
+        wrapper.eq(IotDayWork::getId,id);
+        wrapper.eq(IotDayWork::getIotCode,iotCode);
+        wrapper.last(Constants.LIMIT1);
+        return baseMapper.selectOne(wrapper);
+    }
+}

+ 5 - 0
soc-modules/soc-modules-host/src/main/resources/mapper/IotDayWorkMapper.xml

@@ -0,0 +1,5 @@
+<?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.work.mapper.IotDayWorkMapper">
+
+</mapper>

+ 5 - 0
soc-modules/soc-modules-host/src/main/resources/mapper/IotDayWorkOperationMapper.xml

@@ -0,0 +1,5 @@
+<?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.work.mapper.IotDayWorkOperationMapper">
+
+</mapper>