eis/eqpalg/utility/alarm_handler.hpp

145 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
/**
* @file alarm_handler.hpp
* @brief 处理报警信息
* 1.将队列的报警信息存入数据库
* 2.向页面发送mq
* @author your name (you@domain.com)
* @version 0.1
* @date 2024-05-06
*
* Copyright: Baosight Co. Ltd.
* DO NOT COPY/USE WITHOUT PERMISSION
*
*/
#include <eqpalg/table_struct/fv_result_latest.h>
#include <eqpalg/table_struct/t_rule_record_time.h>
#include <eqpalg/table_struct/t_rule_result.h>
#include <glob/ProxyMag.h>
#include <log4cplus/LOG.h>
#include <memory>
#include <mix_cc/json.h>
#include <mix_cc/sql.h>
#include <mix_cc/sql/database/db2_t.h>
#include <mix_cc/type/mix_time.h>
class AlarmHandler {
private:
MessageICEPrx message_queue_proxy_; ///< 给消息队列发消息的Ice代理
std::unique_ptr<LOG> logger_; ///< 本地logger
public:
AlarmHandler() {
logger_ = std::make_unique<LOG>("AlarmHandler");
message_queue_proxy_ = ProxyMag::GetAppICEPrx("baosight/zmqp");
}
~AlarmHandler() {}
int store_alarm(const string &alarm_info) {
mix_cc::json js1 = mix_cc::json::parse(alarm_info);
//从 t_rule_record_time 中查询 模型修改时间 模型启动时间
mix_cc::mix_time_t rule_lmt;
mix_cc::mix_time_t rule_lst;
string ruleid = js1.at("rule").at("id").get<string>();
T_RULE_RECORD_TIME t_rule_record_time;
auto select_statement =
select(t_rule_record_time.tos(), t_rule_record_time.rule_tom())
.from(t_rule_record_time)
.where(t_rule_record_time.ruleId() =
js1.at("rule").at("id").get<string>());
auto tos_tom_maybe =
mix_cc::sql::exec<db2_t, T_RULE_RECORD_TIME>(select_statement);
if (tos_tom_maybe.is_just()) {
auto tos_tom = tos_tom_maybe.unsafe_get_just();
if (tos_tom.size() == 0) {
logger_->Error() << "t_rule_record_time表格无记录" << endl;
rule_lmt = mix_cc::mix_time_t(std::chrono::system_clock::now());
rule_lst = mix_cc::mix_time_t(std::chrono::system_clock::now());
} else {
rule_lmt = tos_tom[0].rule_tom;
rule_lst = tos_tom[0].tos;
}
} else {
logger_->Error() << "t_rule_record_time表格查询失败" << endl;
}
bool is_200_status = false;
FV_RESULT_LATEST frl;
auto select_sql =
select(frl.statuscode())
.from(frl)
.where(frl.ruleId() == ruleid, frl.statuscode().operator>(199),
frl.statuscode().operator<(210));
auto select_rt_maybe =
mix_cc::sql::exec<db2_t, FV_RESULT_LATEST>(select_sql);
if (select_rt_maybe.is_just()) {
auto select_rt = select_rt_maybe.unsafe_get_just();
if (!select_rt.empty()) {
is_200_status = true;
logger_->Debug() << "ruleid:" << ruleid << "|跟踪中------" << std::endl;
} else {
logger_->Debug() << "ruleid:" << ruleid << "|无200201203"
<< std::endl;
}
} else {
logger_->Error() << "ruleid:" << ruleid << "查询失败!" << std::endl;
}
T_RULE_RESULT rr;
/*报警等及
ERROR---1
WARN----0*/
int rank =
js1.at("result")[0].at("key").get<std::string>() == "ERROR" ? 1 : 0;
// 向表中插入
if (is_200_status) {
short status = 200;
auto num = exec<db2_t, size_t>(insert_into(rr).set(
rr.ruleId() = js1.at("rule").at("id").get<string>(),
rr.ruleName() = js1.at("rule").at("name").get<string>(),
rr.ruleGroup() = js1.at("rule").at("group").get<string>(),
rr.ruleBtime() = mix_cc::mix_time_t(
js1.at("rule").at("rulebtime").get<int64_t>(), true),
rr.ruleEtime() = mix_cc::mix_time_t(
js1.at("rule").at("ruleetime").get<int64_t>(), true),
rr.dealResult() = 0, rr.result() = js1.at("result").dump(),
rr.ruleLastMTime() = rule_lmt, rr.ruleLastSTime() = rule_lst,
rr.rank() = rank, rr.statuscode() = status));
if (num.is_nothing()) {
logger_->Error() << "数据库存储异常" << endl;
return -1;
}
} else {
auto num = exec<db2_t, size_t>(insert_into(rr).set(
rr.ruleId() = js1.at("rule").at("id").get<string>(),
rr.ruleName() = js1.at("rule").at("name").get<string>(),
rr.ruleGroup() = js1.at("rule").at("group").get<string>(),
rr.ruleBtime() = mix_cc::mix_time_t(
js1.at("rule").at("rulebtime").get<int64_t>(), true),
rr.ruleEtime() = mix_cc::mix_time_t(
js1.at("rule").at("ruleetime").get<int64_t>(), true),
rr.dealResult() = 0, rr.result() = js1.at("result").dump(),
rr.ruleLastMTime() = rule_lmt, rr.ruleLastSTime() = rule_lst,
rr.rank() = rank));
if (num.is_nothing()) {
logger_->Error() << "数据库存储异常" << endl;
return -1;
}
}
try {
std::vector<unsigned char> seq((unsigned char *)alarm_info.c_str(),
(unsigned char *)alarm_info.c_str() +
alarm_info.length());
message_queue_proxy_->SendDataShort(911, seq, alarm_info.length());
} catch (::Ice::LocalException &e) {
logger_->Error() << "消息队列发送失败,请检查消息" << e.what() << endl;
return -1;
}
return 0;
}
};