3
2

3 Коммиты 1a755d37e6 ... a6751c31ff

Автор SHA1 Сообщение Дата
  hanzhengyi a6751c31ff 合并远程代码并恢复本地修改 1 месяц назад
  hanzhengyi 8803785dfd Merge branch 'han' of http://47.111.81.118:3000/uskycloud/usky-modules into han 1 месяц назад
  hanzhengyi c8df72f4aa 国动办平台数据推送 1 месяц назад
20 измененных файлов с 1053 добавлено и 98 удалено
  1. 46 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/AlarmDataController.java
  2. 6 5
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/BaseDataController.java
  3. 21 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/web/BaseBuildFacilityController.java
  4. 33 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/web/DmpDeviceInfoController.java
  5. 162 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/domain/BaseBuildFacility.java
  6. 16 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/mapper/BaseBuildFacilityMapper.java
  7. 18 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/BaseBuildFacilityService.java
  8. 25 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/DmpDeviceInfoService.java
  9. 0 41
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/config/mqtt/MqttGateway.java
  10. 37 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/config/mqtt/MqttOutConfig.java
  11. 139 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/AlarmDataTransferService.java
  12. 32 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/BaseBuildFacilityServiceImpl.java
  13. 124 44
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/BaseDataTransferService.java
  14. 35 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/DmpDeviceInfoServiceImpl.java
  15. 11 2
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/IotDataTransferService.java
  16. 69 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/alarm/AlarmMessage1VO.java
  17. 74 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/alarm/AlarmMessageVO.java
  18. 161 0
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/base/FacilityDeviceVO.java
  19. 6 6
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/base/SensorInfoVO.java
  20. 38 0
      service-cdi/service-cdi-biz/src/main/resources/mapper/cdi/BaseBuildFacilityMapper.xml

+ 46 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/AlarmDataController.java

@@ -0,0 +1,46 @@
+package com.usky.cdi.controller;
+
+import com.usky.cdi.service.impl.AlarmDataTransferService;
+import com.usky.cdi.service.vo.alarm.AlarmMessage1VO;
+import com.usky.cdi.service.vo.alarm.AlarmMessageVO;
+import com.usky.cdi.service.vo.base.EngineeringBaseVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 基础类数据传输控制器
+ * 提供基础类数据上报的接口
+ *
+ * @author han
+ * @date 2025/12/08
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/alarm")
+@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
+public class AlarmDataController {
+    @Autowired
+    private AlarmDataTransferService alarmDataTransferService;
+    /**
+     * 上报人防工程基础信息
+     */
+    @PostMapping("/alarmMessage")
+    public String sendAlarmMessage(@RequestBody AlarmMessageVO vo) {
+        boolean success = alarmDataTransferService.sendAlarmMessage(vo);
+        return success ? "上报成功" : "上报失败";
+    }
+
+    /**
+     * 上报人防工程基础信息
+     */
+    @PostMapping("/alarmMessage1")
+    public String sendAlarmMessage1(@RequestBody AlarmMessage1VO vo) {
+        boolean success = alarmDataTransferService.sendAlarmMessage1(vo);
+        return success ? "上报成功" : "上报失败";
+    }
+}

+ 6 - 5
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/BaseDataController.java

@@ -1,5 +1,6 @@
 package com.usky.cdi.controller;
 
+import com.usky.cdi.domain.BaseBuildFacility;
 import com.usky.cdi.service.impl.BaseDataTransferService;
 import com.usky.cdi.service.vo.base.*;
 import lombok.extern.slf4j.Slf4j;
@@ -66,7 +67,7 @@ public class BaseDataController {
      * 上报智能监管物联设施信息
      */
     @PostMapping("/sensorInfo")
-    public String sendSensorInfo(@RequestBody SensorInfoVO vo) {
+    public String sendSensorInfo(@RequestBody FacilityDeviceVO vo) {
         boolean success = baseDataTransferService.sendSensorInfo(vo);
         return success ? "上报成功" : "上报失败";
     }
@@ -74,10 +75,10 @@ public class BaseDataController {
     /**
      * 批量上报智能监管物联设施信息
      */
-    @PostMapping("/sensorInfos")
-    public String batchSendSensorInfos(@RequestBody List<SensorInfoVO> sensors) {
-        int successCount = baseDataTransferService.batchSendSensorInfos(sensors);
-        return String.format("上报成功 %d/%d", successCount, sensors.size());
+    @GetMapping("/sensorInfos")
+    public String batchSendSensorInfos(@RequestParam(value = "tenantId",required = false) Integer tenantId) {
+        int successCount = baseDataTransferService.batchSendSensorInfos(tenantId);
+        return String.format("上报成功 %d", successCount);
     }
 }
 

+ 21 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/web/BaseBuildFacilityController.java

@@ -0,0 +1,21 @@
+package com.usky.cdi.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 建筑设施 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2025-12-02
+ */
+@Controller
+@RequestMapping("/baseBuildFacility")
+public class BaseBuildFacilityController {
+
+}
+

+ 33 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/controller/web/DmpDeviceInfoController.java

@@ -0,0 +1,33 @@
+package com.usky.cdi.controller.web;
+
+import com.usky.backend.domain.*;
+import com.usky.cdi.domain.DmpDevice;
+import com.usky.cdi.service.DmpDeviceInfoService;
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.utils.poi.ExcelUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 设备信息表
+ *
+ * @author ya
+ * @since 2022-10-08
+ */
+@RestController
+@RequestMapping("/dmpDeviceInfo")
+public class DmpDeviceInfoController {
+
+    @Autowired
+    private DmpDeviceInfoService dmpDeviceInfoService;
+
+}
+

+ 162 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/domain/BaseBuildFacility.java

@@ -0,0 +1,162 @@
+package com.usky.cdi.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 建筑设施
+ * </p>
+ *
+ * @author fu
+ * @since 2025-12-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseBuildFacility implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设施编号
+     */
+    private String facilityNum;
+
+    /**
+     * 设施名称
+     */
+    private String facilityName;
+
+    /**
+     * 设施类型
+     */
+    private String facilityType;
+
+    /**
+     * 所属楼层
+     */
+    private String floor;
+
+    /**
+     * 安装位置
+     */
+    private String address;
+
+    /**
+     * 图⽚地址URL
+     */
+    private String imagesUrl;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 联系人
+     */
+    private String contact;
+
+    /**
+     * 联系方式
+     */
+    private String contactPhone;
+
+    /**
+     * 平面X轴坐标
+     */
+    private String planeX;
+
+    /**
+     * 平面Y轴坐标
+     */
+    private String planeY;
+
+    private String coordinateX;
+
+    private String coordinateY;
+
+    private String coordinateZ;
+
+    /**
+     * 删除标识
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 组织结构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 建筑设施备注
+     */
+    private String facilityDesc;
+
+    /**
+     * 三维角度X
+     */
+    private Double anglesX;
+
+    /**
+     * 三维角度y
+     */
+    private Double anglesY;
+
+    /**
+     * 三维角度z
+     */
+    private Double anglesZ;
+
+    /**
+     * 三维图标大小
+     */
+    private Double scaleL;
+
+    /**
+     * 三维图标大小
+     */
+    private Double scaleW;
+
+    /**
+     * 三维图标大小
+     */
+    private Double scaleH;
+
+
+}

+ 16 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/mapper/BaseBuildFacilityMapper.java

@@ -0,0 +1,16 @@
+package com.usky.cdi.mapper;
+
+import com.usky.cdi.domain.BaseBuildFacility;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 建筑设施 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2025-12-02
+ */
+public interface BaseBuildFacilityMapper extends CrudMapper<BaseBuildFacility> {
+
+}

+ 18 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/BaseBuildFacilityService.java

@@ -0,0 +1,18 @@
+package com.usky.cdi.service;
+
+import com.usky.cdi.domain.BaseBuildFacility;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 建筑设施 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2025-12-02
+ */
+public interface BaseBuildFacilityService extends CrudService<BaseBuildFacility> {
+    List<BaseBuildFacility> facilityInfo(Integer tenantId);
+}

+ 25 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/DmpDeviceInfoService.java

@@ -0,0 +1,25 @@
+package com.usky.cdi.service;
+
+import com.usky.backend.domain.*;
+import com.usky.cdi.domain.BaseBuildFacility;
+import com.usky.cdi.domain.DmpDevice;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.CrudService;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * <p>
+ * 设备信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2022-10-08
+ */
+public interface DmpDeviceInfoService extends CrudService<DmpDevice> {
+    List<DmpDevice> deviceInfo(Integer tenantId);
+}

+ 0 - 41
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/config/mqtt/MqttGateway.java

@@ -1,41 +0,0 @@
-package com.usky.cdi.service.config.mqtt;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.integration.annotation.MessagingGateway;
-import org.springframework.integration.mqtt.support.MqttHeaders;
-import org.springframework.messaging.handler.annotation.Header;
-
-/**
- * MQTT消息发送网关
- * 
- * @author han
- * @date 2025/03/20
- */
-@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
-@MessagingGateway(defaultRequestChannel = MqttOutConfig.CHANNEL_NAME_OUT)
-public interface MqttGateway {
-    /**
-     * 发送消息
-     *
-     * @param payload 消息内容
-     */
-    void sendToMqtt(String payload);
-
-    /**
-     * 指定topic发送消息
-     *
-     * @param topic 消息主题
-     * @param payload 消息内容
-     */
-    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
-
-    /**
-     * 指定topic和qos发送消息
-     *
-     * @param topic 消息主题
-     * @param qos 消息质量等级
-     * @param payload 消息内容
-     */
-    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
-}
-

+ 37 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/config/mqtt/MqttOutConfig.java

@@ -1,5 +1,6 @@
 package com.usky.cdi.service.config.mqtt;
 
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
@@ -13,6 +14,8 @@ import org.springframework.messaging.MessageChannel;
 import org.springframework.messaging.MessageHandler;
 import org.springframework.messaging.handler.annotation.Header;
 
+import java.util.Map;
+
 /**
  * @author han
  * @date 2025/03/20 14:31
@@ -57,4 +60,38 @@ public class MqttOutConfig {
         return messageHandler;
     }
 
+    @MessagingGateway(defaultRequestChannel = CHANNEL_NAME_OUT)
+    public interface MqttGateway {
+        /**
+         * 发送消息
+         *
+         * @param payload
+         */
+        void sendToMqtt(String payload);
+
+        /**
+         * 指定top发送消息
+         *
+         * @param topic
+         * @param payload
+         */
+        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
+
+        /**
+         * 指定top发送消息
+         *
+         * @param topic
+         * @param payload
+         */
+        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, Map<String, Object> payload);
+
+        /**
+         * 指定队列和qos
+         *
+         * @param topic
+         * @param qos
+         * @param payload
+         */
+        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
+    }
 }

+ 139 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/AlarmDataTransferService.java

@@ -0,0 +1,139 @@
+package com.usky.cdi.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.shaded.com.google.gson.Gson;
+import com.usky.cdi.service.config.mqtt.MqttOutConfig;
+import com.usky.cdi.service.util.SnowflakeIdGenerator;
+import com.usky.cdi.service.vo.alarm.AlarmMessage1VO;
+import com.usky.cdi.service.vo.alarm.AlarmMessageVO;
+import com.usky.cdi.service.vo.base.FloorPlaneVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * 告警类数据传输服务
+ * 负责向市适配平台发送告警类数据
+ *
+ * @author han
+ * @date 2025/12/08
+ */
+@Slf4j
+@Service
+@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
+public class AlarmDataTransferService {
+
+    @Resource
+    private MqttOutConfig.MqttGateway mqttGateway;
+
+    private final SnowflakeIdGenerator idGenerator;
+    private final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+
+    public AlarmDataTransferService() {
+        // 使用默认的workerId和datacenterId,实际项目中可以从配置读取
+        this.idGenerator = new SnowflakeIdGenerator(1L, 1L);
+    }
+    /**
+     * 获取当前时间字符串
+     */
+    private String getCurrentTime() {
+        return timeFormat.format(new Date());
+    }
+
+    /**
+     * 生成数据包ID
+     */
+    private Long generateDataPacketID() {
+        return idGenerator.nextPacketId();
+    }
+
+    /**
+     * 发送告警信息
+     * Topic: base/floorPlane
+     *
+     * @param vo 楼层平面图信息
+     * @return 是否发送成功
+     */
+    public boolean sendAlarmMessage(AlarmMessageVO vo) {
+        try {
+            if (vo.getDataPacketID() == null) {
+                vo.setDataPacketID(generateDataPacketID());
+            }
+            if (vo.getPublishTime() == null) {
+                vo.setPublishTime(getCurrentTime());
+            }
+
+            HashMap<String, Object> map = new HashMap<>();
+//            map.put("dataPacketID", vo.getDataPacketID());
+//            map.put("engineeringID", vo.getEngineeringID());
+//            map.put("floor", vo.getFloor());
+//            map.put("floorFileID", vo.getFloorFileID());
+//            map.put("floorFileName", vo.getFloorFileName());
+//            map.put("floorFileSuffix", vo.getFloorFileSuffix());
+//            map.put("filePixWidth", vo.getFilePixWidth());
+//            map.put("filePixHeight", vo.getFilePixHeight());
+//            map.put("floorFile", imageBytes);
+//            map.put("publishTime", vo.getPublishTime());
+            Gson gson = new Gson();
+            JSONObject jsonObject = (JSONObject) JSON.toJSON(vo);
+            String json = jsonObject.toJSONString();
+            System.out.println(json);
+            String topic = "alarm/message";
+            mqttGateway.sendToMqtt(topic, json);
+
+            return true;
+        } catch (Exception e) {
+            log.error("发送告警信息失败,AlarmID: {}", vo.getAlarmID(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 发送告警信息
+     * Topic: base/floorPlane
+     *
+     * @param vo 楼层平面图信息
+     * @return 是否发送成功
+     */
+    public boolean sendAlarmMessage1(AlarmMessage1VO vo) {
+        try {
+            if (vo.getDataPacketID() == null) {
+                vo.setDataPacketID(generateDataPacketID());
+            }
+            if (vo.getPublishTime() == null) {
+                vo.setPublishTime(getCurrentTime());
+            }
+
+            HashMap<String, Object> map = new HashMap<>();
+//            map.put("dataPacketID", vo.getDataPacketID());
+//            map.put("engineeringID", vo.getEngineeringID());
+//            map.put("floor", vo.getFloor());
+//            map.put("floorFileID", vo.getFloorFileID());
+//            map.put("floorFileName", vo.getFloorFileName());
+//            map.put("floorFileSuffix", vo.getFloorFileSuffix());
+//            map.put("filePixWidth", vo.getFilePixWidth());
+//            map.put("filePixHeight", vo.getFilePixHeight());
+//            map.put("floorFile", imageBytes);
+//            map.put("publishTime", vo.getPublishTime());
+            Gson gson = new Gson();
+            JSONObject jsonObject = (JSONObject) JSON.toJSON(vo);
+            String json = jsonObject.toJSONString();
+            System.out.println(json);
+            String topic = "alarm/message";
+            mqttGateway.sendToMqtt(topic, json);
+
+            return true;
+        } catch (Exception e) {
+            log.error("发送告警信息失败,AlarmID: {}", vo.getAlarmID(), e);
+            return false;
+        }
+    }
+}

+ 32 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/BaseBuildFacilityServiceImpl.java

@@ -0,0 +1,32 @@
+package com.usky.cdi.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.cdi.domain.BaseBuildFacility;
+import com.usky.cdi.mapper.BaseBuildFacilityMapper;
+import com.usky.cdi.service.BaseBuildFacilityService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.common.security.utils.SecurityUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 建筑设施 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2025-12-02
+ */
+@Service
+public class BaseBuildFacilityServiceImpl extends AbstractCrudService<BaseBuildFacilityMapper, BaseBuildFacility> implements BaseBuildFacilityService {
+    @Override
+    public List<BaseBuildFacility> facilityInfo(Integer tenantId){
+        LambdaQueryWrapper<BaseBuildFacility> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(BaseBuildFacility::getDeleteFlag,0)
+                .eq(BaseBuildFacility::getTenantId, tenantId);
+        List<BaseBuildFacility> list = this.list(queryWrapper);
+        return list;
+    }
+}

+ 124 - 44
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/BaseDataTransferService.java

@@ -2,16 +2,26 @@ package com.usky.cdi.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.usky.cdi.service.config.mqtt.MqttGateway;
+import com.alibaba.nacos.shaded.com.google.gson.Gson;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.usky.cdi.domain.BaseBuildFacility;
+import com.usky.cdi.domain.DmpDevice;
+import com.usky.cdi.service.BaseBuildFacilityService;
+import com.usky.cdi.service.DmpDeviceInfoService;
+import com.usky.cdi.service.config.mqtt.MqttOutConfig;
 import com.usky.cdi.service.util.SnowflakeIdGenerator;
 import com.usky.cdi.service.vo.base.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
 
 /**
  * 基础类数据传输服务
@@ -25,8 +35,17 @@ import java.util.Date;
 @ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
 public class BaseDataTransferService {
 
-    @Autowired(required = false)
-    private MqttGateway mqttGateway;
+    @Autowired
+    private BaseBuildFacilityService baseBuildFacilityService;
+
+    @Autowired
+    private DmpDeviceInfoService dmpDeviceInfoService;
+
+    @Resource
+    private MqttOutConfig.MqttGateway mqttGateway;
+
+    @Value("${config.engineeringID}")
+    private String engineeringID;
 
     private final SnowflakeIdGenerator idGenerator;
     private final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
@@ -58,10 +77,6 @@ public class BaseDataTransferService {
      * @return 是否发送成功
      */
     public boolean sendEngineeringBase(EngineeringBaseVO vo) {
-        if (mqttGateway == null) {
-            log.warn("MQTT Gateway未初始化,无法发送消息");
-            return false;
-        }
         try {
             if (vo.getDataPacketID() == null) {
                 vo.setDataPacketID(generateDataPacketID());
@@ -91,10 +106,6 @@ public class BaseDataTransferService {
      * @return 是否发送成功
      */
     public boolean sendProtectiveUnit(ProtectiveUnitVO vo) {
-        if (mqttGateway == null) {
-            log.warn("MQTT Gateway未初始化,无法发送消息");
-            return false;
-        }
         try {
             if (vo.getDataPacketID() == null) {
                 vo.setDataPacketID(generateDataPacketID());
@@ -124,10 +135,6 @@ public class BaseDataTransferService {
      * @return 是否发送成功
      */
     public boolean sendFloorPlane(FloorPlaneVO vo) {
-        if (mqttGateway == null) {
-            log.warn("MQTT Gateway未初始化,无法发送消息");
-            return false;
-        }
         try {
             if (vo.getDataPacketID() == null) {
                 vo.setDataPacketID(generateDataPacketID());
@@ -136,27 +143,46 @@ public class BaseDataTransferService {
                 vo.setPublishTime(getCurrentTime());
             }
 
+            String imagePath = "D://games/3492.jpg";
+            // 将图片文件读取为字节数组
+            byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
+
             // 检查文件大小(不超过5MB)
-            if (vo.getFloorFile() != null && vo.getFloorFile().length > 5 * 1024 * 1024) {
+            if (vo.getFloorFile() != null && imageBytes.length > 5 * 1024 * 1024) {
                 log.error("楼层平面图文件大小超过5MB限制,FileID: {}", vo.getFloorFileID());
                 return false;
             }
 
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("dataPacketID", vo.getDataPacketID());
+            map.put("engineeringID", vo.getEngineeringID());
+            map.put("floor", vo.getFloor());
+            map.put("floorFileID", vo.getFloorFileID());
+            map.put("floorFileName", vo.getFloorFileName());
+            map.put("floorFileSuffix", vo.getFloorFileSuffix());
+            map.put("filePixWidth", vo.getFilePixWidth());
+            map.put("filePixHeight", vo.getFilePixHeight());
+            map.put("floorFile", imageBytes);
+            map.put("publishTime", vo.getPublishTime());
+            Gson gson = new Gson();
             // 将字节数组转换为Base64编码
             JSONObject jsonObject = (JSONObject) JSON.toJSON(vo);
+            vo.setFloorFile(imageBytes);
+//            jsonObject.put("floorFile", imageBytes);
             if (vo.getFloorFile() != null) {
                 // 使用Base64编码传输二进制数据
                 String base64File = java.util.Base64.getEncoder().encodeToString(vo.getFloorFile());
-                jsonObject.put("floorFile", base64File);
+                jsonObject.put("floorFile", imageBytes);
             }
 
             String json = jsonObject.toJSONString();
+            System.out.println(gson.toJson(map));
             String topic = "base/floorPlane";
             
             log.info("发送楼层平面图信息,Topic: {}, FileID: {}, FileSize: {} bytes", 
                     topic, vo.getFloorFileID(), 
                     vo.getFloorFile() != null ? vo.getFloorFile().length : 0);
-            mqttGateway.sendToMqtt(topic, json);
+            mqttGateway.sendToMqtt(topic, gson.toJson(map));
             
             return true;
         } catch (Exception e) {
@@ -165,6 +191,21 @@ public class BaseDataTransferService {
         }
     }
 
+    /**
+     * 根据输入的键(key)从Map中匹配并返回对应的值
+     * @param key 要匹配的键(输入值)
+     * @param dataMap 存储键值对的Map
+     * @return 匹配到的值(若未匹配到返回null)
+     */
+    public static <K, V> V matchByKey(K key, Map<K, V> dataMap) {
+        // 判空处理(避免空指针)
+        if (key == null || dataMap == null) {
+            return null;
+        }
+        // 直接通过Map的get方法匹配
+        return dataMap.get(key);
+    }
+
     /**
      * 发送智能监管物联设施信息
      * Topic: base/sensorInfo
@@ -172,24 +213,43 @@ public class BaseDataTransferService {
      * @param vo 智能监管物联设施信息
      * @return 是否发送成功
      */
-    public boolean sendSensorInfo(SensorInfoVO vo) {
-        if (mqttGateway == null) {
-            log.warn("MQTT Gateway未初始化,无法发送消息");
-            return false;
-        }
+    public boolean sendSensorInfo(FacilityDeviceVO vo) {
         try {
-            if (vo.getDataPacketID() == null) {
-                vo.setDataPacketID(generateDataPacketID());
-            }
-            if (vo.getPublishTime() == null) {
-                vo.setPublishTime(getCurrentTime());
-            }
+            Map<Integer, Integer> userIdToName = new HashMap<>();
+            userIdToName.put(702, 31);
+            userIdToName.put(703, 33);
+            userIdToName.put(704, 11);
+            userIdToName.put(707, 19);
+            userIdToName.put(708, 19);
+            userIdToName.put(709, 15);
+            userIdToName.put(710, 16);
+            userIdToName.put(711, 2);
+            userIdToName.put(712, 34);
+            userIdToName.put(713, 36);
+            userIdToName.put(714, 37);
 
-            String json = JSON.toJSONString(vo);
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("dataPacketID", generateDataPacketID());
+            map.put("engineeringID", Long.parseLong(engineeringID));
+            map.put("floor", "B2");
+            map.put("floorFileID", 1);
+            map.put("sensorID", Integer.parseInt(vo.getDeviceId()));
+            map.put("sensorNo", vo.getDeviceUuid());
+            map.put("sensorType", matchByKey(vo.getDeviceType(), userIdToName));
+            map.put("unitName", vo.getFacilityDesc());
+            map.put("monitorObjNo", vo.getFacilityNum());
+            map.put("monitorObj", vo.getFacilityName());
+            map.put("location", vo.getAddress());
+//            map.put("xCoordinate", (int) Math.floor(Double.parseDouble(vo.getPlaneX())*4.34));
+//            map.put("yCoordinate", (int) Math.floor(Double.parseDouble(vo.getPlaneY())*4.34));
+            map.put("xCoordinate", Integer.valueOf(vo.getPlaneX()));
+            map.put("yCoordinate", Integer.valueOf(vo.getPlaneY()));
+            map.put("publishTime", getCurrentTime());
+            Gson gson = new Gson();
             String topic = "base/sensorInfo";
-            
-            log.info("发送智能监管物联设施信息,Topic: {}, SensorID: {}", topic, vo.getSensorID());
-            mqttGateway.sendToMqtt(topic, json);
+            System.out.println(gson.toJson(map));
+//            log.info("发送智能监管物联设施信息,Topic: {}, SensorID: {}", topic, vo.getSensorID());
+            mqttGateway.sendToMqtt(topic, gson.toJson(map));
             
             return true;
         } catch (Exception e) {
@@ -223,22 +283,42 @@ public class BaseDataTransferService {
     /**
      * 批量发送智能监管物联设施信息
      * 
-     * @param sensors 物联设施列表
+     * @param tenantId 租户ID
      * @return 成功发送的数量
      */
-    public int batchSendSensorInfos(java.util.List<SensorInfoVO> sensors) {
-        if (sensors == null || sensors.isEmpty()) {
-            return 0;
+    public int batchSendSensorInfos(Integer tenantId) {
+        List<BaseBuildFacility> list = baseBuildFacilityService.facilityInfo(tenantId);
+        List<DmpDevice> list1 = dmpDeviceInfoService.deviceInfo(tenantId);
+        List<FacilityDeviceVO> list2 = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(list)&&CollectionUtils.isNotEmpty(list1)){
+            for (int j=0;j<list.size();j++) {
+                for (int k=0;k<list1.size();k++) {
+                    if (list.get(j).getDeviceId().equals(list1.get(k).getDeviceId())){
+                        FacilityDeviceVO facilityDeviceVO = new FacilityDeviceVO();
+                        facilityDeviceVO.setFloor(list.get(j).getFloor());
+                        facilityDeviceVO.setFacilityName(list.get(j).getFacilityName());
+                        facilityDeviceVO.setFacilityNum(list.get(j).getFacilityNum());
+                        facilityDeviceVO.setDeviceId(list.get(j).getDeviceId());
+                        facilityDeviceVO.setAddress(list.get(j).getAddress());
+                        facilityDeviceVO.setPlaneX(list.get(j).getPlaneX());
+                        facilityDeviceVO.setPlaneY(list.get(j).getPlaneY());
+                        facilityDeviceVO.setDeviceUuid(list1.get(k).getDeviceUuid());
+                        facilityDeviceVO.setFacilityDesc(list.get(j).getFacilityDesc());
+                        facilityDeviceVO.setDeviceType(list1.get(k).getDeviceType());
+                        list2.add(facilityDeviceVO);
+                    }
+                }
+            }
         }
-        
         int successCount = 0;
-        for (SensorInfoVO sensor : sensors) {
-            if (sendSensorInfo(sensor)) {
-                successCount++;
+        if(CollectionUtils.isNotEmpty(list2)){
+            for (int i=0;i<list2.size();i++) {
+                if (sendSensorInfo(list2.get(i))) {
+                    successCount++;
+                }
             }
         }
-        
-        log.info("批量发送智能监管物联设施信息,总数: {}, 成功: {}", sensors.size(), successCount);
+        log.info("批量发送智能监管物联设施信息,总数: {}, 成功: {}", list2.size(), successCount);
         return successCount;
     }
 }

+ 35 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/DmpDeviceInfoServiceImpl.java

@@ -0,0 +1,35 @@
+package com.usky.cdi.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.cdi.domain.BaseBuildFacility;
+import com.usky.cdi.domain.DmpDevice;
+import com.usky.cdi.mapper.DmpDeviceMapper;
+import com.usky.cdi.service.DmpDeviceInfoService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 设备信息表 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2022-10-08
+ */
+@Slf4j
+@Service
+public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceMapper, DmpDevice> implements DmpDeviceInfoService {
+    @Override
+    public List<DmpDevice> deviceInfo(Integer tenantId){
+        LambdaQueryWrapper<DmpDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(DmpDevice::getDeleteFlag,0)
+                .eq(DmpDevice::getTenantId, tenantId);
+        List<DmpDevice> list = this.list(queryWrapper);
+        return list;
+    }
+}

+ 11 - 2
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/impl/IotDataTransferService.java

@@ -2,12 +2,17 @@ package com.usky.cdi.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+<<<<<<< Updated upstream
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.usky.cdi.domain.DmpDevice;
 import com.usky.cdi.domain.DmpProduct;
 import com.usky.cdi.mapper.DmpDeviceMapper;
 import com.usky.cdi.mapper.DmpProductMapper;
 import com.usky.cdi.service.config.mqtt.MqttGateway;
+=======
+//import com.usky.cdi.service.config.mqtt.MqttGateway;
+import com.usky.cdi.service.config.mqtt.MqttOutConfig;
+>>>>>>> Stashed changes
 import com.usky.cdi.service.enums.EnvMonitorMqttTopic;
 import com.usky.cdi.service.util.DeviceDataQuery;
 import com.usky.cdi.service.util.SnowflakeIdGenerator;
@@ -19,8 +24,12 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Service;
 
+<<<<<<< Updated upstream
 import javax.annotation.PostConstruct;
 
+=======
+import javax.annotation.Resource;
+>>>>>>> Stashed changes
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -40,8 +49,8 @@ import java.util.stream.Collectors;
 @ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
 public class IotDataTransferService {
 
-    @Autowired(required = false)
-    private MqttGateway mqttGateway;
+    @Resource
+    private MqttOutConfig.MqttGateway mqttGateway;
 
     private SnowflakeIdGenerator idGenerator;
 

+ 69 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/alarm/AlarmMessage1VO.java

@@ -0,0 +1,69 @@
+package com.usky.cdi.service.vo.alarm;
+
+import lombok.Data;
+
+@Data
+public class AlarmMessage1VO {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 数据包ID
+     */
+    private Long dataPacketID;
+
+    /**
+     * 人防工程ID
+     */
+    private Long engineeringID;
+
+    /**
+     * 事件ID
+     */
+    private Integer alarmID;
+
+    /**
+     * 事件来源
+     */
+    private Integer alarmSource;
+
+    /**
+     * 物联设施ID
+     */
+    private Integer sensorID;
+
+    /**
+     * 事件类型
+     */
+    private String alarmType;
+
+    /**
+     * 事件状态
+     */
+    private Integer alarmStatus;
+
+    /**
+     * 最新水浸状态
+     */
+    private Integer sensorValue;
+
+    /**
+     * 事件发生/更新时间
+     */
+    private String alarmUpdateTime;
+
+    /**
+     * 监测对象编号
+     */
+    private String monitorObjNo;
+
+    /**
+     * 事件描述
+     */
+    private String alarmDesc;
+
+    /**
+     * 上报时间
+     */
+    private String publishTime;
+
+}

+ 74 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/alarm/AlarmMessageVO.java

@@ -0,0 +1,74 @@
+package com.usky.cdi.service.vo.alarm;
+
+import lombok.Data;
+
+@Data
+public class AlarmMessageVO {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 数据包ID
+     */
+    private Long dataPacketID;
+
+    /**
+     * 人防工程ID
+     */
+    private Long engineeringID;
+
+    /**
+     * 事件ID
+     */
+    private Integer alarmID;
+
+    /**
+     * 事件来源
+     */
+    private Integer alarmSource;
+
+    /**
+     * 物联设施ID
+     */
+    private Integer sensorID;
+
+    /**
+     * 事件类型
+     */
+    private String alarmType;
+
+    /**
+     * 事件状态
+     */
+    private Integer alarmStatus;
+
+    /**
+     * 最新水浸状态
+     */
+    private Double sensorValue;
+
+    /**
+     * 告警阈值
+     */
+    private Double thresholding;
+
+    /**
+     * 事件发生/更新时间
+     */
+    private String alarmUpdateTime;
+
+    /**
+     * 监测对象编号
+     */
+    private String monitorObjNo;
+
+    /**
+     * 事件描述
+     */
+    private String alarmDesc;
+
+    /**
+     * 上报时间
+     */
+    private String publishTime;
+
+}

+ 161 - 0
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/base/FacilityDeviceVO.java

@@ -0,0 +1,161 @@
+package com.usky.cdi.service.vo.base;
+
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 楼层平面图信息VO
+ * Topic: base/floorPlane
+ * 
+ * @author han
+ * @date 2025/03/20
+ */
+@Data
+public class FacilityDeviceVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+
+    /**
+     * 设施编号
+     */
+    private String facilityNum;
+
+    /**
+     * 设施名称
+     */
+    private String facilityName;
+
+    /**
+     * 设施类型
+     */
+    private String facilityType;
+
+    /**
+     * 所属楼层
+     */
+    private String floor;
+
+    /**
+     * 安装位置
+     */
+    private String address;
+
+    /**
+     * 图⽚地址URL
+     */
+    private String imagesUrl;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 联系人
+     */
+    private String contact;
+
+    /**
+     * 联系方式
+     */
+    private String contactPhone;
+
+    /**
+     * 平面X轴坐标
+     */
+    private String planeX;
+
+    /**
+     * 平面Y轴坐标
+     */
+    private String planeY;
+
+    private String coordinateX;
+
+    private String coordinateY;
+
+    private String coordinateZ;
+
+    /**
+     * 删除标识
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 组织结构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 建筑设施备注
+     */
+    private String facilityDesc;
+
+    /**
+     * 三维角度X
+     */
+    private Double anglesX;
+
+    /**
+     * 三维角度y
+     */
+    private Double anglesY;
+
+    /**
+     * 三维角度z
+     */
+    private Double anglesZ;
+
+    /**
+     * 三维图标大小
+     */
+    private Double scaleL;
+
+    /**
+     * 三维图标大小
+     */
+    private Double scaleW;
+
+    /**
+     * 三维图标大小
+     */
+    private Double scaleH;
+
+    /**
+     * 设备类型
+     */
+    private Integer deviceType;
+
+    /**
+     * 设备UUID
+     */
+    private String deviceUuid;
+}
+

+ 6 - 6
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/vo/base/SensorInfoVO.java

@@ -70,18 +70,18 @@ public class SensorInfoVO implements Serializable {
     private Long floorFileID;
 
     /**
-     * 设施在平面图的X轴坐标
+     * 上报时间
      */
-    private Integer xCoordinate;
+    private String publishTime;
 
     /**
-     * 设施在平面图的Y轴坐标
+     * 设施在平面图的X轴坐标
      */
-    private Integer yCoordinate;
+    private Long x;
 
     /**
-     * 上报时间
+     * 设施在平面图的Y轴坐标
      */
-    private String publishTime;
+    private Long y;
 }
 

+ 38 - 0
service-cdi/service-cdi-biz/src/main/resources/mapper/cdi/BaseBuildFacilityMapper.xml

@@ -0,0 +1,38 @@
+<?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.usky.cdi.mapper.BaseBuildFacilityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.cdi.domain.BaseBuildFacility">
+        <id column="id" property="id" />
+        <result column="facility_num" property="facilityNum" />
+        <result column="facility_name" property="facilityName" />
+        <result column="facility_type" property="facilityType" />
+        <result column="floor" property="floor" />
+        <result column="address" property="address" />
+        <result column="images_url" property="imagesUrl" />
+        <result column="device_id" property="deviceId" />
+        <result column="contact" property="contact" />
+        <result column="contact_phone" property="contactPhone" />
+        <result column="plane_x" property="planeX" />
+        <result column="plane_y" property="planeY" />
+        <result column="coordinate_x" property="coordinateX" />
+        <result column="coordinate_y" property="coordinateY" />
+        <result column="coordinate_z" property="coordinateZ" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_by" property="createBy" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="facility_desc" property="facilityDesc" />
+        <result column="angles_x" property="anglesX" />
+        <result column="angles_y" property="anglesY" />
+        <result column="angles_z" property="anglesZ" />
+        <result column="scale_l" property="scaleL" />
+        <result column="scale_w" property="scaleW" />
+        <result column="scale_h" property="scaleH" />
+    </resultMap>
+
+</mapper>