diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/RegisEquipReceiverMessageHandler.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/RegisEquipReceiverMessageHandler.java index 691abbef..bd33c2c5 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/RegisEquipReceiverMessageHandler.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/RegisEquipReceiverMessageHandler.java @@ -1,12 +1,21 @@ package com.fuyuanshen.global.mqtt.receiver; import cn.hutool.core.lang.Dict; +import cn.hutool.json.JSONObject; import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.json.utils.JsonUtils; import com.fuyuanshen.common.redis.utils.RedisUtils; +import com.fuyuanshen.equipment.domain.Device; +import com.fuyuanshen.equipment.domain.DeviceType; +import com.fuyuanshen.equipment.domain.form.DeviceForm; +import com.fuyuanshen.equipment.domain.query.DeviceTypeQueryCriteria; +import com.fuyuanshen.equipment.mapper.DeviceMapper; +import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; +import com.fuyuanshen.equipment.service.DeviceService; import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext; import com.fuyuanshen.global.mqtt.base.NewMqttRuleEngine; +import com.fuyuanshen.global.mqtt.config.MqttGateway; import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; import com.fuyuanshen.global.queue.MqttMessageQueueConstants; import lombok.extern.slf4j.Slf4j; @@ -22,6 +31,9 @@ import java.util.Objects; import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; +/** + * 注册设备消息接收处理 + */ @Service @Slf4j public class RegisEquipReceiverMessageHandler implements MessageHandler { @@ -29,23 +41,103 @@ public class RegisEquipReceiverMessageHandler implements MessageHandler { @Autowired private NewMqttRuleEngine newRuleEngine; + @Autowired + private MqttGateway mqttGateway; + + + @Autowired + private DeviceMapper deviceMapper; + @Autowired + private DeviceService deviceService; + + @Autowired + private DeviceTypeMapper deviceTypeMapper; + + @Override public void handleMessage(Message message) throws MessagingException { Object payload = message.getPayload(); MessageHeaders headers = message.getHeaders(); String receivedTopic = Objects.requireNonNull(headers.get("mqtt_receivedTopic")).toString(); + + // 只处理 regis/equip/# 主题的消息 + if (!receivedTopic.startsWith("regis/equip/")) { + return; + } + + // 从主题中提取设备ID + String[] topicParts = receivedTopic.split("/"); + if (topicParts.length < 3) { + log.warn("Invalid topic format: {}", receivedTopic); + return; + } + String deviceTypeName = topicParts[2]; // HBY100-J + String receivedQos = Objects.requireNonNull(headers.get("mqtt_receivedQos")).toString(); String timestamp = Objects.requireNonNull(headers.get("timestamp")).toString(); log.info("MQTT3 payload= {} \n receivedTopic = {} \n receivedQos = {} \n timestamp = {}", payload, receivedTopic, receivedQos, timestamp); + // 解析JSON payload获取imei和mac Dict payloadDict = JsonUtils.parseMap(payload.toString()); - if (receivedTopic == null || payloadDict == null) { + if (payloadDict == null) { + log.warn("Failed to parse payload JSON"); return; } + String imei = payloadDict.getStr("imei"); + String mac = payloadDict.getStr("mac"); + + log.info("Extracted IMEI: {}, MAC: {}", imei, mac); + + // 验证必要字段 + if (StringUtils.isEmpty(imei) || StringUtils.isEmpty(mac)) { + log.warn("Missing required fields - IMEI: {}, MAC: {}", imei, mac); + return; + } + + DeviceTypeQueryCriteria criteria = new DeviceTypeQueryCriteria(); + criteria.setTypeName(deviceTypeName); + DeviceType deviceType = deviceTypeMapper.queryByName(criteria); + if (deviceType == null) { + log.warn("Device type not found for name: {}", deviceTypeName); + return; + } + + Device device = deviceMapper.selectDeviceByImei(imei); + if (device != null) { + log.warn("Device already exists for IMEI: {}", imei); + return; + } + + // 提取MAC地址后6位 + String macSuffix = mac.replaceAll(":", "").substring(6); // 43:73:43:33:53:33 -> 335333 + // 构建设备名称和蓝牙名称:设备类型+MAC后6位 + String deviceName = deviceTypeName + "-" + macSuffix; // HBY100-335333 + + DeviceForm deviceForm = new DeviceForm(); + deviceForm.setDeviceImei(imei); + deviceForm.setDeviceMac(mac); + deviceForm.setDeviceName(deviceName); + deviceForm.setBluetoothName(deviceName); + deviceForm.setDeviceType(deviceType.getId()); + + try { + deviceService.addDevice(deviceForm); + } catch (Exception e) { + throw new RuntimeException(e); + } + + // 解析原始JSON数据 + JSONObject originalData = new JSONObject(); + originalData.put("code", 200); + // 发送到MQTT + String topic = "regis/" + imei; + mqttGateway.sendMsgToMqtt(topic, originalData.toString()); } + + } diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java index 38dc53bd..c883cee2 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java @@ -209,6 +209,20 @@ public class DeviceServiceImpl extends ServiceImpl impleme DeviceTypeGrants typeGrants = new DeviceTypeGrants(); + // 修改为: + Long userId; + LoginUser loginUser; + try { + loginUser = LoginHelper.getLoginUser(); + userId = loginUser != null ? loginUser.getUserId() : 1938143703108689922L; // 如果没有登录用户,使用默认系统用户ID + } catch (Exception e) { + userId = 1938143703108689922L; // 出现异常时使用默认系统用户ID + loginUser = new LoginUser(); + loginUser.setUserId(userId); + loginUser.setNickname("admin"); + loginUser.setTenantId("894078"); // 设置租户ID + } + if (deviceForm.getDeviceType() != null) { DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria(); queryCriteria.setDeviceTypeId(deviceForm.getDeviceType()); @@ -281,8 +295,8 @@ public class DeviceServiceImpl extends ServiceImpl impleme throw new RuntimeException("设备类型名称已存在,无法新增!!!"); } - LoginUser loginUser = LoginHelper.getLoginUser(); newDeviceType.setCreateByName(loginUser.getNickname()); + newDeviceType.setTenantId(loginUser.getTenantId()); deviceTypeMapper.insert(newDeviceType); // 重新查询确保获取到正确的ID @@ -294,6 +308,7 @@ public class DeviceServiceImpl extends ServiceImpl impleme deviceTypeGrants.setCustomerId(loginUser.getUserId()); deviceTypeGrants.setGrantorCustomerId(loginUser.getUserId()); deviceTypeGrants.setGrantedAt(new Date()); + deviceTypeGrants.setTenantId(loginUser.getTenantId()); deviceTypeGrantsMapper.insert(deviceTypeGrants); } @@ -318,13 +333,13 @@ public class DeviceServiceImpl extends ServiceImpl impleme BeanUtil.copyProperties(deviceForm, device, true); device.setDeviceNo(createDeviceNo()); - LoginUser loginUser = LoginHelper.getLoginUser(); device.setCurrentOwnerId(loginUser.getUserId()); device.setOriginalOwnerId(loginUser.getUserId()); device.setCreateByName(loginUser.getNickname()); device.setTypeName(deviceType.getTypeName()); device.setDeviceType(deviceType.getId()); device.setDevicePic(deviceType.getDevicePic()); + device.setTenantId(loginUser.getTenantId()); if (device.getDeviceImei() != null) { device.setPubTopic("A/" + device.getDeviceImei()); device.setSubTopic("B/" + device.getDeviceImei()); @@ -336,7 +351,7 @@ public class DeviceServiceImpl extends ServiceImpl impleme // 查询设备类型的文件列表 // 4. 核心优化:同步设备类型的文件列表 (一行代码) appBusinessFileService.cloneFiles(deviceType.getId(), device.getId()); - //同步设备类型的视频列表 + // 同步设备类型的视频列表 appOperationVideoService.cloneFiles(deviceType.getId(), device.getId()); // 新增设备类型记录 @@ -351,10 +366,12 @@ public class DeviceServiceImpl extends ServiceImpl impleme assignments.setActive(DeviceActiveStatusEnum.ACTIVE.getCode()); String lever = USER_ID_SEPARATOR + loginUser.getUserId(); assignments.setLever(lever); + assignments.setTenantId(loginUser.getTenantId()); deviceAssignmentsService.save(assignments); } + private String createDeviceNo() { String uuidStr = UUID.fastUUID().toString(); // 获取带 - 的标准格式字符串 return uuidStr.replaceAll("-", "");