瀏覽代碼

1. 管理后台增加设备上下线时刻的查询
2. mqtt接收设备上下线处理 插入数据库记录
3. 调整mqtt消息处理器

hxd 1 月之前
父節點
當前提交
4155d9ad96
共有 16 個文件被更改,包括 200 次插入10 次删除
  1. 8 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebStatsController.java
  2. 19 0
      portal-service-common/src/main/java/com/hfln/portal/common/dto/data/device/OnoffDTO.java
  3. 24 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/web/OnoffRecordParams.java
  4. 1 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/exception/ErrorEnum.java
  5. 4 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebStatsGateway.java
  6. 10 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/DeviceGatewayImpl.java
  7. 15 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsGatewayImpl.java
  8. 13 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/DevOnOffInfoMapper.java
  9. 21 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/MqttSend.java
  10. 4 4
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/AlarmEventHandler.java
  11. 1 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/BaseMqttHandler.java
  12. 2 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/ConnectHandler.java
  13. 15 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/LastWillHandler.java
  14. 15 2
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/LoginHandler.java
  15. 11 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevOnOffInfoService.java
  16. 37 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevOnOffInfoServiceImpl.java

+ 8 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebStatsController.java

@@ -4,6 +4,7 @@ package com.hfln.portal.application.controller.web;
 
 import cn.hfln.framework.catchlog.CatchAndLog;
 import cn.hfln.framework.dto.ApiResult;
+import com.hfln.portal.common.dto.data.device.OnoffDTO;
 import com.hfln.portal.common.dto.data.event.EventListDTO;
 import com.hfln.portal.common.dto.data.event.EventsDTO;
 import com.hfln.portal.common.dto.data.stat.ScreenAlarmDTO;
@@ -16,6 +17,7 @@ import com.hfln.portal.common.request.stat.ScreenAlarmQueryParams;
 import com.hfln.portal.common.request.stat.ScreenFallingQueryParams;
 import com.hfln.portal.common.request.stat.ScreenStatQueryParams;
 import com.hfln.portal.common.request.user.UserDailyActiveParams;
+import com.hfln.portal.common.request.web.OnoffRecordParams;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.domain.gateway.WebStatsGateway;
 import io.swagger.v3.oas.annotations.Operation;
@@ -75,4 +77,10 @@ public class WebStatsController {
     public ApiResult<ScreenFallingDTO> queryFalling(@Valid @RequestBody ScreenFallingQueryParams params) {
         return ApiResult.success(webStatsGateway.queryFalling(params));
     }
+
+    @PostMapping("/OnoffRecord")
+    @Operation(summary = "查询设备上下线记录")
+    public ApiResult<PageRecord<OnoffDTO>> queryOnoffRecord(@RequestBody @Valid OnoffRecordParams params) {
+        return ApiResult.success(webStatsGateway.queryOnoffRecord(params));
+    }
 }

+ 19 - 0
portal-service-common/src/main/java/com/hfln/portal/common/dto/data/device/OnoffDTO.java

@@ -0,0 +1,19 @@
+package com.hfln.portal.common.dto.data.device;
+import com.hfln.portal.common.vo.BaseVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class OnoffDTO extends BaseVO {
+
+    @Schema(description = "类型 on-上线 off-离线")
+    private String type;
+
+    @Schema(description = "上下线时间")
+    private LocalDateTime createTime;
+}

+ 24 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/web/OnoffRecordParams.java

@@ -0,0 +1,24 @@
+package com.hfln.portal.common.request.web;
+
+import com.hfln.portal.common.vo.PageVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+@Data
+public class OnoffRecordParams extends PageVo {
+
+
+    @Schema(description = "设备主键id")
+    @NotNull(message = "设备主键id不能为空")
+    private Long devId;
+
+    @Schema(description = "起始时间 格式yyyy-MM-dd")
+    private LocalDate createTimeStart;
+
+    @Schema(description = "结束时间 格式yyyy-MM-dd")
+    private LocalDate createTimeEnd;
+
+}

+ 1 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/exception/ErrorEnum.java

@@ -41,6 +41,7 @@ public enum ErrorEnum implements ErrorEnumInterface{
     PHONE_IS_NULL("30008", "手机号不能为空"),
     USER_INFO_ERROR("30009", "用户信息有误,请联系管理员!"),
     OPR_NOT_ALLOWED("30010", "用户禁止当前操作!"),
+    USER_FWH_IS_NULL("30011", "用户服务号id为空"),
 
     /**
      * 三方系统调用相关

+ 4 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebStatsGateway.java

@@ -1,5 +1,6 @@
 package com.hfln.portal.domain.gateway;
 
+import com.hfln.portal.common.dto.data.device.OnoffDTO;
 import com.hfln.portal.common.dto.data.event.EventListDTO;
 import com.hfln.portal.common.dto.data.event.EventsDTO;
 import com.hfln.portal.common.dto.data.stat.ScreenAlarmDTO;
@@ -12,6 +13,7 @@ import com.hfln.portal.common.request.stat.ScreenAlarmQueryParams;
 import com.hfln.portal.common.request.stat.ScreenFallingQueryParams;
 import com.hfln.portal.common.request.stat.ScreenStatQueryParams;
 import com.hfln.portal.common.request.user.UserDailyActiveParams;
+import com.hfln.portal.common.request.web.OnoffRecordParams;
 import com.hfln.portal.common.vo.PageRecord;
 
 public interface WebStatsGateway {
@@ -28,5 +30,7 @@ public interface WebStatsGateway {
     ScreenAlarmDTO queryAlarm(ScreenAlarmQueryParams params);
 
     ScreenFallingDTO queryFalling(ScreenFallingQueryParams params);
+
+    PageRecord<OnoffDTO> queryOnoffRecord(OnoffRecordParams params);
 }
 

+ 10 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/DeviceGatewayImpl.java

@@ -124,6 +124,9 @@ public class DeviceGatewayImpl implements DeviceGateway {
     @Autowired
     private AlarmPlanService alarmPlanService;
 
+    @Autowired
+    private WxRelationService wxRelationService;
+
 
     @Override
     public HomeInfoDTO queryHomeInfo(Long userId) {
@@ -1178,7 +1181,13 @@ public class DeviceGatewayImpl implements DeviceGateway {
         devInfoService.updateById(devInfo);  // 更新设备信息
 
         // 8.服务号推送告知转移对象
-        mqttSubHandle.pushDeviceTransferMsg(devInfo, userInfo);
+        WxRelation wxRelation = wxRelationService.queryOneByUnionId(userInfo.getUnionId());
+        if (wxRelation != null) {
+            String fwhOpenId = wxRelation.getFwhOpenId();
+            mqttSend.sendDeviceTransferMsg(devInfo, userInfo, fwhOpenId);
+            log.info("设备转移服务号推送目标对象成功,clientId {},目标对象phone {}", devInfo.getClientId(), userInfo.getPhone());
+        }
+        log.info("设备转移服务号推送目标对象失败,目标对象服务号openId为空");
 
         // 9.记录操作日志
         String logContent = String.format(

+ 15 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsGatewayImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.excel.util.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hfln.portal.common.constant.UserConstants;
+import com.hfln.portal.common.dto.data.device.OnoffDTO;
 import com.hfln.portal.common.dto.data.event.EventListDTO;
 import com.hfln.portal.common.dto.data.event.EventsDTO;
 import com.hfln.portal.common.dto.data.stat.ScreenAlarmDTO;
@@ -17,6 +18,7 @@ import com.hfln.portal.common.request.stat.ScreenAlarmQueryParams;
 import com.hfln.portal.common.request.stat.ScreenFallingQueryParams;
 import com.hfln.portal.common.request.stat.ScreenStatQueryParams;
 import com.hfln.portal.common.request.user.UserDailyActiveParams;
+import com.hfln.portal.common.request.web.OnoffRecordParams;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.domain.customer.AdminUserType;
 import com.hfln.portal.domain.customer.util.CopyUtils;
@@ -59,6 +61,9 @@ public class WebStatsGatewayImpl implements WebStatsGateway {
     @Autowired
     private PersonInOutService personInOutService;
 
+    @Autowired
+    private DevOnOffInfoService devOnOffInfoService;
+
 
     @Override
     public PageRecord<EventListDTO> fallQuery(EventListParams params) {
@@ -323,6 +328,16 @@ public class WebStatsGatewayImpl implements WebStatsGateway {
         }
         return screenAlarmDTO;
     }
+
+    @Override
+    public PageRecord<OnoffDTO> queryOnoffRecord(OnoffRecordParams params) {
+        // 执行分页查询
+        Page<DevOnOffInfo> devOnOffInfoPage = devOnOffInfoService.queryOnoffRecord(params);
+        // 转换DTO
+        List<OnoffDTO> onoffDTOS = CopyUtils.copyList(devOnOffInfoPage.getRecords(), OnoffDTO.class);
+
+        return CopyUtils.copyPage(devOnOffInfoPage, onoffDTOS);
+    }
 }
 
 

+ 13 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/DevOnOffInfoMapper.java

@@ -0,0 +1,13 @@
+package com.hfln.portal.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.portal.infrastructure.po.DevOnOffInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+
+/**
+ * web端设备上下线表 Mapper 接口
+ */
+@Mapper
+public interface DevOnOffInfoMapper extends BaseMapper<DevOnOffInfo> {
+}

+ 21 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/MqttSend.java

@@ -6,7 +6,10 @@ import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.hfln.portal.common.constant.mqtt.topic.TopicConstants;
 import com.hfln.portal.common.request.room.SubRegionInfo;
+import com.hfln.portal.domain.customer.util.WxOfficeAccountClient;
 import com.hfln.portal.domain.exception.ErrorEnum;
+import com.hfln.portal.infrastructure.po.DevInfo;
+import com.hfln.portal.infrastructure.po.UserInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -24,6 +27,9 @@ public class MqttSend {
     @Autowired
     private MqttClient mqttClient; // MQTT消息发布器
 
+    @Autowired
+    private WxOfficeAccountClient wxOfficeAccountClient;
+
 
 
     /**
@@ -250,4 +256,19 @@ public class MqttSend {
             throw new BizException(ErrorEnum.MQTT_SEND_ERROR.getErrorCode(), ErrorEnum.MQTT_SEND_ERROR.getErrorMessage());
         }
     }
+
+    /**
+     * 发送设备转移服务号消息给转移对象
+     */
+    public void sendDeviceTransferMsg(DevInfo devInfo, UserInfo targetUser, String fwhOpenId) {
+
+        // 日志打印
+        log.info("mqttutil--当前useropenid={}, fwhopenId={}", targetUser.getOpenid(), fwhOpenId);
+        log.info("发送微信公众号信息:devName={}, phoneNumber={}, fwhOpenId={}", devInfo.getDevName(), targetUser.getPhone(), fwhOpenId);
+
+        // 服务号推送消息
+        wxOfficeAccountClient.sendMsg(devInfo.getClientId(), devInfo.getDevName(), targetUser.getPhone(), fwhOpenId, "设备运行检测到设备转移,请前往小程序查看");
+
+        log.info("发送微信公众号信息完毕");
+    }
 }

+ 4 - 4
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/AlarmEventHandler.java

@@ -18,10 +18,10 @@ import org.springframework.stereotype.Component;
 @Component
 public class AlarmEventHandler extends BaseMqttHandler implements MqttMessageHandler {
 
-    private AlarmPlanService alarmPlanService;
-    private WxOfficeAccountClient wxOfficeAccountClient;
-    private WxRelationService wxRelationService;
-    private UserService userService;
+    private final AlarmPlanService alarmPlanService;
+    private final WxOfficeAccountClient wxOfficeAccountClient;
+    private final WxRelationService wxRelationService;
+    private final UserService userService;
 
     private AlarmEventHandler(AlarmPlanService alarmPlanService,
                               WxOfficeAccountClient wxOfficeAccountClient,

+ 1 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/BaseMqttHandler.java

@@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public abstract class BaseMqttHandler {
 
-    protected DevInfoService devInfoService;
+    protected final DevInfoService devInfoService;
 
     protected BaseMqttHandler(DevInfoService devInfoService) {
         this.devInfoService = devInfoService;

+ 2 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/ConnectHandler.java

@@ -12,11 +12,12 @@ import org.springframework.stereotype.Component;
 @Component
 public class ConnectHandler extends BaseMqttHandler implements MqttMessageHandler {
 
-    private RedisUtil redisUtil;
+    private final RedisUtil redisUtil;
 
     private ConnectHandler(RedisUtil redisUtil,
                            DevInfoService devInfoService) {
         super(devInfoService);
+        this.redisUtil = redisUtil;
     }
 
     @Override

+ 15 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/LastWillHandler.java

@@ -3,7 +3,9 @@ package com.hfln.portal.infrastructure.mqtt.handlers;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.hfln.portal.infrastructure.po.DevInfo;
+import com.hfln.portal.infrastructure.po.DevOnOffInfo;
 import com.hfln.portal.infrastructure.service.DevInfoService;
+import com.hfln.portal.infrastructure.service.DevOnOffInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -13,8 +15,12 @@ import java.time.LocalDateTime;
 @Component
 public class LastWillHandler extends BaseMqttHandler implements MqttMessageHandler {
 
-    private LastWillHandler(DevInfoService devInfoService) {
+    private final DevOnOffInfoService devOnOffInfoService;
+
+    private  LastWillHandler(DevInfoService devInfoService,
+                              DevOnOffInfoService devOnOffInfoService) {
         super(devInfoService);
+        this.devOnOffInfoService = devOnOffInfoService;
     }
 
     @Override
@@ -38,11 +44,19 @@ public class LastWillHandler extends BaseMqttHandler implements MqttMessageHandl
             return;
         }
 
+        // 设备离线 更新设备状态
         devInfoService.update(
                 new LambdaUpdateWrapper<DevInfo>()
                         .eq(DevInfo::getClientId, clientId)
                         .set(DevInfo::getOnline, DevInfo.Constants.OnlineStatus.OFFLINE)
                         .set(DevInfo::getOnoffTime, LocalDateTime.now())
         );
+
+        // 设备离线 添加设备离线记录
+        DevOnOffInfo devOnOffInfo= new DevOnOffInfo();
+        devOnOffInfo.setTenantId(dev.getTenantId());
+        devOnOffInfo.setDevId(dev.getDevId());
+        devOnOffInfo.setType("off");
+        devOnOffInfoService.save(devOnOffInfo);
     }
 }

+ 15 - 2
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mqtt/handlers/LoginHandler.java

@@ -2,7 +2,9 @@ package com.hfln.portal.infrastructure.mqtt.handlers;
 
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.hfln.portal.infrastructure.po.DevInfo;
+import com.hfln.portal.infrastructure.po.DevOnOffInfo;
 import com.hfln.portal.infrastructure.service.DevInfoService;
+import com.hfln.portal.infrastructure.service.DevOnOffInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -12,10 +14,15 @@ import java.time.LocalDateTime;
 @Component
 public class LoginHandler extends BaseMqttHandler implements MqttMessageHandler {
 
-    private LoginHandler(DevInfoService devInfoService) {
+    private final DevOnOffInfoService devOnOffInfoService;
+
+    private LoginHandler(DevInfoService devInfoService,
+                         DevOnOffInfoService devOnOffInfoService) {
         super(devInfoService);
+        this.devOnOffInfoService = devOnOffInfoService;
     }
 
+
     @Override
     public boolean supports(String action) {
         return "login".equals(action);
@@ -30,7 +37,7 @@ public class LoginHandler extends BaseMqttHandler implements MqttMessageHandler
             log.warn("Device not found for clientId: {}", clientId);
             return;
         }
-
+        // 设备上线 更新设备状态
         devInfoService.update(
                 new LambdaUpdateWrapper<DevInfo>()
                         .eq(DevInfo::getClientId, clientId)
@@ -39,5 +46,11 @@ public class LoginHandler extends BaseMqttHandler implements MqttMessageHandler
                         .set(DevInfo::getOnoffTime, LocalDateTime.now())
                         .set(DevInfo::getPresenceChangeTime, LocalDateTime.now())
         );
+        // 设备上线 添加设备上线记录
+        DevOnOffInfo devOnOffInfo= new DevOnOffInfo();
+        devOnOffInfo.setTenantId(dev.getTenantId());
+        devOnOffInfo.setDevId(dev.getDevId());
+        devOnOffInfo.setType("on");
+        devOnOffInfoService.save(devOnOffInfo);
     }
 }

+ 11 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevOnOffInfoService.java

@@ -0,0 +1,11 @@
+package com.hfln.portal.infrastructure.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hfln.portal.common.request.web.OnoffRecordParams;
+import com.hfln.portal.infrastructure.po.DevOnOffInfo;
+
+public interface DevOnOffInfoService extends IService<DevOnOffInfo> {
+
+    Page<DevOnOffInfo> queryOnoffRecord(OnoffRecordParams params);
+}

+ 37 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevOnOffInfoServiceImpl.java

@@ -0,0 +1,37 @@
+package com.hfln.portal.infrastructure.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hfln.portal.common.request.web.OnoffRecordParams;
+import com.hfln.portal.infrastructure.mapper.DevOnOffInfoMapper;
+import com.hfln.portal.infrastructure.po.DevOnOffInfo;
+import com.hfln.portal.infrastructure.service.DevOnOffInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+
+@Service
+@Slf4j
+public class DevOnOffInfoServiceImpl extends ServiceImpl<DevOnOffInfoMapper, DevOnOffInfo> implements DevOnOffInfoService {
+
+    @Override
+    public Page<DevOnOffInfo> queryOnoffRecord(OnoffRecordParams params) {
+        Page<DevOnOffInfo> page = new Page<>(params.getPageNo(), params.getPageSize());
+
+        // 构建查询条件
+        LambdaQueryWrapper<DevOnOffInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DevOnOffInfo::getDevId, params.getDevId());
+
+        if (Objects.nonNull(params.getCreateTimeStart())) {
+            queryWrapper.ge(DevOnOffInfo::getCreateTime, params.getCreateTimeStart());
+        }
+        if (Objects.nonNull(params.getCreateTimeEnd())) {
+            queryWrapper.lt(DevOnOffInfo::getCreateTime, params.getCreateTimeEnd().plusDays(1));
+        }
+        queryWrapper.orderByDesc(DevOnOffInfo::getCreateTime);
+        return this.baseMapper.selectPage(page, queryWrapper);
+    }
+}