📄 frmmain.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Daila.NewClass;//引入命名空间
using System.Data.OleDb;
using System.IO;
using Daila.NewMehod;
namespace Daila
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
public enum CHANNEL_STATE : short
{
CH_FREE,//0"空闲"
CH_RECEIVEID,//有来电呼入
CH_WAITSECONDRING,//2" 等待第二次振铃"
CH_WELCOME,//3"这里是东进电话银行演示系统
CH_WELCOME0,
CH_WELCOME1,
CH_SELECT,//8"选择功能"
CH_SELECT1,//9
CH_PLAYRESULT,//10"播放查询结果";
CH_RECORDFILE,//11
CH_PLAYRECORD,//12
CH_OFFHOOK,//13
CH_WAITUSERONHOOK,//14"等待内线挂机"
CH_ConBusy,//人工忙
CH_ACCOUNT1,//请稍候
CH_ACCOUNT2,//正在连接
CH_ACCOUNT3,
CH_ACCOUNT4,//已接通
CH_ACCOUNT,//已接通
CH_ConBusy0,//对方正忙
CH_Connect,//正在转接"
CH_Over,//请挂机
CH_IsOver,//对方已挂机
CH_PASSWORD0,//请拨号
CH_PASSWORD,//请拨号
CH_PASSWORD1,//已接通
CH_RECEIVEID2,//有来电呼
CH_DIAL,//拔号
CH_CHECKSIG,
CH_PLAY,
CH_ONHOOK,
CH_BUSY,
CH_NOBODY,
CH_NOSIGNAL,
CH_NODIALTONE,
CH_NORESULT
}
public enum CHANNEL_TYPE : short
{
User,//0 内线
Trunk,//1外线
Empty//2悬空
}
public enum SigType : int//信号音类型,可以有如下值:
{
SIG_STOP,//0 停止播放信号音
SIG_DIALTONE,//1 拨号音
SIG_BUSY1,//2 忙音一
SIG_BUSY2,//3 忙音二
SIG_RINGBACK// 回铃音
}
public enum HangUp : int
{
HANG_UP_FLAG_FALSE,//0 没有挂机
HANG_UP_FLAG_TRUE,//1已经挂机(从进入HANG_UP_FLAG_START 状态开始,挂机时间大于0.5秒。)
HANG_UP_FLAG_START,//2 ● 开始挂机
HANG_UP_FLAG_PRESS_R //3 拍了一下叉簧
}
public struct LINESTRUCT //定义linestruct
{
public CHANNEL_TYPE nType;
public CHANNEL_STATE State;
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public string CallerID;
// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Dtmf;
public int nTimeElapse;
public string UserCity;
public int intTimeCount;
}
public LINESTRUCT[] Lines;
public LINESTRUCT[] DaiLines; //定义lines为linestruct[];
public long LoadDriveFlag;
public short TotalLine;
public short[] sWitCh = new short[128];
public short[] SigCheck = new short[128];
public bool[] bUser = new bool[128];
public short[] Dtmf = new short[128];
public static int intLY=0;//控件电话信息
#region//窗体加载事件
private void frmMain_Load(object sender, EventArgs e)
{
//实始化LIStVIEW控件
lvQs.Clear();
lvQs.LargeImageList = imageList1;
lvQs.Items.Add("添加客户信息", 0);
lvQs.Items.Add("删除客户信息", 1);
lvQs.Items.Add("修改客户信息", 0);
lvQs.Items.Add("查询客户信息", 1);
//实始化语音卡
LoadDriveFlag = D160A.LoadDRV(); //public static extern long LoadDRV();
if (LoadDriveFlag == -1) //以前为1,改成-1;
{
MessageBox.Show("Load drive failure");
return;
}
TotalLine = D160A.CheckValidCh(); // 检测在当前机器内可用的通道总数。 //public static extern short CheckValidCh();
if (D160A.EnableCard(TotalLine, 8 * 512) == 1)//public static extern long EnableCard(short wusedCh, short wFileBufLen);
{
MessageBox.Show("Enable card error");
return;
}
Lines = new LINESTRUCT[TotalLine]; //public LINESTRUCT[] Lines;
// DaiLines = new LINESTRUCT[TotalLine];
for (short i = 0; i < TotalLine; i++)
{
Lines[i].nType = (CHANNEL_TYPE)D160A.CheckChType(i);
Lines[i].State = (CHANNEL_STATE)(0);//(i);//0
Lines[i].CallerID = "";//
Lines[i].Dtmf = "";
SigCheck[i] = (short)1;
sWitCh[i] = (short)-1;
bUser[i] = true;
Dtmf[i] = (short)-1;
ChnlState_LV.Items.Add(i.ToString());
if (Lines[i].nType == CHANNEL_TYPE.User)
{ ChnlState_LV.Items[i].SubItems.Add("内线"); }
if (Lines[i].nType == CHANNEL_TYPE.Trunk)
{ ChnlState_LV.Items[i].SubItems.Add("外线"); };
if (Lines[i].nType == CHANNEL_TYPE.Empty)
{ ChnlState_LV.Items[i].SubItems.Add("空悬"); };
if (Lines[i].State == CHANNEL_STATE.CH_FREE)
{ ChnlState_LV.Items[i].SubItems.Add("空闲"); }
ChnlState_LV.Items[i].SubItems.Add("");
ChnlState_LV.Items[i].SubItems.Add("");
ChnlState_LV.Items[i].SubItems.Add("");
}
D160A.SetBusyPara((short)350);
D160A.Sig_Init(0);
timer1.Enabled = true;
}//end if
#endregion
#region //获取控件数量
public int DataGridViewCount(OleDbDataReader dr)
{
int intFalg = 0;
try
{
OleDbDataReader oledDr = dr;
while (oledDr.Read())
{
intFalg++;
}
return intFalg;
}
catch (Exception ee)
{
return intFalg;
}
}
#endregion
#region//填冲控件
public int DataGridFalg(OleDbDataReader dr, int intCount)
{
int intFalg = 0;
try
{
OleDbDataReader oledDr = dr;
intFalg = 0;
dataGridView1.RowCount = intCount;
while (oledDr.Read())
{
this.dataGridView1[0, intFalg].Value = oledDr[0].ToString();
this.dataGridView1[1, intFalg].Value = oledDr[1].ToString();
this.dataGridView1[2, intFalg].Value = oledDr[2].ToString();
this.dataGridView1[3, intFalg].Value = oledDr[7].ToString();
this.dataGridView1[4, intFalg].Value = oledDr[10].ToString();
intFalg++;
}
return intFalg;
}
catch (Exception ee)
{
return intFalg;
}
}
#endregion
#region//此方法处理通话记录
public void tbTelRecordAdd(string stringId,int intChannel)
{
tbTelRecordClass tbClass = new tbTelRecordClass();
tbTelRecordMenthod tbMenhod = new tbTelRecordMenthod();
tbCustomerMethod tbCustom = new tbCustomerMethod();
tbCustomerClass tbCuClass = new tbCustomerClass();
tbClass.strfldTel = stringId;
tbClass.daSearchDate = DateTime.Now;
tbClass.shfldChannel = intChannel;
if (intLY == 1)
{
tbCuClass.kuTel = stringId;
tbCuClass.kuOffice = stringId;
int intFalgTel = DataGridFalg(tbCustom.tbCustomerSecarf(tbCuClass, "khTel"), DataGridViewCount(tbCustom.tbCustomerSecarf(tbCuClass, "khTel")));
tbClass.strsType = "打入";
}
if (intLY == 0)
{
tbClass.strsType = "打出";
}
tbMenhod.tbTelRecordAdd(tbClass);
intLY = 0;
}
#endregion
#region 启动timer1控件调用DaiWorkIng方法维持语音卡工作
private void timer1_Tick(object sender, EventArgs e)
{
DaiWorkIng();
}
#endregion
#region 此方法处理语音卡工作的方法实现,自动台,和转人工台
private void DaiWorkIng()
{ //239行对应475行
D160A.PUSH_PLAY();//入口参数:无函数返回:无;功能描述:维持文件录放音的持续进行,需在处理函数的大循环中调用。
D160A.FeedSigFunc();//维持断续振铃及信号音的函数;请在程序大循环中调用。
byte[] FileName;//原代码
short TmpDTMF,Code;
for (short i = 0; i < TotalLine; i++) //TotalLine = D160A.CheckValidCh();
{
ListViewState(i);
switch (Lines[i].State)
{
case CHANNEL_STATE.CH_FREE: //DJ160Int.CH_FREE://0"空闲" //252对应267行 ch_free;
if (D160A.RingDetect(i) == true)
{
if (Lines[i].nType == CHANNEL_TYPE.User)//内线
{
// 某一通道开始挂机检测;当某通道摘机后,可以调用本函数。该函数只对内线通道有效。
D160A.StartHangUpDetect(i);
Lines[i].State = CHANNEL_STATE.CH_OFFHOOK;
Lines[i].nTimeElapse = 0;
Lines[i].intTimeCount = 0;
sWitCh[i] = i;
}
if (Lines[i].nType == CHANNEL_TYPE.Trunk)//外线
{//给通道状态赋值
Lines[i].State = CHANNEL_STATE.CH_RECEIVEID;
D160A.ResetCallerIDBuffer(i); //清空主叫Buf,为外线收主叫作准备
Lines[i].nTimeElapse = 0;
sWitCh[i] = i;
}
}
break; //267对应252行
case CHANNEL_STATE.CH_RECEIVEID: //"接收主叫号码//268对应283行ch_receiveID;
byte[] TmpCID = new byte[32];
int iResult = 0;
iResult = D160A.GetCallerIDStr(i, TmpCID); //接收主叫号码
if (iResult == 3 || iResult == 4)//收完主叫,外线摘机使能
{
for (int j = 0; j < TmpCID.Length; j++)//存储电话号
{
Lines[i].CallerID = Lines[i].CallerID + ((char)TmpCID[j]).ToString();
intLY = 1;
}
//外线提机
string strin = Encoding.UTF8.GetString(TmpCID).Substring(8,11);
D160A.OffHook(i);
D160A.StartSigCheck(i);
Lines[i].State = CHANNEL_STATE.CH_OFFHOOK;
tbTelRecordAdd(strin, (int)i);
}
break; //283对应268
case CHANNEL_STATE.CH_OFFHOOK: //ch_offhook;
D160A.InitDtmfBuf(i);
StartPlayFileEx(i, "Bank.001");//放音
Lines[i].State = CHANNEL_STATE.CH_WELCOME;//欢迎
break;
case CHANNEL_STATE.CH_WELCOME: //ch_welcome;
TmpDTMF = D160A.GetDtmfCode(i);//接受按键,返回值-1 缓冲区中没有DTMF按键
if (TmpDTMF != -1)
{
D160A.StopPlayFile(i);//停止放音
Lines[i].Dtmf = Lines[i].Dtmf + CvtDTMF(TmpDTMF);//TmpDTMF.ToString();//DTMF号码转换ASCII
Lines[i].State = CHANNEL_STATE.CH_SELECT;//请随意输入8位银行帐号
}
else//后加代码
{
if (D160A.CheckPlayEnd(i))//检查指定通道放音是否结束0未结束1结束
{
D160A.StopPlayFile(i);//停止放音
StartPlayFileEx(i, "Bank.004");
Lines[i].State = CHANNEL_STATE.CH_SELECT;
}
}
break;
case CHANNEL_STATE.CH_SELECT: //ch_select;
TmpDTMF = D160A.GetDtmfCode(i);
if (TmpDTMF != -1)
{
Lines[i].Dtmf = TmpDTMF.ToString();
switch (Lines[i].Dtmf)
{
case "1":
D160A.StopPlayFile(i);
D160A.RsetIndexPlayFile(i);
FileName = GetFilePath("bank.005");
D160A.AddIndexPlayFile(i, FileName);
FileName = GetFilePath("d5");
D160A.AddIndexPlayFile(i, FileName);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -