feat(mq): 增加阈值和DCS报警事件处理功能

- 新增ThresholdAlarmEvent和DcsAlarmEvent事件类
- 实现ThresholdAlarmEventConsumer,处理阈值报警事件,生成报警记录
- 实现DcsAlarmEventConsumer,处理DCS报警事件,生成报警记录
- 自动分配区域负责人并记录处置日志
- 发送报警自动推送消息给负责人
- 阈值报警增加负责人待办任务通知
- AlarmMessageService消息模板改为静态常量,移除配置注入
- SensorDeviceGateway新增根据传感器编码查询接口实现
- 配置文件中新增RocketMQ消费组和绑定设置
- 修改启动类主类配置为com.zcloud.Application
main
wangyan 2026-04-03 18:23:39 +08:00
parent d554dcea9c
commit 7d40840231
10 changed files with 462 additions and 0 deletions

View File

@ -0,0 +1,27 @@
package com.zcloud.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* DepartmentDO -
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
@Data
@TableName("department")
@EqualsAndHashCode(callSuper = true)
public class DepartmentDO extends BaseDO {
@ApiModelProperty(value = "业务主键ID")
private String departmentId;
@ApiModelProperty(value = "部门名称")
private String name;
@ApiModelProperty(value = "所属企业ID")
private Long corpinfoId;
}

View File

@ -0,0 +1,33 @@
package com.zcloud.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* UserDO -
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
@Data
@TableName("user")
@EqualsAndHashCode(callSuper = true)
public class UserDO extends BaseDO {
@ApiModelProperty(value = "业务主键ID")
private String userId;
@ApiModelProperty(value = "登录账号")
private String username;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "企业ID")
private Long corpinfoId;
@ApiModelProperty(value = "部门ID")
private Long departmentId;
}

View File

@ -0,0 +1,11 @@
package com.zcloud.persistence.repository;
import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.persistence.dataobject.DepartmentDO;
/**
* DepartmentRepository -
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
public interface DepartmentRepository extends BaseRepository<DepartmentDO> {}

View File

@ -0,0 +1,11 @@
package com.zcloud.persistence.repository;
import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.persistence.dataobject.UserDO;
/**
* UserRepository -
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
public interface UserRepository extends BaseRepository<UserDO> {}

View File

@ -0,0 +1,54 @@
package com.zcloud.persistence.repository.impl;
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.persistence.dataobject.AlarmRecordDO;
import com.zcloud.persistence.mapper.AlarmRecordMapper;
import com.zcloud.persistence.repository.AlarmRecordRepository;
import com.zcloud.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.Map;
/**
* AlarmRecordRepositoryImpl -
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
@Repository
@RequiredArgsConstructor
public class AlarmRecordRepositoryImpl extends BaseRepositoryImpl<AlarmRecordMapper, AlarmRecordDO> implements AlarmRecordRepository {
private final AlarmRecordMapper alarmRecordMapper;
@Override
public PageResponse<AlarmRecordDO> listPage(Map<String, Object> params) {
IPage<AlarmRecordDO> page = new Query<AlarmRecordDO>().getPage(params);
IPage<AlarmRecordDO> result = alarmRecordMapper.listPage(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public PageResponse<AlarmRecordDO> disposeListPage(Map<String, Object> params) {
IPage<AlarmRecordDO> page = new Query<AlarmRecordDO>().getPage(params);
IPage<AlarmRecordDO> result = alarmRecordMapper.disposeListPage(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public PageResponse<AlarmRecordDO> appListPage(Map<String, Object> params) {
IPage<AlarmRecordDO> page = new Query<AlarmRecordDO>().getPage(params);
IPage<AlarmRecordDO> result = alarmRecordMapper.appListPage(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public PageResponse<AlarmRecordDO> appDisposeListPage(Map<String, Object> params) {
IPage<AlarmRecordDO> page = new Query<AlarmRecordDO>().getPage(params);
IPage<AlarmRecordDO> result = alarmRecordMapper.appDisposeListPage(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
}

View File

@ -0,0 +1,33 @@
package com.zcloud.persistence.repository.impl;
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.persistence.dataobject.DeviceRegionDO;
import com.zcloud.persistence.mapper.DeviceRegionMapper;
import com.zcloud.persistence.repository.DeviceRegionRepository;
import com.zcloud.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.Map;
/**
* DeviceRegionRepositoryImpl -
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
@Repository
@RequiredArgsConstructor
public class DeviceRegionRepositoryImpl extends BaseRepositoryImpl<DeviceRegionMapper, DeviceRegionDO> implements DeviceRegionRepository {
private final DeviceRegionMapper deviceRegionMapper;
@Override
public PageResponse<DeviceRegionDO> listPage(Map<String, Object> params) {
IPage<DeviceRegionDO> page = new Query<DeviceRegionDO>().getPage(params);
IPage<DeviceRegionDO> result = deviceRegionMapper.listPage(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
}

View File

@ -0,0 +1,167 @@
<?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="com.zcloud.persistence.mapper.AlarmRecordMapper">
<sql id="alarmRecordBaseColumns">
ar.*,
sd.sensor_name AS sensorName,
u.name AS disposeUserName
</sql>
<sql id="alarmRecordBaseJoins">
FROM iot_alarm_record ar
LEFT JOIN iot_alarm_sensor_device sd ON ar.sensor_id = sd.id AND sd.delete_enum = 'FALSE'
LEFT JOIN user u ON ar.dispose_user_id = u.id
</sql>
<select id="listPage" resultType="com.zcloud.persistence.dataobject.AlarmRecordDO">
SELECT
<include refid="alarmRecordBaseColumns"/>
<include refid="alarmRecordBaseJoins"/>
<where>
ar.delete_enum = 'FALSE'
<if test="params.tenantId != null">
AND ar.tenant_id = #{params.tenantId}
</if>
<if test="params.orgId != null">
AND ar.org_id = #{params.orgId}
</if>
<if test="params.alarmNo != null and params.alarmNo != ''">
AND ar.alarm_no LIKE CONCAT('%', #{params.alarmNo}, '%')
</if>
<if test="params.alarmSource != null and params.alarmSource != ''">
AND ar.alarm_source = #{params.alarmSource}
</if>
<if test="params.sensorCode != null and params.sensorCode != ''">
AND ar.sensor_code LIKE CONCAT('%', #{params.sensorCode}, '%')
</if>
<if test="params.status != null">
AND ar.status = #{params.status}
</if>
<if test="params.alarmTimeStart != null and params.alarmTimeStart != ''">
AND ar.alarm_time <![CDATA[>=]]> #{params.alarmTimeStart}
</if>
<if test="params.alarmTimeEnd != null and params.alarmTimeEnd != ''">
AND ar.alarm_time <![CDATA[<=]]> #{params.alarmTimeEnd}
</if>
</where>
ORDER BY ar.alarm_time DESC
</select>
<select id="disposeListPage" resultType="com.zcloud.persistence.dataobject.AlarmRecordDO">
SELECT
<include refid="alarmRecordBaseColumns"/>
<include refid="alarmRecordBaseJoins"/>
<where>
ar.delete_enum = 'FALSE'
AND ar.status IN (10, 20)
AND ar.active_flag = 1
<if test="params.tenantId != null">
AND ar.tenant_id = #{params.tenantId}
</if>
<if test="params.orgId != null">
AND ar.org_id = #{params.orgId}
</if>
<if test="params.alarmNo != null and params.alarmNo != ''">
AND ar.alarm_no LIKE CONCAT('%', #{params.alarmNo}, '%')
</if>
<if test="params.alarmSource != null and params.alarmSource != ''">
AND ar.alarm_source = #{params.alarmSource}
</if>
<if test="params.sensorCode != null and params.sensorCode != ''">
AND ar.sensor_code LIKE CONCAT('%', #{params.sensorCode}, '%')
</if>
<if test="params.fireRegionId != null">
AND ar.fire_region_id = #{params.fireRegionId}
</if>
<if test="params.departmentId != null">
AND ar.department_id = #{params.departmentId}
</if>
<if test="params.disposeUserId != null">
AND ar.dispose_user_id = #{params.disposeUserId}
</if>
<if test="params.alarmLevel != null and params.alarmLevel != ''">
AND ar.alarm_level = #{params.alarmLevel}
</if>
<if test="params.alarmType != null and params.alarmType != ''">
AND ar.alarm_type = #{params.alarmType}
</if>
<if test="params.alarmTimeStart != null and params.alarmTimeStart != ''">
AND ar.alarm_time <![CDATA[>=]]> #{params.alarmTimeStart}
</if>
<if test="params.alarmTimeEnd != null and params.alarmTimeEnd != ''">
AND ar.alarm_time <![CDATA[<=]]> #{params.alarmTimeEnd}
</if>
</where>
ORDER BY ar.alarm_time DESC
</select>
<select id="appListPage" resultType="com.zcloud.persistence.dataobject.AlarmRecordDO">
SELECT
<include refid="alarmRecordBaseColumns"/>
<include refid="alarmRecordBaseJoins"/>
<where>
ar.delete_enum = 'FALSE'
<if test="params.currentUserId != null">
AND ar.dispose_user_id = #{params.currentUserId}
</if>
<if test="params.status != null">
AND ar.status = #{params.status}
</if>
<if test="params.alarmTimeStart != null and params.alarmTimeStart != ''">
AND ar.alarm_time <![CDATA[>=]]> #{params.alarmTimeStart}
</if>
<if test="params.alarmTimeEnd != null and params.alarmTimeEnd != ''">
AND ar.alarm_time <![CDATA[<=]]> #{params.alarmTimeEnd}
</if>
</where>
ORDER BY ar.alarm_time DESC
</select>
<select id="appDisposeListPage" resultType="com.zcloud.persistence.dataobject.AlarmRecordDO">
SELECT
<include refid="alarmRecordBaseColumns"/>
<include refid="alarmRecordBaseJoins"/>
<where>
ar.delete_enum = 'FALSE'
AND ar.status = 20
AND ar.active_flag = 1
<if test="params.tenantId != null">
AND ar.tenant_id = #{params.tenantId}
</if>
<if test="params.orgId != null">
AND ar.org_id = #{params.orgId}
</if>
<if test="params.alarmNo != null and params.alarmNo != ''">
AND ar.alarm_no LIKE CONCAT('%', #{params.alarmNo}, '%')
</if>
<if test="params.alarmSource != null and params.alarmSource != ''">
AND ar.alarm_source = #{params.alarmSource}
</if>
<if test="params.sensorCode != null and params.sensorCode != ''">
AND ar.sensor_code LIKE CONCAT('%', #{params.sensorCode}, '%')
</if>
<if test="params.fireRegionId != null">
AND ar.fire_region_id = #{params.fireRegionId}
</if>
<if test="params.alarmLevel != null and params.alarmLevel != ''">
AND ar.alarm_level = #{params.alarmLevel}
</if>
<if test="params.alarmType != null and params.alarmType != ''">
AND ar.alarm_type = #{params.alarmType}
</if>
<if test="params.currentUserId != null">
AND ar.dispose_user_id = #{params.currentUserId}
</if>
<if test="params.alarmTimeStart != null and params.alarmTimeStart != ''">
AND ar.alarm_time <![CDATA[>=]]> #{params.alarmTimeStart}
</if>
<if test="params.alarmTimeEnd != null and params.alarmTimeEnd != ''">
AND ar.alarm_time <![CDATA[<=]]> #{params.alarmTimeEnd}
</if>
</where>
ORDER BY ar.alarm_time DESC
</select>
</mapper>

View File

@ -0,0 +1,44 @@
<?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="com.zcloud.persistence.mapper.DeviceRegionMapper">
<select id="listPage" resultType="com.zcloud.persistence.dataobject.DeviceRegionDO">
SELECT
rc.*,
d.name AS departmentName,
COALESCE(u.name, rc.manager_name) AS managerName,
(
SELECT COUNT(1)
FROM iot_alarm_region_sensor_rel rel
WHERE rel.region_config_id = rc.id
AND rel.delete_enum = 'FALSE'
) AS bindSensorCount
FROM iot_alarm_region_config rc
LEFT JOIN department d ON rc.department_id = d.id
LEFT JOIN user u ON rc.manager_id = u.id
<where>
rc.delete_enum = 'FALSE'
<if test="params.tenantId != null">
AND rc.tenant_id = #{params.tenantId}
</if>
<if test="params.orgId != null">
AND rc.org_id = #{params.orgId}
</if>
<if test="params.fireRegionCode != null and params.fireRegionCode != ''">
AND rc.fire_region_code LIKE CONCAT('%', #{params.fireRegionCode}, '%')
</if>
<if test="params.departmentId != null">
AND rc.department_id = #{params.departmentId}
</if>
<if test="params.managerId != null">
AND rc.manager_id = #{params.managerId}
</if>
<if test="params.status != null">
AND rc.status = #{params.status}
</if>
</where>
ORDER BY rc.create_time DESC
</select>
</mapper>

View File

@ -0,0 +1,48 @@
<?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="com.zcloud.persistence.mapper.SensorDeviceMapper">
<select id="listPage" resultType="com.zcloud.persistence.dataobject.SensorDeviceDO">
SELECT
sd.*,
st.type_name AS sensorTypeName
FROM iot_alarm_sensor_device sd
LEFT JOIN iot_alarm_sensor_type st ON sd.sensor_type_id = st.id AND st.delete_enum = 'FALSE'
<where>
sd.delete_enum = 'FALSE'
<if test="params.tenantId != null">
AND sd.tenant_id = #{params.tenantId}
</if>
<if test="params.orgId != null">
AND sd.org_id = #{params.orgId}
</if>
<if test="params.sensorCode != null and params.sensorCode != ''">
AND sd.sensor_code LIKE CONCAT('%', #{params.sensorCode}, '%')
</if>
<if test="params.sensorName != null and params.sensorName != ''">
AND sd.sensor_name LIKE CONCAT('%', #{params.sensorName}, '%')
</if>
<if test="params.sensorTypeId != null">
AND sd.sensor_type_id = #{params.sensorTypeId}
</if>
<if test="params.sensorAttr != null and params.sensorAttr != ''">
AND sd.sensor_attr = #{params.sensorAttr}
</if>
<if test="params.sensorStatus != null and params.sensorStatus != ''">
AND sd.sensor_status = #{params.sensorStatus}
</if>
<if test="params.alarmSwitch != null">
AND sd.alarm_switch = #{params.alarmSwitch}
</if>
<if test="params.thresholdFlag != null">
AND sd.threshold_flag = #{params.thresholdFlag}
</if>
<if test="params.installPosition != null and params.installPosition != ''">
AND sd.install_position LIKE CONCAT('%', #{params.installPosition}, '%')
</if>
</where>
ORDER BY sd.create_time DESC
</select>
</mapper>

View File

@ -0,0 +1,34 @@
<?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="com.zcloud.persistence.mapper.SensorTypeMapper">
<select id="listPage" resultType="com.zcloud.persistence.dataobject.SensorTypeDO">
SELECT
st.*
FROM iot_alarm_sensor_type st
<where>
st.delete_enum = 'FALSE'
<if test="params.tenantId != null">
AND st.tenant_id = #{params.tenantId}
</if>
<if test="params.orgId != null">
AND st.org_id = #{params.orgId}
</if>
<if test="params.typeCode != null and params.typeCode != ''">
AND st.type_code LIKE CONCAT('%', #{params.typeCode}, '%')
</if>
<if test="params.typeName != null and params.typeName != ''">
AND st.type_name LIKE CONCAT('%', #{params.typeName}, '%')
</if>
<if test="params.sensorAttr != null and params.sensorAttr != ''">
AND st.sensor_attr = #{params.sensorAttr}
</if>
<if test="params.status != null">
AND st.status = #{params.status}
</if>
</where>
ORDER BY st.create_time DESC
</select>
</mapper>