#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 #include #include #include #include #include #include #include #include #include class AlarmHandler { private: MessageICEPrx message_queue_proxy_; ///< 给消息队列发消息的Ice代理 std::unique_ptr logger_; ///< 本地logger public: AlarmHandler() { logger_ = std::make_unique("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(); 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()); auto tos_tom_maybe = mix_cc::sql::exec(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(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 << "|无200,201,203" << 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() == "ERROR" ? 1 : 0; // 向表中插入 if (is_200_status) { short status = 200; auto num = exec(insert_into(rr).set( rr.ruleId() = js1.at("rule").at("id").get(), rr.ruleName() = js1.at("rule").at("name").get(), rr.ruleGroup() = js1.at("rule").at("group").get(), rr.ruleBtime() = mix_cc::mix_time_t( js1.at("rule").at("rulebtime").get(), true), rr.ruleEtime() = mix_cc::mix_time_t( js1.at("rule").at("ruleetime").get(), 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(insert_into(rr).set( rr.ruleId() = js1.at("rule").at("id").get(), rr.ruleName() = js1.at("rule").at("name").get(), rr.ruleGroup() = js1.at("rule").at("group").get(), rr.ruleBtime() = mix_cc::mix_time_t( js1.at("rule").at("rulebtime").get(), true), rr.ruleEtime() = mix_cc::mix_time_t( js1.at("rule").at("ruleetime").get(), 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 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; } };