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

📄 ufrmcaller.pas

📁 a voice guide client ,it is the second part of voice guide center
💻 PAS
📖 第 1 页 / 共 4 页
字号:
unit ufrmCaller;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxLookAndFeelPainters, VirtualTrees, cxMaskEdit, cxDropDownEdit,
  RzButton, RzRadChk, cxMemo, StdCtrls, cxButtons, cxLabel, cxControls,
  cxContainer, cxEdit, cxTextEdit, RzPanel, dxDockPanel, dxDockControl,
  ExtCtrls, GisDefs, DateUtils, uBaseODMDefs,
  uITaxiServiceODMPClientLogistic, uBaseODMProtocalUtils,
  ufrmTaskShow, uITaxiServiceModuleTaskManagerDefs, uTaxiCallUtils,
  uBaseDBDataAwareComboBoxKeyFilter, cxSpinEdit, cxTimeEdit, ComCtrls,
  RzDTP, Mask, RzEdit, uBaseODMMessageLogFormUtils,
  uBaseGISMapCall, Menus, cxGraphics;

type
  {: 车辆轨迹对象。}
  TTargetTrackData = record
    // 车辆状态信息。
    {: [车辆状态信息]定位时间。}
    GPSPosTime          : TDateTime;
    {: [车辆状态信息]经度。}
    GPSLon              : Double;
    {: [车辆状态信息]纬度。}
    GPSLat              : Double;
    {: [车辆状态信息]速度。}
    GPSSpeed            : Integer;
    {: [车辆状态信息]方向。}
    GPSHeading          : Integer;
  end;

  {: 车辆轨迹对象指针。}
  PTargetTrackData = ^TTargetTrackData;
  
  {: 车辆对象。}
  TTargetData = record
    {: 通信号。}
    CommNO              : string;
    {: 终端类型编号。}
    TerminalTypeID      : Integer;
    {: 车牌号码。}
    RegistrationNO      : string;
    {: 车辆外观类型。
      数据库存储基于参考表的形式,在系统中只以字符串的形式存在}
    AppearanceType      : string;
    {: 车辆型号。
      数据库存储基于参考表的形式,在系统中只以字符串的形式存在}
    VehicleModel        : string;
    {: 区域编号。}
    AreaID              : Integer;
    {: 司机姓名。}
    DriverName          : string;
    {: 司机手机号码。}
    DriverMobileNO      : string;
    {: 轨迹列表。}
    TrackList           : TStringList;
  end;

  {: 车辆对象指针。}
  PTargetData = ^TTargetData;

  {: 日志对象。}
  TMemoData = record
    {: 日志内容。}
    Str : string;
  end;

  {: 日志对象指针。}
  PMemoData = ^TMemoData;

  {: 目标车辆显示信息。}
  TTargetShowHint = (TTargetShowHintCommNO, TTargetShowHintRegistrationNO,
    TTargetShowHintDriverMobileNO, TTargetShowHintTaskNO);
  {: 按钮状态。}
  TBtnStatus = (btnStatusNew, btnStatusSelect);

  {: 触发指令状态。}
  TOnConnectResult = procedure(_sender: TObject; _is_connect: Boolean) of Object;

  {: 状态显示触发事件。}
  TOnHint = procedure(_status_str: string) of Object;

  TfrmCaller = class(TForm)
    pnlTaxiCall: TPanel;
    Splitter3: TSplitter;
    dxDockSite1: TdxDockSite;
    dxDockSite2: TdxDockSite;
    dxLayoutDockSite2: TdxLayoutDockSite;
    dxDockPanel6: TdxDockPanel;
    vtTaskTree: TVirtualStringTree;
    dxDockPanel1: TdxDockPanel;
    dxLayoutDockSite1: TdxLayoutDockSite;
    lbTaskNO: TcxLabel;
    lbAppearanceType: TcxLabel;
    lbCommNO: TcxLabel;
    lbVehicleMode: TcxLabel;
    lbDriverName: TcxLabel;
    lbDriverMobileNO: TcxLabel;
    dxDockPanel2: TdxDockPanel;
    dxLayoutDockSite3: TdxLayoutDockSite;
    RzGroupBox1: TRzGroupBox;
    edtCallerIBPhoneNO: TcxTextEdit;
    cxLabel2: TcxLabel;
    cxLabel4: TcxLabel;
    RzGroupBox2: TRzGroupBox;
    cxLabel6: TcxLabel;
    cxLabel7: TcxLabel;
    cxLabel8: TcxLabel;
    cxLabel9: TcxLabel;
    mmCallerIAOtherInfo: TcxMemo;
    cbxCallerIAAgeSegmentID: TcxComboBox;
    cbxCallerIASex: TcxComboBox;
    RzGroupBox4: TRzGroupBox;
    cxLabel25: TcxLabel;
    btnCancel: TcxButton;
    cbxCancelReason: TcxComboBox;
    btnConfirmBaseInfo: TcxButton;
    btnDisplayPoint: TcxButton;
    btnConfirmAdditionalInfo: TcxButton;
    btnContent: TcxButton;
    cbxCallerIBMaxWaitTime: TcxComboBox;
    cbxCallerIAHigh: TcxComboBox;
    cbxCallerIAName: TcxComboBox;
    cxLabel1: TcxLabel;
    cbxCallerIAGuestCount: TcxComboBox;
    cbxCallerIBIsBook: TRzCheckBox;
    cbxCallerIAHasPackage: TcxComboBox;
    cxLabel3: TcxLabel;
    cbxCallerIAFeedbackTypeID: TcxComboBox;
    cxLabel11: TcxLabel;
    btnReply: TcxButton;
    cxLabel10: TcxLabel;
    btnGetPoint: TcxButton;
    lbCallerIBPositionLat: TcxLabel;
    lbCallerIBPositionLon: TcxLabel;
    teCallerIBBookTime: TRzDateTimeEdit;
    lblon: TcxLabel;
    lblat: TcxLabel;
    Timer1: TTimer;
    dxDockPanel3: TdxDockPanel;
    dxTabContainerDockSite1: TdxTabContainerDockSite;
    vtMemo: TVirtualStringTree;
    btnSelectPoint: TcxButton;
    procedure FormDestroy(Sender: TObject);
    procedure btnGetPointClick(Sender: TObject);
    procedure btnConfirmBaseInfoClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure vtTaskTreeGetText(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure btnConfirmAdditionalInfoClick(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure btnContentClick(Sender: TObject);
    procedure cbxCallerIBIsBookClick(Sender: TObject);
    procedure btnDisplayPointClick(Sender: TObject);
    procedure btnReplyClick(Sender: TObject);
    procedure vtTaskTreeChange(Sender: TBaseVirtualTree;
      Node: PVirtualNode);
    procedure vtTaskTreeMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure vtMemoGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure vtMemoFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
    procedure edtCallerIBPhoneNOKeyPress(Sender: TObject; var Key: Char);
    procedure cbxCallerIBMaxWaitTimeKeyPress(Sender: TObject;
      var Key: Char);
    procedure cbxCallerIAHighKeyPress(Sender: TObject; var Key: Char);
    procedure vtTaskTreePaintText(Sender: TBaseVirtualTree;
      const TargetCanvas: TCanvas; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType);
    procedure btnSelectPointClick(Sender: TObject);
  // ODMP客户端
  private
    IP           : string;
    Port         : Integer;
    {: 任务列表。}
    taskList          : TStringList;
    {: 车辆列表。}
    targetList        : TStringList;
    {: 是否登录。}
    isLogon           : Boolean;
    {: 目标车辆显示信息。}
    targetShowHint    : TTargetShowHint;
    {: 状态显示。}
    FOnHint           : TOnHint;
    {: 连接触发事件。}
    FOnConnectResult : TOnConnectResult;

    {: ComboBox控件控制类。}
    FComboBoxFirstStr     : TBaseDBDataAwareComboBoxKeyFilter;
  public
    {: ODMP客户端。}
    clientLogistic : TITaxiServiceBaseODMProtocalClientLogistic;
    {: 座席登录名。}
    userSeatName   : string;
    {: 召车时间。}
    timeCall       : TDateTime;

  // ODMP初始化
  public
    procedure iniBaseGisMapCall;
    procedure InitialODMP(_ip: string; _port: Integer);
    procedure DisplayPnlCaller;
    procedure ConnectODMP;
    procedure freeODMP;

  // 触发事件
  private
    procedure doOnWMCopyData(var Msg: TWMCopyData); message WM_Copydata;
	  procedure doOnProtocalReplyResult(_status_id: Integer);
	  procedure doOnProtocalReceiveResult(_p_protocal_dataset: PBaseODMProtocalDataset);
    procedure doOnLogResult(_sender: TObject; _is_connect: Boolean);

  // 窗口管理
  private
    procedure iniTialVtTaskTree;
    procedure refreshTaskList(_p_task: PTask);
    procedure setBtnStatus(_status: TBtnStatus);
    procedure resetStatus;

  public
    function  getTaskStatusType(_status: TITaxiServiceTaskManagerTaskStatus): string;
    function  getTaskResultType(_result: TITaxiServiceTaskManagerTaskResult): string;
    function  getPTargetByRegistrationNO(_registration_no: string): PTargetData;

  // 任务管理
  private
    function  getPNodeByTask(_p_task: PTask): PVirtualNode;
    function  getPTaskByTaskNO(_task_no: Int64): PTask;
    function  getTaskListIndexByPTask(_p_task: PTask): Integer;
    procedure clearTaskList;
    procedure clearTargetList;
    procedure clearPTargetByName(_reg_no: string);
    procedure clearPTask(_p_task: PTask);
    procedure newTask(_p_protocal_dataset: PBaseODMProtocalDataset);
    function  getInitialTask: PTask;
    procedure receiveTaskStatus(_p_protocal_dataset: PBaseODMProtocalDataset);
    procedure receiveTaskTaxiInfo(_p_protocal_dataset: PBaseODMProtocalDataset);
    procedure receiveTaskEnd(_p_protocal_dataset: PBaseODMProtocalDataset);

  published
    property OnHint : TOnHint
        read FOnHint
       write FOnHint;
    property OnConnectResult : TOnConnectResult
        read FOnConnectResult
       write FOnConnectResult;

  end;

var
  frmCaller: TfrmCaller;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
//  私有方法 -- 构造与析构
//------------------------------------------------------------------------------

procedure TfrmCaller.FormCreate(Sender: TObject);
var
  i         : Integer;
  temp_list : TStringList;
begin
  // 电招基础单元
  BaseGisMapCall := TBaseGisMapCall.Create;
  iniBaseGisMapCall;

  setBtnStatus(btnStatusNew);
  iniTialVtTaskTree;

  TGPSClientVTVUtils.InitialVirtualTreeView(vtTaskTree);
  TGPSClientVTVUtils.InitialVirtualTreeView(vtMemo);

  vtTaskTree.NodeDataSize  := SizeOf(TITaxiServiceTaskManagerTask);
  vtMemo.NodeDataSize  := SizeOf(TMemo);
  taskList    := TStringList.Create;
  targetList  := TStringList.Create;
  targetShowHint := TTargetShowHintRegistrationNO;

  FComboBoxFirstStr       := TBaseDBDataAwareComboBoxKeyFilter.Create;

  temp_list := TStringList.Create;
  try
    temp_list.CommaText := gFirstName;
    for i := 0 to temp_list.Count - 1 do
      cbxCallerIAName.Properties.Items.Append(temp_list.Strings[i]);

    cbxCallerIAName.OnEnter   := FComboBoxFirstStr.comboBoxEnter;
    cbxCallerIAName.OnExit    := FComboBoxFirstStr.comboBoxExit;
    cbxCallerIAName.OnKeyDown := FComboBoxFirstStr.comboBoxKeyDown;
  finally
    temp_list.Free;
  end;
end;

procedure TfrmCaller.FormDestroy(Sender: TObject);
begin
  BaseGisMapCall.Free;
  freeODMP;

  clearTaskList;
  taskList.Free;

  clearTargetList;
  targetList.Free;

  FComboBoxFirstStr.Free;
end;

//------------------------------------------------------------------------------
//  私有方法 -- ODMP触发事件
//------------------------------------------------------------------------------

{: ODMP服务端回复的指令触发事件。
  @param _status_id      回复指令的状态信息
}
procedure TfrmCaller.doOnProtocalReplyResult(_status_id: Integer);
var
  status_str : string;
begin
  case _status_id of
    -301:
    begin
      status_str := '已登录电召服务';
      isLogon    := True;
    end;
    -401: status_str := '电召用户名或密码错误';
  end;

  if Assigned(FOnHint) then
    FOnHint(status_str);
end;

procedure TfrmCaller.doOnLogResult(_sender: TObject; _is_connect: Boolean);
begin
  if Assigned(FOnConnectResult) then
    FOnConnectResult(Self, _is_connect);

  // 断开 清空所有任务
  if not _is_connect then
  begin
    clearTaskList;
    vtTaskTree.Invalidate;
  end;
end;

{: 触发服务端主动发送的指令。
  @param _p_protocal_dataset    指令数据集
}
procedure TfrmCaller.doOnProtocalReceiveResult(
  _p_protocal_dataset: PBaseODMProtocalDataset);
begin
  // 如果是新任务
  if _p_protocal_dataset^.Command^.CommandDefine^.CommandName = 'BCM_Task_New' then
    newTask(_p_protocal_dataset)
  // 如果是任务状态
  else if _p_protocal_dataset^.Command^.CommandDefine^.CommandName = 'BCM_Task_Status' then
    receiveTaskStatus(_p_protocal_dataset)
  // 如果是任务车辆信息
  else if _p_protocal_dataset^.Command^.CommandDefine^.CommandName = 'BCM_Task_TaxiInfo' then
    receiveTaskTaxiInfo(_p_protocal_dataset)
  // 如果是任务结束
  else if _p_protocal_dataset^.Command^.CommandDefine^.CommandName = 'BCM_Task_End' then
    receiveTaskEnd(_p_protocal_dataset);
end;

//------------------------------------------------------------------------------
//  公有方法 -- ODMP
//------------------------------------------------------------------------------

{: 初始化ODMP座席客户端。
  @param _sender            事件触发者
  @param _sender            事件触发者
}
procedure TfrmCaller.InitialODMP(_ip: string; _port: Integer);
begin
  // ODMP
  clientLogistic := TITaxiServiceBaseODMProtocalClientLogistic.Create;
  clientLogistic.OnProtocalReplyResult := doOnProtocalReplyResult;
  clientLogistic.OnProtocalReceiveResult := doOnProtocalReceiveResult;
  clientLogistic.OnLogResult := doOnLogResult;
  IP    := _ip;
  port  := _port;
end;

procedure TfrmCaller.ConnectODMP;
begin
  clientLogistic.ConnectCallServer(IP, Port);
end;

procedure TfrmCaller.DisplayPnlCaller;
begin
  BaseGisMapCall.DisplayPnlCaller;
end;

{: 释放ODMP。}
procedure TfrmCaller.freeODMP;
begin
  clientLogistic.DisConnectCallServer;
  clientLogistic.Free;
end;

//------------------------------------------------------------------------------
//  私有方法 -- 取点
//------------------------------------------------------------------------------

{: 召车GIS取点。
  @param _sender            事件触发者
}
procedure TfrmCaller.btnGetPointClick(Sender: TObject);
begin
  BaseGisMapCall.GetCallerPoint(Self.Handle);
end;

procedure TfrmCaller.btnDisplayPointClick(Sender: TObject);
var
  gis_point : TGIS_Point;
begin
  if (StrToFloatDef(lbLon.Caption, 0) = 0)
    or (StrToFloatDef(lbLat.Caption, 0) = 0) then
    Exit;

  gis_point.X := StrToFloatDef(lbLon.Caption, 0);
  gis_point.Y := StrToFloatDef(lbLat.Caption, 0);

  BaseGisMapCall.DisplayCallerPoint(gis_point);
end;

{: 响应携带结构化数据的消息。。
}

⌨️ 快捷键说明

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