943 lines
34 KiB
C++
Raw Normal View History

2025-03-12 11:08:50 +08:00

/**********************************************************************************
* @file SimpleCtrl.cpp
* @brief 使oatpp简单api的控制器类
* @author yikenan
* @versiong 1.0
* @date 2021/12/27
**********************************************************************************/
#include <string>
#include <vector>
#include <map>
#include "boost/algorithm/string.hpp"
#include "pub_logger_api/logger.h"
#include "pub_utility_api/TimeUtil.h"
#include "db_api_ex/CDbApi.h"
#include "rdb_api/CRdbAccess.h"
//#include "alarm_server_api/AlarmCommonDef.h"
#include "../include/SessionApi.h"
#include "DTOs.hpp"
#include "SimpleCtrl.hpp"
2025-03-12 14:17:01 +08:00
using namespace iot_dbms;
using namespace iot_service;
2025-03-12 11:08:50 +08:00
namespace web_server
{
namespace module_alarm
{
CSimpleCtrl::CSimpleCtrl( std::shared_ptr<oatpp::data::mapping::ObjectMapper> &objMapper )
: oatpp::web::server::api::ApiController( objMapper )
{
}
//< 默认告警颜色
static const std::vector<std::string> g_vecDefaultAlmColor = {"ffff00", "ffBD00", "ff7E00", "ff3F00", "ff0000"};
std::shared_ptr<oatpp::web::protocol::http::outgoing::Response> CSimpleCtrl::findAlarmcolor()
{
//< 析构时会自动关闭连接
2025-03-12 14:17:01 +08:00
iot_dbms::CDbApi objDbConn( DB_CONN_MODEL_READ );
2025-03-12 11:08:50 +08:00
if ( !objDbConn.open())
{
LOGERROR( "findAlarmcolor(): 打开数据库失败" );
return createResponse( Status::CODE_500, "打开数据库失败" );
}
//LOGINFO( "数据库地址=[%s],名称=[%s]", objDbConn.getCurrentDbPara().getHostName().toUtf8().data(),
// objDbConn.getCurrentDbPara().getDatabaseName().toUtf8().data());
QString strSql;
QSqlQuery objQuery;
//< 查询颜色配置
std::map<int, std::string> mapCfgColor;
{
//< SQL中写明列名代码中无需再判断列是否存在
strSql = "SELECT id,color FROM alarm_color ORDER BY id";
if ( objDbConn.execute( strSql, objQuery ))
{
bool bOk = true;
while ( objQuery.next())
{
const int nId = objQuery.value( 0 ).toInt( &bOk );
if ( !bOk )
{
LOGERROR( "findAlarmcolor(): id字段转int失败跳过" );
continue;
}
mapCfgColor[nId] = objQuery.value( 1 ).toString().toStdString();
}
}
else
{
LOGERROR( "findAlarmcolor(): 查询错误SQL语句如下\n%s", strSql.toUtf8().constData());
}
}
//< SQL中写明列名代码中无需再判断列是否存在
strSql = "SELECT priority_id,priority_name FROM alarm_level_define ORDER BY priority_id";
if ( !objDbConn.execute( strSql, objQuery ))
{
LOGERROR( "findAlarmcolor(): 查询错误SQL语句如下\n%s", strSql.toUtf8().constData());
return createResponse( Status::CODE_500, "数据库查询错误" );
}
auto spResp = dto::CAlmColor::createShared();
while ( objQuery.next())
{
auto spOne = dto::COneAlmColor::createShared();
const int nId = objQuery.value( 0 ).toInt();
spOne->id = objQuery.value( 0 ).toString().toStdString();
spOne->name = objQuery.value( 1 ).toString().toStdString();
auto it = mapCfgColor.find( nId );
if ( it == mapCfgColor.end())
{
//< 没找到
if ( nId >= ( int ) g_vecDefaultAlmColor.size())
spOne->color = *g_vecDefaultAlmColor.rbegin();
else if ( nId < 0 )
spOne->color = *g_vecDefaultAlmColor.begin();
else
spOne->color = g_vecDefaultAlmColor[nId];
}
else
{
spOne->color = it->second;
}
spResp->push_back( spOne );
}
return createDtoResponse( Status::CODE_200, spResp );
}
std::shared_ptr<oatpp::web::protocol::http::outgoing::Response> CSimpleCtrl::insertColor( const oatpp::String &strReq )
{
auto spReq = getDefaultObjectMapper()->readFromString<dto::CAlmColor>( strReq );
if ( !spReq )
{
LOGERROR( "insertColor(): 请求解析失败,请求内容:%s", strReq->c_str());
return createResponse( Status::CODE_400, "请求json解析失败" );
}
2025-03-12 14:17:01 +08:00
iot_dbms::CDbApi objDbConn( DB_CONN_MODEL_WRITE );
2025-03-12 11:08:50 +08:00
if ( !objDbConn.open())
{
LOGERROR( "insertColor(): 打开数据库失败" );
return createResponse( Status::CODE_500, "打开数据库失败" );
}
//LOGINFO( "数据库地址=[%s],名称=[%s]", objDbConn.getCurrentDbPara().getHostName().toUtf8().data(),
// objDbConn.getCurrentDbPara().getDatabaseName().toUtf8().data());
if ( !objDbConn.transaction())
{
LOGERROR( "insertColor(): 开启事务失败" );
return createResponse( Status::CODE_500, "开启事务失败" );
}
//< 清空alarm_color表
bool bRc = objDbConn.execute( "TRUNCATE TABLE alarm_color" );
//< 插入
if ( bRc )
{
QList<QList<QVariant> > objInsertVal;
for ( const auto &it:*spReq )
{
objInsertVal.push_back( {it->id->c_str(), it->color->c_str()} );
}
bRc = objDbConn.insert( "alarm_color", {"id", "color"}, objInsertVal, 100 );
}
//< 提交
if ( bRc )
{
if ( !objDbConn.commit())
{
LOGERROR( "insertColor(): 提交事务失败" );
return createResponse( Status::CODE_500, "提交事务失败" );
}
}
else
{
LOGERROR( "insertColor(): 数据库操作失败" );
objDbConn.rollback();
return createResponse( Status::CODE_500, "数据库操作失败" );
}
auto spResp = oatpp::DTO::Fields<String>::createShared();
spResp->push_back( {"reflag", "succ"} );
spResp->push_back( {"reflagInfo", "保存成功"} );
return createDtoResponse( Status::CODE_200, spResp );
}
inline unsigned char from_hex( unsigned char ch )
{
if ( ch <= '9' && ch >= '0' )
ch -= '0';
else if ( ch <= 'f' && ch >= 'a' )
ch -= 'a' - 10;
else if ( ch <= 'F' && ch >= 'A' )
ch -= 'A' - 10;
else
ch = 0;
return ch;
}
inline std::string urldecode( const std::string &str )
{
using namespace std;
string result;
string::size_type i;
for ( i = 0; i < str.size(); ++i )
{
if ( str[i] == '+' )
{
result += ' ';
}
else if ( str[i] == '%' && str.size() > i + 2 )
{
const unsigned char ch1 = from_hex( str[i + 1] );
const unsigned char ch2 = from_hex( str[i + 2] );
const unsigned char ch = ( ch1 << 4 ) | ch2;
result += ch;
i += 2;
}
else
{
result += str[i];
}
}
return result;
}
inline int64 getTime( const char *pCharTime )
{
if ( !pCharTime )
return -1;
int year, month, day, hour, minute;
sscanf( pCharTime, "%04d-%02d-%02d %02d:%02d", &year, &month, &day, &hour, &minute );
// std::cout << pCharTime <<"|||| "<<year << " " << month << " "<< day << " "<< hour << " "<< minute << std::endl;
2025-03-12 14:17:01 +08:00
return iot_public::getUTCMsecFromLocalTime( year, month, day, hour, minute, 0, 0 );
2025-03-12 11:08:50 +08:00
}
std::shared_ptr<oatpp::web::protocol::http::outgoing::Response> CSimpleCtrl::queryEventMsFromMySql(
const oatpp::String &content, const oatpp::String &priority, const oatpp::String &location,
const oatpp::String &devType, const oatpp::String &type, const oatpp::String &regionId,
const oatpp::String &startTime, const oatpp::String &endTime, const oatpp::Int32 &orderType,
const oatpp::String &orderFlag, const oatpp::Int16 &pageSize, const oatpp::Int16 &page )
{
int64 nStartTimeMsec = 0, nEndTimeMsec = 0;
std::string decodedPriority,decodedLocation,decodedDevType,decodedType;
std::vector<std::string> vecPriority, vecLocation, vecDevType, vecType;
QString strOrderType;
{
if ( startTime == "" || endTime == "" )
{
const char *szMsg = "请求错误:时间为空";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
nStartTimeMsec = getTime( urldecode( *startTime ).c_str());
nEndTimeMsec = getTime( urldecode( *endTime ).c_str());
if ( -1 == nStartTimeMsec || -1 == nEndTimeMsec )
{
const char *szMsg = "请求错误:时间错误";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
if ( nStartTimeMsec > nEndTimeMsec )
{//< 不作为错误,调换
const int64 nTemp = nEndTimeMsec;
nEndTimeMsec = nStartTimeMsec;
nStartTimeMsec = nTemp;
}
if ( content != "" || regionId != "" )
{
const char *szMsg = "请求错误:按内容或者按区域搜索未启用";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
// 0 时间1优先组2位置3责任区4事件类型
if ( orderType < 0 || orderType > 5 )
{
const char *szMsg = "请求错误:orderType必须为时间";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
else
{
switch (orderType) {
case 0:
strOrderType = "time_stamp";
break;
case 1:
strOrderType = "priority";
break;
case 2:
strOrderType = "location_id";
break;
case 3:
strOrderType = "region_id";
break;
case 4:
strOrderType = "alm_type";
break;
}
}
if ( pageSize <= 0 )
{
const char *szMsg = "请求错误:pagesize必须大于0";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
if ( page <= 0 )
{
const char *szMsg = "请求错误:size必须大于0";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
if ( orderFlag != "asc" && orderFlag != "desc" )
{
const char *szMsg = "请求错误:orderFlag必须为asc或者desc";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
if ( priority != "" )
{
decodedPriority = urldecode(*priority);
boost::split( vecPriority, decodedPriority, boost::is_any_of( ";" ));
if ( vecPriority.empty())
{
const char *szMsg = "请求错误:错误的priority参数";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
}
if ( location != "" )
{
decodedLocation = urldecode(*location);
boost::split( vecLocation, decodedLocation, boost::is_any_of( ";" ));
if ( vecLocation.empty())
{
const char *szMsg = "请求错误:错误的location参数";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
}
if ( devType != "" )
{
decodedDevType = urldecode(*devType);
boost::split( vecDevType, decodedDevType, boost::is_any_of( ";" ));
if ( vecDevType.size() != 1 )
{
const char *szMsg = "请求错误:devType请求参数数量为1或0";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
}
if ( type != "" )
{
decodedType = urldecode(*type);
boost::split( vecType, decodedType, boost::is_any_of( ";" ));
if ( vecType.empty())
{
const char *szMsg = "请求错误:错误的type参数";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_400, szMsg );
}
}
}
2025-03-12 14:17:01 +08:00
iot_dbms::CDbApi objDbConn( DB_CONN_MODEL_READ );
2025-03-12 11:08:50 +08:00
if ( !objDbConn.open())
{
const char *szMsg = "打开数据库失败";
LOGERROR( "%s", szMsg );
return createResponse( Status::CODE_500, szMsg );
}
QString strSql = "select "
" count(*) "
" from his_event ";
// 构造查询条件
QString strCondition = "";
{ // vecPriority,vecLocation,vecDevType,vecType;
auto addCondtion = [&strCondition]( std::vector<std::string> &vecCondition, const std::string &condName )
{
if ( !vecCondition.empty())
{
strCondition += " ( ";
for ( const std::string &x : vecCondition )
{
strCondition += QString( " " ) + condName.c_str() + "=" + x.c_str() + " or";
}
strCondition.chop( 3 );
strCondition += " ) ";
strCondition += " and ";
}
};
addCondtion( vecPriority, "priority" );
addCondtion( vecLocation, "location_id" );
addCondtion( vecDevType, "dev_type" );
addCondtion( vecType, "alm_type" );
if ( strCondition != "" )
{
strCondition = " and " + strCondition;
strCondition.chop( 5 ); // delete " and "
}
// 添加排序条件
strCondition += QString(" order by ") + strOrderType + " " + orderFlag->c_str() ;
strCondition = QString( " where " ) + " time_stamp > " + QString::number( nStartTimeMsec )
+ " and time_stamp < " + QString::number( nEndTimeMsec ) + strCondition ;
}
strSql += strCondition;
QSqlQuery objQuery;
//先查询符合条件的数量
if ( !objDbConn.execute( strSql, objQuery ))
{
LOGERROR( "queryEventMsFromMySql(): 查询错误SQL语句如下\n%s", strSql.toUtf8().constData());
return createResponse( Status::CODE_500, "数据库查询错误" );
}
LOGDEBUG( "SQL语句如下\n%s", strSql.toUtf8().constData());
auto spResp = dto::EventMsDto::createShared();
spResp->rows = {};
while ( objQuery.next())
{
spResp->records = objQuery.value( 0 ).toString().toInt();
}
spResp->page = page;
spResp->pageSize = pageSize;
spResp->total = ( spResp->records / pageSize ) + 1;
// 填充id到desc的map
std::map<int, String> alarmTypeMap;
std::map<int, String> statuMap;
std::map<int, String> locationMap;
std::map<int, String> levelMap;
std::map<int, String> devTypeMap;
std::map<int, String> regionMap;
{
auto queryIdtoDesc = [&objDbConn, &objQuery, &strSql]( const char *tableName, const char *idCol,
const char *descCol, std::map<int, String> &mapResult )
{
//< SQL中写明列名代码中无需再判断列是否存在
strSql = QString( "SELECT %1,%2 FROM %3 ORDER BY %1" ).arg( idCol ).arg( descCol ).arg( tableName );
objQuery.clear();
if ( objDbConn.execute( strSql, objQuery ))
{
bool bOk = true;
while ( objQuery.next())
{
const int nId = objQuery.value( 0 ).toInt( &bOk );
if ( !bOk )
{
LOGERROR( "queryIdtoDesc(): id字段转int失败跳过, tableName:%s", tableName );
continue;
}
mapResult[nId] = objQuery.value( 1 ).toString().toStdString();
}
}
else
{
LOGERROR( "queryIdtoDesc(): 查询错误SQL语句如下\n%s", strSql.toUtf8().constData());
}
LOGDEBUG( "SQL语句如下\n%s", strSql.toUtf8().constData());
};
queryIdtoDesc( "alarm_type_define", "type_id", "type_name", alarmTypeMap );
queryIdtoDesc( "alarm_status_define", "alarm_type", "display_name", statuMap );
queryIdtoDesc( "sys_model_location_info", "location_id", "DESCRIPTION", locationMap );
queryIdtoDesc( "alarm_level_define", "PRIORITY_ID", "PRIORITY_NAME", levelMap );
queryIdtoDesc( "dev_type_def", "DEV_TYPE_ID", "DESCRIPTION", devTypeMap );
queryIdtoDesc( "region_info", "REGION_ID", "DESCRIPTION", regionMap );
}
// 再查询所有结果
{
strSql = "select "
"alm_type,alm_status,alm_style" // 0 1 2
",time_stamp,location_id,content,priority" // 3 4 5 6
",sub_system,dev_type,region_id,dev_group_tag" // 7 8 9 10
",key_id_tag,confirm_time,confirm_user_id,confirm_node_name" // 11 12 13 14
" from his_event ";
strSql += strCondition;
// page pageSize转换 这里是页数相关
int64 offset = ( int64 ) pageSize * ( int64 ) ( page - 1 );
strSql += QString( " limit " ) + QString::number( pageSize ) + " offset " + QString::number( offset );
objQuery.clear();
if ( !objDbConn.execute( strSql, objQuery ))
{
LOGERROR( "queryEventMsFromMySql(): 查询错误SQL语句如下\n%s", strSql.toUtf8().constData());
return createResponse( Status::CODE_500, "数据库查询错误" );
}
LOGDEBUG( "SQL语句如下\n%s", strSql.toUtf8().constData());
// 填充id到desc的lambda
auto assignDescVal = []( const std::map<int, String> &mapId2Desc, int nId, const char *tableName,
oatpp::String &strVal )
{
auto it = mapId2Desc.find( nId );
if ( it == mapId2Desc.end())
{
( void ) tableName; // 避免 unused parameter 编译器告警
//< 不记录日志,有些告警的设备类型、责任区就是没有的
//< 或者建模删了类型、责任区、区域等,老的事件记录找不到对应的信息
//LOGERROR( "id not found,id:%d,table:%s", nId, tableName );
}
else
{
strVal = it->second;
}
};
while ( objQuery.next())
{
auto spOne = dto::EventRecordRowDto::createShared();
spOne->devType = objQuery.value( 8 ).toString().toStdString();
spOne->confirmTime = objQuery.value( 12 ).toString().toStdString();
spOne->confirmNodeName = objQuery.value( 14 ).toString().toStdString();
spOne->confirm_user_id = objQuery.value( 13 ).toString().toStdString();
spOne->statu = objQuery.value( 2 ).toString().toStdString(); // alm_status
spOne->priority = objQuery.value( 6 ).toString().toStdString();
spOne->type = objQuery.value( 0 ).toString().toStdString(); //alm_type
spOne->content = objQuery.value( 5 ).toString().toStdString();
spOne->regionId = objQuery.value( 9 ).toString().toStdString();
spOne->location = objQuery.value( 4 ).toString().toStdString();
assignDescVal( alarmTypeMap, objQuery.value( 0 ).toInt(), "alarm_type_define", spOne->typeName );
assignDescVal( statuMap, objQuery.value( 2 ).toInt(), "alarm_status_define", spOne->statuName );
assignDescVal( locationMap, objQuery.value( 4 ).toInt(), "sys_model_location_info", spOne->locationName );
assignDescVal( levelMap, objQuery.value( 6 ).toInt(), "alarm_level_define", spOne->priorityName );
assignDescVal( devTypeMap, objQuery.value( 8 ).toInt(), "dev_type_def", spOne->devTypeName );
assignDescVal( regionMap, objQuery.value( 9 ).toInt(), "region_info", spOne->regionName );
spOne->time = QDateTime::fromMSecsSinceEpoch( objQuery.value( 3 ).toLongLong()).toString(
"yyyy-MM-dd HH:mm:ss:zzz" ).toStdString();
spResp->rows->push_back( spOne );
}
}
spResp->operateFlag = true;
return createDtoResponse( Status::CODE_200, spResp );
}
std::shared_ptr<oatpp::web::protocol::http::outgoing::Response>
CSimpleCtrl::queryAlarmTreeMs( const std::shared_ptr<IncomingRequest> &spRequest )
{
// 获取用户
auto spPermApi = getSessionApi()->getCurPermApi( spRequest );
if ( !spPermApi )
{
LOGERROR( "未登录无法获取用户ID" );
return createResponse( Status::CODE_400, "未登录" );
}
// 获取责任区id集合、位置id集合
std::set<int> setRegionId;
std::set<int> setLocationId;
{
std::vector<int> vecRegionId;
std::vector<int> vecLocationId;
2025-03-12 14:54:22 +08:00
if ( spPermApi->GetSpeFunc( "FUNC_SPE_ALARM_VIEW", vecRegionId, vecLocationId ) != iotSuccess )
2025-03-12 11:08:50 +08:00
{
LOGERROR( "GetSpeFunc 执行失败" );
return createResponse( Status::CODE_500, "GetSpeFunc 执行失败" );
}
for ( auto nId:vecRegionId )
setRegionId.emplace( nId );
for ( auto nId:vecLocationId )
setLocationId.emplace( nId );
}
// 创建返回的dto
auto spResp = dto::CAlarmTreeMs::createShared();
spResp->rows = oatpp::Vector<oatpp::Object<dto::CAlarmTreeMsRow >>::createShared();
CRdbAccess objRdb;
// 查询位置
if ( objRdb.open( 1, "sys_model_location_info" ))
{
CVarType objDesc;
for ( const auto nId : setLocationId )
{
const int nIndex = objRdb.searchRecordByKey( &nId );
if ( nIndex >= 0 )
{
if ( objRdb.getColumnValueByIndex( nIndex, "description", objDesc ))
{
auto spItem = dto::CAlarmTreeMsRow::createShared();
//spItem->treePCode = "";
spItem->treeCode = std::to_string( nId );
spItem->name = objDesc.c_str();
spResp->rows->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
//< 查询设备组
if ( objRdb.open( 1, "dev_group" ))
{
CRdbQueryResult objResult;
std::vector<std::string> vecSelectColumn;
vecSelectColumn.emplace_back( "tag_name" );
vecSelectColumn.emplace_back( "description" );
vecSelectColumn.emplace_back( "location_id" );
vecSelectColumn.emplace_back( "region_id" );
if ( objRdb.select( objResult, vecSelectColumn ))
{
const int nRcdCnt = objResult.getRecordCount();
CVarType objTagName, objDesc, objLocationId, objRegionId;
for ( int i = 0; i < nRcdCnt; i++ )
{
if ( objResult.getColumnValue( i, 0, objTagName )
&& objResult.getColumnValue( i, 1, objDesc )
&& objResult.getColumnValue( i, 2, objLocationId )
&& objResult.getColumnValue( i, 3, objRegionId ))
{
if ( setLocationId.count( objLocationId.toInt()) <= 0 )
continue;
if ( setRegionId.count( objRegionId.toInt()) <= 0 )
continue;
auto spItem = dto::CAlarmTreeMsRow::createShared();
spItem->treePCode = objLocationId.toStdString();
spItem->treeCode = objTagName.c_str();
spItem->name = objDesc.c_str();
spResp->rows->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
else
LOGERROR( "实时库查询失败" );
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
return createDtoResponse( Status::CODE_200, spResp );
}
std::shared_ptr<oatpp::web::protocol::http::outgoing::Response>
CSimpleCtrl::queryEventConditionMs( /*const oatpp::Int32 &type, const oatpp::Int32 &id,*/
const std::shared_ptr<IncomingRequest> &spRequest )
{
// todo 参数未用
// 获取用户
auto spPermApi = getSessionApi()->getCurPermApi( spRequest );
if ( !spPermApi )
{
LOGERROR( "未登录无法获取用户ID" );
return createResponse( Status::CODE_400, "未登录" );
}
// 获取责任区id集合、位置id集合
std::vector<int> vecRegionId;
std::vector<int> vecLocationId;
2025-03-12 14:54:22 +08:00
if ( spPermApi->GetSpeFunc( "FUNC_SPE_ALARM_VIEW", vecRegionId, vecLocationId ) != iotSuccess )
2025-03-12 11:08:50 +08:00
{
LOGERROR( "GetSpeFunc 执行失败" );
return createResponse( Status::CODE_500, "GetSpeFunc 执行失败" );
}
// 创建返回的dto
auto spDto = dto::CEventConditionMs::createShared();
spDto->mapData = dto::CEventConditionMsMapData::createShared();
// 查询设备类型
CRdbAccess objRdb;
if ( objRdb.open( 1, "dev_type_def" ))
{
CRdbQueryResult objResult;
std::vector<std::string> vecSelectColumn;
vecSelectColumn.emplace_back( "dev_type_id" );
vecSelectColumn.emplace_back( "tag_name" );
vecSelectColumn.emplace_back( "description" );
if ( objRdb.select( objResult, vecSelectColumn ))
{
const int nRcdCnt = objResult.getRecordCount();
if ( nRcdCnt > 0 )
{
spDto->mapData->devType = oatpp::Vector<oatpp::Object<dto::CEventConditionMsItem >>::createShared();
CVarType v0, v1, v2;
for ( int i = 0; i < nRcdCnt; i++ )
{
if ( objResult.getColumnValue( i, 0, v0 )
&& objResult.getColumnValue( i, 1, v1 )
&& objResult.getColumnValue( i, 2, v2 ))
{
auto spItem = dto::CEventConditionMsItem::createShared();
spItem->id = v0.toStdString();
spItem->code = v1.toStdString();
spItem->name = v2.toStdString();
spDto->mapData->devType->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
}
else
LOGERROR( "实时库查询失败" );
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
// 查询告警类型
if ( objRdb.open( 1, "alarm_type_define" ))
{
CRdbQueryResult objResult;
std::vector<std::string> vecSelectColumn;
vecSelectColumn.emplace_back( "type_id" );
vecSelectColumn.emplace_back( "type_name" );
if ( objRdb.select( objResult, vecSelectColumn ))
{
const int nRcdCnt = objResult.getRecordCount();
if ( nRcdCnt > 0 )
{
spDto->mapData->alarmType = oatpp::Vector<oatpp::Object<dto::CEventConditionMsItem >>::createShared();
CVarType v0, v1;
for ( int i = 0; i < nRcdCnt; i++ )
{
if ( objResult.getColumnValue( i, 0, v0 )
&& objResult.getColumnValue( i, 1, v1 ))
{
auto spItem = dto::CEventConditionMsItem::createShared();
spItem->id = v0.toStdString();
spItem->name = v1.toStdString();
// switch ( v0.toInt())
// {
// case ALM_TYPE_DI_CHANGE:
// spItem->code = "ALM_TYPE_DI_CHANGE";
// break;
// case ALM_TYPE_AI_OVER:
// spItem->code = "ALM_TYPE_AI_OVER";
// break;
// case ALM_TYPE_SOE:
// spItem->code = "ALM_TYPE_SOE";
// break;
// case ALM_TYPE_OPERATE:
// spItem->code = "ALM_TYPE_OPERATE";
// break;
// case ALM_TYPE_SYSTEM:
// spItem->code = "ALM_TYPE_SYSTEM";
// break;
// default:
// break;
// }
spDto->mapData->alarmType->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
}
else
LOGERROR( "实时库查询失败" );
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
// 查询专业
if ( objRdb.open( 1, "sys_model_sub_system_info" ))
{
CRdbQueryResult objResult;
std::vector<std::string> vecSelectColumn;
vecSelectColumn.emplace_back( "sub_system_id" );
vecSelectColumn.emplace_back( "tag_name" );
vecSelectColumn.emplace_back( "description" );
if ( objRdb.select( objResult, vecSelectColumn ))
{
const int nRcdCnt = objResult.getRecordCount();
if ( nRcdCnt > 0 )
{
spDto->mapData->subSystem = oatpp::Vector<oatpp::Object<dto::CEventConditionMsItem >>::createShared();
CVarType v0, v1, v2;
for ( int i = 0; i < objResult.getRecordCount(); i++ )
{
if ( objResult.getColumnValue( i, 0, v0 )
&& objResult.getColumnValue( i, 1, v1 )
&& objResult.getColumnValue( i, 2, v2 ))
{
auto spItem = dto::CEventConditionMsItem::createShared();
spItem->id = v0.toStdString();
spItem->code = v1.toStdString();
spItem->name = v2.toStdString();
spDto->mapData->subSystem->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
}
else
LOGERROR( "实时库查询失败" );
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
// 查询责任区
if ( objRdb.open( 1, "region_info" ))
{
CVarType objTagName;
CVarType objDesc;
for ( const auto nId : vecRegionId )
{
const int nIndex = objRdb.searchRecordByKey( &nId );
if ( nIndex >= 0 )
{
if ( objRdb.getColumnValueByIndex( nIndex, "tag_name", objTagName )
&& objRdb.getColumnValueByIndex( nIndex, "description", objDesc ))
{
auto spItem = dto::CEventConditionMsItem::createShared();
spItem->id = std::to_string( nId );
spItem->code = objTagName.c_str();
spItem->name = objDesc.c_str();
if ( !spDto->mapData->regionInfo )
spDto->mapData->regionInfo = oatpp::Vector<oatpp::Object<dto::CEventConditionMsItem >>::createShared();
spDto->mapData->regionInfo->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
// 查询告警等级
if ( objRdb.open( 1, "alarm_level_define" ))
{
CRdbQueryResult objResult;
std::vector<std::string> vecSelectColumn;
vecSelectColumn.emplace_back( "priority_id" );
vecSelectColumn.emplace_back( "sound_file_name" );
vecSelectColumn.emplace_back( "priority_name" );
if ( objRdb.select( objResult, vecSelectColumn ))
{
const int nRcdCnt = objResult.getRecordCount();
if ( nRcdCnt > 0 )
{
spDto->mapData->alarmLevel = oatpp::Vector<oatpp::Object<dto::CEventConditionMsItem >>::createShared();
CVarType v0, v1, v2;
for ( int i = 0; i < nRcdCnt; i++ )
{
if ( objResult.getColumnValue( i, 0, v0 )
&& objResult.getColumnValue( i, 1, v1 )
&& objResult.getColumnValue( i, 2, v2 ))
{
auto spItem = dto::CEventConditionMsItem::createShared();
spItem->id = v0.toStdString();
spItem->code = v1.toStdString();
spItem->name = v2.toStdString();
spDto->mapData->alarmLevel->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
}
else
LOGERROR( "实时库查询失败" );
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
// 查询位置
if ( objRdb.open( 1, "sys_model_location_info" ))
{
CVarType objTagName;
CVarType objDesc;
for ( const auto nId : vecLocationId )
{
const int nIndex = objRdb.searchRecordByKey( &nId );
if ( nIndex >= 0 )
{
if ( objRdb.getColumnValueByIndex( nIndex, "tag_name", objTagName )
&& objRdb.getColumnValueByIndex( nIndex, "description", objDesc ))
{
auto spItem = dto::CEventConditionMsItem::createShared();
spItem->id = std::to_string( nId );
spItem->code = objTagName.c_str();
spItem->name = objDesc.c_str();
if ( !spDto->mapData->location )
spDto->mapData->location = oatpp::Vector<oatpp::Object<dto::CEventConditionMsItem >>::createShared();
spDto->mapData->location->emplace_back( std::move( spItem ));
}
else
LOGERROR( "实时库取值失败" );
}
}
objRdb.close();
}
else
LOGERROR( "打开实时库表失败" );
// 返回数据
spDto->operateFlag = true;
return createDtoResponse( Status::CODE_200, spDto );
}
} //namespace module_alarm
} //namespace web_server