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

📄 sys_main.pas

📁 开发呼叫中心时
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit sys_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, Buttons, ScktComp ,IniFiles ,StdCtrls ,Exch,
  CoolTrayIcon ,WinSock ,mmsystem;

type
  TFSys_main = class(TForm)
    StatusBar1: TStatusBar;
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    SpeedButton9: TSpeedButton;
    SpeedButton10: TSpeedButton;
    SpeedButton11: TSpeedButton;
    SpeedButton12: TSpeedButton;
    SpeedButton13: TSpeedButton;
    OpeSocket: TClientSocket;
    OpeTimer: TTimer;
    CoolTrayIcon1: TCoolTrayIcon;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton13Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure OpeSocketError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure OpeSocketConnecting(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure OpeSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure OpeSocketDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure OpeSocketRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure OpeTimerTimer(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton9Click(Sender: TObject);
    procedure SpeedButton11Click(Sender: TObject);
    procedure SpeedButton10Click(Sender: TObject);
    procedure CoolTrayIcon1DblClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure StatusBar1DblClick(Sender: TObject);
  private
    { Private declarations }
    LineNo:String;
    DeskNo:String;
    SysState:String;
    LoginState:Integer;
    PhoneState:Integer;  //话务状态 0 未登录 91 登录空闲 92 登录忙碌  93 摘机 94通话中
    TimeCount:Integer;
    CHClose:Boolean;
    DestNo:String;
    ToMobile:String;
    procedure UpdateStatusBar(i:Integer;Str:String);
    function Send_OCCP_BIND:Integer;
    function Send_OCCP_UNBIND:Integer;
    function Send_OCCP_LINK:Integer;
    function Send_OCCP_CALLOUT(phonenumber:String):Integer;
    function Send_OCCP_CALLIN(DestNo:String):Integer;
    function Send_OCCP_EXCHOUT(phonenumber:String):Integer;
    function Send_OCCP_EXCHIN(DestNo:String):Integer;
    function Send_OCCP_BUSY:Integer;
    function Send_OCCP_IDLE:Integer;
    function Send_OCCP_CLINE:Integer;
    function Send_OCCP_SLINE_RESP:Integer;
    function Send_OCCP_SPHONE_RESP:Integer;
    function Send_OCCP_ANS:Integer;
    function Send_OCCP_HUNGUP:Integer;
  public
    { Public declarations }
    ExchType:Integer;
    ExchLine:String;
    ExchPhone:String;
    procedure InitTimer;
    procedure InitButton;
    function FormatSpace(var StrTemp: String; Len: Integer): String; //格式化字符串长度,左齐右补空格
    procedure FormatChar(var a:array of char;b:string);
    procedure FortmatString(Var StrTemp:String);
    function MyInputBox(const ACaption, APrompt, ADefault: string;Len:Integer = 255): string;
    function MyInputQuery(const ACaption, APrompt: string; var Value: string;Len:Integer = 255): Boolean;
    procedure EditKeyPress(Sender: TObject; var Key: Char);
  end;

var
  FSys_main: TFSys_main;
  FormA: TForm;
implementation

uses Occp;

{$R *.dfm}
{$R ope.res}

procedure TFSys_main.FormCreate(Sender: TObject);
var
   FileName:String;
   MyIniFile:Tinifile;

   AcdIP:String;
   AcdSocket:Integer;
begin
     PhoneState:=0;
     InitButton;
     FileName:=ExtractFilePath(Paramstr(0))+'OpeClient.ini';
     MyIniFile:=Tinifile.Create(FileName);
     DeskNo:=MyIniFile.ReadString('System','DeskNo','0');
     LineNo:=MyIniFile.ReadString('System','LineNo','0');
     AcdIP:=MyIniFile.ReadString('System','AcdIP','192.168.11.17');
     AcdSocket:=MyIniFile.ReadInteger('System','AcdSocket',9901);
     SysState:='未登录';
     UpdateStatusBar(0,SysState);
     UpdateStatusBar(8,DeskNo);
     //StatusBar1.Panels[0].Text:=SysState;
     //StatusBar1.Panels[8].Text:=DeskNo;

     OpeSocket.Host:=AcdIP;
     OpeSocket.Port:=AcdSocket;
     try
        OpeSocket.Open;
        //OpeSocket.Active:=true;
     except
          on E:ESocketError do
          begin
               Showmessage(E.Message);
          end;
     end;

     OpeTimer.Enabled:=False;
     CHClose:=False;
end;

procedure TFSys_main.SpeedButton13Click(Sender: TObject);
begin
     FSys_main.Hide;
     if MessageBox(0,'你真的要退出吗?','警告',MB_OKCANCEL+MB_ICONWARNING)=IDOK then
     begin
          if PhoneState <> 0 then
               Send_OCCP_UNBIND;
          sleep(1000);
          CHClose:=True;
          Close;
     end
     else
     FSys_main.Show;
end;

procedure TFSys_main.SpeedButton1Click(Sender: TObject);
begin
     if OpeSocket.Active then
        Send_OCCP_BIND
     else
        Showmessage('服务器异常');  
end;

procedure TFSys_main.UpdateStatusBar(i: Integer; Str: String);
begin
     StatusBar1.Panels[i].Text:=Str;
end;

function TFSys_main.FormatSpace(var StrTemp: String; Len: Integer): String;
var
   I:Integer;
begin
      for I:=Length(StrTemp)+1 to Len do
          StrTemp:=StrTemp+#0;
end;

procedure TFSys_main.FormatChar(var a: array of char; b: string);
var
   i:integer;
begin
     for i:=low(a) to high(a) do
     begin
          if i+1<=Length(b) then
              a[i]:=b[i+1]
          else
               a[i]:=#0;
     end;
end;

procedure TFSys_main.InitTimer;
begin
     OpeTimer.Enabled:=True;
     OpeTimer.Interval:=5000;
     TimeCount:=0;
end;

procedure TFSys_main.InitButton;
begin
     case PhoneState of
          0:
          begin
               SpeedButton1.Enabled:=True;
               SpeedButton2.Enabled:=False;
               SpeedButton3.Enabled:=False;
               SpeedButton4.Enabled:=False;
               SpeedButton5.Glyph:=nil;
               SpeedButton5.Caption:='摘机';
               sndPlaySound(nil, 0);
               SpeedButton5.Enabled:=False;
               SpeedButton6.Enabled:=False;
               SpeedButton7.Enabled:=False;
               SpeedButton8.Enabled:=False;
               SpeedButton9.Enabled:=False;
               SpeedButton10.Enabled:=False;
               SpeedButton11.Enabled:=False;
               SpeedButton12.Enabled:=False;
               SpeedButton13.Enabled:=True;
          end;
          91:
          begin
               SpeedButton1.Enabled:=False;
               SpeedButton2.Enabled:=True;
               SpeedButton3.Enabled:=False;
               SpeedButton4.Enabled:=True;
               SpeedButton5.Glyph:=nil;
               sndPlaySound(nil, 0);
               SpeedButton5.Caption:='摘机';
               SpeedButton5.Enabled:=False;
               SpeedButton6.Enabled:=False;
               SpeedButton7.Enabled:=False;
               SpeedButton8.Enabled:=False;
               SpeedButton9.Enabled:=False;
               SpeedButton10.Enabled:=False;
               SpeedButton11.Enabled:=False;
               SpeedButton12.Enabled:=False;
               SpeedButton13.Enabled:=True;
          end;
          92:
          begin
               SpeedButton1.Enabled:=False;
               SpeedButton2.Enabled:=True;
               SpeedButton3.Enabled:=True;
               SpeedButton4.Enabled:=False;
               SpeedButton5.Glyph:=nil;
               sndPlaySound(nil, 0);
               SpeedButton5.Caption:='摘机';
               SpeedButton5.Enabled:=False;
               SpeedButton6.Enabled:=False;
               SpeedButton7.Enabled:=False;
               SpeedButton8.Enabled:=False;
               SpeedButton9.Enabled:=True;
               SpeedButton10.Enabled:=False;
               SpeedButton11.Enabled:=True;
               SpeedButton12.Enabled:=False;
               SpeedButton13.Enabled:=True;
          end;
          93:
          begin
               SpeedButton1.Enabled:=False;
               SpeedButton2.Enabled:=False;
               SpeedButton3.Enabled:=False;
               SpeedButton4.Enabled:=True;
               SpeedButton5.Glyph:=nil;
               sndPlaySound(nil, 0);
               SpeedButton5.Caption:='摘机';
               SpeedButton5.Enabled:=False;
               SpeedButton6.Enabled:=False;
               SpeedButton7.Enabled:=False;
               SpeedButton8.Enabled:=False;
               SpeedButton9.Enabled:=True;
               SpeedButton10.Enabled:=False;
               SpeedButton11.Enabled:=True;
               SpeedButton12.Enabled:=False;
               SpeedButton13.Enabled:=True;
          end;
          94:
          begin
               SpeedButton1.Enabled:=False;
               SpeedButton2.Enabled:=False;
               SpeedButton3.Enabled:=False;
               SpeedButton4.Enabled:=False;
               SpeedButton5.Glyph:=nil;
               sndPlaySound(nil, 0);
               SpeedButton5.Caption:='摘机';
               SpeedButton5.Enabled:=False;
               SpeedButton6.Enabled:=True;
               SpeedButton7.Enabled:=False;
               SpeedButton8.Enabled:=False;
               SpeedButton9.Enabled:=False;
               SpeedButton10.Enabled:=True;
               SpeedButton11.Enabled:=False;
               SpeedButton12.Enabled:=False;
               SpeedButton13.Enabled:=True;
          end;
          95://话机待摘机状态
          begin
               SpeedButton1.Enabled:=False;
               SpeedButton2.Enabled:=False;
               SpeedButton3.Enabled:=False;
               SpeedButton4.Enabled:=False;
               SpeedButton5.Caption:='';
               SpeedButton5.Glyph.LoadFromResourceName(hinstance,'mypic');
               PlaySound('mywav', hInstance, SND_RESOURCE or SND_ASYNC Or SND_LOOP);
               SpeedButton5.Enabled:=True;
               SpeedButton6.Enabled:=False;
               SpeedButton7.Enabled:=False;
               SpeedButton8.Enabled:=False;
               SpeedButton9.Enabled:=False;
               SpeedButton10.Enabled:=False;
               SpeedButton11.Enabled:=False;
               SpeedButton12.Enabled:=False;
               SpeedButton13.Enabled:=False;
          end;
     end;
end;

procedure TFSys_main.OpeTimerTimer(Sender: TObject);
begin
     if (Timecount+1) mod 6 = 0 then
     begin
          Send_OCCP_LINK;
     end;
     TimeCount:=TimeCount+1;
end;

procedure TFSys_main.OpeSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
     Showmessage('Socket Error');
     SysState:='服务器异常';
     UpdateStatusBar(0,SysState);
     Application.Terminate;
end;

procedure TFSys_main.OpeSocketConnecting(Sender: TObject;
  Socket: TCustomWinSocket);
begin
     SysState:='连接服务器';
     UpdateStatusBar(0,SysState);
end;

procedure TFSys_main.OpeSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
     SysState:='连接成功';
     UpdateStatusBar(0,SysState);
     sleep(1000);
     SysState:='未登录';
     UpdateStatusBar(0,SysState);
end;

procedure TFSys_main.OpeSocketDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
     PhoneState:=0;
     SysState:='连接断开';
     UpdateStatusBar(0,SysState);
     sleep(1000);
     SysState:='未登录';
     UpdateStatusBar(0,SysState);
end;

procedure TFSys_main.OpeSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
   HEAD_INFO:OCCP_PDU_HEAD;
   LINE_INFO:OCCP_SLINE;
   SPHONE_INFO:OCCP_SPHONE;
   StrTmp:String;
   mobile:String;
   spnumber:String;
   I:Integer;
begin
     TimeCount:=0;
     I:=Socket.ReceiveLength;
     Socket.ReceiveBuf(HEAD_INFO,SizeOf(HEAD_INFO));
     HEAD_INFO.command_length:= ntohl(HEAD_INFO.command_length);
     HEAD_INFO.csopcode:=ntohl(HEAD_INFO.csopcode);
     HEAD_INFO.command_status:=ntohl(HEAD_INFO.command_status);

     case HEAD_INFO.csopcode of
          OPE_OCCP_BIND_RESP:
          begin
               LoginState:=HEAD_INFO.command_status;
               if LoginState = 0 then
               begin
                    SysState:='已登录';
                    UpdateStatusBar(0,SysState);
                    PhoneState:=91;
                    InitButton;
                    InitTimer;
               end
               else
               begin
                    SysState:='登录失败';
                    UpdateStatusBar(0,SysState);
               end;
          end;
          OPE_OCCP_CLINE_RESP,
          OPE_OCCP_SLINE:
          begin
               Socket.ReceiveBuf(LINE_INFO,SizeOf(LINE_INFO));
               StrTmp:=LINE_INFO.Linestate;
               FortmatString(StrTmp);
               if StrTmp = 'IDLE' then
               begin
                    PhoneState:=91;
                    SysState:='登录示闲';
               end
               else if StrTmp = 'BUSY' then
               begin
                    PhoneState:=92;
                    SysState:='登录示忙';
               end
               else if StrTmp = 'TALKING' then
               begin
                    PhoneState:=94;
                    SysState:='通话中';
               end
               else if StrTmp = 'ANSWER' then
               begin
                    PhoneState:=93;
                    SysState:='摘机中';
               end;
               InitButton;
               UpdateStatusBar(0,SysState);
               if HEAD_INFO.csopcode = OPE_OCCP_SLINE then
               begin
                    Send_OCCP_SLINE_RESP;
               end;
          end;
          OPE_OCCP_SPHONE:
          begin
               Socket.ReceiveBuf(SPHONE_INFO,SizeOf(SPHONE_INFO));
               mobile:=SPHONE_INFO.Phonenumber;
               spnumber:=SPHONE_INFO.Spnumber;
               UpdateStatusBar(2,mobile);
               UpdateStatusBar(4,spnumber);
               phoneState:=95;
               InitButton;
               Send_OCCP_SPHONE_RESP;
          end;
          OPE_OCCP_BUSY_RESP:
          begin
               LoginState:=HEAD_INFO.command_status;
               if LoginState = 0 then
               begin
                    SysState:='已登录示忙';
                    UpdateStatusBar(0,SysState);
                    PhoneState:=92;
                    InitButton;
                    InitTimer;
               end
               else
               begin
                    SysState:='示忙失败';
                    UpdateStatusBar(0,SysState);
               end;
          end;
          OPE_OCCP_IDLE_RESP:
          begin
               LoginState:=HEAD_INFO.command_status;
               if LoginState = 0 then
               begin
                    SysState:='已登录示闲';
                    UpdateStatusBar(0,SysState);
                    PhoneState:=91;
                    InitButton;
                    InitTimer;
               end
               else
               begin
                    SysState:='示闲失败';
                    UpdateStatusBar(0,SysState);
               end;
          end;
          OPE_OCCP_UNBIND_RESP:
          begin
               LoginState:=HEAD_INFO.command_status;
               if LoginState = 0 then
               begin
                    SysState:='未登录';
                    UpdateStatusBar(0,SysState);
                    PhoneState:=0;
                    InitButton;
                    OpeTimer.Enabled:=False;
               end
               else
               begin

⌨️ 快捷键说明

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