?? rainproc.cpp
字號(hào):
// RainProc.cpp: implementation of the RainProc class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "afxdisp.h"
#include "FileAccess.h"
#include "RainProc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern "C" bool RunRainProc(char *strStation5,char *strStation8)
{
RainProc rainproc(strStation5,strStation8);
if(!rainproc.RainTelProcess()){
return false;
}
return true;
}
RainProc::RainProc(CString strStation5,CString strStation8)
{
m_strStation=strStation5;
m_strLogicID=strStation8;
m_strTempTel="";
m_strTelText="";
m_strAddiTelText="";
m_bolStsChg=false;
m_bolStsFlg=false;
m_bolTelFlg=false;
m_bolAddiTelFlg=false;
m_bolAddiChgFlg=false;
m_intTelCnt=0;
m_intAddiCnt=1;
int i=0;
for(i=0;i<9;i++)m_dblAddiRain[i]=0;
}
RainProc::~RainProc()
{
}
//////////////////////////////////////////////////////////////////////
// 降水量拍報(bào)處理
//////////////////////////////////////////////////////////////////////
bool RainProc::RainTelProcess()
{
int intTelCnt=0;
CTime curTime;
CString strLastAddiTime;
CString strLastRainTime;
double dblLastAddiInfo=0;
struct tm tmLastAddiTime;
double dblRainDaySts=0;
double dblRainTenDaySts=0;
double dblRainMonthSts=0;
FileAccess errFile("c:\\RainErrLog.txt");
errFile.m_strFileRecord.Format("\n%s :: RainTelProcess Begin%s|%s!\n",curTime.GetCurrentTime().Format("%Y-%m-%d %H:%M:%S"),m_strStation,m_strLogicID);
errFile.writerecord();
FileAccess logFile("c:\\RainTelLog.txt");
logFile.m_strFileRecord.Format("\n%s :: %s|%s站啟動(dòng)降水量拍報(bào)處理:\n",curTime.GetCurrentTime().Format("%Y-%m-%d %H:%M:%S"),m_strStation,m_strLogicID);
logFile.writerecord();
m_strTelText="P "+m_strStation;
////////////////////////////////////////////////////////////////////////////////////
//建立數(shù)據(jù)庫(kù)鏈接
////////////////////////////////////////////////////////////////////////////////////
_ConnectionPtr m_connection;
m_connection=DBCon.m_pCon;
try{
m_connection->BeginTrans();
}
catch(_com_error e){
errFile.m_strFileRecord.Format(" BeginTrans Error::%s",e.ErrorMessage());
errFile.writerecord();
return false;
}
////////////////////////////////////////////////////////////////////////////////////
//讀取拍報(bào)參數(shù)
////////////////////////////////////////////////////////////////////////////////////
try{
Param.m_pCon=m_connection;
Param.m_strSource=DBCon.m_strSource;
Param.m_strSQL.Format("select * from TelParam where ParamID='RainTel' and Station='%s'",m_strStation);
switch(Param.startbr()){
case 1:{//如果沒有建立降水量拍報(bào)參數(shù)則取缺省值
Param.m_strParamID="RainTel";
Param.m_intTelLevel=1;
Param.m_intTelInterval=24;
Param.m_dblPeriodStandard=20;
Param.m_bolAccuFlag=true;
Param.m_dblAddiStandard=30;
Param.m_intAddiInterval=3;
break;
}
case 0:break;
case -1:{//如果讀取拍報(bào)參數(shù)出錯(cuò)則記錄錯(cuò)誤信息并退出
errFile.m_strFileRecord=" Param::"+Param.m_strErrMsg;
errFile.writerecord();
return false;
}
}
}
catch(_com_error e){
errFile.m_strFileRecord.Format(" ReadParam Error::%s",e.ErrorMessage());
errFile.writerecord();
return false;
}
////////////////////////////////////////////////////////////////////////////////////
//讀取上次拍報(bào)狀態(tài)
////////////////////////////////////////////////////////////////////////////////////
try{
RainSts.m_pCon=m_connection;
RainSts.m_strSource=DBCon.m_strSource;
RainSts.m_strSQL.Format("select * from RainStatus where Station='%s'",m_strStation);
switch(RainSts.startbr()){
case 0:{
m_bolStsFlg=true;//如果讀取拍報(bào)狀態(tài)則置位標(biāo)志,后續(xù)處理將為更新狀態(tài)記錄
m_tmLastRainTime=Cmc.StrToTime(RainSts.m_strLastRainTime);//轉(zhuǎn)換最后拍報(bào)時(shí)間為時(shí)間結(jié)構(gòu)類型,以便操作
m_tmLastAddiTime=Cmc.StrToTime(RainSts.m_strLastAddiTime);//轉(zhuǎn)換最后暴雨加報(bào)時(shí)間為時(shí)間結(jié)構(gòu)類型,以便操作
strLastAddiTime=RainSts.m_strLastAddiTime;//保存最后暴雨加報(bào)時(shí)間
tmLastAddiTime=Cmc.StrToTime(strLastAddiTime);
break;
}
case 1:{
m_bolStsFlg=false;//如果讀取拍報(bào)狀態(tài)則復(fù)位標(biāo)志,后續(xù)處理將為新增狀態(tài)記錄
//如果沒有狀態(tài)記錄,則準(zhǔn)備初始數(shù)據(jù)。具體為讀取基礎(chǔ)數(shù)據(jù)的最早一筆的時(shí)間,即它前面的一個(gè)8時(shí)。
RainDB.m_pCon=m_connection;
RainDB.m_strSource=DBCon.m_strSource;
RainDB.m_strSQL.Format("select * from F%s order by datatime",m_strLogicID);
if(RainDB.startbr()<0){
errFile.m_strFileRecord.Format(" RainDB1.startbr::%s\n",RainDB.m_strErrMsg);
errFile.writerecord();
return false;
}
m_tmLastRainTime=Cmc.StrToTime(RainDB.m_strInputTime);
RainDB.m_pRst->Close();
if(m_tmLastRainTime.tm_hour<=8)Cmc.TimeSubSpan(&m_tmLastRainTime,0,0,1,0,0,0);
m_tmLastRainTime.tm_hour=8;
m_tmLastRainTime.tm_min=0;
m_tmLastRainTime.tm_sec=0;
RainSts.m_strLastRainTime=Cmc.TimeToStr(m_tmLastRainTime);
RainSts.m_strStation=m_strStation;
RainSts.m_strLastAddiTime=RainSts.m_strLastRainTime;
m_tmLastAddiTime=Cmc.StrToTime(RainSts.m_strLastAddiTime);
strLastAddiTime=RainSts.m_strLastAddiTime;
tmLastAddiTime=Cmc.StrToTime(strLastAddiTime);
RainSts.m_dblLastRainInfo=0;
RainSts.m_dblRainPeriodSts=0;
RainSts.m_dblRainDaySts=0;
RainSts.m_dblRainTenDaySts=0;
RainSts.m_dblRainMonthSts=0;
RainSts.m_dblLastAddiInfo=0;
break;
}
case -1:{//如果操作出錯(cuò)則保存錯(cuò)誤信息并退出
errFile.m_strFileRecord=" RainSts::"+RainSts.m_strErrMsg;
errFile.writerecord();
return false;
}
}
}
catch(_com_error e){
errFile.m_strFileRecord.Format(" OpenRainSts Error::%s",e.ErrorMessage());
errFile.writerecord();
return false;
}
//保存上次拍報(bào)狀態(tài)
strLastRainTime=RainSts.m_strLastRainTime;
dblRainDaySts=RainSts.m_dblRainDaySts;
dblRainTenDaySts=RainSts.m_dblRainTenDaySts;
dblRainMonthSts=RainSts.m_dblRainMonthSts;
////////////////////////////////////////////////////////////////////////////////////
//創(chuàng)建報(bào)文數(shù)據(jù)表的數(shù)據(jù)集
////////////////////////////////////////////////////////////////////////////////////
try{
TelDB.m_pCon=m_connection;
TelDB.m_strSource=DBCon.m_strSource;
TelDB.m_strSQL.Format("select * from tel_source");
if(TelDB.startbr()<0){
errFile.m_strFileRecord.Format(" TelDB.startbr::%s\n",TelDB.m_strErrMsg);
errFile.writerecord();
return false;
}
}
catch(_com_error e){
errFile.m_strFileRecord.Format(" OpenTelDB Error::%s\n",e.ErrorMessage());
errFile.writerecord();
return false;
}
////////////////////////////////////////////////////////////////////////////////////
//掃描自上次拍報(bào)以來(lái)新產(chǎn)生的且未拍報(bào)的降水測(cè)量數(shù)據(jù)
////////////////////////////////////////////////////////////////////////////////////
try{
RainDB.m_pCon=m_connection;
RainDB.m_strSource=DBCon.m_strSource;
RainDB.m_strSQL.Format("select * from F%s where datatime>'%s' order by datatime",m_strLogicID,RainSts.m_strLastRainTime);
if(RainDB.startbr()<0){
errFile.m_strFileRecord.Format(" RainDB.startbr::%s\n",RainDB.m_strErrMsg);
errFile.writerecord();
return false;
}
}
catch(_com_error e){
errFile.m_strFileRecord.Format(" OpenRainDB Error::%s\n",e.ErrorMessage());
errFile.writerecord();
return false;
}
bool bolDailyFlg=false;
int i=0;
//最后拍報(bào)時(shí)間向前推移:
// 最后拍報(bào)時(shí)間向前推移一個(gè)拍報(bào)間隔;
// 最后加報(bào)時(shí)間向前推移一小時(shí)
Cmc.TimeAddSpan(&m_tmLastRainTime,0,0,0,Param.m_intTelInterval,0,0);
RainSts.m_strLastRainTime=Cmc.TimeToStr(m_tmLastRainTime);
Cmc.TimeAddSpan(&m_tmLastAddiTime,0,0,0,1,0,0);
RainSts.m_strLastAddiTime=Cmc.TimeToStr(m_tmLastAddiTime);
//獲取上次暴雨加報(bào)狀態(tài),以進(jìn)行后續(xù)加報(bào)處理
Cmc.m_strInputTime=RainSts.m_strLastAddiTime;
Cmc.TimeValProc();
m_intAddiCnt=(int)(Cmc.m_fltInterval+0.99)%Param.m_intAddiInterval;
if(m_intAddiCnt<=0)m_intAddiCnt=Param.m_intAddiInterval;
if(m_intAddiCnt>0)m_dblAddiRain[m_intAddiCnt-1]=RainSts.m_dblLastAddiInfo;
while(!RainDB.m_pRst->adoEOF){
Cmc.m_strInputTime=RainDB.m_strInputTime;
m_tmInputTime=Cmc.StrToTime(RainDB.m_strInputTime);
if(Cmc.TimeCompare(m_tmInputTime,m_tmLastAddiTime)<=0){//當(dāng)采集時(shí)間小于等于最后暴雨加報(bào)時(shí)間則累計(jì)降水量
if(Cmc.TimeCompare(m_tmInputTime,tmLastAddiTime)>0){
m_dblAddiRain[m_intAddiCnt]+=RainDB.m_dblInputVal;//暴雨累計(jì)
m_dblHourRainSts=m_dblAddiRain[m_intAddiCnt];
}
if(Cmc.TimeCompare(m_tmInputTime,m_tmLastRainTime)<=0){
RainSts.m_dblLastRainInfo+=RainDB.m_dblInputVal;//本時(shí)段累計(jì)
RainSts.m_dblRainPeriodSts+=RainDB.m_dblInputVal;//跨時(shí)段累計(jì)
RainSts.m_dblRainDaySts+=RainDB.m_dblInputVal;//日累計(jì)
RainSts.m_dblRainTenDaySts+=RainDB.m_dblInputVal;//旬累計(jì)
RainSts.m_dblRainMonthSts+=RainDB.m_dblInputVal;//月累計(jì)
if(RainDB.readnext()<0){//讀取測(cè)量數(shù)據(jù)下一筆
errFile.m_strFileRecord.Format(" RainDB.readnext::%s\n",RainDB.m_strErrMsg);
errFile.writerecord();
return false;
}
}
if(Cmc.TimeCompare(m_tmInputTime,m_tmLastAddiTime)<0&&Cmc.TimeCompare(m_tmInputTime,m_tmLastRainTime)<0)continue;
}
if(Cmc.TimeCompare(m_tmInputTime,m_tmLastAddiTime)>=0&&Cmc.TimeCompare(m_tmLastAddiTime,m_tmLastRainTime)<=0){
m_dblHourRainSts=m_dblAddiRain[m_intAddiCnt];
if(m_intAddiCnt>=1&&m_dblAddiRain[m_intAddiCnt]>=(Param.m_dblAddiStandard1-0.001)){//???double比較是否有特殊規(guī)則,不然為何必須加上0.001???
RainSts.m_dblLastAddiInfo=0;
for(i=1;i<=m_intAddiCnt;i++)RainSts.m_dblLastAddiInfo+=m_dblAddiRain[i];
if(!AddiTelPrepare(m_tmLastAddiTime,m_dblAddiRain[m_intAddiCnt],Param.m_intAddiInterval1))return false;//降水達(dá)到暴雨加報(bào)標(biāo)準(zhǔn)則準(zhǔn)備暴雨加報(bào)
}
if(m_intAddiCnt==Param.m_intAddiInterval){//當(dāng)小時(shí)累計(jì)到了三小時(shí)則判斷三小時(shí)累計(jì)雨量是否超過(guò)暴雨加報(bào)標(biāo)準(zhǔn),如超過(guò)則進(jìn)行加報(bào)
RainSts.m_dblLastAddiInfo=0;
for(i=1;i<=m_intAddiCnt;i++)RainSts.m_dblLastAddiInfo+=m_dblAddiRain[i];
if(RainSts.m_dblLastAddiInfo>=Param.m_dblAddiStandard){
if(!AddiTelPrepare(m_tmLastAddiTime,RainSts.m_dblLastAddiInfo,Param.m_intAddiInterval))return false;//降水達(dá)到暴雨加報(bào)標(biāo)準(zhǔn)則準(zhǔn)備暴雨加報(bào)
}
InitAddiRain();
RainSts.m_dblLastAddiInfo=0;
}
else m_intAddiCnt++;
if(m_bolAddiTelFlg){//如果有暴雨加報(bào)則更新上次加報(bào)時(shí)間
strLastAddiTime=RainSts.m_strLastAddiTime;
tmLastAddiTime=Cmc.StrToTime(strLastAddiTime);
}
//strLastAddiTime=RainSts.m_strLastAddiTime;//保存舊的最后暴雨加報(bào)時(shí)間
Cmc.TimeAddSpan(&m_tmLastAddiTime,0,0,0,1,0,0);//最后暴雨加報(bào)時(shí)間向后推移一小時(shí)
RainSts.m_strLastAddiTime=Cmc.TimeToStr(m_tmLastAddiTime);
if(Cmc.TimeCompare(m_tmLastAddiTime,m_tmLastRainTime)<=0){
if(m_bolAddiTelFlg){//如未進(jìn)行時(shí)段拍報(bào)且有暴雨加報(bào)生成則將其新增至報(bào)文數(shù)據(jù)庫(kù)表中
TelDB.m_strStation=m_strStation;
TelDB.m_strTelText=m_strAddiTelText+" NN";
TelDB.m_bitDepartFlag=false;
TelDB.m_intDataSource=1;
//TelDB.m_strOneTime=RainSts.m_strLastAddiTime;
if(TelDB.insertrec()==0){
intTelCnt++;
logFile.m_strFileRecord.Format(" 生成報(bào)文:%s\n",TelDB.m_strTelText);
logFile.writerecord();
}
else{
errFile.m_strFileRecord.Format(" TelDB.insertrec addi::%s\n",TelDB.m_strErrMsg);
errFile.writerecord();
return false;
}
m_strAddiTelText="";
m_bolAddiTelFlg=false;
}
continue;
}
}
//當(dāng)當(dāng)前測(cè)量數(shù)據(jù)的采集時(shí)間達(dá)到時(shí)段拍報(bào)時(shí)間則進(jìn)行時(shí)段拍報(bào)
if(Cmc.TimeCompare(m_tmInputTime,m_tmLastRainTime)>=0){
if(RainSts.m_dblLastRainInfo>=1){//只有本時(shí)段累計(jì)降水量達(dá)到1mm時(shí)才準(zhǔn)備報(bào)文
TelPrepare();
}
//判斷是否進(jìn)行時(shí)段拍報(bào):
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -