#include #include #include extern std::map glob_items; int AlgInstantCommon::init() { LOG d("AlgInstantCommon::init", AUTO_CATCH_PID); int ret = 0; try { // p_tele->ReBuild(event_no_of_item[m_tags[0]]); // p_btel->ReBuild(1010); // d.Debug()<<"tags:"<("T_LOV_TAB1", // 999); pFDAA = new // CMemTable("T_LOV_FDAAITEM", 1); } catch (const std::exception &e) { d.Error() << mix_cc::get_nested_exception(e) << std::endl; ret = -1; } return ret; } AlgInstantCommon::AlgInstantCommon(const string name, const Json::Value rulejson, const string ruleId) : AlgBase(name, rulejson, ruleId) { // CMemTable mod1("ZONE0",1); // gb_data = mod1(); this->init(); for (unsigned int i = 0; i < m_tags.size(); i++) { string tag = "tag" + std::to_string(i + 1); m_vars[tag] = 0.0; } string expdata(m_json_param["action_condition"]["str"][1].asString()); mp_exp = new MathExpression(expdata.c_str(), m_vars); } AlgInstantCommon::~AlgInstantCommon() { delete mp_exp; } int AlgInstantCommon::calculate(string &outjson) { LOG d("AlgInstantCommon::calculate", AUTO_CATCH_PID); outjson = ""; int ret = 0; try { HD3TimeRegion timeRegion; timeRegion.left.nSec = time(0); timeRegion.right.nSec = time(0); string str_changed = m_json_param["changed_parm"]["list"][1].asString(); string str_unchanged = m_json_param["unchanged_parm"]["list"][1].asString(); string msg = m_json_param["limit_error"]["content"][1].asString() + " "; for (unsigned int i = 0; i < m_tags.size(); i++) { string tag = "tag" + std::to_string(i + 1); m_vars[tag] = glob_items[m_tags[i]].value; msg += " " + m_tags[i] + " : " + std::to_string(glob_items[m_tags[i]].value); // d.Debug() << m_tags[i] << " : " << glob_items[m_tags[i]].value << endl; } double ret = mp_exp->evaluate(); // d.Debug() << "exp: " << mp_exp->Disassemble() << " ret: " << ret << // endl; // d.Debug() << " ret: " << ret << endl; if (fabs(ret - m_json_param["action_condition"]["result"][1].asDouble()) > EPS) { //表达式条件不满足 return 0; } if (!str_changed.empty()) { for (int i = m_tags.size() - 1; i >= 0; i--) { string tag = "tag" + std::to_string(i + 1); string::size_type pos = 0; if ((pos = str_changed.find(tag)) != string::npos) { //检测变量 double value = glob_items[m_tags[i]].value; double valueold = glob_items[m_tags[i]].valueold; if (fabs(value - valueold) > m_json_param["changed_parm"]["range"][1].asDouble()) { string tagname = m_json_param["tags"][tag][2].asString(); msg = msg + " " + tagname + "有变化" + " new: " + std::to_string(value) + " old: " + std::to_string(valueold) + ",差值: " + std::to_string(fabs(value - valueold)); // msg = msg + " " + tagname + "有变化"; } else { // d.Debug() << rule_name_ << " 数据正常! " << endl; return 0; } // str_changed = str_changed.replace(pos, // tag.size(),"",AUTO_CATCH_PID); } } } if (!str_unchanged.empty()) { for (int i = m_tags.size() - 1; i >= 0; i--) { string tag = "tag" + std::to_string(i + 1); string::size_type pos = 0; if ((pos = str_unchanged.find(tag)) != string::npos) { //检测变量 double value = glob_items[m_tags[i]].value; double valueold = glob_items[m_tags[i]].valueold; if (fabs(fabs(value - valueold) - m_json_param["unchanged_parm"]["range"][1].asDouble()) < EPS) { string tagname = m_json_param["tags"][tag][2].asString(); msg = msg + " " + tagname + "未发生变化! " + ",值为: " + std::to_string(value); // msg = msg + " " + tagname_str + "有变化"; } else { // d.Debug() << rule_name_ << " 数据正常! " << endl; return 0; } // str_unchanged = str_unchanged.replace(pos, // tag.size(),"",AUTO_CATCH_PID); } } } // d.Debug() << msg << endl; string tmp = this->build_alarm_info(MsgLevel::ERROR, rule_id_, rule_name_, "INSTANT_COMMON", msg, timeRegion); if (!tmp.empty()) outjson = tmp; } catch (const std::exception &e) { d.Error() << mix_cc::get_nested_exception(e) << std::endl; ret = -1; } return ret; }