📄 record.cpp
字号:
// 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 + -