📄 ufrmcaller.pas
字号:
TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
'TimeSubmitInfoAdditional', p_task^.TimeSubmitInfoAdditional);
// 发送指令对象
clientLogistic.SendODMP(p_protocal_dataset);
Timer1.Enabled := False;
btnConfirmAdditionalInfo.Colors.Default := clDefault;
btnConfirmAdditionalInfo.Colors.Normal := clDefault;
btnConfirmAdditionalInfo.Colors.Hot := clDefault;
btnConfirmAdditionalInfo.Colors.Pressed := clDefault;
btnConfirmAdditionalInfo.Colors.Disabled := clDefault;
btnConfirmAdditionalInfo.Enabled := False;
end;
{: 初始化新任务。
}
function TfrmCaller.getInitialTask: PTask;
var
p_task : PTask;
begin
New(p_task);
p_task^.TaskNO := 0;
p_task^.TimeCall := 0;
p_task^.TimeTransfer := 0;
p_task^.TimeSubmitInfoBase := 0;
p_task^.TimeSubmitInfoAdditional := 0;
p_task^.TimeBeginContact := 0;
p_task^.TimeDriverConfirm := 0;
p_task^.TimeEndContact := 0;
p_task^.TimeTaskFinish := 0;
// p_task^.CallerIBPhoneNO := '';
p_task^.CallerIBPositionLon := 0;
p_task^.CallerIBPositionLat := 0;
p_task^.CallerIBMaxWaitTime := 0;
p_task^.CallerIBMaxTaxiDistance := 0;
p_task^.CallerIBIsBook := False;
p_task^.CallerIBBookTime := 0;
p_task^.CallerIAName := '';
p_task^.CallerIAGender := True;
p_task^.CallerIAHeight := -1;
p_task^.CallerIAAgeSegmentID := 0;
p_task^.CallerIAOtherInfo := '';
p_task^.CallerIAFeedbackTypeID := 0;
p_task^.CallerIAGuestCount := -1;
p_task^.CallerIAHasPackage := 0;
// p_task^.TaskNewType := taskNewTypeNew;
p_task^.Status := taskStatusContact;
// p_task^.TaskResult := task;
p_task^.ReasonCancelTask := 0;
p_task^.SeatUserName := '';
p_task^.RegistrationNO := '';
p_task^.CallerHasInfoAdditional := False;
p_task^.RejectTaxiIDList := TStringList.Create;
Result := p_task;
end;
{: 增加新任务。
@param _p_protocal_dataset 指令数据集
}
procedure TfrmCaller.newTask(_p_protocal_dataset: PBaseODMProtocalDataset);
var
p_task : PTask;
task_new_type : Integer;
begin
p_task := getInitialTask;
task_new_type := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TaskNewType'), 1);
if task_new_type = 2 then
p_task^.TimeTransfer := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeTransfer'), 0);
p_task^.TaskNO := VarToInt64Def(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TaskNO'), -1);
p_task^.TimeCall := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeCall'), 0);
p_task^.TimeSubmitInfoBase := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeSubmitInfoBase'), 0);
p_task^.TimeSubmitInfoAdditional := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeSubmitInfoAdditional'), 0);
p_task^.TimeBeginContact := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeBeginContact'), 0);
p_task^.TimeDriverConfirm := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeDriverConfirm'), 0);
p_task^.TimeEndContact := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeEndContact'), 0);
p_task^.TimeTaskFinish := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeTaskFinish'), 0);
p_task^.TimeSubmitInfoBase := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeSubmitInfoBase'), 0);
p_task^.SeatUserName := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'SeatUserName'));
p_task^.RegistrationNO := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'RegistrationNO'));
p_task^.CallerIBPhoneNO := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBPhoneNO'));
p_task^.CallerIBPositionLon := VarToDoubleDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBPositionLon'), 0);
p_task^.CallerIBPositionLat := VarToDoubleDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBPositionLat'), 0);
p_task^.CallerIBMaxWaitTime := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBMaxWaitTime'), 0);
p_task^.CallerIBMaxTaxiDistance := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBMaxTaxiDistance'), 0);
p_task^.CallerIBIsBook := VarToBoolDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBIsBook'), False);
p_task^.CallerIBBookTime := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CallerIBBookTime'), 0);
taskList.AddObject(IntToStr(p_task^.TaskNO), TObject(p_task));
// 刷新显示
refreshTaskList(p_task);
end;
{: 接收任务状态。
@param _p_protocal_dataset 指令数据集
}
procedure TfrmCaller.receiveTaskStatus(_p_protocal_dataset: PBaseODMProtocalDataset);
var
p_task : PTask;
p_memo : PMemoData;
p_target : PTargetData;
p_reject_taxi : PRejectTaxi;
p_node : PVirtualNode;
task_no : Int64;
reg_no : string;
begin
task_no := VarToInt64Def(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TaskNO'), -1);
p_task := getPTaskByTaskNO(task_no);
if not Assigned(p_task) then
Exit;
p_task^.Status := TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'Status');
p_task^.TimeCall := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeCall'), 0);
p_task^.TimeSubmitInfoBase := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeSubmitInfoBase'), 0);
p_task^.TimeSubmitInfoAdditional := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeSubmitInfoAdditional'), 0);
p_task^.TimeBeginContact := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeBeginContact'), 0);
p_task^.TimeDriverConfirm := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeDriverConfirm'), 0);
p_task^.TimeEndContact := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeEndContact'), 0);
p_task^.TimeTaskFinish := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeTaskFinish'), 0);
p_task^.TimeSubmitInfoBase := VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TimeSubmitInfoBase'), 0);
// 如果还在联系 则上次的车辆拒绝了
if (p_task^.Status = taskStatusContact) and (p_task^.RegistrationNO <> '') then
begin
New(p_reject_taxi);
p_reject_taxi^.RegistrationNO := p_task^.RegistrationNO;
p_reject_taxi^.ContactTime := p_task^.TimeBeginContact;
p_task^.RejectTaxiIDList.AddObject('', TObject(p_reject_taxi));
end;
reg_no := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'RegistrationNO'));
// 如果车辆变动
if p_task^.RegistrationNO <> reg_no then
begin
clearPTargetByName(p_task^.RegistrationNO);
// 清除原来车辆目标
BaseGisMapCall.ClearTarget(p_task^.RegistrationNO);
p_task^.RegistrationNO := reg_no;
// 增加车辆列表
// p_target := getPTaxiByRegistrationNO(p_task^.RegistrationNO);
// if not Assigned(p_taxi) then
New(p_target);
p_target^.TrackList := TStringList.Create;
p_target^.RegistrationNO := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'RegistrationNO'));
p_target^.CommNO := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'CommNO'));
p_target^.TerminalTypeID := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TerminalTypeID'), -1);
p_target^.AppearanceType := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'AppearanceType'));
p_target^.VehicleModel := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'VehicleModel'));
p_target^.AreaID := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'AreaID'), -1);
p_target^.DriverName := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'DriverName'));
p_target^.DriverMobileNO := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'DriverMobileNO'));
targetList.AddObject(p_target^.RegistrationNO, TObject(p_target));
end;
New(p_memo);
p_memo^.Str := Format('任务流水号:%d,状态:%s,车辆:%s', [
task_no, getTaskStatusType(p_task^.Status), p_task^.RegistrationNO]);
vtMemo.AddChild(nil, p_memo);
// 刷新显示
vtTaskTree.Invalidate;
// 车辆确认等待附加信息
if p_task^.Status = taskStatusConfirm then
begin
p_node := getPNodeByTask(p_task);
if Assigned(p_node) then
vtTaskTreeChange(vtTaskTree, p_node);
end;
end;
{: 接收任务车辆信息。
@param _p_protocal_dataset 指令数据集
}
procedure TfrmCaller.receiveTaskTaxiInfo(_p_protocal_dataset: PBaseODMProtocalDataset);
var
p_node : PVirtualNode;
address_node_data : Pointer;
p_task : PTask;
p_target : PTargetData;
p_track_data: PTargetTrackData;
task_no : Int64;
gps_lon : Double;
gps_lat : Double;
gps_time : TDateTime;
gps_speed : Integer;
gps_head : Integer;
is_receive : Boolean;
is_valid : Boolean;
is_run : Boolean;
is_carried : Boolean;
is_timeout : Boolean;
registrationNO : string;
begin
task_no := VarToInt64Def(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TaskNO'), -1);
p_task := getPTaskByTaskNO(task_no);
if not Assigned(p_task) then
Exit;
registrationNO := VarToStr(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'RegistrationNO'));
// 该车辆信息 与 任务的车辆信息不同 退出
if p_task^.RegistrationNO <> registrationNO then
begin
ShowMessage(Format('收到不符合任务流水号为%s的车辆%s数据', [IntToStr(task_no), registrationNO]));
Exit;
end;
is_receive := False;
p_node := vtTaskTree.GetFirstSelected;
while Assigned(p_node) do
begin
address_node_data := vtTaskTree.GetNodeData(p_node);
if PTask(address_node_data^) = p_task then
begin
is_receive := True;
break;
end;
p_node := vtTaskTree.GetNextSelected(p_node);
end;
if not is_receive then
Exit;
gps_time:= VarToDateTimeDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSPosTime'), 0);
gps_lon := VarToDoubleDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSLon'), 0);
gps_lat := VarToDoubleDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSLat'), 0);
gps_speed := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSSpeed'), 0);
gps_head := VarToIntDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSHeading'), 0);
is_run := VarToBoolDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSIsRun'), False);
// p_task^.GPSIsRunChanged := TBaseODMProtocalUtils.findFieldValueByCommandName(
// _p_protocal_dataset^.Command, 'GPSIsRunChanged');
is_valid := VarToBoolDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSIsValid'), False);
// p_task^.GPSIsValidChanged := TBaseODMProtocalUtils.findFieldValueByCommandName(
// _p_protocal_dataset^.Command, 'GPSIsValidChanged');
is_carried := VarToBoolDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSIsCarried'), False);
// p_task^.GPSIsCarriedChanged := TBaseODMProtocalUtils.findFieldValueByCommandName(
// _p_protocal_dataset^.Command, 'GPSIsCarriedChanged');
is_timeout := VarToBoolDef(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'GPSIsTimeout'), False);
// p_task^.GPSIsTimeoutChanged := TBaseODMProtocalUtils.findFieldValueByCommandName(
// _p_protocal_dataset^.Command, 'GPSIsTimeoutChanged');
// p_taxi := getPTaxiByRegistrationNO(registrationNO);
// if not Assigned(p_taxi) then
// Exit;
//
// case targetShowHint of
// TTargetShowHintCommNO : target_name := p_taxi^.CommNO;
// TTargetShowHintRegistrationNO : target_name := p_taxi^.RegistrationNO;
// TTargetShowHintDriverMobileNO : target_name := p_taxi^.DriverMobileNO;
// TTargetShowHintTaskNO : target_name := '任务流水号' + IntToStr(task_no);
// end;
// 抛弃无效数据
if not is_valid then
Exit;
p_target := getPTargetByRegistrationNO(registrationNO);
if Assigned(p_target) then
begin
New(p_track_data);
p_track_data^.GPSPosTime := gps_time;
p_track_data^.GPSLon := gps_lon;
p_track_data^.GPSLat := gps_lat;
p_track_data^.GPSSpeed := gps_speed;
p_track_data^.GPSHeading := gps_head;
p_target.TrackList.AddObject('', TObject(p_track_data));
end;
// node := vtTaskTree.GetNodeAt(X, Y);
// if not Assigned(node) then
// begin
// setBtnStatus(btnStatusNew);
// vtTaskTree.ClearSelection;
// Exit;
// end;
//
// address_node_data := vtTaskTree.GetNodeData(node);
// if not Assigned(address_node_data) then
// begin
// setBtnStatus(btnStatusNew);
// vtTaskTree.ClearSelection;
// Exit;
// end;
// 显示车辆
BaseGisMapCall.ReceiveGpsData(registrationNO, gps_time, gps_lon, gps_lat, gps_head, gps_speed,
is_run, is_carried, is_timeout);
end;
{: 接收任务结束。
@param _p_protocal_dataset 指令数据集
}
procedure TfrmCaller.receiveTaskEnd(_p_protocal_dataset: PBaseODMProtocalDataset);
var
p_task : PTask;
p_memo : PMemoData;
task_no : Int64;
task_str : string;
address_node_data : Pointer;
p_node : PVirtualNode;
begin
task_no := VarToInt64Def(TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TaskNO'), -1);
p_task := getPTaskByTaskNO(task_no);
if not Assigned(p_task) then
Exit;
p_task^.TaskResult := TBaseODMProtocalUtils.findFieldValueByCommandName(
_p_protocal_dataset^.Command, 'TaskResult');
task_str := Format('任务%d结束:%s', [task_no, getTaskResultType(p_task^.TaskResult)]);
// 取消任务
ShowMessage(task_str);
New(p_memo);
p_memo^.Str := task_str;
vtMemo.AddChild(nil, p_memo);
p_node := vtTaskTree.GetFirst;
while Assigned(p_node) do
begin
address_node_data := vtTaskTree.GetNodeData(p_node);
if PTask(address_node_data^) = p_task then
begin
vtTaskTree.DeleteNode(p_node);
Break;
end;
p_node := vtTaskTree.GetNext(p_node);
end;
clearPTask(p_task);
BaseGisMapCall.ClearAllTarget;
// 清空召车人点
BaseGisMapCall.ClearCallerPoint;
// 刷新列表
vtTaskTree.Invalidate;
setBtnStatus(btnStatusNew);
end;
{: 通过任务流水号获取任务对象。
@param _task_no 任务流水号
}
function TfrmCaller.getPTaskByTaskNO(_task_no: Int64): PTask;
var
i : Integer;
p_task : PTask;
begin
Result := nil;
for i := 0 to taskList.Count - 1 do
begin
p_task := PTask(taskList.Objects[i]);
if not Assigned(p_task) then
Continue;
if p_task^.TaskNO = _task_no then
begin
Result := p_task;
Break;
end;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -