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

📄 record.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Record.cpp: implementation of the CRecord class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "lane_new.h"
#include "Record.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern CLane_newApp theApp;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

UINT CRecord::nTransIndex;		//交易流水号	
UCHAR CRecord::chAkStatus;		//文件下传状态
UCHAR CRecord::chAkIndex;		//文件下传索引
UCHAR CRecord::iDeviceIndex;	//设备索引
UCHAR CRecord::iDeviceStatus;	//设备状态状态	
BOOL CRecord::bNowDayFlag;
BOOL CRecord::bChangeFlag;

CRecord::CRecord()
{
}

//	报表边界类初始化:判断是否需要生成信息
void CRecord::Initial()
{
//	若上次退出前车道处于打开状态,生成交班消息
	CStatInfo m_clsStat;
	BOOL bFlag=FALSE;
// 生成ES消息以后,保护现象信息被改写,时间被重置,因此,
// 要在生成ES消息前把时间信息取出。
	CTimeInfo m_clsTime;
	if((m_clsTime.GetYear()==m_clsStat.PostevsYear())
		&&(m_clsTime.GetMonth()==m_clsStat.PostevsMonth()))
	{
//	若上次退出前和当前位于同一天但不同小时,生成该小时的MH消息
		if(m_clsTime.GetHour()!=m_clsStat.PostevsHour())
		{
			bFlag=TRUE;
			nRecordYear=m_clsStat.PostevsYear();
			nRecordMonth=m_clsStat.PostevsMonth();
			nRecordDay=m_clsStat.PostevsDay();
			nRecordHour=m_clsStat.PostevsHour();
			nRecordDayCount=m_clsStat.PostevsDayCount();
//	特别地:小时消息的生成时间总为整点
			nRecordMinute=0;
			nRecordSecond=0;
//			nRecordMinute=m_clsStat.PostevsMinuteOfDay();
		}
	}
	if(m_clsStat.LaneStatus()!=LANE_STATUS_CLOSE){
		RecordES();
		m_clsStat.ClearEs();
		//先生成交班消息,后改发票起号
	    for(int i='0'; i<='6'; i++){
		//	剩余发票起号就是当前发票号码
			m_clsStat.SetInvoiceStart(i,m_clsStat.GetInvoiceNow(i));
		}
	}	
//	车道恢复关闭状态
    m_clsStat.ShiftNO(0);
	m_clsStat.LaneStatus(LANE_STATUS_CLOSE);
	m_clsStat.WorkMode(WORK_MODE_NULL);
	if(bFlag)
	{
		RecordMH();
		m_clsStat.ClearMh();	
	} 
}

//生成AK消息:确认上位机下传文件
void CRecord::RecordAK()
{
	SetMesgHead("AK",MESSAGE_AK);
	char strAK_Info[AK_LENGTH+1];
	memset(strAK_Info,0,AK_LENGTH+1);
	char strFileName[10];
	memset(strFileName,0,10);
	char chFileIndex=AkIndex();
	switch(chFileIndex)
	{
	case COLLECOD_INDEX:
		memmove(strFileName,"COLLECOD",8);
		break;	
	case TFRMB_INDEX:
		memmove(strFileName,"TFRMB   ",8);		
		break;
	case BLACKCOL_INDEX:
		memmove(strFileName,"BLACKCOL",8);		
		break;
	case MONTHCAR_INDEX:
		memmove(strFileName,"MONTHCAR",8);		
		break;
	case BLACKCAR_INDEX:
		memmove(strFileName,"BLACKCAR",8);		
		break;
	case FREECAR_INDEX:
		memmove(strFileName,"FREECAR ",8);		
		break;
	case DELAYS_INDEX:
		memmove(strFileName,"DELAYS  ",8);
		break;
	}
	memmove(strAK_Info+AK_FILENAME,strFileName,8);	
	strAK_Info[AK_STATUS]=AkStatus();	
	SaveData(MESSAGE_AK,strAK_Info,AK_LENGTH);
}

//生成ME消息:生成车道外设故障状态信息
void CRecord::RecordME()
{
	SetMesgHead("ME",MESSAGE_ME);
	char strME_Info[ME_LENGTH+1];
	memset(strME_Info,0,ME_LENGTH+1);	
	char tmp[2];
	memset(tmp,0,2);
	tmp[0]=DeviceStatus();
	sprintf(strME_Info+ME_DEVICE_INDEX,"%.2d",DeviceIndex());
	memmove(strME_Info+ME_STATUS,tmp,1);
	SaveData(MESSAGE_ME,strME_Info,ME_LENGTH);
}

//生成ES消息:交班消息
void CRecord::RecordES()
{
//	首先判断操作员类型,不同的操作员开班消息不同
	CStatInfo m_clsStat;
	char tmpStr[11],i;
	memset(tmpStr,0,11);
	if(m_clsStat.CollectType()){		//假如为收费员
		SetMesgHead("ES",MESSAGE_ES);	//收费员开班
	} else {
		SetMesgHead("EM",MESSAGE_ES);	//其他人员开班
	}
	char strES_Info[ES_LENGTH+1];
	memset(strES_Info,0,ES_LENGTH+1);
//	交班信息中有许多备用字节,先将所有数据初始化为'0'
	memset(strES_Info,'0',ES_LENGTH);
//	sprintf()语句会在字符串的后面自动增加一个空字符,因此使用sprintf()
//	时后续字段会被截断,本函数中用memmove()避免后续字节被截断。
	sprintf(strES_Info+ES_TOTAL_COUNT,"%.4d",m_clsStat.EsTotalCount());
	sprintf(strES_Info+ES_VIOLATE_COUNT,"%.4d",m_clsStat.EsViolateCount());
	
	long lInvoiceEnd=m_clsStat.GetInvoiceNow(0)-1; 	
	if(lInvoiceEnd<0) lInvoiceEnd=0;

	sprintf(strES_Info+ES_COMPUTER_INVOICE_START_NO,"%.10u",m_clsStat.InvoiceStart(0));
	sprintf(strES_Info+ES_COMPUTER_INVOICE_END_NO,"%.10u",lInvoiceEnd);
	//定额票起号(1~6型车)
	for(i=0;i<6;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.10u",m_clsStat.InvoiceStart(i+1));
		memmove(strES_Info+ES_RATION_INVOICE_1_START_NO+i*20,tmpStr,10);
	}
	//定额票止号(1~6型车)
	for(i=0;i<6;i++)
	{
		lInvoiceEnd=m_clsStat.GetInvoiceNow(i+1)-1; 	
		if(lInvoiceEnd<0) lInvoiceEnd=0;

		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.10u",lInvoiceEnd);
		memmove(strES_Info+ES_RATION_INVOICE_1_END_NO+i*20,tmpStr,10);
	}
	sprintf(strES_Info+ES_MODIFY_COUNT,"%.4d",m_clsStat.EsModifyCount());
	sprintf(strES_Info+ES_LOOP_COUNT,"%.4d",m_clsStat.EsLoopCount());
	sprintf(strES_Info+ES_SHIFT_TIME,"%.7u",m_clsStat.ShiftTime());
	//收费车车流
	sprintf(strES_Info+ES_NORMAL_TOTAL_COUNT,"%.4d",m_clsStat.EsTypeCount(TYPE_NORMAL));		
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.4d",m_clsStat.EsClassTypeCount(i+'1',TYPE_NORMAL));
		memmove(strES_Info+ES_NORMAL_CLASS_COUNT+i*4,tmpStr,4);
	}
	//免费车车流量
	sprintf(strES_Info+ES_FREE_TOTAL_COUNT,"%.4d",m_clsStat.EsTypeCount(TYPE_FREE));
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.4d",m_clsStat.EsClassTypeCount(i+'1',TYPE_FREE));
		memmove(strES_Info+ES_FREE_CLASS_COUNT+i*4,tmpStr,4);
	}
	//月票车车流量
	sprintf(strES_Info+ES_MONTH_TOTAL_COUNT,"%.4d",m_clsStat.EsTypeCount(TYPE_MONTH));
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.4d",m_clsStat.EsClassTypeCount(i+'1',TYPE_MONTH));
		memmove(strES_Info+ES_MONTH_CLASS_COUNT+i*4,tmpStr,4);
	}
	//军警车车流量
	sprintf(strES_Info+ES_ARMY_TOTAL_COUNT,"%.4d",m_clsStat.EsTypeCount(TYPE_ARMY_POLICE));
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.4d",m_clsStat.EsClassTypeCount(i+'1',TYPE_ARMY_POLICE));
		memmove(strES_Info+ES_ARMY_CLASS_COUNT+i*4,tmpStr,4);
	}
	//废票车数目
	sprintf(strES_Info+ES_BAD_INVOICE_TOTAL_COUNT,"%.4d",m_clsStat.EsBadInvoiceCount());
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.4d",m_clsStat.EsClassBadInvoiceCount(i+'1'));
		memmove(strES_Info+ES_BAD_INVOICE_CLASS_COUNT+i*4,tmpStr,4);
	}
	//人民币收入
	sprintf(strES_Info+ES_TOTAL_MONEY,"%.6u",m_clsStat.EsTotalMoney());
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.6u",m_clsStat.EsClassMoney(i+'1'));
		memmove(strES_Info+ES_CLASS_MONEY+i*6,tmpStr,6);
	}
	//废票金额
	sprintf(strES_Info+ES_BAD_INVOICE_TOTAL_MONEY,"%.6u",m_clsStat.EsBadMoney());
	for(i=0;i<9;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.6u",m_clsStat.EsClassBadMoney(i+'1'));
		memmove(strES_Info+ES_BAD_INVOICE_CLASS_MONEY+i*6,tmpStr,6);
	}
	SaveData(MESSAGE_ES,strES_Info,ES_LENGTH);	
}

//	生成BS消息:上班消息
void CRecord::RecordBS()
{
	CStatInfo m_clsStat;
	char tmpStr[11];	
	int i;
	//首先判断操作员类型
	if(m_clsStat.CollectType()){		//假如为收费员
		SetMesgHead("BS",MESSAGE_BS);	//收费员开班
	} else {
		SetMesgHead("BM",MESSAGE_BS);	//维修员开班
	}
	char strBS_Info[BS_LENGTH+1];
	memset(strBS_Info,0,BS_LENGTH+1);	
	sprintf(strBS_Info+BS_TOTAL_COUNT,"%.4d",m_clsStat.EsTotalCount());
	sprintf(strBS_Info+BS_VIOLATE_COUNT,"%.4d",m_clsStat.EsViolateCount());
	//票卷起号  定额票起号
	for(i=0;i<7;i++)
	{
		memset(tmpStr,0,11);
		sprintf(tmpStr,"%.10u",m_clsStat.InvoiceStart(i));
		memmove(strBS_Info+BS_INVOICE_START_NO+i*10,tmpStr,10);
	}
	SaveData(MESSAGE_BS,strBS_Info,BS_LENGTH);
}

//生成TR消息:交易消息
void CRecord::RecordTR()
{
	CTransInfo m_clsTrans;
	SetMesgHead("TR",MESSAGE_TR);
	char strTR_Info[TR_LENGTH+1];
	memset(strTR_Info,0,TR_LENGTH+1);
	sprintf(strTR_Info+TR_BUS_CLASS_COLLECTOR,"%c",m_clsTrans.BusClass());
	sprintf(strTR_Info+TR_BUS_CLASS_MONITOR,"%.1d",0);
	sprintf(strTR_Info+TR_BUS_TYPE_COLLECTOR,"%c",m_clsTrans.BusType());
	sprintf(strTR_Info+TR_BUS_TYPE_MONITOR,"%.1d",0);
	sprintf(strTR_Info+TR_VIOLATE_MONITOR,"%.1d",0);
	sprintf(strTR_Info+TR_MONEY,"%.3d",m_clsTrans.Fare());
	sprintf(strTR_Info+TR_VIOLATE_COLLECTOR,"%c",m_clsTrans.ViolateType());
	sprintf(strTR_Info+TR_MODIFY,"%c",m_clsTrans.ModifyType());
	sprintf(strTR_Info+TR_BAD_INVOICE,"%c",m_clsTrans.BadInvoiceType());
	sprintf(strTR_Info+TR_INVOICE_NO,"%.10u",m_clsTrans.InvoiceNO());
	sprintf(strTR_Info+TR_INVOICE_TYPE,"%c",m_clsTrans.InvoiceType());	
	char strBusNo[10];
	memset(strBusNo,0,10);
	m_clsTrans.GetBusNO(strBusNo);  //取车牌号	
	memset(strTR_Info+TR_BUS_NO,' ',10);
	memmove(strTR_Info+TR_BUS_NO+10-strlen(strBusNo),strBusNo,strlen(strBusNo));
	SaveData(MESSAGE_TR,strTR_Info,TR_LENGTH);
}

//生成EW消息:报警消息
void CRecord::RecordEW()
{
	CTransInfo m_clsTrans;
	SetMesgHead("EW",MESSAGE_EW);
	char strEW_Info[EW_LENGTH+1];
	memset(strEW_Info,0,EW_LENGTH+1);
	sprintf(strEW_Info+EW_BUS_CLASS_COLLECTOR,"%c",m_clsTrans.BusClass());
	sprintf(strEW_Info+EW_BUS_CLASS_MONITOR,"%.1d",0);
	sprintf(strEW_Info+EW_BUS_TYPE_COLLECTOR,"%c",m_clsTrans.BusType());
	sprintf(strEW_Info+EW_BUS_TYPE_MONITOR,"%.1d",0);
	sprintf(strEW_Info+EW_WARNING_TYPE_COLLECTOR,"0%c",m_clsTrans.WarningReason());
	sprintf(strEW_Info+EW_WARNING_TYPE_MONITOR,"%.2d",0);
	SaveData(MESSAGE_EW,strEW_Info,EW_LENGTH);
}

//生成MH消息:小时消息
void CRecord::RecordMH()
{
	CStatInfo m_clsStat;
	char tmpStr[8];
	UCHAR i;
	SetMesgHead("MH",MESSAGE_MH);
	char strMH_Info[MH_LENGTH+1];
	memset(strMH_Info,0,MH_LENGTH+1);
//	交班信息中有许多备用字节,先将所有数据初始化为'0'
	memset(strMH_Info,'0',MH_LENGTH);
//	sprintf()语句会在字符串的后面自动增加一个空字符,因此使用sprintf()
//	时后续字段会被截断,本函数中用memmove()避免后续字节被截断。
	sprintf(strMH_Info+MH_TOTAL_COUNT,"%.4d",m_clsStat.MhTotalCount());
	sprintf(strMH_Info+MH_VIOLATE_COUNT,"%.4d",m_clsStat.MhViolateCount());

⌨️ 快捷键说明

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