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

📄 d300.cpp

📁 170话费查询系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:

									get_system_datetime(sdatetime);
									strcpy(Channel[cn-1].ServerLog.start_time,sdatetime);
									strcpy(Channel[cn-1].ServerLog.ani,Channel[cn-1].ani);
									strcpy(Channel[cn-1].ServerLog.result,"受理成功");

									put_event_to_board(cn,	wel_play);
									break;
									
					case ani_invalid://主叫无效
									switch_thread(cn, _timeout,tm_anirefuse);
									break;
									
					case wel_play:	//欢迎提示
									Channel[cn-1].Main.cur_st	= wel_play;										
									play_voc(cn,"欢迎提示");										
									return 0;

					case vm_1_play: //语音菜单(vm_1)
									set_singleinput_io(cn, &SGIPT_io_vm1);
									switch_thread(cn, _singleinput, sgipt_start);
									ChnPrintf(cn, "_USER","选择服务");
									play_voc(cn,"选择服务");
									return 0;

					case cmd0_hf:	//话费查询
									Channel[cn-1].Main.cur_st	= hf_play;
									ChnPrintf(cn, "_USER","话费查询");
									play_voc(cn, "话费查询");
									set_singleinput_io(cn, &SGIPT_io_hf);
									switch_thread(cn, _singleinput, sgipt_start);
									break;

					case cmd0_xd:	//详单查询
									Channel[cn-1].Main.cur_st	= hf_play;
									ChnPrintf(cn, "_USER","详单查询");
									play_voc(cn, "详单查询");
									set_singleinput_io(cn, &SGIPT_io_xd);
									switch_thread(cn, _singleinput, sgipt_start);
									break;

					case cmd0_qf:	//欠费查询
									strcpy(Channel[cn-1].Main.UserOp, Query_QF);
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_QF);
									ChnPrintf(cn, "_USER","欠费查询");
									put_event_to_board(cn,qry_data);
									break;

					case cmd0_ad:	//电信宣传
									Channel[cn-1].Main.cur_st	= ad_play;
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_HELP);
									ChnPrintf(cn, "_USER","了解业务");
									play_voc(cn, "电信宣传");
									break;

					case ad_asknext:	//下一步
									set_singleinput_io(cn, &SGIPT_io_adover);
									switch_thread(cn, _singleinput, sgipt_start);
									play_voc(cn,"往下一步");
									break;

					case cmd1_qry_djdy:
					
									//单机单月话费
									strcpy(Channel[cn-1].Main.UserOp, Query_DJDY);
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_DJDY);
									ChnPrintf(cn, "_USER","单机单月话费");
									put_event_to_board(cn,qry_hint);  //不再播放提示
									break;

					case cmd1_qry_tshou:

									//托收用户话费
									strcpy(Channel[cn-1].Main.UserOp, Query_TSHOU);
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_TSHOU);
									ChnPrintf(cn, "_USER","托收用户话费");
									put_event_to_board(cn,qry_hint);  //不再播放提示
									break;

					case cmd2_qry_ctxd:

									//长途详单
									strcpy(Channel[cn-1].Main.UserOp, Query_CTXD);
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_CTXD);
									ChnPrintf(cn, "_USER","长途详单查询");
									put_event_to_board(cn,qry_hint);  //不再播放提示
									break;

					case cmd2_qry_bdwxd:

									//本地网详单
									strcpy(Channel[cn-1].Main.UserOp, Query_BDWXD);
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_BDWXD);
									ChnPrintf(cn, "_USER","本地网详单查询");
									put_event_to_board(cn,qry_hint);  //不再播放提示
									break;

					case cmd2_qry_168xd:
					
									//声讯详单
									strcpy(Channel[cn-1].Main.UserOp, Query_168XD);
									strcpy(Channel[cn-1].ServerLog.last_demand, Demand_168XD);
									ChnPrintf(cn, "_USER","声讯详单查询");
									put_event_to_board(cn,qry_hint); 
									break;

					case qry_hint:
									//查询前提示
									Channel[cn-1].Main.cur_st	= qry_hint;
									//play_query_hint(cn);
									ChnPrintf(cn, "_STATE","等待用户输入月份....");
									switch_thread(cn, _monthinput, mth_start);
									break;
									
					case qry_data:	//数据库查询								
									Channel[cn-1].Main.cur_st	= qry_data;	
									Channel[cn-1].Main.play_sysbusy_over = false;
									Channel[cn-1].Main.query_data_ok 	 = false;
									play_voc(cn, "正在查询");									
									System.start = clock();									
   									//SysPrintf("query begin  at %3.2f seconds", System.start);

									post_retrieve_command(cn);	//提交查询,而后启动超时监控
									start_timing(cn,MaxDataQueryTime,qry_timeout);
									break;
									
					case qry_ok:	//查询结束
									System.finish = clock();
									System.duration = (double)(System.finish - System.start) / CLOCKS_PER_SEC;
									//SysPrintf( "query using %4.3f seconds\n", System.duration );
   									

									SysPrintf("通道%d查询完毕!",cn);
									stop_timing(cn);									
									Channel[cn-1].Main.query_data_ok = true;
									//同步语音播放和数据查询
									if (Channel[cn-1].Main.query_data_ok	==true && 
										Channel[cn-1].Main.play_sysbusy_over==true){

										Channel[cn-1].Main.cur_st	= play_result;
										switch_thread(cn, _multiplay, mply_start);
									}
									break;
					
					case qry_timeout:
									//查询超时
									if(Channel[cn-1].Main.cur_st == qry_data){
										SysPrintf("查询超时!");
										switch_thread(cn,_timeout, tm_systmout);
									}
									break;
					
					} // end switch (cstp->cst_event)
					break; //  break case TDX_CST

		case TDX_GETDIG:		
					break; 
		case TDX_ERROR:					
					SysPrintf("通道%d播放语音出错:%s",cn, ATDV_LASTERR(Channel[cn-1].voc));
					break;
		case TDX_PLAY: 					
					switch (Channel[cn-1].Main.cur_st){
						
						case 	wel_play:	//欢迎提示over
											Channel[cn-1].Main.cur_st == vm_1_play;
											put_event_to_board(cn,	vm_1_play);
											break;
						case	qry_data:
											Channel[cn-1].Main.play_sysbusy_over= true;
											//同步语音播放和数据查询
											if (Channel[cn-1].Main.query_data_ok	==true && 
												Channel[cn-1].Main.play_sysbusy_over==true)
											{
												Channel[cn-1].Main.cur_st	= play_result;
												switch_thread(cn, _multiplay, mply_start);
											}
											break;
											
						case 	ad_play:	//电信宣传over
											put_event_to_board(cn,	ad_asknext);
											//set_singleinput_io(cn, &SGIPT_io_adover);
											//switch_thread(cn, _singleinput, sgipt_start);
											//play_voc(cn,"往下一步");
											break;											
					}
					break;  // break case TDX_PLAY

		case TDX_PLAYTONE:
					if (dti_play_tone(cn) == 1) {
						//put_event_to_board(cn,ani_recieve);
						//put_event_to_board(cn,ani_wait);
						// 2秒钟后启动 ani_recieve事件
						start_timing(cn,AniWaitTime,ani_recieve);
					}
					break; // break case TDX_PLAYTONE;
		default:
					break;
		}  // end switch(EventType)

   return 1;   
}  //end main_thread_func()


/*************************************************************************
*   FUNC:	monthinput_thread_func() 
*   
*	说明:	月份输入线程函数
*	
*   
************************************************************************/
UINT monthinput_thread_func(int cn) 
{
   bool         myDEBUG = false;
   DX_CST *		cstp;
   int			result;
   long			evt_handle;		//事件句柄
   int			EventType;		//事件类型   
   long			dev_handle;		//设备句柄
   long			term;
   int			count=0;
   int			ret;

	result		= Channel[cn-1].wait_result;
	evt_handle	= Channel[cn-1].evt_handle; 
	dev_handle	= Channel[cn-1].dev_handle; 

	//获取事件类型
	EventType = sr_getevttype(evt_handle);

	switch(EventType){
        	
		case DTEV_SIG: //DTI 信号事件
					check_commu_status(cn, evt_handle);
					break; // break  case DTEV_SIG

		case TDX_CST: //Vocie上的状态事件
					if(myDEBUG) SysPrintf("%s: EVENT TYPE: TDX_CST\n",Channel[cn-1].voxname);
					cstp=(DX_CST*)sr_getevtdatap(evt_handle);
					switch (cstp->cst_event){
					case DE_TONEON:
									break;
					case DE_TONEOFF:
									break;
					case DE_DIGITS:
									break;
					case mth_start:
									Channel[cn-1].MonthInput.cur_st = mth_start;
									put_event_to_board(cn,mth_playmonth);
									break;

					case mth_playmonth:
									clear_read_buffer(cn);
									Channel[cn-1].MonthInput.cur_st = mth_playmonth;
									play_voc(cn, "输入月份");
									break;
									
					case mth_timeout:
									switch_thread(cn,_timeout, tm_usertmout);
									break;			
									
					case mth_check:
									Channel[cn-1].MonthInput.cur_st = mth_check;
									Channel[cn-1].MonthInput.month  = 0;
									ret = check_month_digits(cn);
									if ( ret > 0 ) {  // 有效月份
										Channel[cn-1].MonthInput.month = ret;
										//WinPrintf("月份%d有数据!",ret);
										put_event_to_board(cn, mth_valid);	
										
										return 1;
									}

									if ( ret<0 ) {    //无效数字
										//WinPrintf("月份数字%s无效!",Channel[cn-1].keybuffer);
										put_event_to_board(cn, mth_numerr);
										
									} 
									if ( ret == 0 ) {  //月份无数据
										//WinPrintf("月份数字%s有效,但无数据!",Channel[cn-1].keybuffer);
										put_event_to_board(cn, mth_nodata);
										
									}
									Channel[cn-1].MonthInput.error_input_times++;
									if (Channel[cn-1].MonthInput.error_input_times > MaxUserErrorTimes)
									{
										Channel[cn-1].MonthInput.error_input_times =0;
										put_event_to_board(cn, mth_alwayserr);
									}

									break;

					case mth_numerr://月份数字无效									
									put_event_to_board(cn, mth_playerr);
									break;

					case mth_nodata://该月无数据
									put_event_to_board(cn, mth_playnodata);
									break;

					case mth_alwayserr:
									//多次输入无效
									switch_thread(cn,_timeout,tm_alwayserr);
									break;
					case mth_valid:
									//月份有效
									switch_thread(cn,_main,qry_data);
									break;

					case mth_playerr:
									//播放月份错
									Channel[cn-1].MonthInput.cur_st = mth_playerr;
									play_voc(cn, "输入错误");

					case mth_playnodata:
									//播放没有数据
									Channel[cn-1].MonthInput.cur_st = mth_playerr;
									play_voc(cn, "没有数据");


					} // end switch (cstp->cst_event)
					break; //  break case TDX_CST

		case TDX_GETDIG:
					term=ATDX_TERMMSK(Channel[cn-1].voc); 
					//用户按键
					if (term & TM_MAXDTMF){		
							read_the_key(cn);
							switch (Channel[cn-1].MonthInput.cur_st) {
								case mth_wait:
										if (Channel[cn-1].keynumber >= 2) {
											Channel[cn-1].MonthInput.cur_st = mth_check; 
											put_event_to_board(cn, mth_check);
										}
										else post_read_command_to_board(cn,2- Channel[cn-1].keynumber);
								break;
							}
					}								
					//用户超时
					if ((term & TM_IDDTIME) ||(term & TM_MAXTIME)){
						put_event_to_board(cn,mth_timeout);
					}								
					break; // break case TDX_GETDIG

		case TDX_PLAY: 
					term=ATDX_TERMMSK(Channel[cn-1].voc);  //检测播报的终止情况。
					
					switch (Channel[cn-1].MonthInput.cur_st) {
							case    mth_start:
									put_event_to_board(cn,mth_playmonth);
									break;

							case 	mth_playmonth:
									Channel[cn-1].MonthInput.cur_st = mth_wait;	
									if (! (term & TM_MAXDTMF)){ // 正常结束
										post_read_command_to_board(cn,2);
									}else						// 按键结束
									{
										post_read_command_to_board(cn);
									}
									break;

							case	mth_playerr:		
							case	mth_playnodata:
									Channel[cn-1].MonthInput.cur_st = mth_start;
									put_event_to_board(cn, mth_start);
									break;
					}
					
					if(term & TM_EOD) {
							//SysPrintf("%s: Play ended by 全部拨完TM_EOD\n",Channel[cn-1].voxname);
					}
					if(term & TM_MAXTIME){ 
							//SysPrintf("%s: Play ended by 超出时间TM_MAXTIME\n",Channel[cn-1].voxname);		
					}
					if (term & TM_USRSTOP){
							//SysPrintf("%s: Play ended by 用户挂机终止(tm_usrstop)\n",Channel[cn-1].voxname);		
					}
					if (term & TM_MAXDTMF){
							//SysPrintf("%s: Play ended by 用户按键终止(tM_maxdtmf)\n",Channel[cn-1].voxname);
					}
					break;  // break case TDX_PLAY

		case TDX_PLAYTONE:
					break; // break case TDX_PLAYTONE;

		default:
					break;

		}  // end switch(EventType)

   return 1; 
   
}  //end monthinput_thread_func()


/*************************************************************************
*   FUNC:	timeout_thread_func() 
*   
*	说明:	超时线程函数(系统逸出线程)
*	
*   
************************************************************************/
UINT timeout_thread_func(int cn) 
{
   bool         myDEBUG = false;
   DX_CST *		cstp;
   int			result;
   long			evt_handle;		//事件句柄
   int			EventType;		//事件类型   
   long			dev_handle;		//设备句柄
   int			count=0;

	result		= Channel[cn-1].wait_result;
	evt_handle	= Channel[cn-1].evt_handle; 
	dev_handle	= Channel[cn-1].dev_handle; 

	EventType = sr_getevttype(evt_handle);

⌨️ 快捷键说明

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