feat(rocketmq): 添加仪表记录消费者和生产者服务

This commit is contained in:
2025-08-26 20:32:51 +08:00
parent 638a98a4c6
commit b20828a800
16 changed files with 407 additions and 28 deletions

View File

@@ -125,6 +125,11 @@
<artifactId>ruoyi-common-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>

View File

@@ -47,7 +47,7 @@ public class TbLightInfoBo extends BaseEntity {
/**
* 楼层ID
*/
@NotNull(message = "层ID不能为空", groups = {AddGroup.class, EditGroup.class})
@NotNull(message = "层ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long floorId;
/**

View File

@@ -9,6 +9,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 水电气业务对象 tb_meter_info
*
@@ -23,7 +25,7 @@ public class TbMeterInfoBo extends BaseEntity {
/**
* 主键id
*/
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
@NotNull(message = "主键id不能为空", groups = {EditGroup.class})
private Long id;
/**
@@ -44,15 +46,42 @@ public class TbMeterInfoBo extends BaseEntity {
/**
* 设备类型(1-电表2-水表3-气表)
*/
@NotNull(message = "设备类型(1-电表2-水表3-气表)不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "设备类型(1-电表2-水表3-气表)不能为空", groups = {AddGroup.class, EditGroup.class})
private Long meterType;
/**
* 计量单位(1-度2-吨3-立方米)
*/
@NotNull(message = "计量单位(1-度2-吨3-立方米)不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "计量单位(1-度2-吨3-立方米)不能为空", groups = {AddGroup.class, EditGroup.class})
private Long meterUnit;
/**
* 采集器IP
*/
@NotNull(message = "采集器IP不能为空", groups = {AddGroup.class, EditGroup.class})
private String hostIp;
/**
* 楼层ID
*/
@NotNull(message = "楼层ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long floorId;
/**
* 园区编码
*/
private Long communityId;
/**
* 建筑名称
*/
private Long buildingId;
/**
* 单元编码
*/
private Long unitId;
/**
* 安装位置
*/
@@ -61,12 +90,12 @@ public class TbMeterInfoBo extends BaseEntity {
/**
* 初始读数
*/
private Long initReading;
private BigDecimal initReading;
/**
* 最大量程
*/
private Long maxRang;
private BigDecimal maxRang;
/**
* 通信状态

View File

@@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 水电气对象 tb_meter_info
@@ -60,12 +61,12 @@ public class TbMeterInfo extends TenantEntity {
/**
* 初始读数
*/
private Long initReading;
private BigDecimal initReading;
/**
* 最大量程
*/
private Long maxRang;
private BigDecimal maxRang;
/**
* 通信状态
@@ -82,5 +83,30 @@ public class TbMeterInfo extends TenantEntity {
*/
private String remark;
/**
* 园区编码
*/
private Long communityId;
/**
* 建筑名称
*/
private Long buildingId;
/**
* 单元编码
*/
private Long unitId;
/**
* 所属楼层ID
*/
private Long floorId;
/**
* 采集器IP
*/
private String hostIp;
}

View File

@@ -10,7 +10,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
@@ -54,7 +54,7 @@ public class TbMeterInfoVo implements Serializable {
/**
* 设备类型(1-电表2-水表3-气表)
*/
@ExcelProperty(value = "设备类型(1-电表2-水表3-气表)" ,converter = ExcelDictConvert.class)
@ExcelProperty(value = "设备类型(1-电表2-水表3-气表)", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "meter_type")
private Long meterType;
@@ -75,13 +75,13 @@ public class TbMeterInfoVo implements Serializable {
* 初始读数
*/
@ExcelProperty(value = "初始读数")
private Long initReading;
private BigDecimal initReading;
/**
* 最大量程
*/
@ExcelProperty(value = "最大量程")
private Long maxRang;
private BigDecimal maxRang;
/**
* 通信状态
@@ -97,6 +97,42 @@ public class TbMeterInfoVo implements Serializable {
@ExcelDictFormat(dictType = "sis_device_status")
private Long runningState;
/**
* 园区编码
*/
@ExcelProperty(value = "园区编码")
private Long communityId;
/**
* 建筑名称
*/
@ExcelProperty(value = "建筑名称")
private Long buildingId;
/**
* 单元编码
*/
@ExcelProperty(value = "单元编码")
private Long unitId;
/**
* 楼层ID
*/
@ExcelProperty(value = "楼层ID")
private Long floorId;
/**
* 楼层
*/
@ExcelProperty(value = "楼层")
private String floorName;
/**
* 采集器IP
*/
@ExcelProperty(value = "采集器IP")
private String hostIp;
/**
* 备注
*/

View File

@@ -1,5 +1,6 @@
package org.dromara.property.mapper.smartDevicesMapper;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.property.domain.entity.smartDevices.TbMeterInfo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -8,8 +9,9 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
* 水电气Mapper接口
*
* @author lsm
* @date 2025-07-19
* @since 2025-07-19
*/
@Mapper
public interface TbMeterInfoMapper extends BaseMapperPlus<TbMeterInfo, TbMeterInfoVo> {
}

View File

@@ -0,0 +1,18 @@
package org.dromara.property.rocketmq;
/**
* @author lsm
* @apiNote RocketMqConstants
* @since 2025/8/25
*/
public interface RocketMqConstants {
// mq topic
String TOPIC = "SmartParks";
// mq GROUP
String GROUP = "Meter-Group";
/*-----------------------------------消息tag------------------------------------*/
String METER_RECORD = "METER_RECORD_TAG";
}

View File

@@ -0,0 +1,40 @@
package org.dromara.property.rocketmq.consumer;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.dromara.property.rocketmq.RocketMqConstants;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* @author lsm
* @apiNote MeterRecordConsumer
* @since 2025/8/25
*/
@Slf4j
@Component
@RequiredArgsConstructor
@RocketMQMessageListener(
topic = RocketMqConstants.TOPIC,
consumerGroup = RocketMqConstants.GROUP,
selectorExpression = RocketMqConstants.METER_RECORD
)
public class MeterRecordConsumer implements RocketMQListener<MessageExt> {
@Override
public void onMessage(MessageExt ext) {
log.info("消费仪表上报数据,数据长度={}", ext.getBody().length);
try {
String message = new String(ext.getBody());
log.info("物业仪表上报数据,数据={}", message);
} catch (Exception e) {
log.error("消费仪表上报数据处理失败,", e);
}
}
}

View File

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.property.domain.bo.TbFloorBo;
import org.dromara.property.domain.vo.TbFloorVo;
import org.dromara.property.service.ITbFloorService;
import org.springframework.stereotype.Service;
@@ -23,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 灯控开关信息Service业务层处理
@@ -60,7 +62,19 @@ public class TbLightInfoServiceImpl implements ITbLightInfoService {
public TableDataInfo<TbLightInfoVo> queryPageList(TbLightInfoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TbLightInfo> lqw = buildQueryWrapper(bo);
Page<TbLightInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
result.getRecords().forEach(r -> r.setFloorName(floorService.queryById(r.getFloorId()).getFloorName()));
// 创建楼层ID到楼层名称的映射避免重复查询
List<TbFloorVo> floorVo = floorService.queryList(new TbFloorBo());
Map<Long, String> floorMap = floorVo.stream()
.collect(Collectors.toMap(TbFloorVo::getId, TbFloorVo::getFloorName, (key1, key2) -> key1));
// 为每个灯控信息设置楼层名称
result.getRecords().forEach(record -> {
String floorName = floorMap.get(record.getFloorId());
if (floorName != null) {
record.setFloorName(floorName);
}
});
return TableDataInfo.build(result);
}
@@ -151,7 +165,7 @@ public class TbLightInfoServiceImpl implements ITbLightInfoService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean switchSingleLight(TbLightInfoBo bo){
public Boolean switchSingleLight(TbLightInfoBo bo) {
TbLightInfo update = MapstructUtils.convert(bo, TbLightInfo.class);
boolean flag = baseMapper.updateById(update) > 0;
Assert.isTrue(flag, "修改灯开关失败");

View File

@@ -1,5 +1,6 @@
package org.dromara.property.service.impl.smartDevicesImpl;
import cn.hutool.core.lang.Assert;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -9,16 +10,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.property.domain.bo.TbFloorBo;
import org.dromara.property.domain.vo.TbFloorVo;
import org.dromara.property.service.ITbFloorService;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterInfoBo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
import org.dromara.property.domain.entity.smartDevices.TbMeterInfo;
import org.dromara.property.mapper.smartDevicesMapper.TbMeterInfoMapper;
import org.dromara.property.service.smartDevicesService.ITbMeterInfoService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 水电气Service业务层处理
@@ -27,11 +33,12 @@ import java.util.Collection;
* @since 2025-07-19
*/
@Slf4j
@RequiredArgsConstructor
@Service
@RequiredArgsConstructor
public class TbMeterInfoServiceImpl implements ITbMeterInfoService {
private final TbMeterInfoMapper baseMapper;
private final ITbFloorService floorService;
/**
* 查询水电气
@@ -40,7 +47,7 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService {
* @return 水电气
*/
@Override
public TbMeterInfoVo queryById(Long id){
public TbMeterInfoVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -55,6 +62,19 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService {
public TableDataInfo<TbMeterInfoVo> queryPageList(TbMeterInfoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TbMeterInfo> lqw = buildQueryWrapper(bo);
Page<TbMeterInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 创建楼层ID到楼层名称的映射避免重复查询
List<TbFloorVo> floorList = floorService.queryList(new TbFloorBo());
Map<Long, String> floorMap = floorList.stream()
.collect(Collectors.toMap(TbFloorVo::getId, TbFloorVo::getFloorName, (key1, key2) -> key1));
// 为每个灯控信息设置楼层名称
result.getRecords().forEach(record -> {
String floorName = floorMap.get(record.getFloorId());
if (floorName != null) {
record.setFloorName(floorName);
}
});
return TableDataInfo.build(result);
}
@@ -94,13 +114,15 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService {
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(TbMeterInfoBo bo) {
TbMeterInfo add = MapstructUtils.convert(bo, TbMeterInfo.class);
validEntityBeforeSave(add);
assert add != null;
TbFloorVo floor = floorService.queryById(add.getFloorId());
add.setBuildingId(floor.getBuildingId());
add.setCommunityId(floor.getCommunityId());
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
Assert.isTrue(flag, "新增水电气信息失败");
return flag;
}
@@ -120,7 +142,7 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService {
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(TbMeterInfo entity){
private void validEntityBeforeSave(TbMeterInfo entity) {
//TODO 做一些数据校验,如唯一约束
}
@@ -133,7 +155,7 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;