#include #include #include #include #include RICSAlg::RICSAlg() { logger_ = std::make_unique("RICSAlg"); SingletonTemplate::GetInstance()("test"); } RICSAlg::~RICSAlg() {} void RICSAlg::alg_handle(int algid) { try { // 载入T_RULE_CFG表,从其中读取算法 T_RULE_CFG t_rule_cfg; auto sql_statement = select(t_rule_cfg.algId(), t_rule_cfg.ruleId(), t_rule_cfg.ruleName(), t_rule_cfg.remark(), t_rule_cfg.ruleGroup(), t_rule_cfg.eqpid(), t_rule_cfg.flag(), t_rule_cfg.ruleParam()) .from(t_rule_cfg) .where(t_rule_cfg.algId() == algid); auto rule_list_maybe = mix_cc::sql::exec(sql_statement); if (rule_list_maybe.is_just()) { int tagMax = 0; auto rule_list = rule_list_maybe.unsafe_get_just(); logger_->Info() << "rules in DB:" << rule_list.size() << endl; CfgRuleInfo cfg_rule_info; for (auto x : rule_list) { RuleInfo rule_info; // logger_->Debug() << "ID:" << x.ruleId << " AlgID:" << x.algId // << " Name:" << x.ruleName << " Flag:" << x.flag // << endl; rule_info.rule_name = x.ruleName; rule_info.remark = x.remark; rule_info.eqpid = x.eqpid; rule_info.rule_group = x.ruleGroup; auto param_info = mix_cc::json::parse(x.ruleParam); if (param_info.contains("output")) { rule_info.alarm_reason = param_info.at("output").at("reason").at("value").get(); rule_info.alarm_content = param_info.at("output").at("error").at("value").get(); } rule_info.pre_condition = param_info.at("before_exec").get(); rule_info.pre_result = param_info.at("function") .at("pre_result") .at("value") .get(); const auto tag_dict = param_info["tags"]; const int tag_size = tag_dict.size(); tagMax = std::max(tagMax, tag_size); rule_info.tags_item.resize(tag_size); rule_info.tags_chinese.resize(tag_size); for (auto y : tag_dict.items()) { int item_index = stoi(y.key().substr(3)); if (item_index > tag_size) { logger_->Error() << "ruleid:" << x.ruleId << ",rulename:" << x.ruleName << ",tag max:" << tag_size << ",now tag index:" << item_index << std::endl; continue; } auto itemi = y.value().at("value").get(); rule_info.tags_item[item_index - 1] = itemi; rule_info.tags_chinese[item_index - 1] = SingletonTemplate::GetInstance()(itemi); } auto fun_json = param_info.at("function"); exp_handle(fun_json, rule_info, algid); cfg_rule_info[x.ruleId] = rule_info; } alg_rule_info_[algid] = cfg_rule_info; alg_2_tagMax[algid] = tagMax; logger_->Debug() << "alg_2_tagMax[algid]:" << alg_2_tagMax[algid] << std::endl; } else { logger_->Debug() << "algid:" << algid << " 无规则" << std::endl; } } catch (const std::exception &e) { logger_->Error() << e.what() << std::endl; } } void RICSAlg::timed_task() { logger_->Debug() << "test" << std::endl; for (auto item : AlgId) { logger_->Debug() << "item:" << item << std::endl; alg_handle(item); string jvalue = get_json_by_algid(item); string jkey = unitNo_ + "_Alg_" + std::to_string(item); write_memcaced(jkey, jvalue); logger_->Debug() << "jkey:" << jkey << ",jvalue size:" << alg_rule_info_[item].size() << std::endl; // logger_->Debug() << "jkey:" << jkey << ",jvalue:" << jvalue << std::endl; } } void RICSAlg::dispose(int event_no, const ::Ice::ByteSeq &seq) { string str(seq.begin(), seq.end()); logger_->Debug() << "seq:" << str << std::endl; } void RICSAlg::exp_handle(json &funciton_param, RuleInfo &ruleInfo, int algid) { switch (algid) { case 1: { ruleInfo.exp_str.resize(1); ruleInfo.exp_str[0] = funciton_param.at("result").at("value").get(); } break; case 2: { ruleInfo.exp_str.resize(2); ruleInfo.exp_str[0] = funciton_param.at("filter_exp").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("result").at("value").get(); ruleInfo.limit_down = funciton_param.at("result") .at("param") .at("limit_down") .at("value") .get(); ruleInfo.limit_up = funciton_param.at("result") .at("param") .at("limit_up") .at("value") .get(); if (funciton_param.at("result").at("param").contains("unit")) { ruleInfo.unit = funciton_param.at("result") .at("param") .at("unit") .at("value") .get(); } } break; case 3: { ruleInfo.exp_str.resize(3); ruleInfo.exp_str[0] = funciton_param.at("action_start").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("action_end").at("value").get(); ruleInfo.exp_str[2] = funciton_param.at("result").at("value").get(); ruleInfo.params.resize(2); ruleInfo.params[0] = funciton_param.at("action_start") .at("param") .at("hold") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("action_end") .at("param") .at("timeout") .at("value") .get(); } break; case 4: { ruleInfo.exp_str.resize(3); ruleInfo.exp_str[0] = funciton_param.at("action_start").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("action_end").at("value").get(); ruleInfo.exp_str[2] = funciton_param.at("result").at("value").get(); ruleInfo.params.resize(2); ruleInfo.params[0] = funciton_param.at("action_start") .at("param") .at("hold") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("action_end") .at("param") .at("timeout") .at("value") .get(); ruleInfo.limit_down = funciton_param.at("result") .at("param") .at("limit_down") .at("value") .get(); ruleInfo.limit_up = funciton_param.at("result") .at("param") .at("limit_up") .at("value") .get(); if (funciton_param.at("result").at("param").contains("unit")) { ruleInfo.unit = funciton_param.at("result") .at("param") .at("unit") .at("value") .get(); } } break; case 5: { ruleInfo.exp_str.resize(2); ruleInfo.exp_str[0] = funciton_param.at("filter_exp").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("result").at("value").get(); ruleInfo.params.resize(1); ruleInfo.params[0] = funciton_param.at("result") .at("param") .at("hold_time") .at("value") .get(); ruleInfo.limit_down = funciton_param.at("result") .at("param") .at("limit_down") .at("value") .get(); ruleInfo.limit_up = funciton_param.at("result") .at("param") .at("limit_up") .at("value") .get(); if (funciton_param.at("result").at("param").contains("unit")) { ruleInfo.unit = funciton_param.at("result") .at("param") .at("unit") .at("value") .get(); } } break; case 6: { ruleInfo.exp_str.resize(1); ruleInfo.exp_str[0] = funciton_param.at("result").at("value").get(); ruleInfo.params.resize(1); ruleInfo.params[0] = funciton_param.at("result") .at("param") .at("limit_time") .at("value") .get(); } break; case 7: { ruleInfo.exp_str.resize(1); ruleInfo.exp_str[0] = funciton_param.at("result").at("value").get(); ruleInfo.params.resize(1); ruleInfo.params[0] = funciton_param.at("result") .at("param") .at("limit_times") .at("value") .get(); } break; case 8: { ruleInfo.exp_str.resize(1); ruleInfo.exp_str[0] = funciton_param.at("limit_error").at("value").get(); ruleInfo.params.resize(4); ruleInfo.params[0] = funciton_param.at("limit_error") .at("param") .at("interval_time") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("limit_error") .at("param") .at("deltaX") .at("value") .get(); ruleInfo.params[2] = funciton_param.at("limit_error") .at("param") .at("diff") .at("value") .get(); ruleInfo.params[3] = funciton_param.at("limit_error") .at("param") .at("CS_AVG_SIZE") .at("value") .get(); } break; case 12: { ruleInfo.exp_str.resize(3); ruleInfo.exp_str[0] = funciton_param.at("result").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("sample_X").at("value").get(); ruleInfo.exp_str[2] = funciton_param.at("sample_Y").at("value").get(); ruleInfo.params.resize(1); ruleInfo.params[0] = funciton_param.at("sample_Y") .at("param") .at("scale") .at("value") .get(); } break; case 13: { ruleInfo.exp_str.resize(3); ruleInfo.exp_str[0] = funciton_param.at("result").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("sample_X").at("value").get(); ruleInfo.exp_str[2] = funciton_param.at("sample_Y").at("value").get(); ruleInfo.params.resize(2); ruleInfo.params[0] = funciton_param.at("sample_Y") .at("param") .at("scale") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("sample_Y") .at("param") .at("min_len") .at("value") .get(); } break; case 14: { ruleInfo.exp_str.resize(1); ruleInfo.exp_str[0] = funciton_param.at("limit_error").at("value").get(); ruleInfo.params.resize(4); ruleInfo.params[0] = funciton_param.at("limit_error") .at("param") .at("interval_time") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("limit_error") .at("param") .at("deltaX") .at("value") .get(); ruleInfo.params[2] = funciton_param.at("limit_error") .at("param") .at("diff") .at("value") .get(); ruleInfo.params[3] = funciton_param.at("limit_error") .at("param") .at("CS_AVG_SIZE") .at("value") .get(); } break; case 15: { ruleInfo.exp_str.resize(1); ruleInfo.exp_str[0] = funciton_param.at("dataX").at("value").get(); ruleInfo.params.resize(1); ruleInfo.params[0] = funciton_param.at("dataX") .at("param") .at("lenth") .at("value") .get(); } break; case 16: case 18: { ruleInfo.exp_str.resize(2); ruleInfo.exp_str[0] = funciton_param.at("pre_exp").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("input").at("value").get(); ruleInfo.params.resize(4); if (funciton_param.at("input").at("param").contains("unit")) { ruleInfo.unit = funciton_param.at("input") .at("param") .at("unit") .at("value") .get(); } ruleInfo.params[0] = funciton_param.at("input") .at("param") .at("detect_mode") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("input") .at("param") .at("limit_warn") .at("value") .get(); ruleInfo.params[2] = funciton_param.at("input") .at("param") .at("limit_error") .at("value") .get(); if (funciton_param.at("input").at("param").contains("hold_time")) { ruleInfo.params[3] = funciton_param.at("input") .at("param") .at("hold_time") .at("value") .get(); } else { ruleInfo.params[3] = "0"; } } break; case 17: { ruleInfo.exp_str.resize(2); ruleInfo.exp_str[0] = funciton_param.at("filter_exp").at("value").get(); ruleInfo.exp_str[1] = funciton_param.at("result").at("value").get(); ruleInfo.params.resize(3); if (funciton_param.at("result").at("param").contains("unit")) { ruleInfo.unit = funciton_param.at("result") .at("param") .at("unit") .at("value") .get(); } ruleInfo.params[0] = funciton_param.at("result") .at("param") .at("limit_warn") .at("value") .get(); ruleInfo.params[1] = funciton_param.at("result") .at("param") .at("limit_error") .at("value") .get(); } break; default: logger_->Debug() << "algid:" << algid << " error!" << std::endl; break; } } string RICSAlg::get_json_by_algid(int algid) { nlohmann::json js1; vector columns_name{ "规则名称", "设备id", "规则分组", "规则描述", "报警原因", "报警内容", "前置条件", "执行前置条件表达式", }; vector> data; const auto &algRuleIfo = alg_rule_info_[algid]; for (int i = 0; i < 8; i++) { vector coli_data; for (auto &item : algRuleIfo) { coli_data.push_back(item.second.get_value(i)); } data.push_back(coli_data); } switch (algid) { case 1: { columns_name.push_back("报警条件表达式"); vector coli_data; for (const auto &item : algRuleIfo) { coli_data.push_back(item.second.exp_str[0]); } data.push_back(coli_data); } break; case 2: { columns_name.push_back("数据筛选表达式"); columns_name.push_back("监控变量表达式"); columns_name.push_back("单位"); columns_name.push_back("下限"); columns_name.push_back("上限"); for (int i = 0; i < 5; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 2) { coli_data.push_back(item.second.exp_str[i]); } else if (i == 2) { coli_data.push_back(item.second.unit); } else if (i == 3) { coli_data.push_back(item.second.limit_down); } else { coli_data.push_back(item.second.limit_up); } } data.push_back(coli_data); } } break; case 3: { columns_name.push_back("动作表达式"); columns_name.push_back("反馈表达式"); columns_name.push_back("监控变量表达式"); columns_name.push_back("是否保持"); columns_name.push_back("超时时间"); for (int i = 0; i < 5; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 3) { coli_data.push_back(item.second.exp_str[i]); } else { coli_data.push_back(item.second.params[i - 3]); } } data.push_back(coli_data); } } break; case 4: { columns_name.push_back("动作表达式"); columns_name.push_back("反馈表达式"); columns_name.push_back("监控变量条件表达式"); columns_name.push_back("是否保持"); columns_name.push_back("超时时间"); columns_name.push_back("单位"); columns_name.push_back("下限"); columns_name.push_back("上限"); for (int i = 0; i < 8; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 3) { coli_data.push_back(item.second.exp_str[i]); } else if (i == 3) { coli_data.push_back(item.second.params[0]); } else if (i == 4) { coli_data.push_back(item.second.params[1]); } else if (i == 5) { coli_data.push_back(item.second.unit); } else if (i == 6) { coli_data.push_back(item.second.limit_down); } else { coli_data.push_back(item.second.limit_up); } } data.push_back(coli_data); } } break; case 5: { columns_name.push_back("数据筛选表达式"); columns_name.push_back("监控变量表达式"); columns_name.push_back("单位"); columns_name.push_back("下限"); columns_name.push_back("上限"); columns_name.push_back("持续时间[ms]"); for (int i = 0; i < 6; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 2) { coli_data.push_back(item.second.exp_str[i]); } else if (i == 2) { coli_data.push_back(item.second.unit); } else if (i == 3) { coli_data.push_back(item.second.limit_down); } else if (i == 4) { coli_data.push_back(item.second.limit_up); } else { coli_data.push_back(item.second.params[0]); } } data.push_back(coli_data); } } break; case 6: { columns_name.push_back("检测条件表达式"); columns_name.push_back("最大保持时间[小时]"); for (int i = 0; i < 2; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i == 0) { coli_data.push_back(item.second.exp_str[0]); } else { coli_data.push_back(item.second.params[0]); } } data.push_back(coli_data); } } break; case 7: { columns_name.push_back("检测条件表达式"); columns_name.push_back("最大出现次数"); for (int i = 0; i < 2; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i == 0) { coli_data.push_back(item.second.exp_str[0]); } else { coli_data.push_back(item.second.params[0]); } } data.push_back(coli_data); } } break; case 8: { columns_name.push_back("报警条件表达式"); columns_name.push_back("查询均值时间[s]"); columns_name.push_back("单位时间间隔[min]"); columns_name.push_back("监控量斜率(减少为用负值)"); columns_name.push_back("连续出现的次数"); for (int i = 0; i < 5; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i == 0) { coli_data.push_back(item.second.exp_str[0]); } else { coli_data.push_back(item.second.params[i - 1]); } } data.push_back(coli_data); } } break; case 12: { columns_name.push_back("筛选条件表达式"); columns_name.push_back("X表达式"); columns_name.push_back("Y表达式"); columns_name.push_back("数据误差比(0~1)"); for (int i = 0; i < 4; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 3) { coli_data.push_back(item.second.exp_str[i]); } else { coli_data.push_back(item.second.params[0]); } } data.push_back(coli_data); } } break; case 13: { columns_name.push_back("筛选条件表达式"); columns_name.push_back("X表达式"); columns_name.push_back("Y表达式"); columns_name.push_back("数据误差比(0~1)"); columns_name.push_back("相关性计算数据最小长度"); for (int i = 0; i < 5; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 3) { coli_data.push_back(item.second.exp_str[i]); } else { coli_data.push_back(item.second.params[i - 3]); } } data.push_back(coli_data); } } break; case 14: { columns_name.push_back("报警条件表达式"); columns_name.push_back("查询均值时间[s]"); columns_name.push_back("单位时间间隔[min]"); columns_name.push_back("监控量变化率[%](减少为用负值)"); columns_name.push_back("连续出现的次数"); for (int i = 0; i < 5; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i == 0) { coli_data.push_back(item.second.exp_str[0]); } else { coli_data.push_back(item.second.params[i - 1]); } } data.push_back(coli_data); } } break; case 15: { columns_name.push_back("监控变量表达式"); columns_name.push_back("监测窗数据量[100,1000]"); for (int i = 0; i < 2; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i == 0) { coli_data.push_back(item.second.exp_str[0]); } else { coli_data.push_back(item.second.params[0]); } } data.push_back(coli_data); } } break; case 16: { columns_name.push_back("前提条件表达式"); columns_name.push_back("多变量求和表达式"); columns_name.push_back("单位"); columns_name.push_back("检测模式"); columns_name.push_back("超时警告:离群变量超均值百分比"); columns_name.push_back("报警:离群变量超均值百分比"); columns_name.push_back("持续时间[ms]"); for (int i = 0; i < 7; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 2) { coli_data.push_back(item.second.exp_str[i]); } else if (i == 2) { coli_data.push_back(item.second.unit); } else { coli_data.push_back(item.second.params[i - 3]); } } data.push_back(coli_data); } } break; case 17: { columns_name.push_back("数据筛选表达式"); columns_name.push_back("超限结果表达式"); columns_name.push_back("单位"); columns_name.push_back("警告:限幅"); columns_name.push_back("报警:限幅"); for (int i = 0; i < 5; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 2) { coli_data.push_back(item.second.exp_str[i]); } else if (i == 2) { coli_data.push_back(item.second.unit); } else { coli_data.push_back(item.second.params[i - 3]); } } data.push_back(coli_data); } } break; case 18: { columns_name.push_back("前提条件表达式"); columns_name.push_back("多变量求和表达式"); columns_name.push_back("单位"); columns_name.push_back("检测模式"); columns_name.push_back("超时警告:离群变量超均值"); columns_name.push_back("报警:离群变量超均值"); columns_name.push_back("持续时间[ms]"); for (int i = 0; i < 7; i++) { vector coli_data; for (const auto &item : algRuleIfo) { if (i < 2) { coli_data.push_back(item.second.exp_str[i]); } else if (i == 2) { coli_data.push_back(item.second.unit); } else { coli_data.push_back(item.second.params[i - 3]); } } data.push_back(coli_data); } } break; default: logger_->Debug() << "algid:" << algid << " error!" << std::endl; break; } const int tagMaxNum = alg_2_tagMax[algid]; for (int i = 0; i < tagMaxNum; i++) { string tagi = "tag" + std::to_string(i + 1); columns_name.push_back(tagi); vector coli_data; for (const auto &item : algRuleIfo) { coli_data.push_back(item.second.tags_item_get(i)); } data.push_back(coli_data); } for (int i = 0; i < tagMaxNum; i++) { string tagi = "tag" + std::to_string(i + 1) + "中文"; columns_name.push_back(tagi); vector coli_data; for (const auto &item : algRuleIfo) { coli_data.push_back(item.second.tags_chinese_get(i)); } data.push_back(coli_data); } js1["columns"] = columns_name; js1["data"] = data; return js1.dump(); } bool RICSAlg::write_memcaced(string jkey, string jvalue) { auto reSult = m_memclient.Insert(jkey.c_str(), jvalue.c_str()); if (1 != reSult) { this->logger_->Debug() << "update_eqp_status()" << "m_memclient.Insert异常[0,set data fail;-1,key=null or value=null]:" << reSult << std::endl; return false; } return true; }