添加报警记录折线图功能并完善报警处置流程

main
zhangyue 2026-05-06 15:56:09 +08:00
parent 66430b21c8
commit 0c8d3c1dd2
13 changed files with 216 additions and 28 deletions

View File

@ -1,10 +1,12 @@
package com.zcloud.web;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.api.AlarmRecordServiceI;
import com.zcloud.dto.AlarmRecordPageQry;
import com.zcloud.dto.AlarmRecordSensorPageQry;
import com.zcloud.dto.AppAlarmDisposePageQry;
import com.zcloud.dto.clientobject.AlarmRecordCO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -12,6 +14,12 @@ import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
* AlarmRecordController -
* @Author wangyan
@ -44,4 +52,29 @@ public class AlarmRecordController {
public SingleResponse<AlarmRecordCO> info(@PathVariable("id") Long id) {
return alarmRecordService.info(id);
}
@ApiOperation("报警折线图")
@GetMapping("/lineChart/{id}")
public MultiResponse<AlarmRecordCO> lineChart(@PathVariable("id") String id) {
List<AlarmRecordCO> alarmRecordCOList = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 2. 解析目标时间字符串
String timeStr = "2025-01-01 00:00:00";
LocalDateTime dateTime = LocalDateTime.parse(timeStr, formatter);
// 给我生成一组模拟数据要求时间段内每10秒一个数据数据格式时间报警值
for (int i = 0; i < 60; i++) {
LocalDateTime newDateTime = dateTime.plusSeconds(10*i);
// 生成30-100的随机数
double currentValue = Math.round((Math.random() * 70 + 30) * 100) / 100.0;
AlarmRecordCO alarmRecordCO = new AlarmRecordCO();
// 每往前导10秒时间往前推10秒
alarmRecordCO.setAlarmTime(newDateTime.format(formatter));
alarmRecordCO.setCurrentValue(BigDecimal.valueOf(currentValue));
alarmRecordCOList.add(alarmRecordCO);
}
return MultiResponse.of(alarmRecordCOList);
}
}

View File

@ -1,27 +1,34 @@
package com.zcloud.command;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.cola.dto.SingleResponse;
import com.alibaba.cola.exception.BizException;
import com.zcloud.domain.gateway.AlarmRecordGateway;
import com.alibaba.fastjson.JSONObject;
import com.jjb.saas.message.client.message.facede.MessageFacade;
import com.jjb.saas.message.client.message.request.MessageSendCmd;
import com.jjb.saas.message.client.message.request.MessageTargetCmd;
import com.zcloud.domain.config.MessageTemplateConfig;
import com.zcloud.domain.gateway.AlarmDisposeLogGateway;
import com.zcloud.domain.gateway.AlarmRecordGateway;
import com.zcloud.domain.model.AlarmRecordE;
import com.zcloud.domain.model.AlarmDisposeLogE;
import com.zcloud.dto.AlarmDisposeAssignCmd;
import com.zcloud.gbscommon.utils.DateUtil;
import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil;
import com.zcloud.gbscommon.todolistmq.event.TodoListAddBatchEvent;
import com.zcloud.gbscommon.todolistmq.event.TodoListAddEvent;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.utils.UuidUtil;
import com.zcloud.service.AlarmMessageService;
import com.zcloud.service.AlarmTodoService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
@ -32,6 +39,7 @@ import java.util.List;
@Component
@RequiredArgsConstructor
@RefreshScope
@Slf4j
public class AlarmDisposeAssignExe {
private final AlarmRecordGateway alarmRecordGateway;
@ -39,6 +47,8 @@ public class AlarmDisposeAssignExe {
private final AlarmMessageService alarmMessageService;
private final AlarmTodoService alarmTodoService;
private final MessageTemplateConfig messageTemplateConfig;
private final TodoListEventPusherUtil todoListEventPusherUtil;
@Transactional(rollbackFor = Exception.class)
public SingleResponse execute(AlarmDisposeAssignCmd cmd) {
List<Long> ids = cmd.getIds();
@ -48,8 +58,8 @@ public class AlarmDisposeAssignExe {
// 获取当前时间的LocalDateTime "yyyy-MM-dd HH:mm:ss"
LocalDateTime assignTime = LocalDateTime.now();
List<TodoListAddEvent> todoListAddEventList = new ArrayList<>();
for (Long id : ids) {
StringBuffer msg = new StringBuffer();
// 查询报警记录
AlarmRecordE alarmRecord = alarmRecordGateway.getById(id);
if (Tools.isEmpty(alarmRecord)) {
@ -67,17 +77,53 @@ public class AlarmDisposeAssignExe {
updateEntity.setId( id);
updateEntity.setAssignTime(assignTime);
alarmRecordGateway.update(updateEntity);
if (cmd.getStatus() == 20){
// 发送站内信
sendMessage(messageTemplateConfig.getDispose(), alarmRecord.getDisposeUserId());
//待排查 待办
TodoListAddEvent event = new TodoListAddEvent();
event.setTitle("您有一条【物联网报警】待处置");
event.setContent("您有一条报警信息,请及时进行处置。");
event.setForeignKey(alarmRecord.getId()); // 业务表ID -申请
event.setForeignSubsidiaryKey(alarmRecord.getId()); // 业务附表ID 没有附表时为foreignKey的值
event.setReceiveUser(alarmRecord.getDisposeUserId());// user表ID
event.setPcFlag(0); // 是否PC端待办 1是 0否
event.setAppFlag(1); // 是否APP端待办 1是 0否
event.setOtherParams(new JSONObject());
todoListAddEventList.add(event);
}
}
if (cmd.getStatus() == 20){
TodoListAddBatchEvent event3 = new TodoListAddBatchEvent();
event3.setTodoListAddEventList(todoListAddEventList);
log.info("【物联网报警】待处置,请求:{}", JSONUtil.toJsonStr(event3));
boolean b = todoListEventPusherUtil.sendMessageAddBatchEvent(event3);
log.info("【物联网报警】待处置,结果:{}",b);
}
return SingleResponse.buildSuccess();
//
// // 发送报警处置推送消息给处置人
// // 更新后的报警记录包含分配时间和处置说明
// alarmMessageService.sendDisposePushMessage(updateEntity, cmd.getDisposeUserId());
//
// // 新增处置人待办
// alarmTodoService.addDisposeTodo(updateEntity, cmd.getDisposeUserId());
//
// // 完成负责人待办(原来负责人是 alarmRecord.getManagerId()
// alarmTodoService.completeTodo(cmd.getId());
}
@DubboReference
private MessageFacade messageFacade;
private void sendMessage(String template, Long userId) {
try {
MessageSendCmd messageSendCmd = new MessageSendCmd();
messageSendCmd.setBusinessId(UuidUtil.get32UUID());
MessageTargetCmd messageTargetCmd = new MessageTargetCmd();
messageTargetCmd.setUserId(userId);
messageSendCmd.setTargetCmd(messageTargetCmd);
messageSendCmd.setSourceCode(template);
messageSendCmd.setNeedTokenEnum(false);
log.info("发送站内信人员:{}", userId);
SingleResponse<Boolean> result = messageFacade.send(messageSendCmd);
log.info("发送站内信结果:{}", result.toString());
} catch (Exception e){
e.printStackTrace();
}
}
}

View File

@ -12,7 +12,7 @@ import com.zcloud.gbscommon.utils.UuidUtil;
import com.zcloud.persistence.dataobject.DeviceRegionDO;
import com.zcloud.persistence.dataobject.UserDO;
import com.zcloud.persistence.repository.DeviceRegionRepository;
import com.zcloud.persistence.repository.UserRepository;
import com.zcloud.service.ExtraUserQueryService;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@ -29,14 +29,14 @@ import org.springframework.transaction.annotation.Transactional;
public class ManagerExe {
private final DeviceRegionGateway deviceRegionGateway;
private final UserRepository userRepository;
private final ExtraUserQueryService extraUserQueryService;
private final DeviceRegionRepository deviceRegionRepository;
@Transactional(rollbackFor = Exception.class)
public void execute(ManagerCmd cmd) {
DeviceRegionE existingRegion = new DeviceRegionE();
BeanUtil.copyProperties(cmd, existingRegion);
UserDO userDO = userRepository.findById(cmd.getManagerId());
UserDO userDO = extraUserQueryService.getRequiredById(cmd.getManagerId());
existingRegion.setManagerName(userDO.getName());
existingRegion.setManagerId(userDO.getId());
existingRegion.setDepartmentId(userDO.getDepartmentId());

View File

@ -0,0 +1,25 @@
package com.zcloud.domain.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
/**
* @author zhangyue
* @date 2026/2/11 10:05
*/
@Component
@ConfigurationProperties(prefix = "message.template")
@Data
public class MessageTemplateConfig {
private String assign;
private String dispose;
}

View File

@ -0,0 +1,42 @@
package com.zcloud.domain.enums;
import lombok.Getter;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
*/
@Getter
public enum MenuEnum {
qydbjczglbjczfp("/iotalarm/container/branchCompany/alarmAssign/list", "qyd-bjczgl-bjczfp"),
qydbjczglbjjlgl("/iotalarm/container/branchCompany/alarmRecord/list", "qyd-bjczgl-bjjlgl"),
qydbjxxglsfbjxx("/iotalarm/container/branchCompany/dcsAlarmInfo/list", "qyd-bjxxgl-sfbjxx"),
qydsbqygl("/iotalarm/container/branchCompany/deviceRegion/list", "qyd-sbqygl"),
qydcgqsbgl("/iotalarm/container/branchCompany/sensorDevice/list", "qyd-cgqsbgl"),
qydchqlxgl("/iotalarm/container/branchCompany/sensorType/list", "qyd-chqlxgl"),
qydbjxxglyzbjxx("/iotalarm/container/branchCompany/thresholdAlarmInfo/list", "qyd-bjxxgl-yzbjxx");
private final String path;
private final String menuKey;
private static final Map<String, MenuEnum> PATH_MAP =
Arrays.stream(values())
.collect(Collectors.toMap(MenuEnum::getPath, Function.identity()));
MenuEnum(String path, String menuKey) {
this.path = path;
this.menuKey = menuKey;
}
public static MenuEnum getByPath(String path) {
return PATH_MAP.get(path);
}
public static String getMenuKeyByPath(String path) {
MenuEnum menuEnum = PATH_MAP.get(path);
return menuEnum != null ? menuEnum.getMenuKey() : null;
}
}

View File

@ -2,6 +2,8 @@ package com.zcloud.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.datascope.annotation.DataScope;
import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.persistence.dataobject.AlarmRecordDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -14,9 +16,12 @@ import java.util.Map;
* @Date 2026-04-03 00:00:00
*/
@Mapper
@DataScopes({
@DataScope(method = "listPage", menuPerms = "")
})
public interface AlarmRecordMapper extends BaseMapper<AlarmRecordDO> {
IPage<AlarmRecordDO> listPage(IPage<AlarmRecordDO> page, @Param("params") Map<String, Object> params);
IPage<AlarmRecordDO> listPage(IPage<AlarmRecordDO> page, @Param("params") Map<String, Object> params, @Param("menuPerms") String menuPerms);
IPage<AlarmRecordDO> listBySensorDevice(IPage<AlarmRecordDO> page, @Param("params") Map<String, Object> params);

View File

@ -2,6 +2,8 @@ package com.zcloud.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.datascope.annotation.DataScope;
import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.persistence.dataobject.DeviceRegionDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -14,9 +16,12 @@ import java.util.Map;
* @Date 2026-04-03 00:00:00
*/
@Mapper
@DataScopes({
@DataScope(method = "listPage", menuPerms = "")
})
public interface DeviceRegionMapper extends BaseMapper<DeviceRegionDO> {
IPage<DeviceRegionDO> listPage(IPage<DeviceRegionDO> page, @Param("params") Map<String, Object> params);
IPage<DeviceRegionDO> listPage(IPage<DeviceRegionDO> page, @Param("params") Map<String, Object> params, @Param("menuPerms") String menuPerms);
DeviceRegionDO findRegionById(String fireRegionId);
}

View File

@ -2,6 +2,8 @@ package com.zcloud.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.datascope.annotation.DataScope;
import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -14,7 +16,11 @@ import java.util.Map;
* @Date 2026-04-03 00:00:00
*/
@Mapper
@DataScopes({
@DataScope(method = "listPage", menuPerms = "")
})
public interface SensorDeviceMapper extends BaseMapper<SensorDeviceDO> {
IPage<SensorDeviceDO> listPage(IPage<SensorDeviceDO> page, @Param("params") Map<String, Object> params);
IPage<SensorDeviceDO> listPage(IPage<SensorDeviceDO> page, @Param("params") Map<String, Object> params, @Param("menuPerms") String menuPerms);
}

View File

@ -2,6 +2,8 @@ package com.zcloud.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.datascope.annotation.DataScope;
import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.persistence.dataobject.SensorTypeDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -14,7 +16,11 @@ import java.util.Map;
* @Date 2026-04-03 00:00:00
*/
@Mapper
@DataScopes({
@DataScope(method = "listPage", menuPerms = "")
})
public interface SensorTypeMapper extends BaseMapper<SensorTypeDO> {
IPage<SensorTypeDO> listPage(IPage<SensorTypeDO> page, @Param("params") Map<String, Object> params);
IPage<SensorTypeDO> listPage(IPage<SensorTypeDO> page, @Param("params") Map<String, Object> params, @Param("menuPerms") String menuPerms);
}

View File

@ -4,6 +4,7 @@ import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.domain.enums.MenuEnum;
import com.zcloud.persistence.dataobject.AlarmRecordDO;
import com.zcloud.persistence.mapper.AlarmRecordMapper;
import com.zcloud.persistence.repository.AlarmRecordRepository;
@ -27,7 +28,11 @@ public class AlarmRecordRepositoryImpl extends BaseRepositoryImpl<AlarmRecordMap
@Override
public PageResponse<AlarmRecordDO> listPage(Map<String, Object> params) {
IPage<AlarmRecordDO> page = new Query<AlarmRecordDO>().getPage(params);
IPage<AlarmRecordDO> result = alarmRecordMapper.listPage(page, params);
String menuPerms = "";
if (!org.springframework.util.ObjectUtils.isEmpty(params.get("menuPath"))){
menuPerms = MenuEnum.getMenuKeyByPath(params.get("menuPath").toString());
}
IPage<AlarmRecordDO> result = alarmRecordMapper.listPage(page, params, menuPerms);
return PageHelper.pageToResponse(result, result.getRecords());
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.domain.enums.MenuEnum;
import com.zcloud.persistence.dataobject.DeviceRegionDO;
import com.zcloud.persistence.mapper.DeviceRegionMapper;
import com.zcloud.persistence.repository.DeviceRegionRepository;
@ -28,7 +29,11 @@ public class DeviceRegionRepositoryImpl extends BaseRepositoryImpl<DeviceRegionM
@Override
public PageResponse<DeviceRegionDO> listPage(Map<String, Object> params) {
IPage<DeviceRegionDO> page = new Query<DeviceRegionDO>().getPage(params);
IPage<DeviceRegionDO> result = deviceRegionMapper.listPage(page, params);
String menuPerms = "";
if (!org.springframework.util.ObjectUtils.isEmpty(params.get("menuPath"))){
menuPerms = MenuEnum.getMenuKeyByPath(params.get("menuPath").toString());
}
IPage<DeviceRegionDO> result = deviceRegionMapper.listPage(page, params, menuPerms);
return PageHelper.pageToResponse(result, result.getRecords());
}

View File

@ -4,6 +4,7 @@ import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.domain.enums.MenuEnum;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
import com.zcloud.persistence.mapper.SensorDeviceMapper;
import com.zcloud.persistence.repository.SensorDeviceRepository;
@ -27,7 +28,11 @@ public class SensorDeviceRepositoryImpl extends BaseRepositoryImpl<SensorDeviceM
@Override
public PageResponse<SensorDeviceDO> listPage(Map<String, Object> params) {
IPage<SensorDeviceDO> page = new Query<SensorDeviceDO>().getPage(params);
IPage<SensorDeviceDO> result = sensorDeviceMapper.listPage(page, params);
String menuPerms = "";
if (!org.springframework.util.ObjectUtils.isEmpty(params.get("menuPath"))){
menuPerms = MenuEnum.getMenuKeyByPath(params.get("menuPath").toString());
}
IPage<SensorDeviceDO> result = sensorDeviceMapper.listPage(page, params, menuPerms);
return PageHelper.pageToResponse(result, result.getRecords());
}
}

View File

@ -4,6 +4,7 @@ import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.domain.enums.MenuEnum;
import com.zcloud.persistence.dataobject.SensorTypeDO;
import com.zcloud.persistence.mapper.SensorTypeMapper;
import com.zcloud.persistence.repository.SensorTypeRepository;
@ -27,7 +28,11 @@ public class SensorTypeRepositoryImpl extends BaseRepositoryImpl<SensorTypeMappe
@Override
public PageResponse<SensorTypeDO> listPage(Map<String, Object> params) {
IPage<SensorTypeDO> page = new Query<SensorTypeDO>().getPage(params);
IPage<SensorTypeDO> result = sensorTypeMapper.listPage(page, params);
String menuPerms = "";
if (!org.springframework.util.ObjectUtils.isEmpty(params.get("menuPath"))){
menuPerms = MenuEnum.getMenuKeyByPath(params.get("menuPath").toString());
}
IPage<SensorTypeDO> result = sensorTypeMapper.listPage(page, params, menuPerms);
return PageHelper.pageToResponse(result, result.getRecords());
}
}