Browse Source

增加离线报警,人员管理,修改气体报警流程

master
wangwei_123 17 hours ago
parent
commit
370725fb8f
  1. 28
      cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/DeviceMessageProcessor.java
  2. 7
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmRuleController.java
  3. 8
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmTypeController.java
  4. 113
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/PersonnelController.java
  5. 7
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandAlarmDO.java
  6. 14
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandDetectorDO.java
  7. 56
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/PersonnelDO.java
  8. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/enums/ErrorCodeConstants.java
  9. 147
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/job/OfflineAlarmJob.java
  10. 1
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/HandAlarmMapper.java
  11. 32
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/PersonnelMapper.java
  12. 3
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/TdengineMapper.java
  13. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmRuleService.java
  14. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmTypeService.java
  15. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandAlarmService.java
  16. 65
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/PersonnelService.java
  17. 46
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java
  18. 5
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmTypeServiceImpl.java
  19. 6
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandAlarmServiceImpl.java
  20. 3
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java
  21. 92
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/PersonnelServiceImpl.java
  22. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/AlarmRuleSaveReqVO.java
  23. 3
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmPageReqVO.java
  24. 4
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmRespVO.java
  25. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmSaveReqVO.java
  26. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDataVo.java
  27. 3
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorPageReqVO.java
  28. 3
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorRespVO.java
  29. 3
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorSaveReqVO.java
  30. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandTdenginePo.java
  31. 38
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelPageReqVO.java
  32. 47
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelRespVO.java
  33. 35
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelSaveReqVO.java
  34. 2
      cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/TdengineDataVo.java
  35. 12
      cc-admin-master/yudao-module-hand/src/main/resources/mapper/PersonnelMapper.xml
  36. 31
      cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml
  37. 4
      cc-admin-master/yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java
  38. 4
      cc-admin-master/yudao-server/src/main/resources/application-local.yaml

28
cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/DeviceMessageProcessor.java

@ -129,7 +129,6 @@ public class DeviceMessageProcessor {
private void handLogSave(HandDataVo handVo) {
TdengineDataVo bean = BeanUtils.toBean(handVo, TdengineDataVo.class);
bean.setGasType(handVo.getGasType());
bean.setTenantId(handVo.getTenantId());
bean.setTs(new Timestamp(System.currentTimeMillis())); // 直接创建Timestamp对象
tdengineBatchConfig.addToBatch(bean);
@ -456,6 +455,7 @@ public class DeviceMessageProcessor {
handAlarmService.updateById(handAlarmDO);
//删除离线报警
redisData.setAlarmId(null);
return redisData;
}
boolean isCurrentlyAlarming = redisData.getAlarmLevel() != null && redisData.getAlarmLevel() > 0;
@ -470,6 +470,7 @@ public class DeviceMessageProcessor {
if (alarmRule.getAlarmLevel() == 0) {
redisData.setAlarmLevel(0);
redisData.setGasStatus(HandAlarmType.NORMAL.getType());
return redisData;
}
@ -514,8 +515,20 @@ public class DeviceMessageProcessor {
String battery = obj.getStr("battery");
String numbersString = loc.substring(1, loc.length() - 1);
// 将字符串按逗号分割成数组
String[] split = numbersString.split(",");
if (numbersString.isEmpty()) {
log.error("数据格式错误:输入字符串为 null 或为空:{}", payload);
return detector;
}
detector.setValue(value);
detector.setSn(topic);
detector.setBattery(battery);
//添加最新时间
detector.setTime(new Date(System.currentTimeMillis()));
//添加默认状态
detector.setOnlineStatus(OnlineStatusType.ONLINE.getType());
String[] split = numbersString.split(",");
if (split.length != 3) {
log.error("数据格式错误:{}", payload);
return detector;
@ -524,17 +537,12 @@ public class DeviceMessageProcessor {
Double lon = wgs84ToGcj02.get("lon");
Double lat = wgs84ToGcj02.get("lat");
detector.setBattery(battery);
detector.setLongitude(lon);
detector.setLatitude(lat);
detector.setValue(value);
detector.setSn(topic);
//添加最新时间
detector.setTime(new Date(System.currentTimeMillis()));
//添加默认状态
detector.setOnlineStatus(OnlineStatusType.ONLINE.getType());
String type = split[2];
detector.setGasType(Integer.parseInt(type));
detector.setGpsType(Integer.parseInt(type));
return detector;
}

7
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmRuleController.java

@ -91,7 +91,12 @@ public class AlarmRuleController {
return success(BeanUtils.toBean(pageResult, AlarmRuleRespVO.class));
}
@GetMapping("/listAll")
@Operation(summary = "获得全部的GAS警报规则")
public CommonResult<List<AlarmRuleDO>> getListAll() {
List<AlarmRuleDO> listAll = alarmRuleService.getListAll();
return success(listAll);
}
@GetMapping("/export-excel")
@Operation(summary = "导出GAS警报规则 Excel")
@PreAuthorize("@ss.hasPermission('gas:alarm-rule:export')")

8
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmTypeController.java

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hand.controller.admin;
import cn.iocoder.yudao.module.hand.dal.AlarmRuleDO;
import cn.iocoder.yudao.module.hand.dal.AlarmTypeDO;
import cn.iocoder.yudao.module.hand.service.AlarmTypeService;
import cn.iocoder.yudao.module.hand.vo.AlarmTypePageReqVO;
@ -90,7 +91,12 @@ public class AlarmTypeController {
PageResult<AlarmTypeDO> pageResult = alarmTypeService.getAlarmTypePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AlarmTypeRespVO.class));
}
@GetMapping("/listAll")
@Operation(summary = "获得全部的警报类型")
public CommonResult<List<AlarmTypeDO>> getListAll() {
List<AlarmTypeDO> listAll = alarmTypeService.getListAll();
return success(listAll);
}
@GetMapping("/export-excel")
@Operation(summary = "导出GAS警报类型 Excel")
@PreAuthorize("@ss.hasPermission('gas:alarm-type:export')")

113
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/PersonnelController.java

@ -0,0 +1,113 @@
package cn.iocoder.yudao.module.hand.controller.admin;
import cn.iocoder.yudao.module.hand.dal.PersonnelDO;
import cn.iocoder.yudao.module.hand.service.PersonnelService;
import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO;
import cn.iocoder.yudao.module.hand.vo.PersonnelRespVO;
import cn.iocoder.yudao.module.hand.vo.PersonnelSaveReqVO;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 人员信息")
@RestController
@RequestMapping("/gas/personnel")
@Validated
public class PersonnelController {
@Resource
private PersonnelService personnelService;
@PostMapping("/create")
@Operation(summary = "创建人员信息")
@PreAuthorize("@ss.hasPermission('gas:personnel:create')")
public CommonResult<Long> createPersonnel(@Valid @RequestBody PersonnelSaveReqVO createReqVO) {
return success(personnelService.createPersonnel(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新人员信息")
@PreAuthorize("@ss.hasPermission('gas:personnel:update')")
public CommonResult<Boolean> updatePersonnel(@Valid @RequestBody PersonnelSaveReqVO updateReqVO) {
personnelService.updatePersonnel(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除人员信息")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('gas:personnel:delete')")
public CommonResult<Boolean> deletePersonnel(@RequestParam("id") Long id) {
personnelService.deletePersonnel(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除人员信息")
@PreAuthorize("@ss.hasPermission('gas:personnel:delete')")
public CommonResult<Boolean> deletePersonnelList(@RequestParam("ids") List<Long> ids) {
personnelService.deletePersonnelListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得人员信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('gas:personnel:query')")
public CommonResult<PersonnelRespVO> getPersonnel(@RequestParam("id") Long id) {
PersonnelDO personnel = personnelService.getPersonnel(id);
return success(BeanUtils.toBean(personnel, PersonnelRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得人员信息分页")
@PreAuthorize("@ss.hasPermission('gas:personnel:query')")
public CommonResult<PageResult<PersonnelRespVO>> getPersonnelPage(@Valid PersonnelPageReqVO pageReqVO) {
PageResult<PersonnelDO> pageResult = personnelService.getPersonnelPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PersonnelRespVO.class));
}
@GetMapping("/getListAll")
@Operation(summary = "获得全部人员信息")
@PreAuthorize("@ss.hasPermission('gas:personnel:query')")
public CommonResult<List<PersonnelDO>> getListAll() {
List<PersonnelDO> listAll = personnelService.getListAll();
return success(listAll);
}
@GetMapping("/export-excel")
@Operation(summary = "导出人员信息 Excel")
@PreAuthorize("@ss.hasPermission('gas:personnel:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportPersonnelExcel(@Valid PersonnelPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PersonnelDO> list = personnelService.getPersonnelPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "人员信息.xls", "数据", PersonnelRespVO.class,
BeanUtils.toBean(list, PersonnelRespVO.class));
}
}

7
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandAlarmDO.java

@ -1,12 +1,9 @@
package cn.iocoder.yudao.module.hand.dal;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;

14
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandDetectorDO.java

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hand.dal;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
@ -26,6 +27,9 @@ public class HandDetectorDO extends BaseDO {
*/
@TableId
private Long id;
private Long personId;
/**
* SN
*/
@ -106,4 +110,14 @@ public class HandDetectorDO extends BaseDO {
*/
private Integer tenantId;
// 在 Setter 方法中加入 trim() 逻辑
public void setSn(String sn) {
// 先判断是否为 null,避免 NullPointerException
if (sn != null) {
// 在赋值给字段之前,先调用 trim()
this.sn = sn.trim();
} else {
this.sn = null;
}
}
}

56
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/PersonnelDO.java

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.hand.dal;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 人员信息 DO
*
* @author 超级管理员
*/
@TableName("gas_personnel")
@KeySequence("gas_personnel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PersonnelDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 姓名
*/
private String name;
/**
* 工号
*/
private String employeeId;
/**
* 关联的系统用户ID (关联系统用户表, 可为空)
*/
private Long userId;
/**
* 联系电话
*/
private String phone;
/**
* 电子邮箱
*/
private String email;
/**
* 状态 (1-在职, 0-离职)
*/
private Integer status;
}

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/enums/ErrorCodeConstants.java

@ -24,4 +24,6 @@ public interface ErrorCodeConstants {
ErrorCode FACTORY_NOT_EXISTS = new ErrorCode(1000071, "GAS工厂不存在");
ErrorCode HAND_DETECTOR_REDIS_NOT_EXISTS = new ErrorCode(100001, "请先登录,再查看");
ErrorCode PERSONNEL_NOT_EXISTS = new ErrorCode(2131, "人员信息不存在");
}

147
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/job/OfflineAlarmJob.java

@ -0,0 +1,147 @@
package cn.iocoder.yudao.module.hand.job;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.hand.dal.HandAlarmDO;
import cn.iocoder.yudao.module.hand.enums.*;
import cn.iocoder.yudao.module.hand.service.HandAlarmService;
import cn.iocoder.yudao.module.hand.util.RedisKeyUtil;
import cn.iocoder.yudao.module.hand.util.RedisUtil;
import cn.iocoder.yudao.module.hand.vo.HandAlarmSaveReqVO;
import cn.iocoder.yudao.module.hand.vo.HandDataVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class OfflineAlarmJob implements JobHandler {
/**
* 定义设备离线阈值10分钟
*/
private static final long OFFLINE_THRESHOLD_MINUTES = 10;
private static final long OFFLINE_THRESHOLD_MS = TimeUnit.MINUTES.toMillis(OFFLINE_THRESHOLD_MINUTES);
@Resource
private RedisUtil redisUtil;
// 1. 注入报警记录相关的Service
@Resource
private HandAlarmService handAlarmService;
@Override
@TenantJob
public String execute(String param) throws Exception {
Long tenantId = TenantContextHolder.getTenantId();
if (tenantId == null) {
log.warn("无法获取到租户ID,任务终止");
return "无法获取租户ID";
}
String tenantDeviceKey = RedisKeyUtil.getTenantDeviceHashKey(tenantId);
Map<Object, Object> deviceDataMap = redisUtil.hmget(tenantDeviceKey);
if (deviceDataMap == null || deviceDataMap.isEmpty()) {
log.info("租户ID {} 下无设备数据,任务结束", tenantId);
return "无设备数据";
}
long currentTimeMillis = System.currentTimeMillis();
// 用于存储需要批量插入数据库的新报警记录
List<HandAlarmDO> newAlarmsToCreate = new ArrayList<>();
for (Map.Entry<Object, Object> entry : deviceDataMap.entrySet()) {
try {
HandDataVo handData = BeanUtils.toBean(entry.getValue(), HandDataVo.class);
if (handData == null || handData.getTime() == null) {
continue; // 跳过无效数据
}
long lastReportTimeMillis = handData.getTime().getTime();
long timeDifference = currentTimeMillis - lastReportTimeMillis;
// 判断条件 1:设备是否离线? (时间差超过阈值)
if (timeDifference > OFFLINE_THRESHOLD_MS) {
// 判断条件 2:这是否是一次新的离线事件? (检查Redis中当前的状态是否还不是报警状态)
// 如果已经是报警状态,则本次不再重复处理
if (!OnlineStatusType.OFFLINE.getType().equals(handData.getOnlineStatus())) {
// --- 这是新发现的离线设备,执行报警逻辑 ---
log.info("【新设备离线报警】租户ID: {}, 设备SN: {} 已离线超过{}分钟",
tenantId, handData.getSn(), OFFLINE_THRESHOLD_MINUTES);
// a. 更新设备状态
handData.setOnlineStatus(OnlineStatusType.OFFLINE.getType());
handData.setAlarmLevel(AlarmLevelEnum.OFFLINE.value());
// b. 将更新后的状态写回 Redis
redisUtil.hset(tenantDeviceKey, entry.getKey().toString(), handData);
// c. 准备要插入数据库的报警记录
HandAlarmDO handAlarmDO = buildAlarmRecord(tenantId, handData);
newAlarmsToCreate.add(handAlarmDO);
}
}
} catch (Exception e) {
log.error("处理设备数据时发生异常,设备Key: {}. 错误: {}", entry.getKey(), e.getMessage());
}
}
// 批量将新产生的报警记录插入数据库
if (!newAlarmsToCreate.isEmpty()) {
log.info("租户 {} 发现 {} 条新的设备离线报警,准备批量写入数据库...", tenantId, newAlarmsToCreate.size());
try {
handAlarmService.insertBatch(newAlarmsToCreate);
log.info("批量写入 {} 条设备离线报警记录成功", newAlarmsToCreate.size());
} catch (Exception e) {
log.error("批量写入设备离线报警记录失败", e);
}
}
log.info("租户 {} 的设备离线检查任务执行完毕", tenantId);
return "任务执行成功";
}
/**
* 辅助方法构建报警记录对象
*/
private HandAlarmDO buildAlarmRecord(Long tenantId, HandDataVo handData) {
HandAlarmDO alarm = new HandAlarmDO();
alarm.setTenantId(tenantId);
alarm.setDetectorId(handData.getId());
alarm.setPicX(handData.getLatitude());
alarm.setPicY(handData.getLongitude());
alarm.setName(handData.getName());
alarm.setSn(handData.getSn());
alarm.setAlarmType(AlarmType.OFFLINE.getType()); // 明确指定为离线报警类型
alarm.setAlarmLevel(AlarmLevelEnum.OFFLINE.value());
if (handData.getTime() != null) {
LocalDateTime lastReportTime = handData.getTime()
.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
alarm.setTAlarmStart(lastReportTime);
}
alarm.setStatus(EnableStatus.DISABLED.value());
alarm.setGasType(handData.getUnit());
alarm.setUnit(handData.getUnit());
alarm.setCreator("admin");
alarm.setCreateTime(LocalDateTime.now());
return alarm;
}
}

1
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/HandAlarmMapper.java

@ -23,6 +23,7 @@ public interface HandAlarmMapper extends BaseMapperX<HandAlarmDO> {
.likeIfPresent(HandAlarmDO::getName,reqVO.getName())
.likeIfPresent(HandAlarmDO::getSn,reqVO.getSn())
.eqIfPresent(HandAlarmDO::getAlarmLevel, reqVO.getAlarmLevel())
.eqIfPresent(HandAlarmDO::getAlarmType, reqVO.getAlarmType())
.eqIfPresent(HandAlarmDO::getGasType, reqVO.getGasType())
.eqIfPresent(HandAlarmDO::getUnit, reqVO.getUnit())
.eqIfPresent(HandAlarmDO::getLocation, reqVO.getLocation())

32
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/PersonnelMapper.java

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.hand.mapper;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.hand.dal.PersonnelDO;
import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO;
import org.apache.ibatis.annotations.Mapper;
/**
* 人员信息 Mapper
*
* @author 超级管理员
*/
@Mapper
public interface PersonnelMapper extends BaseMapperX<PersonnelDO> {
default PageResult<PersonnelDO> selectPage(PersonnelPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PersonnelDO>()
.likeIfPresent(PersonnelDO::getName, reqVO.getName())
.eqIfPresent(PersonnelDO::getEmployeeId, reqVO.getEmployeeId())
.eqIfPresent(PersonnelDO::getUserId, reqVO.getUserId())
.eqIfPresent(PersonnelDO::getPhone, reqVO.getPhone())
.eqIfPresent(PersonnelDO::getEmail, reqVO.getEmail())
.eqIfPresent(PersonnelDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PersonnelDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PersonnelDO::getId));
}
}

3
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/TdengineMapper.java

@ -29,6 +29,7 @@ public interface TdengineMapper {
IPage<HandOriginalLog> selectOriginalPage(IPage<HandOriginalLog> page,@Param("vo") HandTdenginePageVO vo);
List<TdengineDataVo> HistoricalSn(HandTdenginePo po);
@InterceptorIgnore(tenantLine = "true")
List<TdengineDataVo> HistoricalSn(@Param("po") HandTdenginePo po);
}

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmRuleService.java

@ -63,5 +63,5 @@ public interface AlarmRuleService {
Map<Long, List<AlarmRuleDO>> selectCacheListMap(Long tenantId);
List<AlarmRuleDO> getListAll();
}

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmTypeService.java

@ -61,4 +61,6 @@ public interface AlarmTypeService {
*/
PageResult<AlarmTypeDO> getAlarmTypePage(AlarmTypePageReqVO pageReqVO);
List<AlarmTypeDO> getListAll();
}

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandAlarmService.java

@ -61,4 +61,6 @@ public interface HandAlarmService {
PageResult<HandAlarmDO> getHandAlarmPage(HandAlarmPageReqVO pageReqVO);
int updateById(HandAlarmDO alarm);
void insertBatch(List<HandAlarmDO> doList);
}

65
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/PersonnelService.java

@ -0,0 +1,65 @@
package cn.iocoder.yudao.module.hand.service;
import java.util.*;
import cn.iocoder.yudao.module.hand.dal.PersonnelDO;
import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO;
import cn.iocoder.yudao.module.hand.vo.PersonnelSaveReqVO;
import jakarta.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 人员信息 Service 接口
*
* @author 超级管理员
*/
public interface PersonnelService {
/**
* 创建人员信息
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createPersonnel(@Valid PersonnelSaveReqVO createReqVO);
/**
* 更新人员信息
*
* @param updateReqVO 更新信息
*/
void updatePersonnel(@Valid PersonnelSaveReqVO updateReqVO);
/**
* 删除人员信息
*
* @param id 编号
*/
void deletePersonnel(Long id);
/**
* 批量删除人员信息
*
* @param ids 编号
*/
void deletePersonnelListByIds(List<Long> ids);
/**
* 获得人员信息
*
* @param id 编号
* @return 人员信息
*/
PersonnelDO getPersonnel(Long id);
/**
* 获得人员信息分页
*
* @param pageReqVO 分页查询
* @return 人员信息分页
*/
PageResult<PersonnelDO> getPersonnelPage(PersonnelPageReqVO pageReqVO);
List<PersonnelDO> getListAll();
}

46
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java

@ -46,52 +46,54 @@ public class AlarmRuleServiceImpl implements AlarmRuleService {
@Resource
private AlarmRuleMapper alarmRuleMapper;
// 定义一个常量来表示缓存清除的 SpEL 表达式,避免重复和拼写错误
private static final String EVICT_CACHE_KEY_SPEL =
"'gas_rules_map:' + T(cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder).getTenantId()";
@Override
@CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME,
// 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。
key = EVICT_CACHE_KEY_SPEL)
public Long createAlarmRule(AlarmRuleSaveReqVO createReqVO) {
// 插入
AlarmRuleDO alarmRule = BeanUtils.toBean(createReqVO, AlarmRuleDO.class);
alarmRuleMapper.insert(alarmRule);
LoginUser loginUser = getLoginUser();
if (loginUser != null && loginUser.getTenantId() != null){
evictGasAlarmRuleCache(loginUser.getTenantId());
}
// 返回
return alarmRule.getId();
}
@Override
@CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME,
// 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。
key = EVICT_CACHE_KEY_SPEL)
public void updateAlarmRule(AlarmRuleSaveReqVO updateReqVO) {
// 校验存在
validateAlarmRuleExists(updateReqVO.getId());
// 更新
AlarmRuleDO updateObj = BeanUtils.toBean(updateReqVO, AlarmRuleDO.class);
alarmRuleMapper.updateById(updateObj);
LoginUser loginUser = getLoginUser();
if (loginUser != null && loginUser.getTenantId() != null){
evictGasAlarmRuleCache(loginUser.getTenantId());
}
}
@Override
@CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME,
// 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。
key = EVICT_CACHE_KEY_SPEL)
public void deleteAlarmRule(Long id) {
// 校验存在
validateAlarmRuleExists(id);
// 删除
alarmRuleMapper.deleteById(id);
LoginUser loginUser = getLoginUser();
if (loginUser != null && loginUser.getTenantId() != null){
evictGasAlarmRuleCache(loginUser.getTenantId());
}
}
@Override
@CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME,
// 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。
key = EVICT_CACHE_KEY_SPEL)
public void deleteAlarmRuleListByIds(List<Long> ids) {
// 删除
alarmRuleMapper.deleteByIds(ids);
LoginUser loginUser = getLoginUser();
if (loginUser != null && loginUser.getTenantId() != null){
evictGasAlarmRuleCache(loginUser.getTenantId());
}
}
@ -128,16 +130,8 @@ public class AlarmRuleServiceImpl implements AlarmRuleService {
public PageResult<AlarmRuleDO> getAlarmRulePage(AlarmRulePageReqVO pageReqVO) {
return alarmRuleMapper.selectPage(pageReqVO);
}
/**
* 当规则发生变更时调用此方法来清空缓存
*/
@CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME,
// 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。
key = "'gas_rules_map:' + #tenantId")
@TenantIgnore
public void evictGasAlarmRuleCache(Long tenantId) {
log.info("成功清除气体报警规则缓存。");
@Override
public List<AlarmRuleDO> getListAll() {
return alarmRuleMapper.selectList();
}
}

5
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmTypeServiceImpl.java

@ -84,4 +84,9 @@ public class AlarmTypeServiceImpl implements AlarmTypeService {
return alarmTypeMapper.selectPage(pageReqVO);
}
@Override
public List<AlarmTypeDO> getListAll() {
return alarmTypeMapper.selectList();
}
}

6
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandAlarmServiceImpl.java

@ -90,4 +90,10 @@ public class HandAlarmServiceImpl implements HandAlarmService {
return handAlarmMapper.updateById(alarm);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertBatch(List<HandAlarmDO> doList) {
handAlarmMapper.insertBatch(doList);
}
}

3
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java

@ -192,7 +192,6 @@ public class HandDetectorServiceImpl implements HandDetectorService {
// 校验存在
validateHandDetectorExists(id);
// 删除
handDetectorMapper.deleteById(id);
String deviceSn = handDetectorMapper.selectOne(HandDetectorDO::getId, id).getSn();
// 2. 从全局映射缓存中删除
redisUtil.hdel(RedisKeyUtil.getDeviceTenantMappingKey(), deviceSn);
@ -200,6 +199,8 @@ public class HandDetectorServiceImpl implements HandDetectorService {
// 3. 从租户自己的设备信息缓存中删除
String tenantDeviceKey = RedisKeyUtil.getTenantDeviceHashKey(loginUser.getTenantId());
redisUtil.hdel(tenantDeviceKey, deviceSn);
handDetectorMapper.deleteById(id);
}
@Override

92
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/PersonnelServiceImpl.java

@ -0,0 +1,92 @@
package cn.iocoder.yudao.module.hand.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.hand.dal.PersonnelDO;
import cn.iocoder.yudao.module.hand.mapper.PersonnelMapper;
import cn.iocoder.yudao.module.hand.service.PersonnelService;
import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO;
import cn.iocoder.yudao.module.hand.vo.PersonnelSaveReqVO;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
import static cn.iocoder.yudao.module.hand.enums.ErrorCodeConstants.PERSONNEL_NOT_EXISTS;
/**
* 人员信息 Service 实现类
*
* @author 超级管理员
*/
@Service
@Validated
public class PersonnelServiceImpl implements PersonnelService {
@Resource
private PersonnelMapper personnelMapper;
@Override
public Long createPersonnel(PersonnelSaveReqVO createReqVO) {
// 插入
PersonnelDO personnel = BeanUtils.toBean(createReqVO, PersonnelDO.class);
personnelMapper.insert(personnel);
// 返回
return personnel.getId();
}
@Override
public void updatePersonnel(PersonnelSaveReqVO updateReqVO) {
// 校验存在
validatePersonnelExists(updateReqVO.getId());
// 更新
PersonnelDO updateObj = BeanUtils.toBean(updateReqVO, PersonnelDO.class);
personnelMapper.updateById(updateObj);
}
@Override
public void deletePersonnel(Long id) {
// 校验存在
validatePersonnelExists(id);
// 删除
personnelMapper.deleteById(id);
}
@Override
public void deletePersonnelListByIds(List<Long> ids) {
// 删除
personnelMapper.deleteByIds(ids);
}
private void validatePersonnelExists(Long id) {
if (personnelMapper.selectById(id) == null) {
throw exception(PERSONNEL_NOT_EXISTS);
}
}
@Override
public PersonnelDO getPersonnel(Long id) {
return personnelMapper.selectById(id);
}
@Override
public PageResult<PersonnelDO> getPersonnelPage(PersonnelPageReqVO pageReqVO) {
return personnelMapper.selectPage(pageReqVO);
}
@Override
public List<PersonnelDO> getListAll() {
return personnelMapper.selectList();
}
}

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/AlarmRuleSaveReqVO.java

@ -18,7 +18,7 @@ public class AlarmRuleSaveReqVO {
private Long gasTypeId;
@Schema(description = "警报类型ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12917")
@NotEmpty(message = "警报类型ID不能为空")
@NotNull(message = "警报类型ID不能为空")
private Long alarmTypeId;
@Schema(description = "警报名称", example = "赵六")

3
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmPageReqVO.java

@ -27,6 +27,9 @@ public class HandAlarmPageReqVO extends PageParam {
@Schema(description = "警报方式/级别(0:正常状态;1:一级警报;2:二级警报;3:弹窗警报)")
private Integer alarmLevel;
@Schema(description = "报警类型")
private Integer alarmType;
@Schema(description = "气体类型", example = "1")
private String gasType;

4
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmRespVO.java

@ -27,6 +27,10 @@ public class HandAlarmRespVO {
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "报警类型")
@ExcelProperty("报警类型")
private Integer alarmType;
@Schema(description = "警报方式/级别(0:正常状态;1:一级警报;2:二级警报;3:弹窗警报)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("警报方式/级别(0:正常状态;1:一级警报;2:二级警报;3:弹窗警报)")
private Integer alarmLevel;

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmSaveReqVO.java

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hand.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@ -18,7 +19,6 @@ public class HandAlarmSaveReqVO {
private Long id;
@Schema(description = "探头ID", example = "1")
private Long detectorId;

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDataVo.java

@ -70,7 +70,7 @@ public class HandDataVo {
private Double maxValue;
@Schema(description = "定位类型")
private Integer gasType;
private Integer gpsType;
@Schema(description = "报警开始时间")
private LocalDateTime tAlarmStart;

3
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorPageReqVO.java

@ -18,6 +18,9 @@ public class HandDetectorPageReqVO extends PageParam {
@Schema(description = "SN")
private String sn;
@Schema(description = "持有人id", example = "1")
private Long personId;
@Schema(description = "持有人姓名", example = "赵六")
private String name;

3
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorRespVO.java

@ -16,6 +16,9 @@ public class HandDetectorRespVO {
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "持有人id", example = "1")
private Long personId;
@Schema(description = "SN")
@ExcelProperty("SN")
private String sn;

3
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorSaveReqVO.java

@ -13,6 +13,9 @@ public class HandDetectorSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24178")
private Long id;
@Schema(description = "持有人id", example = "1")
private Long personId;
@Schema(description = "SN")
private String sn;

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandTdenginePo.java

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.hand.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.sql.Timestamp;
@ -8,6 +9,7 @@ import java.sql.Timestamp;
@Data
public class HandTdenginePo{
@NotEmpty(message ="sn不能为空")
private String sn;
private Timestamp startTime;

38
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelPageReqVO.java

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.hand.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 人员信息分页 Request VO")
@Data
public class PersonnelPageReqVO extends PageParam {
@Schema(description = "姓名", example = "王五")
private String name;
@Schema(description = "工号", example = "32467")
private String employeeId;
@Schema(description = "关联的系统用户ID (关联系统用户表, 可为空)", example = "14813")
private Long userId;
@Schema(description = "联系电话")
private String phone;
@Schema(description = "电子邮箱")
private String email;
@Schema(description = "状态 (1-在职, 0-离职)", example = "2")
private Integer status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

47
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelRespVO.java

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.hand.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 人员信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PersonnelRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19452")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@ExcelProperty("姓名")
private String name;
@Schema(description = "工号", example = "32467")
@ExcelProperty("工号")
private String employeeId;
@Schema(description = "关联的系统用户ID (关联系统用户表, 可为空)", example = "14813")
@ExcelProperty("关联的系统用户ID (关联系统用户表, 可为空)")
private Long userId;
@Schema(description = "联系电话")
@ExcelProperty("联系电话")
private String phone;
@Schema(description = "电子邮箱")
@ExcelProperty("电子邮箱")
private String email;
@Schema(description = "状态 (1-在职, 0-离职)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty("状态 (1-在职, 0-离职)")
private Integer status;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

35
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelSaveReqVO.java

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.hand.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
@Schema(description = "管理后台 - 人员信息新增/修改 Request VO")
@Data
public class PersonnelSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19452")
private Long id;
@Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@NotEmpty(message = "姓名不能为空")
private String name;
@Schema(description = "工号", example = "32467")
private String employeeId;
@Schema(description = "关联的系统用户ID (关联系统用户表, 可为空)", example = "14813")
private Long userId;
@Schema(description = "联系电话")
private String phone;
@Schema(description = "电子邮箱")
private String email;
@Schema(description = "状态 (1-在职, 0-离职)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "状态 (1-在职, 0-离职)不能为空")
private Integer status;
}

2
cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/TdengineDataVo.java

@ -27,8 +27,6 @@ public class TdengineDataVo {
@Schema(description = "纬度")
private Double latitude;
@Schema(description = "纬度")
private Integer gasType;
@Schema(description = "更新时间")
private Timestamp ts;

12
cc-admin-master/yudao-module-hand/src/main/resources/mapper/PersonnelMapper.xml

@ -0,0 +1,12 @@
<?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="cn.iocoder.yudao.module.hand.mapper.PersonnelMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

31
cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml

@ -25,17 +25,17 @@
INSERT INTO device_data_log_#{sn}
USING device_data_log
TAGS(#{sn}, #{tenantId})
(ts, battery, `value`, longitude, latitude, `name`,gas_type)
(ts, battery, `value`, longitude, latitude, `name`)
VALUES
<foreach collection="dataVoList" item="log" separator=",">
(#{log.ts}, #{log.battery}, #{log.value}, #{log.longitude}, #{log.latitude}, #{log.name}, #{log.gasType})
(#{log.ts}, #{log.battery}, #{log.value}, #{log.longitude}, #{log.latitude}, #{log.name})
</foreach>
</insert>
<select id="selectPage" resultType="cn.iocoder.yudao.module.hand.vo.TdengineDataVo">
SELECT
ts, sn, battery, `value`, longitude, latitude, `name`,gas_type as gasType,tenantId
ts, sn, battery, `value`, longitude, latitude, `name`,tenantId
FROM
device_data_log
<where>
@ -79,6 +79,7 @@
AND ts &lt;= #{vo.endTime}
</if>
</where>
ORDER BY ts DESC
</select>
<select id="HistoricalSn" resultType="cn.iocoder.yudao.module.hand.vo.TdengineDataVo">
@ -86,26 +87,28 @@
_wstart as ts,
LAST(`value`) as `value`,
LAST(longitude) as longitude,
LAST(latitude) as latitude,
LAST(gas_type) as gasType
LAST(latitude) as latitude
FROM
device_data_log
<where>
<if test="vo.sn != null and vo.sn != ''">
AND sn = #{vo.sn}
<if test="po.sn != null and po.sn != ''">
<!-- 关键修正1: sn 是唯一需要用 ${} 的参数,并且必须手动加上单引号 '' -->
AND sn = '${po.sn}'
</if>
<if test="vo.tenantId != null">
AND tenantId = #{vo.tenantId}
<if test="po.tenantId != null">
<!-- 关键修正2: tenantId 是数字,必须用回安全的 #{} -->
AND tenantId = #{po.tenantId}
</if>
<if test="vo.startTime != null">
AND ts >= #{vo.startTime}
<if test="po.startTime != null">
<!-- 关键修正3: 时间戳必须用回安全的 #{},Mybatis 会自动处理格式和单引号 -->
AND ts >= #{po.startTime}
</if>
<if test="vo.endTime != null">
AND ts &lt;= #{vo.endTime}
<if test="po.endTime != null">
<!-- 关键修正4: 时间戳必须用回安全的 #{} -->
AND ts &lt;= #{po.endTime}
</if>
</where>
INTERVAL(1m)
PARTITION BY sn, tenantId
ORDER BY ts DESC
</select>
</mapper>

4
cc-admin-master/yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java

@ -70,11 +70,11 @@ public class DefaultController {
"[AI 大模型 yudao-module-ai - 已禁用][参考 https://doc.iocoder.cn/ai/build/ 开启]");
}
@RequestMapping(value = { "/admin-api/iot/**"})
/* @RequestMapping(value = { "/admin-api/iot/**"})
public CommonResult<Boolean> iot404() {
return CommonResult.error(NOT_IMPLEMENTED.getCode(),
"[IoT 物联网 yudao-module-iot - 已禁用][参考 https://doc.iocoder.cn/iot/build/ 开启]");
}
}*/
/**
* 测试接口打印 queryheaderbody

4
cc-admin-master/yudao-server/src/main/resources/application-local.yaml

@ -114,7 +114,7 @@ spring:
password: rabbit # RabbitMQ 服务的密码
# Kafka 配置项,对应 KafkaProperties 配置类
kafka:
bootstrap-servers: video.zdhlcn.com:9092 # 或者内网地址 172.21.16.6:9091,或者测试地址video.zdhlcn.com:9092
bootstrap-servers: zdmq.zdhlcn.com:9092 # 或者内网地址 172.21.16.6:9091,或者测试地址video.zdhlcn.com:9092,zdmq.zdhlcn.com:9092
properties:
security.protocol: SASL_PLAINTEXT
sasl.mechanism: SCRAM-SHA-512
@ -221,7 +221,7 @@ pf4j:
pluginsDir: ../plugins
mqtt:
enable: true
enable: false
url: tcp://zdmq.zdhlcn.com:2883
username: mobileqt
password: DVSwxQwY<x

Loading…
Cancel
Save