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

📄 dbtestview.cpp

📁 处理各种电话投诉的危机情况
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// DBtestView.cpp : implementation of the CDBtestView class
//
// 视图类:程序主要在此编写
// 功能:处理计算机和电话之间的各种信息,包括投诉、抢修、和查询等。
// 编者:徐景周
// 日期:1999.4.18


#include "stdafx.h"
#include "DBtest.h"
#include "TW8a.h"
#include "DBtestSet.h"
#include "DBtestDoc.h"
#include "DBtestView.h"
#include "RingOption.h"
#include "PhonenumOpt.h"
#include "FindIt.h"
#include <time.h>
#include <stdio.h>
#include <string.h>

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

#define WAIT_TIMER	20 	/* 20 seconds */

#define LEFT		320  //信息窗视图框架
#define TOP			340
#define RIGHT		1024
#define HEIGHT		22

#define ID_TIMER	1025   //计数器号
#define PASSWORDBIT	4     //口令位数


#define INFORMATION1	".\\message1.tw"
#define INFORMATION2	".\\message2.tw"
#define INFORMATION3	".\\message3.tw"   // 信息文件
#define VOICE_FILE      ".\\sample.tw"    


#define CHANNELS_IN_TW8A 8                 //硬件设置参数
WORD AdapterNumber, TW_ChannelNumber;
DWORD TW_IRQ;
char Status[MAX_CHANNELS+1];

typedef enum 
{	
	WS_AUTODIAL,         //自动拔号状态
    WS_DIALOUT,
	WS_TIMER,
	WS_RECORDINFORMATION,
	WS_BUSY,
	WS_HANGUP,								//挂机状态
	WS_PLAY,	//放音状态
	WS_PLAYINF,     //播放信息文件状态
	WS_RECORD,								//录音状态
	WS_WAITFORPASSWORD,						//等待密码状态(限时10秒)
	WS_WAITFORFILE,	
	WS_DEFAULT,       //等待数据库给出放音文件名
} WORKING_STATUS;							//内外线电话状态
WORKING_STATUS	CS[MAX_CHANNELS];	

char	ChMess[MAX_CHANNELS][64];
char	filename[4][25];					//通道中进行录、放音的文件名
char	*filenamestr;			
char	welcomfile[]=".\\newwelcom.tw";     		//初始放音文件名,初始时播放
char	chooseappeal[]=".\\newchooseappeal.tw";//选择投诉放音文件名,按1时播放
char	leaveword[]=".\\tvcall.tw";			//留言放音文件名,按2时播放
char	chooseinf[]=".\\thanks.tw";			//选择信息放音文件名,按3时播放
char	particular[]=".\\particular.tw";		//特殊功能放音文件名,按0时播放
char	recordinf[]=".\\recordinf.tw";			//选择录音类型提示文件名
char	choosecommand[]=".\\choosecommand.tw";	//选择放音类型提示文件名
char    dialout[]=".\\dialout.tw";

typedef enum      //在线实时状态结构
{
	START,
	APPEAL,
	LEAVEWORD,
	INQUIRE,
	PARTICULAR,
	CHOOSECOMMAND,
	RECORDINF,
}LINE_STATUS;
LINE_STATUS inputchar[MAX_CHANNELS];

typedef struct
{    
    char PhoneNumber[13];
	unsigned int RecordNumber;
    char FileName[25];
	int  Type;
} APPEAL_STRUC;
 APPEAL_STRUC ad ;    // 投诉库结构 

typedef enum
{  
	WS_INITIALIZED,
	WS_STARTDIAL,
	WS_ONDIAL,
	WS_WAITOFFHOOK,
	WS_CALLBACK,
	WS_STARTPLAY,
	WS_ONPLAY,
	WS_WAITHANGUP,
} DIAL_STATUS;
  DIAL_STATUS DIAL[MAX_CHANNELS]; //自动拨号结构

//FILE *fp;
unsigned int Count,RecordNum;
char Fname[21],Temp,Type;             //文件结构  
char Key;
int ch1; 
unsigned int FileLen ;

char truepassword1[]="1999";
char truepassword2[]="2000";     //口令检验
char password[5];
int passwordpointer;

char cPhoneNum[8];    //内线拔出
int iPointer=0;

char cType[9];
char cTemp1[6],cTemp2[6];  //数据库更新临时变量

int iTitleHeight;         //连续打印字体高度
int iContextHeight;
int iRowTotal;

char PhoneNum[4][14];  //存贮设置的电话号码

/////////////////////////////////////////////////////////////////////////////
// CDBtestView

IMPLEMENT_DYNCREATE(CDBtestView, CRecordView)

BEGIN_MESSAGE_MAP(CDBtestView, CRecordView)
	//{{AFX_MSG_MAP(CDBtestView)
	ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
	ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
	ON_COMMAND(ID_SORT_ID, OnSortId)
	ON_COMMAND(ID_SORT_TYPE, OnSortType)
	ON_COMMAND(ID_SORT_FILENAME, OnSortFilename)
	ON_COMMAND(ID_RECORD_PLAY, OnRecordPlay)
	ON_COMMAND(ID_RECORD_FIRST, OnRecordFirst)
	ON_COMMAND(ID_RECORD_LAST, OnRecordLast)
	ON_COMMAND(ID_RECORD_NEXT, OnRecordNext)
	ON_COMMAND(ID_RECORD_PREV, OnRecordPrev)
	ON_BN_CLICKED(IDC_BUTTONOK, OnButtonok)
	ON_BN_CLICKED(IDC_BUTTONCANCEL, OnButtoncancel)
	ON_WM_TIMER()
	ON_WM_PAINT()
	ON_COMMAND(ID_RECORD_REPAIR, OnRecordRepair)
	ON_EN_KILLFOCUS(IDC_RECORD_MEMO, OnKillfocusRecordMemo)
	ON_WM_DESTROY()
	ON_COMMAND(ID_RING, OnRing)
	ON_COMMAND(ID_RECORD_QUERY, OnRecordQuery)
	ON_COMMAND(ID_PHONENUM, OnPhonenum)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDBtestView construction/destruction

CDBtestView::CDBtestView()
	: CRecordView(CDBtestView::IDD)
{
	//{{AFX_DATA_INIT(CDBtestView)
	m_pSet = NULL;
	m_bAdding=FALSE;
	m_IntTimes = 0;
	//}}AFX_DATA_INIT
 
}

CDBtestView::~CDBtestView()
{
}

void CDBtestView::OnPaint() 
{
 LOGFONT m_font;
 CFont font;

	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
	    CDC	*	pDC;
	    PAINTSTRUCT	ps;

		pDC = BeginPaint(&ps); 

		 //3D阴影标题字体属性设置
        memset(&m_font,0,sizeof(m_font));
        m_font.lfHeight=16;
	    m_font.lfWidth=8;
	    m_font.lfWeight=FW_SEMIBOLD;
	    m_font.lfCharSet=GB2312_CHARSET;
	    strcpy(m_font.lfFaceName,"隶书");
	    m_font.lfHeight*=4;    //字体放大倍数
	    m_font.lfWidth*=4;
			//在客户区显示3D阴影标题字(黑白组成)
	    font.CreateFontIndirect(&m_font);
		CFont *pOldFont=pDC->SelectObject(&font);
		int nOldMode=pDC->SetBkMode(TRANSPARENT);
		COLORREF OldColor=pDC->SetTextColor(RGB(0,0,0));
		pDC->TextOut(LEFT-30,TOP-200,"投诉抢修管理系统");
		pDC->SetTextColor(RGB(255,255,255));
		pDC->TextOut(LEFT-25,TOP-195,"投诉抢修管理系统");
		pDC->SetTextColor(OldColor);  //恢复原始字体设置 
		pDC->SetBkMode(nOldMode);
		pDC->SelectObject(pOldFont);  
		
		//显示通道当前状态提示
	    for (WORD i = 0; i < TW_ChannelNumber; ++i)
			pDC->TextOut(LEFT, TOP + i * HEIGHT, ChMess[i], strlen (ChMess[i]));
	    EndPaint (&ps);
		
		CRecordView::OnPaint();	
	}
	// Do not call CRecordView::OnPaint() for painting messages
}

 


void CDBtestView::DoDataExchange(CDataExchange* pDX)
{
	CRecordView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDBtestView)
	DDX_Control(pDX, IDC_RECORD_NUM, m_oNum);
	DDX_Control(pDX, IDC_BUTTONOK, m_oOk);
	DDX_Control(pDX, IDC_BUTTONCANCEL, m_oCancel);
	DDX_Control(pDX, IDC_RECORD_MEMO, m_oMemo);
	DDX_Control(pDX, IDC_RECORD_FILENAME, m_oFilename);
	DDX_Control(pDX, IDC_RECORD_TYPE, m_oType);
	DDX_Control(pDX, IDC_RECORD_ID, m_oSampleID);
	DDX_FieldText(pDX, IDC_RECORD_FILENAME, m_pSet->m_FileName, m_pSet);
	DDX_FieldText(pDX, IDC_RECORD_MEMO, m_pSet->m_memo, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_memo, 256);
	DDX_FieldText(pDX, IDC_RECORD_TYPE, m_pSet->m_type, m_pSet);
	DDX_FieldText(pDX, IDC_RECORD_ID, m_pSet->m_sampleID, m_pSet);
	DDX_FieldText(pDX, IDC_RECORD_NUM, m_pSet->m_RecordNum, m_pSet);
	//}}AFX_DATA_MAP
}

BOOL CDBtestView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
    
	return CRecordView::PreCreateWindow(cs);
}

//在此监视并显示各内外线电话的摘挂机状态
void CDBtestView::UpdateIntTimes()
{
	int i;
	char message[41]="";
	m_IntTimes++;

	for (i = 0; i < TW_ChannelNumber; i++) 
	{
		//注意:放音模块为i=3时进行相应操作
		switch (TW_ChannelType(i)) 
		{
		case CT_INTERNAL:
			Status[i] = TW_OffHookDetect(i)? '|' :'-';
			//sprintf(ChMess[i],"通道%d (内线) : 正在侦听...",i);
	        //ChPaint(i);
			InternalChannels (i);
			break;

		case CT_EXTERNAL:
			Status[i] = TW_ListenerOffHook(i)? '|' : '-';
			//sprintf(ChMess[i],"通道%d (外线) : 正在侦听...",i);
	        //ChPaint(i);
			ExternalChannels (i);
			break;
		} 
	  if(Status[i]=='|')
         strcat(message,"摘机 ");
	  else
		 strcat(message,"挂机 ");
	  
	 	}
	
	GetDlgItem(IDC_EDIT_CHANNEL_STATUS)->SetWindowText(message);
}

void CDBtestView::OnTimer(UINT nIDEvent) //100毫秒更新一次计数器
{
 	UpdateIntTimes();  //更新电话通道状态显示

	CRecordView::OnTimer(nIDEvent);
}


void CDBtestView::ChPaint(WORD ch)
{
	RECT	r;

	if (IsIconic ()) //提示字符显示大小
		return;
	r.left	 = LEFT;
	r.top	 = TOP + ch * HEIGHT; 
	r.right	 = RIGHT;
	r.bottom = TOP + ch * HEIGHT + HEIGHT-1;
	InvalidateRect (&r, TRUE);
}

void CDBtestView::CheckDtmf(WORD i)     //检查dtmf按键
{
	int	d;

	while ((d = TW_GetDTMFChar (i)) != -1) 
	{
		TW_StartTimer (i, WAIT_TIMER);
		sprintf (ChMess[i], "通道%2d (%s) : 接收到DTMF '%c'", i, TW_ChannelType (i) == CT_INTERNAL ? "内线" : "外线", d);
		ChPaint (i);
	}
}
/*从系统时间获得文件名:0~3:年;4~6:月;7,8:日;9,10:时;11,12:分;***
***13,14:秒;15:留言(此位为0)或投诉类型(此位大于0),16:通道号(0或1)****
***17~19:文件名后缀:“.TW”;20:字符串结束标志:'\0'***********************/
char* CDBtestView::GetFileName(char type,int chnumber)
{
	struct tm *newtime;
	time_t aclock;
	int i;
	char *times;
	static char filename[21];
	time( &aclock );                // Get time in seconds 
	newtime = localtime( &aclock ); // Convert time to struct tm form 
	times=asctime( newtime );
	for(i=0;i<=3;i++)
		filename[i]=times[20+i];	//年
	for(i=4;i<=6;i++)
		filename[i]=times[i];		//月
	for(i=7;i<=8;i++)
		filename[i]=times[i+1];		//日
	for(i=9;i<=10;i++)
		filename[i]=times[i+2];		//时
	for(i=11;i<=12;i++)
		filename[i]=times[i+3];		//分
	for(i=13;i<=14;i++)
		filename[i]=times[i+4];		//秒
	filename[15]=type;				//留言或投诉类型
	filename[16]=chnumber+'0';		//通道号
	filename[17]='.';
	filename[18]='t';
	filename[19]='w';
	filename[20]='\0';
	 
	return filename;
}

//外线电话管理模块
void CDBtestView::ExternalChannels(WORD i)
{
	WORD Sig;
	DWORD	SigCount, SigLen;
	int dtmf,j;
    long fail;

	switch (CS[i]) 
	{
		/******挂机时收到外线来电进行摘机操作并播放提示语音文件*****/
		case WS_HANGUP :

			if(bRingTime)
			{
				//振铃1次之后摘机
			if (TW_RingDetect (i) >iRingTimeNum)
			{
				sprintf (ChMess[i], "通道%2d (外线) : 有外来振玲...",i); 
				ChPaint(i);
				TW_OffHookCtrl (i);
				TW_FlushDTMF (i);
				inputchar[i]=START;
				strcpy(filename[i],welcomfile);//播放初始放音文件
				
				if (TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX) == -1)
				{
					sprintf (ChMess[i], " 通道%d (外线) : 初始放音失败.", i);
					ChPaint (i);
					TW_HangUpCtrl (i);
					CS[i] = WS_HANGUP;
				}
				else 
				{
				
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ;
					 
			        sprintf (ChMess[i], "通道%2d (外线) : 正在播放提示音...", i);
					ChPaint (i);
					CS[i] = WS_PLAY;
				}
			}
			//当外线无来电时查询是否拨号队列为空,若不空时,自动拨号播放相应文件
			else 
			{
			 	
			}
			}
			else
			{
				//根据设置时间摘机
				if(TW_RingDetect (i) >1)
				{
				Sleep(iRingTimeNum );
				sprintf (ChMess[i], "通道%2d (外线) : 有外来振玲...",i); 
				ChPaint(i);
				TW_OffHookCtrl (i);
				TW_FlushDTMF (i);
				inputchar[i]=START;
				strcpy(filename[i],welcomfile);//播放初始放音文件
				
				if (TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX) == -1)
				{
					sprintf (ChMess[i], " 通道%d (外线) : 初始放音失败.", i);
					ChPaint (i);
					TW_HangUpCtrl (i);
					CS[i] = WS_HANGUP;
				}
				else 
				{
				
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ;
					 
			        sprintf (ChMess[i], "通道%2d (外线) : 正在播放提示音...", i);
					ChPaint (i);
					CS[i] = WS_PLAY;
				}
			}
			}

⌨️ 快捷键说明

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