| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?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.zksy.base.alarm.mapper.AlarmOperationsMapper">
- <!-- 已转工单按 device_id 取设备;待审核事件尚无工单,按报警设备编码取设备。 -->
- <sql id="mobileJoins">
- FROM app_user.alarm_data a
- LEFT JOIN app_user.work_order w ON w.order_id = a.work_order_id
- LEFT JOIN LATERAL (SELECT b.* FROM app_user.equipment_base b
- WHERE (a.work_order_id IS NOT NULL AND b.equipment_id = w.device_id)
- OR (a.work_order_id IS NULL AND b.equipment_code = a.device_code)
- ORDER BY b.equipment_id LIMIT 1) e ON true
- LEFT JOIN LATERAL (SELECT s.alarm_status FROM app_user.equipment_status s
- WHERE s.equipment_id = e.equipment_id AND s.del_flag = '0'
- ORDER BY s.status_update_time DESC NULLS LAST, s.status_id DESC LIMIT 1) st ON true
- LEFT JOIN app_user.sys_user u ON u.user_id = w.receive_user
- </sql>
- <sql id="mobileScope">
- <choose>
- <when test="typeIds != null and typeIds.size() > 0">
- AND e.equipment_type_id IN
- <foreach collection="typeIds" item="typeId" open="(" separator="," close=")">#{typeId}</foreach>
- </when>
- <otherwise>AND 1 = 0</otherwise>
- </choose>
- </sql>
- <select id="selectMobilePage" resultMap="alarm">
- SELECT <include refid="columns"/> <include refid="mobileJoins"/>
- <where>
- <include refid="mobileScope"/>
- AND a.alarm_status = #{query.alarmStatus}
- <if test="query.keyword != null and query.keyword != ''">
- AND (a.device_code ILIKE CONCAT('%',#{query.keyword},'%')
- OR e.equipment_name ILIKE CONCAT('%',#{query.keyword},'%')
- OR a.alarm_no ILIKE CONCAT('%',#{query.keyword},'%'))
- </if>
- <if test="query.alarmLevel != null">AND a.alarm_level = #{query.alarmLevel}</if>
- <if test="query.auditStatus != null">AND a.audit_status = #{query.auditStatus}</if>
- <if test="query.startTime != null">AND a.create_time >= #{query.startTime}</if>
- <if test="query.endTime != null">AND a.create_time < #{query.endTime}</if>
- </where>
- ORDER BY a.create_time DESC NULLS LAST, a.id DESC
- </select>
- <select id="selectMobileDetail" resultMap="alarm">
- SELECT <include refid="columns"/> <include refid="mobileJoins"/>
- WHERE a.id = #{id} <include refid="mobileScope"/>
- </select>
- <sql id="joins">
- FROM app_user.alarm_data a
- LEFT JOIN LATERAL (SELECT b.* FROM app_user.equipment_base b WHERE b.equipment_code = a.device_code
- ORDER BY b.equipment_id LIMIT 1) e ON true
- LEFT JOIN LATERAL (SELECT s.alarm_status FROM app_user.equipment_status s WHERE s.equipment_id = e.equipment_id AND s.del_flag = '0' ORDER BY s.status_update_time DESC NULLS LAST, s.status_id DESC LIMIT 1) st ON true
- LEFT JOIN app_user.work_order w ON w.order_id = a.work_order_id
- LEFT JOIN app_user.sys_user u ON u.user_id = w.receive_user
- </sql>
- <sql id="columns">
- a.*, e.equipment_id, e.equipment_name AS current_device_name, e.equipment_location,
- e.equipment_type_id, e.equipment_image, e.longitude, e.latitude, st.alarm_status AS device_alarm_status,
- w.order_no, w.order_status, w.plan_finish_time, COALESCE(u.nick_name,u.user_name) AS receive_user_name,
- (SELECT wtt.warning_unit FROM app_user.equipment_warning_type ewt
- JOIN app_user.warning_type wtt ON wtt.id = ewt.warning_type_id
- WHERE ewt.equipment_type_id = e.equipment_type_id AND wtt.warning_code = a.warning_code LIMIT 1) AS warning_unit
- </sql>
- <resultMap id="alarm" type="com.zksy.base.alarm.dto.AlarmVO" autoMapping="true">
- <id property="id" column="id"/>
- <result property="deviceName" column="current_device_name"/>
- </resultMap>
- <sql id="filters">
- <include refid="com.zksy.base.alarm.mapper.AlarmReviewMapper.scope"/>
- <if test="query.keyword != null and query.keyword != ''">
- AND (a.device_code ILIKE CONCAT('%',#{query.keyword},'%')
- OR e.equipment_name ILIKE CONCAT('%',#{query.keyword},'%'))
- </if>
- <if test="query.alarmNo != null and query.alarmNo != ''">AND a.alarm_no ILIKE CONCAT('%',#{query.alarmNo},'%')</if>
- <if test="query.deviceCode != null and query.deviceCode != ''">AND a.device_code = #{query.deviceCode}</if>
- <if test="query.alarmStatus != null">AND a.alarm_status = #{query.alarmStatus}</if>
- <if test="query.deviceAlarmStatus != null">AND st.alarm_status = #{query.deviceAlarmStatus}</if>
- <if test="query.displayStatus != null">AND (CASE WHEN a.audit_status = 2 THEN 4 WHEN a.alarm_status = 1 THEN 3 WHEN a.work_order_id IS NOT NULL THEN 2 ELSE 1 END) = #{query.displayStatus}</if>
- <if test="query.actualValueOnly">AND a.actual_value IS NOT NULL</if>
- <if test="query.auditStatus != null">AND a.audit_status = #{query.auditStatus}</if>
- <if test="query.alarmLevel != null">AND a.alarm_level = #{query.alarmLevel}</if>
- <if test="query.startTime != null">AND a.create_time >= #{query.startTime}</if>
- <if test="query.endTime != null">AND a.create_time <= #{query.endTime}</if>
- </sql>
- <select id="selectPage" resultMap="alarm">
- SELECT <include refid="columns"/> <include refid="joins"/> <where><include refid="filters"/></where>
- ORDER BY a.create_time <choose><when test="query.ascending">ASC</when><otherwise>DESC</otherwise></choose> NULLS LAST, a.id DESC
- </select>
- <select id="selectDetail" resultMap="alarm">
- SELECT <include refid="columns"/> <include refid="joins"/> WHERE a.id = #{id}
- <include refid="com.zksy.base.alarm.mapper.AlarmReviewMapper.scope"/>
- </select>
- <select id="selectReminders" resultMap="alarm">
- SELECT <include refid="columns"/>, l.oper_desc AS latest_operation,
- COALESCE(l.oper_time, a.update_time, a.create_time) AS latest_operation_time
- <include refid="joins"/>
- LEFT JOIN LATERAL (SELECT oper_time, oper_desc FROM app_user.alarm_log
- WHERE alarm_id = a.id ORDER BY oper_time DESC, log_id DESC LIMIT 1) l ON true
- <where><include refid="filters"/></where>
- ORDER BY latest_operation_time DESC NULLS LAST, a.id DESC
- </select>
- <select id="countByLevel" resultType="java.util.Map">
- SELECT a.alarm_level AS level, COUNT(*) AS total,
- COUNT(CASE WHEN a.alarm_status = #{unhandledStatus} THEN 1 END) AS abnormal,
- COUNT(CASE WHEN a.alarm_status = #{handledStatus} THEN 1 END) AS recovered
- <include refid="joins"/>
- <where><include refid="filters"/></where> GROUP BY a.alarm_level
- </select>
- <select id="selectMap" resultMap="alarm">
- SELECT <include refid="columns"/> <include refid="joins"/>
- <where><include refid="filters"/></where> ORDER BY a.create_time DESC NULLS LAST, a.id DESC LIMIT 10001
- </select>
- <select id="selectDashboardCounts" resultType="com.zksy.base.alarm.dto.AlarmDashboardVO">
- SELECT COUNT(*) AS total_count,
- COUNT(DISTINCT CASE WHEN EXISTS (SELECT 1 FROM app_user.equipment_status s
- WHERE s.equipment_id = e.equipment_id AND s.del_flag = '0'
- AND s.alarm_status = #{deviceAlarmStatus}) THEN a.device_code END) AS alarming_device_count
- <include refid="joins"/> <where><include refid="filters"/></where>
- </select>
- <select id="selectDashboardTrend" resultType="java.util.Map">
- SELECT to_char(a.create_time, 'YYYY-MM-DD') AS date, a.alarm_level AS level, COUNT(*) AS total
- <include refid="joins"/>
- <where><include refid="filters"/> AND a.create_time >= #{start} AND a.create_time < #{end}</where>
- GROUP BY 1, 2 ORDER BY 1, 2
- </select>
- <select id="countByWarningType" resultType="java.util.Map">
- SELECT COALESCE(NULLIF(trim(wt.warning_name), ''), '未分类') AS name,
- COUNT(*) AS count
- <include refid="joins"/>
- LEFT JOIN LATERAL (SELECT wt.warning_name FROM app_user.equipment_warning_type ewt
- JOIN app_user.warning_type wt ON wt.id = ewt.warning_type_id
- WHERE ewt.equipment_type_id = e.equipment_type_id AND wt.warning_code = a.warning_code
- ORDER BY wt.warning_name LIMIT 1) wt ON true
- <where><include refid="filters"/></where> GROUP BY 1 ORDER BY count DESC, name
- </select>
- <select id="countByDeviceType" resultType="java.util.Map">
- SELECT COALESCE(NULLIF(trim(t.type_name), ''), '未分类') AS name, COUNT(*) AS count
- <include refid="joins"/> LEFT JOIN app_user.equipment_type t ON t.id = e.equipment_type_id
- <where><include refid="filters"/></where> GROUP BY 1 ORDER BY count DESC, name
- </select>
- <!-- source 来自服务端枚举,绝不能由请求直接指定表名/字段名。无效字符串不强转,不补零。 -->
- <sql id="numericValue">
- CASE WHEN trim(CAST(${source.column} AS text)) ~ '^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?$'
- THEN trim(CAST(${source.column} AS text))::numeric ELSE NULL END
- </sql>
- <sql id="sampleDevice">
- <choose><when test="source.nodeId != null">CAST(${source.deviceColumn} AS text) = #{deviceCode} AND node_id = #{source.nodeId}</when>
- <otherwise>${source.deviceColumn} = #{deviceCode}</otherwise></choose>
- </sql>
- <select id="selectLatestSample" resultType="com.zksy.base.alarm.dto.AlarmSampleVO">
- SELECT ${source.timeColumn} AS time, <include refid="numericValue"/> AS value
- FROM app_user.${source.table} WHERE <include refid="sampleDevice"/>
- AND ${source.timeColumn} <= CURRENT_TIMESTAMP
- ORDER BY ${source.timeColumn} DESC, id DESC LIMIT 1
- </select>
- <select id="selectSamples" resultType="com.zksy.base.alarm.dto.AlarmSampleVO">
- WITH samples AS (
- SELECT ${source.timeColumn} AS time, <include refid="numericValue"/> AS value
- FROM app_user.${source.table}
- WHERE <include refid="sampleDevice"/> AND ${source.timeColumn} >= #{start} AND ${source.timeColumn} < #{end}
- )
- SELECT <choose><when test="period == 'DAILY'">date_trunc('day',time)</when>
- <when test="period == 'MONTHLY'">date_trunc('month',time)</when><otherwise>time</otherwise></choose> AS time,
- AVG(value) AS value, COUNT(value) AS valid_count, COUNT(*) AS sample_count
- FROM samples GROUP BY 1 ORDER BY 1 LIMIT 20001
- </select>
- </mapper>
|