AlarmOperationsMapper.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.zksy.base.alarm.mapper.AlarmOperationsMapper">
  4. <!-- 已转工单按 device_id 取设备;待审核事件尚无工单,按报警设备编码取设备。 -->
  5. <sql id="mobileJoins">
  6. FROM app_user.alarm_data a
  7. LEFT JOIN app_user.work_order w ON w.order_id = a.work_order_id
  8. LEFT JOIN LATERAL (SELECT b.* FROM app_user.equipment_base b
  9. WHERE (a.work_order_id IS NOT NULL AND b.equipment_id = w.device_id)
  10. OR (a.work_order_id IS NULL AND b.equipment_code = a.device_code)
  11. ORDER BY b.equipment_id LIMIT 1) e ON true
  12. LEFT JOIN LATERAL (SELECT s.alarm_status FROM app_user.equipment_status s
  13. WHERE s.equipment_id = e.equipment_id AND s.del_flag = '0'
  14. ORDER BY s.status_update_time DESC NULLS LAST, s.status_id DESC LIMIT 1) st ON true
  15. LEFT JOIN app_user.sys_user u ON u.user_id = w.receive_user
  16. </sql>
  17. <sql id="mobileScope">
  18. <choose>
  19. <when test="typeIds != null and typeIds.size() > 0">
  20. AND e.equipment_type_id IN
  21. <foreach collection="typeIds" item="typeId" open="(" separator="," close=")">#{typeId}</foreach>
  22. </when>
  23. <otherwise>AND 1 = 0</otherwise>
  24. </choose>
  25. </sql>
  26. <select id="selectMobilePage" resultMap="alarm">
  27. SELECT <include refid="columns"/> <include refid="mobileJoins"/>
  28. <where>
  29. <include refid="mobileScope"/>
  30. AND a.alarm_status = #{query.alarmStatus}
  31. <if test="query.keyword != null and query.keyword != ''">
  32. AND (a.device_code ILIKE CONCAT('%',#{query.keyword},'%')
  33. OR e.equipment_name ILIKE CONCAT('%',#{query.keyword},'%')
  34. OR a.alarm_no ILIKE CONCAT('%',#{query.keyword},'%'))
  35. </if>
  36. <if test="query.alarmLevel != null">AND a.alarm_level = #{query.alarmLevel}</if>
  37. <if test="query.auditStatus != null">AND a.audit_status = #{query.auditStatus}</if>
  38. <if test="query.startTime != null">AND a.create_time &gt;= #{query.startTime}</if>
  39. <if test="query.endTime != null">AND a.create_time &lt; #{query.endTime}</if>
  40. </where>
  41. ORDER BY a.create_time DESC NULLS LAST, a.id DESC
  42. </select>
  43. <select id="selectMobileDetail" resultMap="alarm">
  44. SELECT <include refid="columns"/> <include refid="mobileJoins"/>
  45. WHERE a.id = #{id} <include refid="mobileScope"/>
  46. </select>
  47. <sql id="joins">
  48. FROM app_user.alarm_data a
  49. LEFT JOIN LATERAL (SELECT b.* FROM app_user.equipment_base b WHERE b.equipment_code = a.device_code
  50. ORDER BY b.equipment_id LIMIT 1) e ON true
  51. 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
  52. LEFT JOIN app_user.work_order w ON w.order_id = a.work_order_id
  53. LEFT JOIN app_user.sys_user u ON u.user_id = w.receive_user
  54. </sql>
  55. <sql id="columns">
  56. a.*, e.equipment_id, e.equipment_name AS current_device_name, e.equipment_location,
  57. e.equipment_type_id, e.equipment_image, e.longitude, e.latitude, st.alarm_status AS device_alarm_status,
  58. w.order_no, w.order_status, w.plan_finish_time, COALESCE(u.nick_name,u.user_name) AS receive_user_name,
  59. (SELECT wtt.warning_unit FROM app_user.equipment_warning_type ewt
  60. JOIN app_user.warning_type wtt ON wtt.id = ewt.warning_type_id
  61. WHERE ewt.equipment_type_id = e.equipment_type_id AND wtt.warning_code = a.warning_code LIMIT 1) AS warning_unit
  62. </sql>
  63. <resultMap id="alarm" type="com.zksy.base.alarm.dto.AlarmVO" autoMapping="true">
  64. <id property="id" column="id"/>
  65. <result property="deviceName" column="current_device_name"/>
  66. </resultMap>
  67. <sql id="filters">
  68. <include refid="com.zksy.base.alarm.mapper.AlarmReviewMapper.scope"/>
  69. <if test="query.keyword != null and query.keyword != ''">
  70. AND (a.device_code ILIKE CONCAT('%',#{query.keyword},'%')
  71. OR e.equipment_name ILIKE CONCAT('%',#{query.keyword},'%'))
  72. </if>
  73. <if test="query.alarmNo != null and query.alarmNo != ''">AND a.alarm_no ILIKE CONCAT('%',#{query.alarmNo},'%')</if>
  74. <if test="query.deviceCode != null and query.deviceCode != ''">AND a.device_code = #{query.deviceCode}</if>
  75. <if test="query.alarmStatus != null">AND a.alarm_status = #{query.alarmStatus}</if>
  76. <if test="query.deviceAlarmStatus != null">AND st.alarm_status = #{query.deviceAlarmStatus}</if>
  77. <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>
  78. <if test="query.actualValueOnly">AND a.actual_value IS NOT NULL</if>
  79. <if test="query.auditStatus != null">AND a.audit_status = #{query.auditStatus}</if>
  80. <if test="query.alarmLevel != null">AND a.alarm_level = #{query.alarmLevel}</if>
  81. <if test="query.startTime != null">AND a.create_time &gt;= #{query.startTime}</if>
  82. <if test="query.endTime != null">AND a.create_time &lt;= #{query.endTime}</if>
  83. </sql>
  84. <select id="selectPage" resultMap="alarm">
  85. SELECT <include refid="columns"/> <include refid="joins"/> <where><include refid="filters"/></where>
  86. ORDER BY a.create_time <choose><when test="query.ascending">ASC</when><otherwise>DESC</otherwise></choose> NULLS LAST, a.id DESC
  87. </select>
  88. <select id="selectDetail" resultMap="alarm">
  89. SELECT <include refid="columns"/> <include refid="joins"/> WHERE a.id = #{id}
  90. <include refid="com.zksy.base.alarm.mapper.AlarmReviewMapper.scope"/>
  91. </select>
  92. <select id="selectReminders" resultMap="alarm">
  93. SELECT <include refid="columns"/>, l.oper_desc AS latest_operation,
  94. COALESCE(l.oper_time, a.update_time, a.create_time) AS latest_operation_time
  95. <include refid="joins"/>
  96. LEFT JOIN LATERAL (SELECT oper_time, oper_desc FROM app_user.alarm_log
  97. WHERE alarm_id = a.id ORDER BY oper_time DESC, log_id DESC LIMIT 1) l ON true
  98. <where><include refid="filters"/></where>
  99. ORDER BY latest_operation_time DESC NULLS LAST, a.id DESC
  100. </select>
  101. <select id="countByLevel" resultType="java.util.Map">
  102. SELECT a.alarm_level AS level, COUNT(*) AS total,
  103. COUNT(CASE WHEN a.alarm_status = #{unhandledStatus} THEN 1 END) AS abnormal,
  104. COUNT(CASE WHEN a.alarm_status = #{handledStatus} THEN 1 END) AS recovered
  105. <include refid="joins"/>
  106. <where><include refid="filters"/></where> GROUP BY a.alarm_level
  107. </select>
  108. <select id="selectMap" resultMap="alarm">
  109. SELECT <include refid="columns"/> <include refid="joins"/>
  110. <where><include refid="filters"/></where> ORDER BY a.create_time DESC NULLS LAST, a.id DESC LIMIT 10001
  111. </select>
  112. <select id="selectDashboardCounts" resultType="com.zksy.base.alarm.dto.AlarmDashboardVO">
  113. SELECT COUNT(*) AS total_count,
  114. COUNT(DISTINCT CASE WHEN EXISTS (SELECT 1 FROM app_user.equipment_status s
  115. WHERE s.equipment_id = e.equipment_id AND s.del_flag = '0'
  116. AND s.alarm_status = #{deviceAlarmStatus}) THEN a.device_code END) AS alarming_device_count
  117. <include refid="joins"/> <where><include refid="filters"/></where>
  118. </select>
  119. <select id="selectDashboardTrend" resultType="java.util.Map">
  120. SELECT to_char(a.create_time, 'YYYY-MM-DD') AS date, a.alarm_level AS level, COUNT(*) AS total
  121. <include refid="joins"/>
  122. <where><include refid="filters"/> AND a.create_time &gt;= #{start} AND a.create_time &lt; #{end}</where>
  123. GROUP BY 1, 2 ORDER BY 1, 2
  124. </select>
  125. <select id="countByWarningType" resultType="java.util.Map">
  126. SELECT COALESCE(NULLIF(trim(wt.warning_name), ''), '未分类') AS name,
  127. COUNT(*) AS count
  128. <include refid="joins"/>
  129. LEFT JOIN LATERAL (SELECT wt.warning_name FROM app_user.equipment_warning_type ewt
  130. JOIN app_user.warning_type wt ON wt.id = ewt.warning_type_id
  131. WHERE ewt.equipment_type_id = e.equipment_type_id AND wt.warning_code = a.warning_code
  132. ORDER BY wt.warning_name LIMIT 1) wt ON true
  133. <where><include refid="filters"/></where> GROUP BY 1 ORDER BY count DESC, name
  134. </select>
  135. <select id="countByDeviceType" resultType="java.util.Map">
  136. SELECT COALESCE(NULLIF(trim(t.type_name), ''), '未分类') AS name, COUNT(*) AS count
  137. <include refid="joins"/> LEFT JOIN app_user.equipment_type t ON t.id = e.equipment_type_id
  138. <where><include refid="filters"/></where> GROUP BY 1 ORDER BY count DESC, name
  139. </select>
  140. <!-- source 来自服务端枚举,绝不能由请求直接指定表名/字段名。无效字符串不强转,不补零。 -->
  141. <sql id="numericValue">
  142. CASE WHEN trim(CAST(${source.column} AS text)) ~ '^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?$'
  143. THEN trim(CAST(${source.column} AS text))::numeric ELSE NULL END
  144. </sql>
  145. <sql id="sampleDevice">
  146. <choose><when test="source.nodeId != null">CAST(${source.deviceColumn} AS text) = #{deviceCode} AND node_id = #{source.nodeId}</when>
  147. <otherwise>${source.deviceColumn} = #{deviceCode}</otherwise></choose>
  148. </sql>
  149. <select id="selectLatestSample" resultType="com.zksy.base.alarm.dto.AlarmSampleVO">
  150. SELECT ${source.timeColumn} AS time, <include refid="numericValue"/> AS value
  151. FROM app_user.${source.table} WHERE <include refid="sampleDevice"/>
  152. AND ${source.timeColumn} &lt;= CURRENT_TIMESTAMP
  153. ORDER BY ${source.timeColumn} DESC, id DESC LIMIT 1
  154. </select>
  155. <select id="selectSamples" resultType="com.zksy.base.alarm.dto.AlarmSampleVO">
  156. WITH samples AS (
  157. SELECT ${source.timeColumn} AS time, <include refid="numericValue"/> AS value
  158. FROM app_user.${source.table}
  159. WHERE <include refid="sampleDevice"/> AND ${source.timeColumn} &gt;= #{start} AND ${source.timeColumn} &lt; #{end}
  160. )
  161. SELECT <choose><when test="period == 'DAILY'">date_trunc('day',time)</when>
  162. <when test="period == 'MONTHLY'">date_trunc('month',time)</when><otherwise>time</otherwise></choose> AS time,
  163. AVG(value) AS value, COUNT(value) AS valid_count, COUNT(*) AS sample_count
  164. FROM samples GROUP BY 1 ORDER BY 1 LIMIT 20001
  165. </select>
  166. </mapper>