diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java index abbd4fc..c82e6a0 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -54,10 +54,7 @@ public class AjaxResult extends HashMap { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); - if (StringUtils.isNotNull(data)) - { - super.put(DATA_TAG, data); - } + super.put(DATA_TAG, data); } /** diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/mybatis/typehandler/NonNullIntegerTyperHandler.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/mybatis/typehandler/NonNullIntegerTyperHandler.java index 8cadcc6..1d74bee 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/mybatis/typehandler/NonNullIntegerTyperHandler.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/mybatis/typehandler/NonNullIntegerTyperHandler.java @@ -1,13 +1,13 @@ package com.ruoyi.common.mybatis.typehandler; -import org.apache.ibatis.type.BaseTypeHandler; -import org.apache.ibatis.type.JdbcType; - import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + /** * 非空Integer类型处理器,为空时,返回0 * @author wjh diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java index c1bc9d1..4398352 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java @@ -1,14 +1,15 @@ package com.ruoyi.bst.device.domain; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + /** * 设备对象 bst_device * @@ -34,13 +35,17 @@ public class Device extends BaseEntity @ApiModelProperty("在线状态") private String onlineStatus; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "最后在线时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("最后在线时间") - private Date lastOnlineTime; + private LocalDateTime lastOnlineTime; @Excel(name = "最新数据") @ApiModelProperty("最新数据") private String dataPoints; + @Excel(name = "备注") + @ApiModelProperty("备注") + private String remark; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java index e42c017..28b83a6 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java @@ -8,4 +8,6 @@ public class DeviceQuery extends DeviceVO { // 精准设备MAC private String eqMac; + // MAC前缀 + private String macPrefix; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java index e10af5f..36a9adb 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java @@ -4,5 +4,10 @@ import lombok.Data; @Data public class DeviceVO extends Device { + + // 在线网关数 + private Integer onlineGatewayCount; + // 离线网关数 + private Integer offlineGatewayCount; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java index f3db751..68a8897 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java @@ -1,11 +1,13 @@ package com.ruoyi.bst.device.mapper; import java.util.List; -import com.ruoyi.bst.device.domain.Device; -import com.ruoyi.bst.device.domain.DeviceVO; -import com.ruoyi.bst.device.domain.DeviceQuery; + import org.apache.ibatis.annotations.Param; +import com.ruoyi.bst.device.domain.Device; +import com.ruoyi.bst.device.domain.DeviceQuery; +import com.ruoyi.bst.device.domain.DeviceVO; + /** * 设备Mapper接口 * @@ -71,4 +73,12 @@ public interface DeviceMapper * @return 结果 */ public int deleteDeviceByIds(Long[] ids); + + /** + * 查询设备MAC列表 + * + * @param query 设备查询条件 + * @return 设备MAC列表 + */ + List selectMacList(@Param("query") DeviceQuery query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml index a61859f..5c99e01 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml @@ -14,7 +14,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bd.create_time, bd.online_status, bd.last_online_time, - bd.data_points + bd.data_points, + bd.remark from bst_device bd @@ -24,6 +25,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bd.type = #{query.type} and bd.online_status = #{query.onlineStatus} and bd.mac = #{query.eqMac} + and bd.remark like concat('%', #{query.remark}, '%') + and bd.mac like concat(#{query.macPrefix}, '%') ${query.params.dataScope} @@ -48,6 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" online_status, last_online_time, data_points, + remark, #{mac}, @@ -56,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{onlineStatus}, #{lastOnlineTime}, #{dataPoints}, + #{remark}, @@ -74,6 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" online_status = #{data.onlineStatus}, last_online_time = #{data.lastOnlineTime}, data_points = #{data.dataPoints}, + remark = #{data.remark}, @@ -86,4 +92,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceAssembler.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceAssembler.java new file mode 100644 index 0000000..67525b2 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceAssembler.java @@ -0,0 +1,14 @@ +package com.ruoyi.bst.device.service; + +import java.util.List; + +import com.ruoyi.bst.device.domain.DeviceVO; + +public interface DeviceAssembler { + + /** + * 组装关联网关数 + */ + void assembleGatewayCount(List list); + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceConverter.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceConverter.java new file mode 100644 index 0000000..5a9ee57 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceConverter.java @@ -0,0 +1,5 @@ +package com.ruoyi.bst.device.service; + +public interface DeviceConverter { + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java index dd4e1bf..726d5e1 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java @@ -68,4 +68,11 @@ public interface DeviceService * @return 设备 */ public DeviceVO selectDeviceByMac(String mac); + + /** + * 根据数据点查询相似的设备MAC + * @param macPrefix MAC前缀 + * @return 设备MAC + */ + public String selectOneMacByPrefix(String macPrefix); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceAssemblerImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceAssemblerImpl.java new file mode 100644 index 0000000..a015aca --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceAssemblerImpl.java @@ -0,0 +1,58 @@ +package com.ruoyi.bst.device.service.impl; + +import java.util.List; +import java.util.Objects; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.ruoyi.bst.device.domain.DeviceVO; +import com.ruoyi.bst.device.service.DeviceAssembler; +import com.ruoyi.bst.gateway.domain.enums.GatewayOnlineStatus; +import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceQuery; +import com.ruoyi.bst.gatewayDevice.domain.vo.GatewayStatusCountGroupByDeviceVO; +import com.ruoyi.bst.gatewayDevice.service.GatewayDeviceDashboard; +import com.ruoyi.common.utils.collection.CollectionUtils; + +@Service +public class DeviceAssemblerImpl implements DeviceAssembler { + + @Autowired + private GatewayDeviceDashboard gatewayDeviceDashboard; + + @Override + public void assembleGatewayCount(List list) { + if (CollectionUtils.isEmptyElement(list)) { + return; + } + + GatewayDeviceQuery query = new GatewayDeviceQuery(); + query.setDeviceIds(CollectionUtils.map(list, DeviceVO::getId)); + List statusList = gatewayDeviceDashboard.selectGatewayStatusCountGroupByDevice(query); + + for (DeviceVO device : list) { + // 在线网关数 + GatewayStatusCountGroupByDeviceVO onlineStatus = statusList.stream() + .filter(status -> Objects.equals(status.getDeviceId(), device.getId()) + && GatewayOnlineStatus.ONLINE.getCode().equals(status.getGatewayOnlineStatus())) + .findFirst().orElse(null); + if (onlineStatus != null) { + device.setOnlineGatewayCount(onlineStatus.getCount()); + } else { + device.setOnlineGatewayCount(0); + } + + // 离线网关数 + GatewayStatusCountGroupByDeviceVO offlineStatus = statusList.stream() + .filter(status -> Objects.equals(status.getDeviceId(), device.getId()) + && GatewayOnlineStatus.OFFLINE.getCode().equals(status.getGatewayOnlineStatus())) + .findFirst().orElse(null); + if (offlineStatus != null) { + device.setOfflineGatewayCount(offlineStatus.getCount()); + } else { + device.setOfflineGatewayCount(0); + } + } + } + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceConverterImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceConverterImpl.java new file mode 100644 index 0000000..959154d --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceConverterImpl.java @@ -0,0 +1,10 @@ +package com.ruoyi.bst.device.service.impl; + +import org.springframework.stereotype.Service; + +import com.ruoyi.bst.device.service.DeviceConverter; + +@Service +public class DeviceConverterImpl implements DeviceConverter { + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java index 164284b..4f08908 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java @@ -12,7 +12,9 @@ import com.ruoyi.bst.gateway.service.GatewayIotService; import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceQuery; import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceVO; import com.ruoyi.bst.gatewayDevice.service.GatewayDeviceService; +import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.iot.domain.response.CommandResponse; import com.ruoyi.iot.util.IotUtil; @@ -27,21 +29,24 @@ public class DeviceIotServiceImpl implements DeviceIotService { @Override public CommandResponse autoSend(DeviceSendDTO dto) { - if (dto == null || StringUtils.isBlank(dto.getMac()) || StringUtils.isBlank(dto.getCommand())) { - return null; - } + ServiceUtil.assertion(dto == null, "参数不能为空"); + ServiceUtil.assertion(StringUtils.isBlank(dto.getMac()), "mac不能为空"); + ServiceUtil.assertion(StringUtils.isBlank(dto.getCommand()), "命令不能为空"); + // 尝试次数(默认1次) int tryCount = dto.getTryCount() == null ? 1 : dto.getTryCount(); // 查询设备关联的网关 - // TODO 按照优先级排序(到时候找个方法来做优先级) PageHelper.startPage(1, tryCount); + // 排序优先级 最近心跳时间 > 网关最近在线时间 > 网关在线状态 + PageHelper.orderBy("last_heart_time desc, gateway_last_online_time desc, gateway_online_status desc"); GatewayDeviceQuery query = new GatewayDeviceQuery(); query.setEqDeviceMac(dto.getMac()); List gatewayDeviceList = gatewayDeviceService.selectGatewayDeviceList(query); // 发送命令 CommandResponse res = null; + ServiceUtil.assertion(CollectionUtils.isEmpty(gatewayDeviceList), "当前设备未关联网关"); for (GatewayDeviceVO vo : gatewayDeviceList) { res = gatewayIotService.send(vo.getGatewayMac(), vo.getDeviceMac(), dto.getCommand(), dto.getTimeout()); // 若发送成功,则直接返回 @@ -52,5 +57,5 @@ public class DeviceIotServiceImpl implements DeviceIotService { return res; } - + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java index e6258cd..cf63ccf 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java @@ -115,4 +115,16 @@ public class DeviceServiceImpl implements DeviceService List list = deviceMapper.selectDeviceList(query); return CollectionUtils.firstElement(list); } + + @Override + public String selectOneMacByPrefix(String macPrefix) { + if (StringUtils.isBlank(macPrefix)) { + return null; + } + PageHelper.startPage(1, 1); + DeviceQuery query = new DeviceQuery(); + query.setMacPrefix(macPrefix); + List list = deviceMapper.selectMacList(query); + return CollectionUtils.firstElement(list); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLog.java b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLog.java new file mode 100644 index 0000000..eff8fdd --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLog.java @@ -0,0 +1,47 @@ +package com.ruoyi.bst.dsLog.domain; + +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 数据日志对象 bst_ds_log + * + * @author ruoyi + * @date 2025-04-18 + */ +@Data +public class DsLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private Long id; + + @Excel(name = "网关MAC") + @ApiModelProperty("网关MAC") + private String gatewayMac; + + @Excel(name = "实际设备MAC") + @ApiModelProperty("实际设备MAC") + private String deviceMac; + + @Excel(name = "数据点") + @ApiModelProperty("数据点") + private String ds; + + @Excel(name = "数据") + @ApiModelProperty("数据") + private String data; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "上报时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("上报时间") + private LocalDateTime at; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLogQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLogQuery.java new file mode 100644 index 0000000..6aad1bd --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLogQuery.java @@ -0,0 +1,8 @@ +package com.ruoyi.bst.dsLog.domain; + +import lombok.Data; + +@Data +public class DsLogQuery extends DsLogVO { + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLogVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLogVO.java new file mode 100644 index 0000000..3d8d84c --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/domain/DsLogVO.java @@ -0,0 +1,8 @@ +package com.ruoyi.bst.dsLog.domain; + +import lombok.Data; + +@Data +public class DsLogVO extends DsLog { + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/mapper/DsLogMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/mapper/DsLogMapper.java new file mode 100644 index 0000000..7b74328 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/mapper/DsLogMapper.java @@ -0,0 +1,74 @@ +package com.ruoyi.bst.dsLog.mapper; + +import java.util.List; +import com.ruoyi.bst.dsLog.domain.DsLog; +import com.ruoyi.bst.dsLog.domain.DsLogVO; +import com.ruoyi.bst.dsLog.domain.DsLogQuery; +import org.apache.ibatis.annotations.Param; + +/** + * 数据日志Mapper接口 + * + * @author ruoyi + * @date 2025-04-18 + */ +public interface DsLogMapper +{ + /** + * 查询数据日志 + * + * @param id 数据日志主键 + * @return 数据日志 + */ + DsLogVO selectDsLogById(Long id); + + /** + * 查询数据日志列表 + * + * @param query 数据日志 + * @return 数据日志集合 + */ + List selectDsLogList(@Param("query")DsLogQuery query); + + /** + * 新增数据日志 + * + * @param dsLog 数据日志 + * @return 结果 + */ + int insertDsLog(DsLog dsLog); + + /** + * 批量新增数据日志 + */ + int batchInsert(@Param("list") List list); + + /** + * 批量修改数据日志 + */ + int batchUpdate(@Param("list") List list); + + /** + * 修改数据日志 + * + * @param dsLog 数据日志 + * @return 结果 + */ + public int updateDsLog(@Param("data") DsLog dsLog); + + /** + * 删除数据日志 + * + * @param id 数据日志主键 + * @return 结果 + */ + int deleteDsLogById(Long id); + + /** + * 批量删除数据日志 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDsLogByIds(Long[] ids); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/mapper/DsLogMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/mapper/DsLogMapper.xml new file mode 100644 index 0000000..264bbf8 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/mapper/DsLogMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + select + bdl.id, + bdl.gateway_mac, + bdl.device_mac, + bdl.ds, + bdl.data, + bdl.at + from bst_ds_log bdl + + + + and bdl.id = #{query.id} + and bdl.gateway_mac like concat('%', #{query.gatewayMac}, '%') + and bdl.device_mac like concat('%', #{query.deviceMac}, '%') + and bdl.ds like concat('%', #{query.ds}, '%') + ${query.params.dataScope} + + + + + + + + insert into bst_ds_log + + gateway_mac, + device_mac, + ds, + data, + at, + + + #{gatewayMac}, + #{deviceMac}, + #{ds}, + #{data}, + #{at}, + + + + + insert into bst_ds_log + + gateway_mac, + device_mac, + ds, + data, + at, + + values + + + #{i.gatewayMac}, + default, + #{i.deviceMac}, + default, + #{i.ds}, + default, + #{i.data}, + default, + #{i.at}, + default, + + + + + + update bst_ds_log + + + + where id = #{data.id} + + + + gateway_mac = #{data.gatewayMac}, + device_mac = #{data.deviceMac}, + ds = #{data.ds}, + data = #{data.data}, + at = #{data.at}, + + + + delete from bst_ds_log where id = #{id} + + + + delete from bst_ds_log where id in + + #{id} + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/service/DsLogService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/service/DsLogService.java new file mode 100644 index 0000000..359f0ae --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/service/DsLogService.java @@ -0,0 +1,64 @@ +package com.ruoyi.bst.dsLog.service; + +import java.util.List; + +import com.ruoyi.bst.dsLog.domain.DsLog; +import com.ruoyi.bst.dsLog.domain.DsLogQuery; +import com.ruoyi.bst.dsLog.domain.DsLogVO; + +/** + * 数据日志Service接口 + * + * @author ruoyi + * @date 2025-04-18 + */ +public interface DsLogService +{ + /** + * 查询数据日志 + * + * @param id 数据日志主键 + * @return 数据日志 + */ + public DsLogVO selectDsLogById(Long id); + + /** + * 查询数据日志列表 + * + * @param dsLog 数据日志 + * @return 数据日志集合 + */ + public List selectDsLogList(DsLogQuery dsLog); + + /** + * 新增数据日志 + * + * @param dsLog 数据日志 + * @return 结果 + */ + public int insertDsLog(DsLog dsLog); + + /** + * 修改数据日志 + * + * @param dsLog 数据日志 + * @return 结果 + */ + public int updateDsLog(DsLog dsLog); + + /** + * 批量删除数据日志 + * + * @param ids 需要删除的数据日志主键集合 + * @return 结果 + */ + public int deleteDsLogByIds(Long[] ids); + + /** + * 删除数据日志信息 + * + * @param id 数据日志主键 + * @return 结果 + */ + public int deleteDsLogById(Long id); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/service/impl/DsLogServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/service/impl/DsLogServiceImpl.java new file mode 100644 index 0000000..525a0c6 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/dsLog/service/impl/DsLogServiceImpl.java @@ -0,0 +1,97 @@ +package com.ruoyi.bst.dsLog.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.ruoyi.bst.dsLog.domain.DsLog; +import com.ruoyi.bst.dsLog.domain.DsLogQuery; +import com.ruoyi.bst.dsLog.domain.DsLogVO; +import com.ruoyi.bst.dsLog.mapper.DsLogMapper; +import com.ruoyi.bst.dsLog.service.DsLogService; + +/** + * 数据日志Service业务层处理 + * + * @author ruoyi + * @date 2025-04-18 + */ +@Service +public class DsLogServiceImpl implements DsLogService +{ + @Autowired + private DsLogMapper dsLogMapper; + + /** + * 查询数据日志 + * + * @param id 数据日志主键 + * @return 数据日志 + */ + @Override + public DsLogVO selectDsLogById(Long id) + { + return dsLogMapper.selectDsLogById(id); + } + + /** + * 查询数据日志列表 + * + * @param dsLog 数据日志 + * @return 数据日志 + */ + @Override + public List selectDsLogList(DsLogQuery dsLog) + { + return dsLogMapper.selectDsLogList(dsLog); + } + + /** + * 新增数据日志 + * + * @param dsLog 数据日志 + * @return 结果 + */ + @Override + public int insertDsLog(DsLog dsLog) + { + return dsLogMapper.insertDsLog(dsLog); + } + + /** + * 修改数据日志 + * + * @param dsLog 数据日志 + * @return 结果 + */ + @Override + public int updateDsLog(DsLog dsLog) + { + return dsLogMapper.updateDsLog(dsLog); + } + + /** + * 批量删除数据日志 + * + * @param ids 需要删除的数据日志主键 + * @return 结果 + */ + @Override + public int deleteDsLogByIds(Long[] ids) + { + return dsLogMapper.deleteDsLogByIds(ids); + } + + /** + * 删除数据日志信息 + * + * @param id 数据日志主键 + * @return 结果 + */ + @Override + public int deleteDsLogById(Long id) + { + return dsLogMapper.deleteDsLogById(id); + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/domain/enums/GatewayOnlineStatus.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/domain/enums/GatewayOnlineStatus.java new file mode 100644 index 0000000..bf4c128 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/domain/enums/GatewayOnlineStatus.java @@ -0,0 +1,15 @@ +package com.ruoyi.bst.gateway.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum GatewayOnlineStatus { + + ONLINE("1", "在线"), + OFFLINE("0", "离线"); + + private final String code; + private final String name; +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/mapper/GatewayMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/mapper/GatewayMapper.xml index 679f7af..d95ecfd 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/mapper/GatewayMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/mapper/GatewayMapper.xml @@ -13,7 +13,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bg.online_status, bg.create_time, bg.last_online_time, - bg.imei + bg.imei, + bg.remark from bst_gateway bg @@ -22,6 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bg.mac like concat('%', #{query.mac}, '%') and bg.online_status = #{query.onlineStatus} and bg.imei like concat('%', #{query.imei}, '%') + and bg.remark like concat('%', #{query.remark}, '%') ${query.params.dataScope} @@ -45,6 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time, last_online_time, imei, + remark, #{mac}, @@ -52,6 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createTime}, #{lastOnlineTime}, #{imei}, + #{remark}, @@ -108,6 +112,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + WHEN #{item.id} THEN #{item.remark} + + + WHEN #{item.id} THEN `remark` + + + where id in @@ -129,6 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time = #{data.createTime}, last_online_time = #{data.lastOnlineTime}, imei = #{data.imei}, + remark = #{data.remark}, diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/service/impl/GatewayIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/service/impl/GatewayIotServiceImpl.java index 4cec7a2..b7b04f2 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/service/impl/GatewayIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gateway/service/impl/GatewayIotServiceImpl.java @@ -10,10 +10,12 @@ import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.ruoyi.bst.device.service.DeviceConverter; import com.ruoyi.bst.gateway.domain.Gateway; import com.ruoyi.bst.gateway.domain.GatewayVO; import com.ruoyi.bst.gateway.mapper.GatewayMapper; import com.ruoyi.bst.gateway.service.GatewayIotService; +import com.ruoyi.bst.gatewayDevice.service.GatewayDeviceService; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.iot.constants.IotConstants; @@ -37,6 +39,12 @@ public class GatewayIotServiceImpl implements GatewayIotService { @Autowired private GatewayMapper gatewayMapper; + @Autowired + private DeviceConverter deviceConverter; + + @Autowired + private GatewayDeviceService gatewayDeviceService; + @Override public void refresh(List gatewayList, String onlineType) { if (CollectionUtils.isEmptyElement(gatewayList)) { @@ -59,7 +67,7 @@ public class GatewayIotServiceImpl implements GatewayIotService { .findFirst().orElse(null); this.setIotInfo(gateway, iot); } - + // 异步更新数据库 scheduledExecutorService.schedule(() -> { for (GatewayVO gateway : gatewayList) { diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDevice.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDevice.java index b91fca5..9aec749 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDevice.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDevice.java @@ -21,6 +21,8 @@ public class GatewayDevice extends BaseEntity { private static final long serialVersionUID = 1L; + private Long id; + @Excel(name = "设备MAC") @ApiModelProperty("设备MAC") private String deviceMac; @@ -29,11 +31,13 @@ public class GatewayDevice extends BaseEntity @ApiModelProperty("网关MAC") private String gatewayMac; - private Long id; - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "最后一次心跳时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("最后一次心跳时间") private LocalDateTime lastHeartTime; + @Excel(name = "心跳设置") + @ApiModelProperty("心跳设置") + private Integer heartBeat; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceQuery.java index 13e060d..0eca3c4 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceQuery.java @@ -1,5 +1,7 @@ package com.ruoyi.bst.gatewayDevice.domain; +import java.util.List; + import lombok.Data; @Data @@ -10,4 +12,13 @@ public class GatewayDeviceQuery extends GatewayDeviceVO { // 精准设备MAC private String eqDeviceMac; + + // 网关MAC列表 + private List gatewayMacList; + + // 设备MAC列表 + private List deviceMacList; + + // 设备ID列表 + private List deviceIds; } \ No newline at end of file diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceVO.java index f7bd67f..02f826c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/GatewayDeviceVO.java @@ -1,5 +1,9 @@ package com.ruoyi.bst.gatewayDevice.domain; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + import lombok.Data; @Data @@ -7,10 +11,14 @@ public class GatewayDeviceVO extends GatewayDevice { // 网关ID private Long gatewayId; + // 网关最近在线时间 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime gatewayLastOnlineTime; + // 网关在线状态 + private String gatewayOnlineStatus; // 设备ID private Long deviceId; - // 设备类型 private String deviceType; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/vo/GatewayStatusCountGroupByDeviceVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/vo/GatewayStatusCountGroupByDeviceVO.java new file mode 100644 index 0000000..76c47c7 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/domain/vo/GatewayStatusCountGroupByDeviceVO.java @@ -0,0 +1,17 @@ +package com.ruoyi.bst.gatewayDevice.domain.vo; + +import lombok.Data; + +@Data +public class GatewayStatusCountGroupByDeviceVO { + + // 设备ID + private Long deviceId; + + // 网关在线状态 + private String gatewayOnlineStatus; + + // 数量 + private Integer count; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.java index f387226..4f2c038 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.java @@ -1,11 +1,14 @@ package com.ruoyi.bst.gatewayDevice.mapper; import java.util.List; -import com.ruoyi.bst.gatewayDevice.domain.GatewayDevice; -import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceVO; -import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceQuery; + import org.apache.ibatis.annotations.Param; +import com.ruoyi.bst.gatewayDevice.domain.GatewayDevice; +import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceQuery; +import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceVO; +import com.ruoyi.bst.gatewayDevice.domain.vo.GatewayStatusCountGroupByDeviceVO; + /** * 网关设备Mapper接口 * @@ -71,4 +74,20 @@ public interface GatewayDeviceMapper * @return 结果 */ public int deleteGatewayDeviceByIds(Long[] ids); + + /** + * 根据网关mac和设备mac更新网关设备 + * + * @param data 网关设备 + * @return 结果 + */ + int updateByGatewayAndDeviceMac(@Param("data") GatewayDevice data); + + /** + * 查询网关状态统计,并按设备分组 + * + * @param query 网关设备查询条件 + * @return 网关状态统计结果 + */ + List selectGatewayStatusCountGroupByDevice(@Param("query") GatewayDeviceQuery query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.xml index 8605637..f1b1403 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/mapper/GatewayDeviceMapper.xml @@ -5,7 +5,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select bgd.id, @@ -13,10 +13,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bgd.device_mac, bgd.create_time, bgd.last_heart_time, - bd.type as device_type, + bgd.heart_beat, bg.id as gateway_id, + bg.last_online_time as gateway_last_online_time, + bg.online_status as gateway_online_status, + bd.type as device_type, bd.id as device_id - from bst_gateway_device bgd + from + + + + bst_gateway_device bgd left join bst_gateway bg on bg.mac = bgd.gateway_mac left join bst_device bd on bd.mac = bgd.device_mac @@ -30,6 +37,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bg.mac = #{query.eqGatewayMac} and bd.mac = #{query.eqDeviceMac} and bd.type = #{query.deviceType} + + and bg.mac in + + #{item} + + + + and bd.mac in + + #{item} + + + + and bd.id in + + #{item} + + ${query.params.dataScope} @@ -52,12 +80,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" device_mac, create_time, last_heart_time, + heart_beat, #{gatewayMac}, #{deviceMac}, #{createTime}, #{lastHeartTime}, + #{heartBeat}, @@ -69,11 +99,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{data.id} + + update bst_gateway_device + + + + where gateway_mac = #{data.gatewayMac} and device_mac = #{data.deviceMac} + + gateway_mac = #{data.gatewayMac}, device_mac = #{data.deviceMac}, create_time = #{data.createTime}, last_heart_time = #{data.lastHeartTime}, + heart_beat = #{data.heartBeat}, @@ -86,4 +125,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + + + + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceDashboard.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceDashboard.java new file mode 100644 index 0000000..52a58fd --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceDashboard.java @@ -0,0 +1,19 @@ +package com.ruoyi.bst.gatewayDevice.service; + +import java.util.List; + +import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceQuery; +import com.ruoyi.bst.gatewayDevice.domain.vo.GatewayStatusCountGroupByDeviceVO; + +public interface GatewayDeviceDashboard { + + /** + * 查询网关状态统计,并按设备分组 + * @param query + * @return + */ + List selectGatewayStatusCountGroupByDevice(GatewayDeviceQuery query); + + + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceService.java index 7e8faf9..143f6fe 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/GatewayDeviceService.java @@ -61,4 +61,20 @@ public interface GatewayDeviceService * @return 结果 */ public int deleteGatewayDeviceById(Long id); + + /** + * 根据网关mac列表查询网关设备列表 + * + * @param gatewayMacList 网关mac列表 + * @return 网关设备列表 + */ + public List selectByGatewayMacList(List gatewayMacList); + + /** + * 插入或更新网关设备 + * + * @param data 网关设备 + * @return 结果 + */ + public int insertOrUpdate(GatewayDevice data); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceDashboardImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceDashboardImpl.java new file mode 100644 index 0000000..acc56dc --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceDashboardImpl.java @@ -0,0 +1,24 @@ +package com.ruoyi.bst.gatewayDevice.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceQuery; +import com.ruoyi.bst.gatewayDevice.domain.vo.GatewayStatusCountGroupByDeviceVO; +import com.ruoyi.bst.gatewayDevice.mapper.GatewayDeviceMapper; +import com.ruoyi.bst.gatewayDevice.service.GatewayDeviceDashboard; + +@Service +public class GatewayDeviceDashboardImpl implements GatewayDeviceDashboard { + + @Autowired + private GatewayDeviceMapper gatewayDeviceMapper; + + @Override + public List selectGatewayStatusCountGroupByDevice(GatewayDeviceQuery query) { + return gatewayDeviceMapper.selectGatewayStatusCountGroupByDevice(query); + } + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceServiceImpl.java index f00fa84..237e7d8 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/gatewayDevice/service/impl/GatewayDeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.bst.gatewayDevice.service.impl; +import java.util.Collections; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -11,6 +12,8 @@ import com.ruoyi.bst.gatewayDevice.domain.GatewayDeviceVO; import com.ruoyi.bst.gatewayDevice.mapper.GatewayDeviceMapper; import com.ruoyi.bst.gatewayDevice.service.GatewayDeviceService; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; /** * 网关设备Service业务层处理 @@ -96,4 +99,32 @@ public class GatewayDeviceServiceImpl implements GatewayDeviceService { return gatewayDeviceMapper.deleteGatewayDeviceById(id); } + + @Override + public List selectByGatewayMacList(List gatewayMacList) { + if (CollectionUtils.isEmptyElement(gatewayMacList)) { + return Collections.emptyList(); + } + GatewayDeviceQuery query = new GatewayDeviceQuery(); + query.setGatewayMacList(gatewayMacList); + return gatewayDeviceMapper.selectGatewayDeviceList(query); + } + + @Override + public int insertOrUpdate(GatewayDevice data) { + if (data == null) { + return 0; + } + int rows = 0; + try { + // 尝试插入,如果插入失败,则更新 + rows = this.insertGatewayDevice(data); + ServiceUtil.assertion(rows != 1, "插入失败"); + } catch (Exception e) { + // 更新 + rows = gatewayDeviceMapper.updateByGatewayAndDeviceMac(data); + ServiceUtil.assertion(rows != 1, "更新失败"); + } + return rows; + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/constants/IotConstants.java b/ruoyi-service/src/main/java/com/ruoyi/iot/constants/IotConstants.java index c110f2e..d1cf85e 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/constants/IotConstants.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/constants/IotConstants.java @@ -48,5 +48,6 @@ public class IotConstants { public static final String DS_VER = "VER"; // 版本号 public static final String DS_IMEI = "IMEI"; // 物联网卡号 public static final String DS_CSQ = "CSQ"; // 信号强度 + public static final String DS_HB = "HB"; // 心跳设置 } diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotConverterImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotConverterImpl.java index 6d2351a..35f6332 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotConverterImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotConverterImpl.java @@ -11,6 +11,7 @@ import com.ruoyi.iot.domain.CurrentDatastream; import com.ruoyi.iot.domain.CurrentDeviceData; import com.ruoyi.iot.domain.IotDeviceInfo; import com.ruoyi.iot.service.IotConverter; +import com.ruoyi.iot.util.IotUtil; import lombok.extern.slf4j.Slf4j; @@ -44,7 +45,7 @@ public class IotConverterImpl implements IotConverter { String id = stream.getId(); // 数据点ID String value = stream.getValue().toString(); // 数据点取值,取最新的值 - if (id.length() == 12) { + if (IotUtil.isSubDevice(id)) { // 子设备数据 device.addSubData(stream); } else { diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index fbad052..549e47a 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -1,13 +1,23 @@ package com.ruoyi.iot.service.impl; +import java.time.LocalDateTime; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import com.ruoyi.bst.device.service.DeviceService; +import com.ruoyi.bst.dsLog.domain.DsLog; +import com.ruoyi.bst.dsLog.service.DsLogService; +import com.ruoyi.bst.gatewayDevice.domain.GatewayDevice; +import com.ruoyi.bst.gatewayDevice.service.GatewayDeviceService; import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.iot.domain.ReceiveMsg; import com.ruoyi.iot.enums.ReceiveType; import com.ruoyi.iot.service.IotReceiveService; -import com.ruoyi.ws.service.DeviceWebSocketService; +import com.ruoyi.iot.util.IotUtil; import lombok.extern.slf4j.Slf4j; @@ -23,7 +33,13 @@ public class IotReceiveServiceImpl implements IotReceiveService { private RedisCache redisCache; @Autowired - private DeviceWebSocketService deviceWebSocketService; + private GatewayDeviceService gatewayDeviceService; + + @Autowired + private DsLogService dsLogService; + + @Autowired + private DeviceService deviceService; @Override public void handleReceive(ReceiveMsg msg) { @@ -32,10 +48,50 @@ public class IotReceiveServiceImpl implements IotReceiveService { } // 数据点推送 if (ReceiveType.DATA_POINT.getType().equals(msg.getType())) { + String dsId = msg.getDsId(); + if (IotUtil.isSubDevice(dsId)) { + handleSubDevice(msg); + } } // 生命周期 else if (ReceiveType.DEVICE_STATUS.getType().equals(msg.getType())) { } } + private void handleSubDevice(ReceiveMsg msg) { + String gatewayMac = msg.getDevName(); + String dsId = msg.getDsId(); + Object value = msg.getValue(); + LocalDateTime at = DateUtils.toLocalDateTime(msg.getAt()); + + // 获取设备MAC + String prefix = dsId; + // 判断dsId的倒数3、2位是否为ST,如果是,则查询相似的设备MAC + if (IotUtil.isSubDevicePart(dsId)) { + prefix = dsId.substring(0, 10); + } + String deviceMac = deviceService.selectOneMacByPrefix(prefix); + if (StringUtils.isBlank(deviceMac)) { + log.error("不存在前缀为{}的设备,无法存储日志", prefix); + return; + } + + // 存储日志 + DsLog dsLog = new DsLog(); + dsLog.setGatewayMac(gatewayMac); + dsLog.setDeviceMac(deviceMac); + dsLog.setAt(at); + dsLog.setData(value.toString()); + dsLog.setDs(dsId); + dsLogService.insertDsLog(dsLog); + + // 更新设备网关数据 + GatewayDevice gatewayDevice = new GatewayDevice(); + gatewayDevice.setGatewayMac(gatewayMac); + gatewayDevice.setDeviceMac(deviceMac); + gatewayDevice.setLastHeartTime(at); + gatewayDevice.setHeartBeat(IotUtil.getHeartBeat(value)); + gatewayDeviceService.insertOrUpdate(gatewayDevice); + } + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java b/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java index 0cfd3bd..8e642e9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java @@ -28,6 +28,7 @@ import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.iot.constants.IotConstants; +import com.ruoyi.iot.domain.CurrentDatastream; import com.ruoyi.iot.domain.ObjBody; import com.ruoyi.iot.domain.response.CommandResponse; @@ -223,4 +224,38 @@ public class IotUtil { } return IotConstants.SUB_SUCCESS.equals(res.getCmdResp()); } + + // 是否是子设备 + public static boolean isSubDevice(String dsId) { + return dsId != null && dsId.length() == 12; + } + + /** + * 获取心跳设置 + */ + public static Integer getHeartBeat(CurrentDatastream datastream) { + if (datastream == null) { + return 0; + } + Object value = datastream.getValue(); + return getHeartBeat(value.toString()); + } + + public static Integer getHeartBeat(Object value) { + if (value == null) { + return 0; + } + JSONObject json = JSON.parseObject(JSON.toJSONString(value)); + return json.getInteger(IotConstants.DS_HB); + } + + /** + * 判断是否为子设备的一部分 + */ + public static boolean isSubDevicePart(String dsId) { + if (StringUtils.isEmpty(dsId)) { + return false; + } + return dsId.matches(".*ST.$"); + } } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceController.java index 718f3cc..6513b40 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceController.java @@ -20,6 +20,7 @@ import com.ruoyi.bst.device.domain.Device; import com.ruoyi.bst.device.domain.DeviceQuery; import com.ruoyi.bst.device.domain.DeviceVO; import com.ruoyi.bst.device.domain.dto.DeviceSendDTO; +import com.ruoyi.bst.device.service.DeviceAssembler; import com.ruoyi.bst.device.service.DeviceIotService; import com.ruoyi.bst.device.service.DeviceService; import com.ruoyi.common.annotation.Log; @@ -45,6 +46,9 @@ public class DeviceController extends BaseController @Autowired private DeviceIotService deviceIotService; + @Autowired + private DeviceAssembler deviceAssembler; + /** * 查询设备列表 */ @@ -55,6 +59,7 @@ public class DeviceController extends BaseController startPage(); startOrderBy(); List list = deviceService.selectDeviceList(query); + deviceAssembler.assembleGatewayCount(list); return getDataTable(list); } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/DsLogController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/DsLogController.java new file mode 100644 index 0000000..9f33b7e --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/DsLogController.java @@ -0,0 +1,110 @@ +package com.ruoyi.web.bst; + +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ruoyi.bst.dsLog.domain.DsLog; +import com.ruoyi.bst.dsLog.domain.DsLogQuery; +import com.ruoyi.bst.dsLog.domain.DsLogVO; +import com.ruoyi.bst.dsLog.service.DsLogService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; + +/** + * 数据日志Controller + * + * @author ruoyi + * @date 2025-04-18 + */ +@RestController +@RequestMapping("/bst/dsLog") +public class DsLogController extends BaseController +{ + @Autowired + private DsLogService dsLogService; + + /** + * 查询数据日志列表 + */ + @PreAuthorize("@ss.hasPermi('bst:dsLog:list')") + @GetMapping("/list") + public TableDataInfo list(DsLogQuery query) + { + startPage(); + startOrderBy(); + List list = dsLogService.selectDsLogList(query); + return getDataTable(list); + } + + /** + * 导出数据日志列表 + */ + @PreAuthorize("@ss.hasPermi('bst:dsLog:export')") + @Log(title = "数据日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DsLogQuery query) + { + List list = dsLogService.selectDsLogList(query); + ExcelUtil util = new ExcelUtil(DsLogVO.class); + util.exportExcel(response, list, "数据日志数据"); + } + + /** + * 获取数据日志详细信息 + */ + @PreAuthorize("@ss.hasPermi('bst:dsLog:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(dsLogService.selectDsLogById(id)); + } + + /** + * 新增数据日志 + */ + @PreAuthorize("@ss.hasPermi('bst:dsLog:add')") + @Log(title = "数据日志", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DsLog dsLog) + { + return toAjax(dsLogService.insertDsLog(dsLog)); + } + + /** + * 修改数据日志 + */ + @PreAuthorize("@ss.hasPermi('bst:dsLog:edit')") + @Log(title = "数据日志", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DsLog dsLog) + { + return toAjax(dsLogService.updateDsLog(dsLog)); + } + + /** + * 删除数据日志 + */ + @PreAuthorize("@ss.hasPermi('bst:dsLog:remove')") + @Log(title = "数据日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(dsLogService.deleteDsLogByIds(ids)); + } +}