📄 ufrmcaller.pas
字号:
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 + -