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

📄 ufrmcaller.pas

📁 a voice guide client ,it is the second part of voice guide center
💻 PAS
📖 第 1 页 / 共 4 页
字号:
{: 通过车辆号码找到车辆对象。
  @param _sender            事件触发者
}
function TfrmCaller.getPTargetByRegistrationNO(
  _registration_no: string): PTargetData;
var
  i         : Integer;
  p_target  : PTargetData;
begin
  Result := nil;

  for i := 0 to targetList.Count - 1 do
  begin
    p_target := PTargetData(targetList.Objects[i]);
    if not Assigned(p_target) then
      Continue;

    if p_target^.RegistrationNO = _registration_no then
    begin
      Result := p_target;
      Break;
    end;
  end;
end;

procedure TfrmCaller.btnCancelClick(Sender: TObject);
var
  address_node_data     : Pointer;
  p_task                : PTask;
  p_protocal_dataset    : PBaseODMProtocalDataset;
  p_node                : PVirtualNode;
begin
  p_node := vtTaskTree.GetFirstSelected;
  if not Assigned(p_node) then
    Exit;

  address_node_data := vtTaskTree.GetNodeData(p_node);
  if not Assigned(address_node_data) then
    Exit;

  p_task := PTask(address_node_data^);
  if not Assigned(p_task) then
    Exit;

  // 建立对象
  p_protocal_dataset := TBaseODMProtocalUtils.BuildProtocalDataset(
    'BCM_Task_Cancel', False, 0);

  // 增加指令对象内容
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'TaskNO', p_task^.TaskNO);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'TimeCancelTask', Now);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'ReasonCancelTask', cbxCancelReason.ItemIndex + 1);

  // 发送指令对象
  clientLogistic.SendODMP(p_protocal_dataset);
end;

procedure TfrmCaller.btnReplyClick(Sender: TObject);
var
  address_node_data     : Pointer;
  p_task                : PTask;
  p_protocal_dataset    : PBaseODMProtocalDataset;
  p_node                : PVirtualNode;
begin
  p_node := vtTaskTree.GetFirstSelected;
  if not Assigned(p_node) then
    Exit;

  address_node_data := vtTaskTree.GetNodeData(p_node);
  if not Assigned(address_node_data) then
    Exit;

  p_task := PTask(address_node_data^);
  if not Assigned(p_task) then
    Exit;

  p_task^.CallerIAFeedbackTypeID  := cbxCallerIAFeedbackTypeID.ItemIndex;

  // 建立对象
  p_protocal_dataset := TBaseODMProtocalUtils.BuildProtocalDataset(
    'BCM_Task_InfoAdditional', False, 0);

  // 增加指令对象内容
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'TaskNO', p_task^.TaskNO);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'SeatUserName', p_task^.SeatUserName);
  if cbxCallerIAName.ItemIndex = 0 then
    TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
      'CallerIAName', '')
  else  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
          'CallerIAName', cbxCallerIAName.Text);

  if cbxCallerIASex.ItemIndex = 0 then
    TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
      'CallerIAGender', True)
  else TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
        'CallerIAGender', False);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'CallerIAHeight', StrToIntDef(cbxCallerIAHigh.Text, -1));
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'CallerIAAgeSegmentID', cbxCallerIAAgeSegmentID.ItemIndex + 1);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'CallerIAOtherInfo', mmCallerIAOtherInfo.Text);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'CallerIAGuestCount', StrToIntDef(cbxCallerIAGuestCount.Text, -1));
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'CallerIAHasPackage', cbxCallerIAHasPackage.ItemIndex + 1);
  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'TimeSubmitInfoAdditional', p_task^.TimeSubmitInfoAdditional);

  TBaseODMProtocalUtils.BuildCommandAddParams(p_protocal_dataset^.Command,
    'CallerIAFeedbackTypeID', cbxCallerIAFeedbackTypeID.ItemIndex + 1);

  // 发送指令对象
  clientLogistic.SendODMP(p_protocal_dataset);
end;

procedure TfrmCaller.btnContentClick(Sender: TObject);
var
  address_node_data     : Pointer;
  p_task                : PTask;
  p_node                : PVirtualNode;
begin
  p_node := vtTaskTree.GetFirstSelected;
  if not Assigned(p_node) then
    Exit;

  address_node_data := vtTaskTree.GetNodeData(p_node);
  if not Assigned(address_node_data) then
    Exit;

  p_task := PTask(address_node_data^);
  if not Assigned(p_task) then
    Exit;

  frmTaskShow := TfrmTaskShow.Create(nil);
  frmTaskShow.TaskShow(p_task);
  frmTaskShow.ShowModal;
  frmTaskShow.Free;
end;

procedure TfrmCaller.cbxCallerIBIsBookClick(Sender: TObject);
begin
  if cbxCallerIBIsBook.Checked then
  begin
    teCallerIBBookTime.Enabled := True;
    teCallerIBBookTime.SetFocus;
  end
  else teCallerIBBookTime.Enabled := False;
end;

procedure TfrmCaller.vtTaskTreeChange(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  i                     : Integer;
  n                     : Integer;
  gptlist               : array of TGIS_Point;
  gis_point             : TGIS_Point;
  address_node_data     : Pointer;
  p_node                : PVirtualNode;
  p_task                : PTask;
  p_target              : PTargetData;
  is_timer              : Boolean;
  p_track_data          : PTargetTrackData;
begin
  if vtTaskTree.Selected[Node] = False then
    Exit;

  BaseGisMapCall.ClearAllTarget;

  is_timer    := False;
  gis_point.X := 0;
  gis_point.Y := 0;

  p_node := vtTaskTree.GetFirstSelected;
  // 无选中任务
  if not Assigned(p_node) then
  begin
    setBtnStatus(btnStatusNew);
    vtTaskTree.ClearSelection;
    // 清空召车人点
    BaseGisMapCall.ClearCallerPoint;

    Exit;
  end;

  SetLength(gptlist, vtTaskTree.SelectedCount);
  n := 0;
    
  while Assigned(p_node) do
  begin
    address_node_data := vtTaskTree.GetNodeData(p_node);
    if not Assigned(address_node_data) then
      Continue;

    p_task := PTask(address_node_data^);
    if not Assigned(p_task) then
      Continue;

    gis_point.X := p_task^.CallerIBPositionLon;
    gis_point.Y := p_task^.CallerIBPositionLat;
    gptlist[n] := gis_point;
    Inc(n);

    // 任务基本信息
    lbTaskNO.Caption := Format('流水号: %d', [p_task^.TaskNO]);

    // 任务信息
    edtCallerIBPhoneNO.Text := p_task^.CallerIBPhoneNO;
    cbxCallerIBMaxWaitTime.Text   := IntToStr(p_task^.CallerIBMaxWaitTime);
    lbLon.Caption := Format('%.6f', [p_task^.CallerIBPositionLon]);
    lbLat.Caption := Format('%.6f', [p_task^.CallerIBPositionLat]);
    cbxCallerIAFeedbackTypeID.ItemIndex := p_task^.CallerIAFeedbackTypeID;

    // 车辆确认等待附加信息
    if p_task^.Status = taskStatusConfirm then
      is_timer := True
    else is_timer := False;

    p_target := getPTargetByRegistrationNO(p_task^.RegistrationNO);
    if Assigned(p_target) then
    begin
      lbCommNO.Caption         := Format('通信号: %s', [p_target^.CommNO]);
      lbVehicleMode.Caption    := Format('车辆型号: %s', [p_target^.VehicleModel]);
      lbAppearanceType.Caption := Format('车辆外观: %s', [p_target^.AppearanceType]);
      lbDriverName.Caption     := Format('司机姓名: %s', [p_target^.DriverName]);
      lbDriverMobileNO.Caption := Format('手机号码: %s', [p_target^.DriverMobileNO]);

      for i := 0 to p_target^.TrackList.Count - 1 do
      begin
        p_track_data := PTargetTrackData(p_target^.TrackList.Objects[i]);
        if not Assigned(p_track_data) then
          Continue;

        BaseGisMapCall.ReceiveGpsData(p_task^.RegistrationNO, p_track_data^.GPSPosTime,
          p_track_data^.GPSLon, p_track_data^.GPSLat, p_track_data^.GPSHeading,
          p_track_data^.GPSSpeed, True, False, False);
      end;
    end;

    p_node := vtTaskTree.GetNextSelected(p_node);
  end;

  setBtnStatus(btnStatusSelect);

  if is_timer then
  begin
    btnConfirmAdditionalInfo.Enabled := True;
    Timer1.Enabled := True;
  end
  else begin
    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;

  // 增加召车人点
  BaseGisMapCall.AddCallerPoint(gptlist);
end;

procedure TfrmCaller.vtTaskTreeMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  p_node                : PVirtualNode;
begin
  p_node := vtTaskTree.GetNodeAt(X, Y);
  if not Assigned(p_node) then
  begin
    Timer1.Enabled := False;
    btnConfirmAdditionalInfo.Colors.Default   := clDefault;
    btnConfirmAdditionalInfo.Colors.Normal    := clDefault;
    btnConfirmAdditionalInfo.Colors.Hot       := clDefault;
    btnConfirmAdditionalInfo.Colors.Pressed   := clDefault;
    btnConfirmAdditionalInfo.Colors.Disabled  := clDefault;

    setBtnStatus(btnStatusNew);

    BaseGisMapCall.ClearAllTarget;
    BaseGisMapCall.ClearCallerPoint;
  end;
//  else vtTaskTreeChange(vtTaskTree, p_node);
end;

procedure TfrmCaller.Timer1Timer(Sender: TObject);
begin
  if btnConfirmAdditionalInfo.Colors.Default = clDefault then
  begin
    btnConfirmAdditionalInfo.Colors.Default   := clRed;
    btnConfirmAdditionalInfo.Colors.Normal    := clRed;
    btnConfirmAdditionalInfo.Colors.Hot       := clRed;
    btnConfirmAdditionalInfo.Colors.Pressed   := clRed;
    btnConfirmAdditionalInfo.Colors.Disabled  := clRed;
  end
  else begin
    btnConfirmAdditionalInfo.Colors.Default   := clDefault;
    btnConfirmAdditionalInfo.Colors.Normal    := clDefault;
    btnConfirmAdditionalInfo.Colors.Hot       := clDefault;
    btnConfirmAdditionalInfo.Colors.Pressed   := clDefault;
    btnConfirmAdditionalInfo.Colors.Disabled  := clDefault;
  end;
end;

procedure TfrmCaller.vtMemoGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  address_node_data     : Pointer;
  p_memo                : PMemoData;
begin
  CellText  := '';

  address_node_data := vtMemo.GetNodeData(Node);
  if not Assigned(address_node_data) then
    Exit;

  p_memo := PMemoData(address_node_data^);
  if not Assigned(p_memo) then
    Exit;

  if Column < 0  then
    Exit;

  case Column of
    0: CellText  := p_memo^.Str;
  end;
end;

procedure TfrmCaller.vtMemoFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  address_node_data     : Pointer;
  p_memo                : PMemoData;
begin
  address_node_data := vtMemo.GetNodeData(Node);
  if not Assigned(address_node_data) then
    Exit;

  p_memo := PMemoData(address_node_data^);
  if Assigned(p_memo) then
    Dispose(p_memo);
end;

procedure TfrmCaller.edtCallerIBPhoneNOKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (Key in ['0'..'9', '-', #8]) then
    Key := #0;
end;

procedure TfrmCaller.cbxCallerIBMaxWaitTimeKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (Key in ['0'..'9', #8]) then
    Key := #0;
end;

procedure TfrmCaller.cbxCallerIAHighKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (Key in ['0'..'9', #8]) then
    Key := #0;
end;

procedure TfrmCaller.vtTaskTreePaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
var
  address_node_data     : Pointer;
  p_task                : PTask;
begin
  address_node_data := vtTaskTree.GetNodeData(Node);
  if not Assigned(address_node_data) then
    Exit;

  p_task := PTask(address_node_data^);
  if not Assigned(p_task) then
    Exit;

  if Column < 0  then
    Exit;

  if p_task^.Status = taskStatusContact then
    TargetCanvas.Font.Color := clBlack
  else if p_task^.Status = taskStatusConfirm then
    TargetCanvas.Font.Color := clRed
  else TargetCanvas.Font.Color := clGreen;
end;

function TfrmCaller.getPNodeByTask(_p_task: PTask): PVirtualNode;
var
  address_node_data     : Pointer;
  p_task                : PTask;
  p_node                : PVirtualNode;
begin
  Result := nil;

  p_node := vtTaskTree.GetFirst;
  while Assigned(p_node) do
  begin
    address_node_data := vtTaskTree.GetNodeData(p_node);
    if not Assigned(address_node_data) then
    begin
      p_node := vtTaskTree.GetNext(p_node);
      Continue;
    end;

    p_task := PTask(address_node_data^);
    if p_task = _p_task then
    begin
      Result := p_node;
      Break;
    end;

    p_node := vtTaskTree.GetNext(p_node);
  end;
end;

procedure TfrmCaller.btnSelectPointClick(Sender: TObject);
begin
  if mmCallerIAOtherInfo.Text <> '' then
    BaseGisMapCall.SelectPoint(Trim(mmCallerIAOtherInfo.Text));
end;

end.

⌨️ 快捷键说明

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