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

📄 statuscontrol.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			nMainStatus=WAIT_BUS_NORMAL_INFO;
        	nSlaveStatus=SHOW_BUS_CLASS;        
        	break;
        case WORK_MODE_TEST://	测试模式下返回测试菜单
	        nMainStatus=WAIT_TEST_MENU;
            nSlaveStatus=SHOW_TEST_MENU;        
        	break;					
        case WORK_MODE_SETUP://	设置模式下返回参数设置窗口一
	        nMainStatus=WAIT_SET_MODE;
			nSlaveStatus=SHOW_SET_MENU;        
        	break;					
        case WORK_MODE_EDIT://	编辑模式下返回编辑菜单
	        nMainStatus=WAIT_EDIT_MODE;
            nSlaveStatus=SHOW_EDIT_MENU;        
        	break;    
		}
		break;
	case END_VALID_OK:			//确认交班     
		m_clsRecord.RecordES();
		m_clsStat.ClearEs();
	    m_clsStat.LaneStatus(LANE_STATUS_CLOSE);
	    m_clsStat.WorkMode(WORK_MODE_NULL);
        m_clsStat.ShiftNO(0);
	    UpdateLaneStatus();
//	交班时重新初始化捕获设备
//	    SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CAPTURE_WINDOW,RESET_CAPTURE,0);
		nMainStatus=WAIT_BEGIN_SHIFT;
	    nSlaveStatus=SHOW_PRESS_BEGIN;
		break;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}
	
////////////////////////////////////////////////////////////

//	输入车型窗口下处理操作员按键,此时按键有两种情况:
//	1、上辆车尚未离去时继续处理上辆车(例如:重打票等)
//	2、对新车辆收费
void CStatusControl::ProcessKeyOfInputBusClass(UINT KeyValue)//输入车型窗口状态的事件
{
//	若交易状态标志为TRUE,说明上辆车信息尚未离去,允许继续处理上一
//	辆车:只允许重打发票或发出定额票。
//	另外:若上辆车未离去前处理下辆车或准备交班,生成上辆车的交易信息
	if(m_clsTrans.TollStatusFlag()){
		switch(KeyValue)
//	本段程序处理上一辆车的事务(已经收费但车尚未离去)
		{
		case NORMAL_INPUT_BUS_CLASS:
	    case NORMAL_CHECK_BLACKCAR:
		case NORMAL_HAS_GROUP:
//	上辆车未离去前处理下辆车,生成交易消息
		case NORMAL_HAS_END:
//	上辆车未离去前准备交班,生成交易消息
		    FinishTrade();	
		    break;
		case TICKET_KEY:          //输入车型窗口输入定额票键
//	若尚未发出定额票,允许重新发出定额票
			if(!m_clsTrans.AlreadyIssueRationInvoiceFlag())
			{
				if(m_clsTrans.BusType()==TYPE_NORMAL)
				{
//	重新发出定额票时判断电脑票打印标志,若票据打印机提示已经打印过
//	发票,则已打出的发票为废票,生成类型为废票的TR消息
					if(!m_clsTrans.PrintNoSuccessFlag())
					{
						m_clsTrans.BadInvoiceType('1');
						m_clsRecord.RecordTR();
	                    m_clsStat.IncBadInvoice();
//	恢复坏票标志,否则下次生成的TR消息时仍会认为是坏票
					    m_clsTrans.BadInvoiceType('0');
					}
					int nBusClass=m_clsTrans.BusClass()-'0';//当前车型即为发票种类的序号
				    m_clsTrans.InvoiceType('1');//更改发票票型
					m_clsTrans.InvoiceNO(m_clsStat.GetInvoiceNow(nBusClass));
					m_clsStat.IncInvoiceNow(nBusClass); //发一张票则对应数加
					m_clsTrans.AlreadyIssueRationInvoiceFlag (TRUE);
				}
			}
            break; 
        case REPEAT_PRINT_KEY:    //输入车型窗口输入重打票键
//	如果未发出过定额票,允许重打发票
			if(!m_clsTrans.AlreadyIssueRationInvoiceFlag())
			{
				if(m_clsTrans.BusType()==TYPE_NORMAL)
				{
					m_clsTrans.WarningReason(WARNING_REPEAT_PRINT);	//报警原因为
					m_clsRecord.RecordEW();
					BOOL bPrintFlag=m_clsDevice.PrintInvoice();	//重打发票
//	重新打印票时判断电脑票打印标志,若票据打印机提示已经打印过发票,
//	则上次打印出的发票为废票,生成类型为废票的TR消息
					if((!m_clsTrans.PrintNoSuccessFlag())&&(bPrintFlag))
					{
//	若重打发票成功,生成类型为废票的TR消息(废票号码为上张发票)
						m_clsTrans.BadInvoiceType('1');
						m_clsRecord.RecordTR();
					   	m_clsStat.IncBadInvoice();
//	恢复坏票标志,否则下次生成的TR消息时仍会认为是坏票
						m_clsTrans.BadInvoiceType('0');
					}
					if(bPrintFlag){
//	若重打发票成功,重新设置当前发票号码
						m_clsTrans.InvoiceNO(m_clsStat.GetInvoiceNow(0));//打印票
		                m_clsStat.IncInvoiceNow(0); //发一张票则对应数加1
						m_clsTrans.PrintNoSuccessFlag(FALSE);
					}
				}
			}
            break;
		}
	}
	CBusNormal m_clsCarNormal;
	switch(KeyValue)
//	本段程序处理下一辆车事物(当前尚未开始交易的车辆),允许输入车型、
//	查询黑名单、处理车队、交班
	{              
	case NORMAL_INPUT_BUS_CLASS:  //用户已经输入车型	
//	设置车型,交易数据为非空
		m_clsTrans.BusClass(m_clsCarNormal.BusClass());
		m_clsTrans.BusType(TYPE_NORMAL);	//缺省为正常车
//		m_clsTrans.TollStatusFlag(TRUE);	//交易开始
		m_clsTrans.Fare(m_clsLane.SearchFare(m_clsCarNormal.BusClass(),'1'));//计算通行费,
		m_clsDevice.ClearTfi();//当前一辆车没走,收下一辆车需清屏
		Sleep(500);    // 发清屏命令需一定延时,才能接收新命令
		m_clsDevice.PlayFare();				//显示和语音报价

		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_FARE;
 		break;
	case NORMAL_CHECK_BLACKCAR:		//操作员准备查询黑名单
		nMainStatus=WAIT_CHECK_BLACK_CAR;
	    nSlaveStatus=SHOW_INPUT_BLACKCAR;
		break;
	case NORMAL_HAS_GROUP:			//准备处理车队键
        m_clsTrans.BusType(TYPE_ARMY_POLICE);//车队车车情为军警车
		m_clsTrans.GroupBusClass('2');		//车队车辆缺省为2型
	    m_clsTrans.GroupNumber(0);
		m_clsDevice.OverlayTransInfo();
	    m_clsDevice.DefineAutoRailStatus('O');
	    m_clsDevice.DefineIndicationStatus('V');
        m_clsTrans.WarningReason(WARNING_ARMY_POLICE);//报警原因
	    m_clsRecord.RecordEW();
		nMainStatus=WAIT_GROUP;
	    nSlaveStatus=SHOW_GROUP_CLASS;
		break;
	case NORMAL_HAS_END:     //输入车型窗口输入下班
		nMainStatus=WAIT_END_SHIFT;
	    nSlaveStatus=SHOW_END_INVOICE;
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	价格窗口下处理按键:允许发出电脑票、发出定额票、修改、处理军车、
//	月票车、免征
void CStatusControl::ProcessKeyOfInputFare(UINT KeyValue)//显示费额窗口状态的事件
{
	int mInvoiceType;
	switch(KeyValue)
	{
    case NORMAL_ISSUE_COMPUTER_INVOICE:  //显示价钱窗口有确认键按
//	发出电脑票
		m_clsDevice.PlayThankYou();
        m_clsTrans.BusType(TYPE_NORMAL);//车类为正常收费车
        m_clsTrans.InvoiceType(0);   //为打印票
		if(m_clsDevice.PrintInvoice()) //打印票,成功返回真
		{
            m_clsTrans.InvoiceNO(m_clsStat.GetInvoiceNow(0));//发票号
            m_clsStat.IncInvoiceNow(0); //发一张票则对应数加1
			m_clsTrans.PrintNoSuccessFlag(FALSE);
		} else {
			m_clsTrans.PrintNoSuccessFlag(TRUE);
		}
        m_clsTrans.IncAllowBusNumber();// 允许过车数加一
		m_clsDevice.OverlayTransInfo();
        m_clsDevice.DefineAutoRailStatus('O');//自动栏杆开
        m_clsDevice.DefineIndicationStatus('V');//通行指示灯绿
		m_clsTrans.AlreadyIssueRationInvoiceFlag(FALSE);
		m_clsTrans.TollStatusFlag(TRUE);	//有交易数据
        nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;
 	case NORMAL_ISSUE_RATION_INVOICE: //显示价钱窗口有定额票键按
		m_clsDevice.PlayThankYou();
        m_clsTrans.BusType(TYPE_NORMAL);//车类为正常收费车
		mInvoiceType=m_clsTrans.BusClass()-'0';
        m_clsTrans.InvoiceNO(m_clsStat.GetInvoiceNow(mInvoiceType));//发票号
        m_clsTrans.InvoiceType('1');	//为定额票
        m_clsStat.IncInvoiceNow(mInvoiceType); //发一张票则对应数加
        m_clsTrans.IncAllowBusNumber();// 允许过车数加一
		m_clsDevice.OverlayTransInfo();
        m_clsDevice.DefineAutoRailStatus('O');//自动栏杆开
        m_clsDevice.DefineIndicationStatus('V');//通行指示灯绿
		m_clsTrans.AlreadyIssueRationInvoiceFlag(TRUE);
		m_clsTrans.TollStatusFlag(TRUE);	//有交易数据
        nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS;
		break;
	case NORMAL_POLICE_ARMY_CAR: //显示价钱窗口有军警车键按
		m_clsDevice.PlayThankYou();
        m_clsTrans.BusType(TYPE_ARMY_POLICE);//车类为军警车
        m_clsTrans.Fare(0);    //费设置为0
	    m_clsTrans.WarningReason(WARNING_ARMY_POLICE);//报警原因
		m_clsRecord.RecordEW();
        m_clsTrans.IncAllowBusNumber();// 允许过车数加一
		m_clsDevice.OverlayTransInfo();
        m_clsDevice.DefineAutoRailStatus('O');//自动栏杆开
        m_clsDevice.DefineIndicationStatus('V');//通行指示灯绿
		m_clsTrans.TollStatusFlag(TRUE);	//有交易数据
		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;
	case NORMAL_FREE_CAR:      //显示价钱窗口有免征键按	
		m_clsTrans.BusType(TYPE_FREE);
   	    m_clsTrans.WarningReason(WARNING_FREE);	//报警原因
		m_clsRecord.RecordEW();
		nMainStatus=WAIT_AUTHENTICATION;
		nSlaveStatus=SHOW_BUS_NO;
		break;
	case NORMAL_MONTH_CAR:  //显示价钱窗口有月票键按
		m_clsTrans.BusType(TYPE_MONTH);
   	    m_clsTrans.WarningReason(WARNING_MONTH);	//报警原因为
		m_clsRecord.RecordEW();
        nMainStatus=WAIT_AUTHENTICATION;
		nSlaveStatus=SHOW_BUS_NO;
		break;
	case MODIFY_KEY:  //发现输入车型有错,收费员按更改键
        m_clsTrans.ModifyType(TRUE);
	    m_clsTrans.WarningReason(WARNING_MODIFY);	//报警原因为
		m_clsRecord.RecordEW();
		m_clsRecord.RecordTR();
		m_clsStat.IncModifyCount();
		m_clsTrans.ClearTransData();
		m_clsDevice.ClearTfi();
		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;      
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus); 
}

//	输入车牌窗口下处理按键:允许取消输入车牌、车牌输入完成
void CStatusControl::ProcessKeyOfInputBusNO(UINT KeyValue)//显示输入特殊车车牌窗口状态的事件
{
	char pBusNO[10];
	memset(pBusNO,0,10);
    CAuthentication m_clsAuthentication;
    m_clsAuthentication.GetBusNO(pBusNO);
	switch(KeyValue)
	{
	case AUTHENTICATION_INPUT_BUS_NO_OK:		//用户已经输入车牌    
		if(m_clsTrans.BusType()==TYPE_FREE)
		{
//	输入免征车车牌,核对免征车白名单以判断合法性
			if(m_clsLane.CheckFreeCar(pBusNO))	//如果是免征车
			{
			    MonthOrFreeOK();
				nMainStatus=WAIT_BUS_NORMAL_INFO;
	            nSlaveStatus=SHOW_BUS_CLASS	;	       
			} else {
				nMainStatus=WAIT_AUTHENTICATION;
	            nSlaveStatus=SHOW_FREE_NOTE;
			}
		}
		if(m_clsTrans.BusType()==TYPE_MONTH)
		{
//	输入月票车车牌,核对月票车白名单以判断合法性
			if(m_clsLane.CheckMonthCar(pBusNO)) //如果是月票车
			{
                MonthOrFreeOK();
				nMainStatus=WAIT_BUS_NORMAL_INFO;
	            nSlaveStatus=SHOW_BUS_CLASS	;
			} else {
				nMainStatus=WAIT_AUTHENTICATION;
	            nSlaveStatus=SHOW_FREE_NOTE;
			}
		}            
		break;
	case AUTHENTICATION_INPUT_BUS_NO_CANCEL:  //输入车牌前按取消键
//	取消输入车牌,返回价格窗口
		m_clsTrans.BusType(TYPE_NORMAL);
		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_FARE;
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	确认无效免费车窗口下处理按键:只允许确认无效或确认有效
void CStatusControl::ProcessKeyOfNoteFree(UINT KeyValue)//显示输入特殊车认证窗口状态的事件
{
	switch(KeyValue)
	{
	case AUTHENTICATION_FREE_CHECK_PASS:   //免征或月票无效,收费员确认有效
		MonthOrFreeOK();
		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;
	case AUTHENTICATION_FREE_CHECK_NOPASS: //免征或月票无效,收费员确认无效 
		m_clsTrans.BusType(TYPE_NORMAL);
		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_FARE;
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}	

//	确认违章窗口下处理按键:只允许确认无效或确认有效
void CStatusControl::ProcessKeyOfViolate(UINT KeyValue) //显示违章车窗口状态的事件			
{
	switch(KeyValue)
	{
	case VIOLATE_OK:		//确认违章
		ProcessViolateOK();	
		nMainStatus=WAIT_BUS_NORMAL_INFO;
		nSlaveStatus=SHOW_BUS_CLASS	;
		break;		
	case VIOLATE_CANCEL:	//否认违章,清除已生成的交易信息
		m_clsTrans.ClearTransData();
    	m_clsDevice.ClearTfi();
		nMainStatus=WAIT_BUS_NORMAL_INFO;
		nSlaveStatus=SHOW_BUS_CLASS	;
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);	
}	

//	输入车队车型窗口下处理按键:只允许输入车型或退出车队状态
void CStatusControl::ProcessKeyOfInputGroupClass(UINT KeyValue) //显示输入车队车型窗口状态的事件
{
	CGroup m_clsGroup;
	switch(KeyValue){
	case GROUP_CLASS_OK:	//输入车队车型
        m_clsTrans.GroupBusClass(m_clsGroup.GroupClass());
        nMainStatus=WAIT_GROUP;
	    nSlaveStatus=SHOW_GROUP;
		break;
	case CANCEL_KEY:
//	若退出车队状态,判断是否仍有车辆等待离去,若无,关闭自动栏杆,
//	通行指示灯变为红色
		if(m_clsTrans.AllowBusNumber()==0){
			m_clsDevice.DefineAutoRailStatus('F');
			m_clsDevice.DefineIndicationStatus('R');
		}
		nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	车队计数窗口下处理按键:只允许退出车队状态
void CStatusControl::ProcessKeyOfGroup(UINT KeyValue)	   //显示车队过车窗口状态的事件
{
	switch(KeyValue)
	{
	case GROUP_KEY_PRESS:   //车队结束
	    m_clsTrans.GroupNumber(0);
//	判断是否仍有车辆等待离去,若无,关闭自动栏杆,通行指示灯变为红色
		if(m_clsTrans.AllowBusNumber()==0){
    	    m_clsDevice.DefineAutoRailStatus('F');
    	    m_clsDevice.DefineIndicationStatus('R');
		}
        nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;	   
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	输入黑名单车牌窗口下处理按键:只允许输入黑名单车牌或退出黑名单
//	查询状态
void CStatusControl::ProcessKeyOfInputBlackCar(UINT KeyValue)//显示输入黑名单车车牌窗口状态的事件	
{	
	char pBusNO[10];
	memset(pBusNO,0,10);
	CCheckBlackCar m_clsFindBlackCar;
    m_clsFindBlackCar.GetBusNO(pBusNO);
	switch(KeyValue)
	{
    case AUTHENTICATION_INPUT_BUS_NO_OK:  //用户已经输入车牌
//	无论是否黑名单车辆,记录该车的车牌号码
		m_clsTrans.SetBusNO(pBusNO);
		if(!m_clsLane.CheckBlackCar(pBusNO))//如果不是黑名单车
		{	
			nMainStatus=WAIT_BUS_NORMAL_INFO;
			nSlaveStatus=SHOW_BUS_CLASS;	       
		} else {
//	黑名单车辆,生成报警消息并提示操作员确认
			m_clsTrans.WarningReason(WARNING_BLACKCAR);	//报警原因
			m_clsRecord.RecordEW();
			nMainStatus=WAIT_CHECK_BLACK_CAR;
			nSlaveStatus=SHOW_IS_BLACK;
		}            
		break;	    
	case AUTHENTICATION_INPUT_BUS_NO_CANCEL:
//	退出黑名单查询
		nMainStatus=WAIT_BUS_NORMAL_INFO;
        nSlaveStatus=SHOW_BUS_CLASS;	   
		break;	    
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

⌨️ 快捷键说明

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