133 lines
4.9 KiB
C++
133 lines
4.9 KiB
C++
|
|
#include <base/BitTool.h>
|
|
#include <eqpalg/algs/AlgInstantCommon.h>
|
|
#include <utility/StringHelper.h>
|
|
extern std::map<std::string, ITEM> 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:"<<m_feedback.addr_action<<"
|
|
// "<<m_feedback.addr_feedback<<endl;
|
|
// mp_timeset = new CMemTable<T_TIME_SET::STR_T_TIME_SET>("T_LOV_TAB1",
|
|
// 999); pFDAA = new
|
|
// CMemTable<T_LOV_FDAAITEM::STR_T_LOV_FDAAITEM>("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<MOD_CACHE> 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;
|
|
}
|