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