⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rainproc.cpp

📁 用C++基于SQL SERVER使用存储过程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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()
{

}

//////////////////////////////////////////////////////////////////////
// 降水量拍报处理
//////////////////////////////////////////////////////////////////////
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站启动降水量拍报处理:\n",curTime.GetCurrentTime().Format("%Y-%m-%d %H:%M:%S"),m_strStation,m_strLogicID);
	logFile.writerecord();

	m_strTelText="P "+m_strStation;

	////////////////////////////////////////////////////////////////////////////////////
	//建立数据库链接
	////////////////////////////////////////////////////////////////////////////////////
	_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;
	}
	

	////////////////////////////////////////////////////////////////////////////////////
	//读取拍报参数
	////////////////////////////////////////////////////////////////////////////////////
	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:{//如果没有建立降水量拍报参数则取缺省值
			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:{//如果读取拍报参数出错则记录错误信息并退出
			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;
	}

	////////////////////////////////////////////////////////////////////////////////////
	//读取上次拍报状态
	////////////////////////////////////////////////////////////////////////////////////
	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;//如果读取拍报状态则置位标志,后续处理将为更新状态记录
			m_tmLastRainTime=Cmc.StrToTime(RainSts.m_strLastRainTime);//转换最后拍报时间为时间结构类型,以便操作
			m_tmLastAddiTime=Cmc.StrToTime(RainSts.m_strLastAddiTime);//转换最后暴雨加报时间为时间结构类型,以便操作
			strLastAddiTime=RainSts.m_strLastAddiTime;//保存最后暴雨加报时间
			tmLastAddiTime=Cmc.StrToTime(strLastAddiTime);
			break;
			   }
		case 1:{
			m_bolStsFlg=false;//如果读取拍报状态则复位标志,后续处理将为新增状态记录

			//如果没有状态记录,则准备初始数据。具体为读取基础数据的最早一笔的时间,即它前面的一个8时。
			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:{//如果操作出错则保存错误信息并退出
			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;
	}

	//保存上次拍报状态
	strLastRainTime=RainSts.m_strLastRainTime;
	dblRainDaySts=RainSts.m_dblRainDaySts;
	dblRainTenDaySts=RainSts.m_dblRainTenDaySts;
	dblRainMonthSts=RainSts.m_dblRainMonthSts;
	

	////////////////////////////////////////////////////////////////////////////////////
	//创建报文数据表的数据集
	////////////////////////////////////////////////////////////////////////////////////
	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;
	}

	////////////////////////////////////////////////////////////////////////////////////
	//扫描自上次拍报以来新产生的且未拍报的降水测量数据
	////////////////////////////////////////////////////////////////////////////////////
	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;

	//最后拍报时间向前推移:
	//    最后拍报时间向前推移一个拍报间隔;
	//    最后加报时间向前推移一小时
	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);

	//获取上次暴雨加报状态,以进行后续加报处理
	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){//当采集时间小于等于最后暴雨加报时间则累计降水量
			if(Cmc.TimeCompare(m_tmInputTime,tmLastAddiTime)>0){
				m_dblAddiRain[m_intAddiCnt]+=RainDB.m_dblInputVal;//暴雨累计
				m_dblHourRainSts=m_dblAddiRain[m_intAddiCnt];
			}

			if(Cmc.TimeCompare(m_tmInputTime,m_tmLastRainTime)<=0){
				RainSts.m_dblLastRainInfo+=RainDB.m_dblInputVal;//本时段累计
				RainSts.m_dblRainPeriodSts+=RainDB.m_dblInputVal;//跨时段累计
				RainSts.m_dblRainDaySts+=RainDB.m_dblInputVal;//日累计
				RainSts.m_dblRainTenDaySts+=RainDB.m_dblInputVal;//旬累计
				RainSts.m_dblRainMonthSts+=RainDB.m_dblInputVal;//月累计
				if(RainDB.readnext()<0){//读取测量数据下一笔
					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比较是否有特殊规则,不然为何必须加上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;//降水达到暴雨加报标准则准备暴雨加报
			}

			if(m_intAddiCnt==Param.m_intAddiInterval){//当小时累计到了三小时则判断三小时累计雨量是否超过暴雨加报标准,如超过则进行加报
				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;//降水达到暴雨加报标准则准备暴雨加报
				}
				InitAddiRain();
				RainSts.m_dblLastAddiInfo=0;
			}
			else m_intAddiCnt++;

			if(m_bolAddiTelFlg){//如果有暴雨加报则更新上次加报时间
				strLastAddiTime=RainSts.m_strLastAddiTime;
				tmLastAddiTime=Cmc.StrToTime(strLastAddiTime);
			}

			//strLastAddiTime=RainSts.m_strLastAddiTime;//保存旧的最后暴雨加报时间
			Cmc.TimeAddSpan(&m_tmLastAddiTime,0,0,0,1,0,0);//最后暴雨加报时间向后推移一小时
			RainSts.m_strLastAddiTime=Cmc.TimeToStr(m_tmLastAddiTime);
			if(Cmc.TimeCompare(m_tmLastAddiTime,m_tmLastRainTime)<=0){
				if(m_bolAddiTelFlg){//如未进行时段拍报且有暴雨加报生成则将其新增至报文数据库表中
					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("  生成报文:%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;
			}
		}

		//当当前测量数据的采集时间达到时段拍报时间则进行时段拍报
		if(Cmc.TimeCompare(m_tmInputTime,m_tmLastRainTime)>=0){
			if(RainSts.m_dblLastRainInfo>=1){//只有本时段累计降水量达到1mm时才准备报文
				TelPrepare();
			}

			//判断是否进行时段拍报:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -