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

📄 ufrmcaller.pas

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

  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 + -