AlarmDataMapper.java 2.4 KB

1234567891011121314151617181920212223242526272829303132333435
  1. package com.zksy.api.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.zksy.api.domain.AlarmData;
  4. import org.apache.ibatis.annotations.Options;
  5. import org.apache.ibatis.annotations.Param;
  6. import org.apache.ibatis.annotations.Select;
  7. import org.apache.ibatis.annotations.Update;
  8. public interface AlarmDataMapper extends BaseMapper<AlarmData> {
  9. /** Kingbase事务锁:同一设备/报警编码的跨线程、跨实例写入串行,提交/回滚自动释放。 */
  10. @Select("SELECT 1 FROM pg_advisory_xact_lock(hashtext('collection-alarm:' || #{deviceCode}), hashtext(#{warningCode}))")
  11. @Options(timeout = 5)
  12. Integer lockAlarmKey(@Param("deviceCode") String deviceCode, @Param("warningCode") String warningCode);
  13. /** 锁定最新未处理记录,防止读取等级后人工处理;独立语句保证看到前一写入事务的提交。 */
  14. @Select("SELECT id, alarm_level FROM alarm_data WHERE device_code=#{deviceCode} AND warning_code=#{warningCode} AND alarm_status=0 "
  15. + "ORDER BY alarm_time DESC NULLS LAST, create_time DESC NULLS LAST, id DESC LIMIT 1 FOR UPDATE")
  16. @Options(timeout = 5)
  17. AlarmData selectUnhandledAlarmForUpdate(@Param("deviceCode") String deviceCode, @Param("warningCode") String warningCode);
  18. /** 只更新本次等级对应的采集字段;max_value非空列在无阈值时写0,其余空指标可清空。 */
  19. @Update("UPDATE alarm_data SET alarm_level=#{sample.alarmLevel}, actual_value=#{sample.actualValue,jdbcType=NUMERIC}, "
  20. + "min_value=#{sample.minValue,jdbcType=NUMERIC}, max_value=COALESCE(#{sample.maxValue,jdbcType=NUMERIC},0), "
  21. + "deviation_ratio=#{sample.deviationRatio,jdbcType=NUMERIC}, update_time=CURRENT_TIMESTAMP "
  22. + "WHERE id=#{id} AND device_code=#{sample.deviceCode} AND warning_code=#{sample.warningCode} AND alarm_status=0")
  23. @Options(timeout = 5)
  24. int updateUnhandledAlarmLevel(@Param("id") String id, @Param("sample") AlarmData sample);
  25. /** 按指标恢复全部未处理记录(包括历史重复);保留告警发生时的等级、数值和工单关联。 */
  26. @Update("UPDATE alarm_data SET alarm_status=1, update_time=CURRENT_TIMESTAMP "
  27. + "WHERE device_code=#{deviceCode} AND warning_code=#{warningCode} AND alarm_status=0")
  28. @Options(timeout = 5)
  29. int markUnhandledAlarmsRecovered(@Param("deviceCode") String deviceCode, @Param("warningCode") String warningCode);
  30. }