浏览代码

1.1.9.10集成外部数据导入代码.

git-svn-id: https://202.107.226.68:8443/svn/Services/ResistanceMonitor@103 a05970a1-87b9-9d4f-9ee5-fa77e2ec115b
shenchunzhong 1 年之前
父节点
当前提交
34978416e8
共有 3 个文件被更改,包括 151 次插入6 次删除
  1. 3 2
      4.Data/AppService.cpp
  2. 148 4
      4.Data/ResistAlarm.cpp
  3. 二进制
      4.Data/TimeSyncServer.rc

+ 3 - 2
4.Data/AppService.cpp

@@ -135,7 +135,7 @@ bool CAppService::Start()
 	::WritePrivateProfileString("SET", "reminder_interval", (to_string(g_tReminderInterval) + " #报警提醒间隔").c_str(), m_strIniPath);
 	::WritePrivateProfileString("SET", "momp", g_strMoMp.c_str(), m_strIniPath);
 	::WritePrivateProfileString("SET", "DataCompression", to_string(g_bDataCompression).c_str(), m_strIniPath);
-    ::WritePrivateProfileString("SET", "ExternalData", fmt::format(" #是否采用外部程序分析数据进行智能判断 默认为0 9.6以上").c_str(), m_strIniPath);
+    ::WritePrivateProfileString("SET", "ExternalData", fmt::format("{} #是否采用外部程序分析数据进行智能判断 默认为0 9.6以上", (int)g_bExternalData).c_str(), m_strIniPath);
 
 	//ODBC
     if (CDBConnectPool::Instance()->Init(m_strDriver, m_strDataSource, m_strUserID, m_strPassWD, m_strCataLog, 5) == FALSE)
@@ -799,7 +799,8 @@ void CAppService::ThreadProcCreateTable(DWORD_PTR pThis)
 					mark                 nvarchar(255)        null,\
 					type				 tinyint			  not null default(0),\
 					sunroof			     tinyint			  not null default(0),\
-				);create unique clustered index IDX_MO_MP on {0}(mo ASC,mp ASC,show_time ASC,type ASC);", table_today).c_str();
+				);create unique clustered index IDX_MO_MP on {0}(mo ASC,mp ASC,show_time ASC,type ASC);\
+				create index IDX_TIME on {0} (show_time DESC)", table_today).c_str();
 
 				//不存在
 				if (!CDBConnectPool::Instance()->DBExecuteSQL(strSql))

+ 148 - 4
4.Data/ResistAlarm.cpp

@@ -1152,13 +1152,14 @@ void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, CONVERT_RESIST_OVER_
 	}
 }
 
-void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, FRICTION_OVER_LIMIT_INFO* pAlarmSet, time_t show_time, int show_val, eDaoChaPosi posi, eUpOrDownInfo eUpOrDown, void* pMoMpInfo)
+void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, FRICTION_OVER_LIMIT_INFO* pAlarmSet, time_t show_time, int showval, eDaoChaPosi posi, eUpOrDownInfo eUpOrDown, void* pMoMpInfo)
 {
 	if (pAlarmSet == nullptr || pAlarmSet->enable == false) return;
 	auto pInfo = (ST_MOMP_INFO*)pMoMpInfo;
 	
 	bool bNew = false;
 	ALARM_INFO* pAlarmInfo = nullptr;
+	int show_val = showval < 0 ? -showval : showval;
 	bool bAlarm = false, bWarn = false; int alarm_value = show_val, alarm_refer; time_t alarm_time = show_time;
 	CTime ctAlarmTime = CTime(alarm_time / 1000);
 	eLowHigh loworhigh = eLowHigh::LH_UNKNOWN; //0:最小值  1:最大值
@@ -1600,6 +1601,15 @@ void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, RETENSION_FORCE_DROP
 			pService->m_lstUnConfirmAlarm.push_back(pAlarmInfo);
 		}
 
+		//send
+		if (bNew) //不再推送
+		{
+			rapidjson::StringBuffer buffer;
+			auto ret = AlarmInfo2Pack(pAlarmInfo, buffer);
+			const char* output = buffer.GetString();
+			CAppService::Instance()->GetMgServer()->SendToAllClient(output, buffer.GetLength());
+		}
+
 		//主动推送315
 		if (bNew)
 		{
@@ -1665,6 +1675,8 @@ void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, RETENSION_FORCE_DROP
 							ctAlarmTime.GetAsSystemTime(pAlarm->recoveryTime);
 						}
 
+						//TODO 发送给客户端
+
 						g_p315ClientManager->GetTcpClient()->SendAlarmData(pAlarmInfo->zzjno, 2, CTime(pAlarmInfo->time).GetTime(), ctAlarmTime.GetTime(),
 							pAlarmInfo->type, posi == eSuoBiPosi::SB_FIX ? eDaoChaPosi::DCP_FIX : eDaoChaPosi::DCP_INVERT, pAlarmInfo->level, pAlarm->loworhigh,
 							TIEDA_ACQ_VALUE(pAlarm->val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), TIEDA_ACQ_VALUE(pAlarm->refer_val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), 0);
@@ -3348,14 +3360,146 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
 void CResistAlarmMng::ThreadProcMoveFromDB(DWORD_PTR param)
 {
 	auto pService = (CResistAlarmMng*)param;
-	auto ctNow = CTime::GetCurrentTime();
+	auto ctLast = CTime::GetCurrentTime();
 	Sleep(2000);
 	auto pDBConn = CDBConnectPool::Instance()->GetConnection();
 	do 
 	{
 		Sleep(100);   //每100ms 获取一次
-
-
+		string table_today = fmt::format("rm_move_{:0>4}{:0>2}", ctLast.GetYear(), ctLast.GetMonth());
+		auto ctNow = CTime::GetCurrentTime();
+		//加载数据
+		CString sql = fmt::format("SELECT mo,mp,show_time,start_time,end_time,curr_val,show_val,\
+			idx,posi,mark,type,sunroof FROM {} WHERE show_time >= '{}' ORDER BY show_time ASC;", table_today, ctLast.Format("%Y-%m-%d %H:%M:%S")).c_str();
+		ctLast = ctNow;
+
+       COdbcStatement stmt;
+	   if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))
+	   {
+		   ASSERT(0);
+		   continue;
+	   }
+	   //绑定数据
+	   int nCol = 1;
+	   char mo[51], mp[51];
+	   TIMESTAMP_STRUCT show_time, start_time, end_time;
+	   int curr_val, show_val;
+	   uint8_t idx, posi, type, sunroof;
+	   char mark[100];
+	   stmt.BindCharCol(nCol++, mo, sizeof(mo));
+	   stmt.BindCharCol(nCol++, mp, sizeof(mp));
+	   stmt.BindTimeStampCol(nCol++, &show_time);
+	   stmt.BindTimeStampCol(nCol++, &start_time);
+	   stmt.BindTimeStampCol(nCol++, &end_time);
+	   stmt.BindIntCol(nCol++, &curr_val);
+	   stmt.BindIntCol(nCol++, &show_val);
+	   stmt.BindTinyIntCol(nCol++, &idx);
+	   stmt.BindTinyIntCol(nCol++, &posi);
+	   stmt.BindCharCol(nCol++, mark, sizeof(mark));
+	   stmt.BindTinyIntCol(nCol++, &type);
+	   stmt.BindTinyIntCol(nCol++, &sunroof);
+
+	   ST_MOMP_INFO* pMompInfo = nullptr;
+	   auto mg_315_server = g_p315ClientManager->GetTcpClient();
+	   int nCount = 0;
+	   //获取数据
+	   do
+	   {
+		   if (stmt.FetchNext() != 0) break;
+		   //类型条件语句
+		   auto ePosi = (eDaoChaPosi)posi;
+		   auto eType = (ePowerName)type;
+		   if (pMompInfo == nullptr || pMompInfo->mo.compare(mo) != 0 || pMompInfo->mp.compare(mp) != 0)
+			   pMompInfo = CMonitorObjectMng::Instance()->GetMoMpInfo(string(mo) + "." + mp);
+		   if (pMompInfo == nullptr) continue;
+		   CTime ctAlarm = CTime(show_time.year, show_time.month, show_time.day, show_time.hour, show_time.minute, show_time.second);
+		   time_t show_time_t = ctAlarm.GetTime() * 1000
+			   + show_time.fraction / 1000000;
+		   nCount++;
+		   switch (eType)
+		   {
+		   case ePowerName::PN_LOCK:
+		   {
+			   //报警判断
+			   if (ePosi == eDaoChaPosi::DCP_FIX)
+			   {
+				   auto pFixSuobiOverInfo = (SUOBI_OVER_LIMIT_INFO*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_FIX, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);
+				   JudgeAlarm(pService, pFixSuobiOverInfo, show_time_t, show_val, eSuoBiPosi::SB_FIX, mo, mp, pMompInfo->zzjno);
+			   }
+			   else if (ePosi == eDaoChaPosi::DCP_INVERT)
+			   {
+				   auto pInvertSuobiOverInfo = (SUOBI_OVER_LIMIT_INFO*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_INVERT, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);
+				   JudgeAlarm(pService, pInvertSuobiOverInfo, show_time_t, show_val, eSuoBiPosi::SB_INVERT, mo, mp, pMompInfo->zzjno);
+			   }
+		   }
+			   break;
+		   case ePowerName::PN_RETENTION:
+		   {
+			   if (ePosi == eDaoChaPosi::DCP_FIX)
+			   {
+				   auto pFixConstRetensionForceWaveInfo = (RETENSION_FORCE_DROP*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_FIX, eZL_ALARMTYPE::RETENSION_FORCE);
+				   JudgeAlarm(pService, pFixConstRetensionForceWaveInfo, show_time_t, show_val, eSuoBiPosi::SB_FIX, mo, mp, pMompInfo);
+			   }
+			   else if (ePosi == eDaoChaPosi::DCP_INVERT)
+			   {
+				   auto pInvertConstRetensionForceWaveInfo = (RETENSION_FORCE_DROP*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_INVERT, eZL_ALARMTYPE::RETENSION_FORCE);
+				   JudgeAlarm(pService, pInvertConstRetensionForceWaveInfo, show_time_t, show_val, eSuoBiPosi::SB_INVERT, mo, mp, pMompInfo);
+			   }
+		   }
+			   break;
+		   case ePowerName::PN_MOVE:
+		   {
+			   //转换阻力报警设置项
+			   auto pConvertResistOverLimitInfo =
+				   (CONVERT_RESIST_OVER_LIMIT*)pService->Find(mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);
+			   if (ePosi == eDaoChaPosi::DCP_FIX2INVERT)
+			   {
+				   //更新状态
+				   CMonitorObjectMng::Instance()->UpdateZZJEPOS(string(mo) + "." + mp, DAOCHA_POSITION::MP_INVERT);
+				   SPDLOG_INFO("{}:{} 更新到反位", mo, mp);
+
+				   if (pMompInfo->out_name.find("定扳反") != -1)
+						JudgeAlarm(pService, pConvertResistOverLimitInfo, show_time_t, show_val, ePosi, eUpOrDownInfo::UOD_DOWN, mo, mp, pMompInfo->zzjno);
+				   else if (pMompInfo->in_name.find("定扳反") != -1)
+					   JudgeAlarm(pService, pConvertResistOverLimitInfo, show_time_t, show_val, ePosi, eUpOrDownInfo::UOD_UP, mo, mp, pMompInfo->zzjno);
+			   }
+			   else if (ePosi == eDaoChaPosi::DCP_INVERT2FIX)
+			   {
+				   //更新状态
+				   CMonitorObjectMng::Instance()->UpdateZZJEPOS(string(mo) + "." + mp, DAOCHA_POSITION::MP_FIX);
+				   SPDLOG_INFO("{}:{} 更新到定位", mo, mp);
+
+				   if (pMompInfo->out_name.find("反扳定") != -1)
+					   JudgeAlarm(pService, pConvertResistOverLimitInfo, show_time_t, show_val, ePosi, eUpOrDownInfo::UOD_DOWN, mo, mp, pMompInfo->zzjno);
+				   else if (pMompInfo->in_name.find("反扳定") != -1)
+					   JudgeAlarm(pService, pConvertResistOverLimitInfo, show_time_t, show_val, ePosi, eUpOrDownInfo::UOD_UP, mo, mp, pMompInfo->zzjno);
+			   }
+
+				//TODO发送315曲线
+				// mg_315_server->SendCurveData(pMompInfo->zzjno, posi, 1, true, mapData, it.tmStart, it.tmEnd);
+		   }
+			   break;
+		   case ePowerName::PN_FRICTION:
+		   {
+			   //摩擦力
+			   auto pAlarmSet = (FRICTION_OVER_LIMIT_INFO*)pService->Find(mo, mp, 2, eZL_ALARMTYPE::FRICTION_OVER_LIMIT);
+			   JudgeAlarm(pService, pAlarmSet, show_time_t, show_val, eDaoChaPosi::DCP_UNKNOWN, show_val < 0 ? eUpOrDownInfo::UOD_DOWN : eUpOrDownInfo::UOD_UP, pMompInfo);
+
+			   //TODO发送315曲线
+			   //mg_315_server->SendCurveData(pMompInfo->zzjno, posi, 1, true, mapData, it.tmStart, it.tmEnd);
+		   }
+			   break;
+		   default:
+			   SPDLOG_WARN("[扳动数据有误]{}:{} type:{}", mo, mp, type);
+			   ASSERT(0);
+			   break;
+		   }
+
+	   } while (true);
+
+	   stmt.Close();
+
+	   SPDLOG_INFO("外部加载扳动数据:{}条 语句:{}", nCount, sql);
 
 	} while (pService->m_bWork);
 	CDBConnectPool::Instance()->FreeConnection(pDBConn);

二进制
4.Data/TimeSyncServer.rc