起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 213|回复: 6

急急急***关于多种岗位快速切换的问题**

[复制链接]
发表于 2009-3-28 21:59:58 | 显示全部楼层 |阅读模式
斑竹,我们目前碰到棘手的问题就是用户要求我们在下周前解决对于一个人员有多种岗位的能够在下拉岗位列表那边进行快速切换,请斑竹帮忙处理下,谢谢
回复

使用道具 举报

发表于 2009-3-29 12:55:49 | 显示全部楼层
不是很了解,是登陆对话框这个地方吗?我们现在提供的是下拉选择,用户要求用其他的方法,定义各个岗位的切换的快捷方式,是吗?
例如,人员1即在  机构1 下的 部门1 下的 岗位1 下,也在 机构1 下的 部门1 下的 岗位2 下。当人员1登陆的时候 CTRL+A 是以 机构1 下的 部门1 下的 岗位1  的身份登陆,CTRL+B 是 机构1 下的 部门1 下的 岗位2 的身份登陆 ,是这样吗?如果不是,那请楼主具体说说,最好能配置界面图,现在是怎样的,想实现成怎样的吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-29 20:20:21 | 显示全部楼层
原先的问题描述得不够详细,抱歉!因为我们系统的用户很多都有多岗位,用户希望用其中一个岗位登录进来后,在工作台界面不用退出或者注销就能够切换到其他岗位,比如人员A有岗位1和岗位2及岗位3共三个岗位,他用岗位1身份登陆进来后,在工作台有一个下拉列表,列举出岗位2和岗位3两个岗位,选择后即可自动切换到新岗位。这个问题用户一直希望我们尽快修改,质疑我们系统的易用性,目前系统正面临整合后推广的关键阶段,4月8日就要给用户培训,需在此之前实现此功能,因此,还请贵公司尽早帮忙解决。还有疑问,请直接与我公司黄露贵工程师联系,谢谢!
回复 支持 反对

使用道具 举报

发表于 2009-3-30 08:56:20 | 显示全部楼层
我们的系统是这样的:如果不选择岗位的话系统会有自动选择合适(以权限为依据)的岗位,当前如果冲突的岗位(多个岗位都有权限)我们会选择第一个的,如果登录时选择了岗位那么就按照选择的岗位执行,如果在运行期不注销就切换岗位那么已经按原岗位加载的数据就得不到变更的机会,这样系统里就会看到不应该看到的数据,从而引发各种问题,所以不建议做这种操作。用户一般登录的时候不选择任何岗位登录就可以了。
回复 支持 反对

使用道具 举报

发表于 2009-3-30 09:01:38 | 显示全部楼层
我上面已经加载的数据主要包括待办任务、待办计划和客户中心等在运行之后需要立即加载数据的功能,如果您哪儿不用这些功能的话切换一下岗位倒也问题不大。
其实注销就是一个切换用户释放现在的系统数据,加载新的数据的过程。如果不注销,就无机会释放现在的数据,取新数据了,其主要是这些东西逻辑比较复杂,单拆出来也需要比较长的时间。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-30 15:07:01 | 显示全部楼层
注销功能不够友好,功能的易用性比较差,用户不接受
回复 支持 反对

使用道具 举报

发表于 2009-3-31 10:32:42 | 显示全部楼层
1.如果不需要岗位自动登录选项---------------------------------------------------
  // 不舒服,暂时这样
  FDefaultPosition := nil;
  if TSystemLoginDialog.GetPersonMember <> nil then
    for I := 0 to TSystemCore.Operator.PositionCount - 1 do
      if TSystemCore.Operator.Positions[I].PersonMember = TSystemLoginDialog.GetPersonMember then
      begin
        FDefaultPosition := TSystemCore.Operator.Positions[I];
        Break;
      end
-----------------------
replace----------------
------------------------
FDefaultPosition := nil;
  if TSystemLoginDialog.GetPersonMember <> nil then
    for I := 0 to TSystemCore.Operator.PositionCount - 1 do
      if TSystemCore.Operator.Positions[I].PersonMember = TSystemLoginDialog.GetPersonMember then
      begin
        FDefaultPosition := TSystemCore.Operator.Positions[I];
        Break;
      end;
//added by alang 2007-12-07
  if (SystemCore.TSystemCore.Operator.ID<>'SYSTEM') AND (not Assigned(FDefaultPosition)) then
    FDefaultPosition := SystemCore.TSystemCore.Operator.DefaultPosition;
  //end added by alang 2007-12-07


2.-------------------------------------修改statusbar切换岗位显示不对问题
function TSTANDARDSTYLEMAINFORM.CreateStatusBarText(var L: Integer;
  Parent: TWinControl; const Text: string; IsLast: Boolean): TFrameButton;
var
  Spacer: TBevel;
begin
  Result := TFrameButton.Create(Self);
  Result.Parent := Parent;
  Result.Resource := FrameButtonResource;
  Result.ActiveFrames := 'StatusBarText';
  Result.Text := Text;
  Result.Width := Canvas.TextWidth(Text) + 16;
  Result.Left := L;
  L := L + Result.Width;
  if not IsLast then
  begin
    Result.Align := TAlign.alLeft;
    Spacer := TBevel.Create(Self);
    Spacer.Parent := Parent;
    Spacer.Align := TAlign.alLeft;
    Spacer.Shape := TBevelShape.bsSpacer;
    Spacer.Width := 3;
    Spacer.Left := L;
    L := L + Spacer.Width;
  end;
end;
-----------------------
replace----------------
------------------------
//added by alang 2007-12-07
var
  FB: TFrameButton;
//end added by alang 2007-12-07
function TSTANDARDSTYLEMAINFORM.CreateStatusBarText(var L: Integer;
  Parent: TWinControl; const Text: string; IsLast: Boolean): TFrameButton;
var
  Spacer: TBevel;
begin
//delete by alang 2007-12-07
//  Result := TFrameButton.Create(Self);
//end delete by alang 2007-12-07

//added by alang 2007-12-07
  if not Assigned(FB) then FB := TFrameButton.Create(Self);
  Result := FB;
//end added by alang 2007-12-07

  Result.Parent := Parent;
  Result.Resource := FrameButtonResource;
  Result.ActiveFrames := 'StatusBarText';
  Result.Text := Text;
  Result.Width := Canvas.TextWidth(Text) + 16;
  Result.Left := L;
  L := L + Result.Width;
  if not IsLast then
  begin
    Result.Align := TAlign.alLeft;
    Spacer := TBevel.Create(Self);
    Spacer.Parent := Parent;
    Spacer.Align := TAlign.alLeft;
    Spacer.Shape := TBevelShape.bsSpacer;
    Spacer.Width := 3;
    Spacer.Left := L;
    L := L + Spacer.Width;
  end;
end;

3、procedure TSTANDARDSTYLEMAINFORM.fbtLogoutClick(Sender: TObject); 修改为

--------------------
//  actFileLogout.Execute;
procedure TSTANDARDSTYLEMAINFORM.fbtLogoutClick(Sender: TObject);
//added by alang 2007-12-07
var
  I: Integer;
  lFunc: TFunc;
  lTree: TBaseTree;
  lPosition: TOperatorPosition;
//end added by alang 2007-12-07
begin
//delete by alang 2007-12-07
//  actFileLogout.Execute;
//end delete by alang 2007-12-07

//added by alang 2007-12-07
//修改用途为岗位切换
  actFileCloseAll.Execute;
  lPosition := FDefaultPosition;
  if TSelectPositionDialog.SelectPosition(TSystemCore.Operator, lPosition) and
    (FDefaultPosition <> lPosition) then
  begin
    FDefaultPosition := lPosition;

    for I:= FFuncContainers.Count-1 downto 0 do
    begin
      lFunc := TFuncContainer(FFuncContainers).Func;
      RemoveFunc(TFuncContainer(FFuncContainers).Func);
      if lFunc<>nil then
            lFunc.Terminate;
    end;
    FFuncContainers.Clear;
    ApplySetting(False);

    if SysUtils.SameText(SysSrv.SysService.Config.Attributes('defaultfuncs/enabled', 'true'), 'true')  then
    begin
      if not FNotFirstRun then
      begin
        GetDefaultFuncs(OrgSys.DefaultFuncs);
        FNotFirstRun := True;
      end;
      EnsureFuncItems(OrgSys.DefaultFuncs, FDefaultPosition);
    end;

    //jhm free auto runfuncs
    FreeAutoRunFuncs;
    //end by jhm

    if Assigned(FFuncNavBar) then FFuncNavBar.Free;
    if FDefaultPosition = nil then
      FFuncNavBar := TOperatorFuncNavBar.Create(TSystemCore.Operator.Context)
    else
      FFuncNavBar := TOperatorFuncNavBar.Create(FDefaultPosition.Context);

    //jhm 2008-11-2 load AllocatedFuncs
    FFuncNavBar.RefreshFuncs;
    //end by jhm

    FFuncNavBar.Parent := pnlFuncTree;//HidePanel;
    FFuncNavBar.Width := 180;
    FFuncNavBar.View := 14;
    FFuncNavBar.Align := TAlign.alClient;
    FFuncNavBar.BorderStyle := TFormBorderStyle.bsNone;
    FFuncNavBar.SmallImages := TImageList(TComponentsLib.UserGraphics.ImageList16);
    FFuncNavBar.LargeImages := TImageList(TComponentsLib.UserGraphics.ImageList24);

    FFuncNavBar.DefaultStyles.Background.BackColor := 15855854;
    FFuncNavBar.DefaultStyles.Background.BackColor2 := 15855854;
    FFuncNavBar.DefaultStyles.Background.GradientMode := TdxBarStyleGradientMode.gmForwardDiagonal;

    // FFuncNavBar.DefaultStyles.GroupHeader.HAlignment := TdxBarStyleHAlignment.haCenter;
    FFuncNavBar.DefaultStyles.GroupHeader.Font.Color := Graphics.clBlack;
    FFuncNavBar.DefaultStyles.GroupHeader.Font.Style := [];
    FFuncNavBar.DefaultStyles.GroupHeader.AlphaBlending := 100;
    FFuncNavBar.DefaultStyles.GroupHeader.BackColor := 15260372;
    FFuncNavBar.DefaultStyles.GroupHeader.BackColor2 := 15128272;

    // FFuncNavBar.DefaultStyles.GroupHeaderHotTracked.HAlignment := TdxBarStyleHAlignment.haCenter;
    FFuncNavBar.DefaultStyles.GroupHeaderHotTracked.Font.Color := Graphics.clWhite;
    FFuncNavBar.DefaultStyles.GroupHeaderHotTracked.AlphaBlending2 := 250;
    FFuncNavBar.DefaultStyles.GroupHeaderHotTracked.BackColor := 6343771;//4641273;
    FFuncNavBar.DefaultStyles.GroupHeaderHotTracked.BackColor2 := 2792213;//4641273;

    // FFuncNavBar.DefaultStyles.GroupHeaderPressed.HAlignment := TdxBarStyleHAlignment.haCenter;
    FFuncNavBar.DefaultStyles.GroupHeaderPressed.Font.Color := Graphics.clWhite;
    FFuncNavBar.DefaultStyles.GroupHeaderPressed.AlphaBlending2 := 250;
    FFuncNavBar.DefaultStyles.GroupHeaderPressed.BackColor := 6343771;
    FFuncNavBar.DefaultStyles.GroupHeaderPressed.BackColor2 := 2792213;

    FFuncNavBar.DefaultStyles.GroupHeaderActivePressed.AlphaBlending2 := 250;
    FFuncNavBar.DefaultStyles.GroupHeaderActivePressed.BackColor := 6343771;
    FFuncNavBar.DefaultStyles.GroupHeaderActivePressed.BackColor2 := 2792213;

    FFuncNavBar.DefaultStyles.GroupHeaderActive.AlphaBlending2 := 250;
    FFuncNavBar.DefaultStyles.GroupHeaderActive.BackColor := 6343771;
    FFuncNavBar.DefaultStyles.GroupHeaderActive.BackColor2 := 2792213;

    FFuncNavBar.DefaultStyles.GroupHeaderActiveHotTracked.AlphaBlending2 := 250;
    FFuncNavBar.DefaultStyles.GroupHeaderActiveHotTracked.BackColor := 6343771;
    FFuncNavBar.DefaultStyles.GroupHeaderActiveHotTracked.BackColor2 := 2792213;
    for I := 0 to FFuncNavBar.Groups.Count - 1 do
    begin
      FFuncNavBar.Groups[I].UseSmallImages := False;
      FFuncNavBar.Groups[I].LargeImageIndex := 8;
    end;

    //Borland.Delphi.Windows.SetWindowText(OrgTreeView.Handle, '组织机构');

    InitStatusBar;
    InitFuncTreeTabs;
    SetBizGroup(0);

    //jhm 2008-11-02 run auto funcs
    ApplyDesktops;
    DelayRunFuncsTimer.Enabled := True;

    //jhm run fist funcs
    RunFirstFuncTimer.Enabled := True;
    //end by jhm
    {if FFuncContainers.Count>0 then
      ShowContainer(TFuncContainer(FFuncContainers[0]));
    }
{    lTree := FUserTreeView.BaseTree;
    FUserTreeView.BaseTree := nil;
    FUserListView.BaseTree := nil;
    FFavoritesCommonFrame.FavoritesTreeView.BaseTree := nil;
    try
      FUserTreeView.Items.Clear;
      FFavoritesCommonFrame.FavoritesTreeView.Items.Clear;
      TCommonComponentLibrary.UserSystem.CurrentPosition := lPosition;
    finally
      FUserTreeView.BaseTree := lTree;
      FUserListView.BaseTree := lTree;
      FFavoritesCommonFrame.FavoritesTreeView.BaseTree := lTree;
      FUserTreeView.ReloadTree;
      FFavoritesCommonFrame.FavoritesTreeView.ReloadTree;
    end;
    InitializeMainForm;
    RefreshFuncs;
}  end;
//end added by alang 2007-12-07
end;

4、
a、在标准风格主窗体的窗体库底下新建一个窗体-> SelectPositionDialog

b、选择岗位窗体控件资源(贴到窗体库-新窗体(SelectPositionDialog)里面)
-----------------------------------------------------------------------------
object lblPositions: TLabel
  Left = 304
  Top = 16
  Width = 66
  Height = 12
  Caption = #25152#26377#23703#20301'(&)'
  FocusControl = ocPosition
end
object ocPosition: TOrgChart
  Left = 16
  Top = 32
  Width = 368
  Height = 300
  AutoLoad = False
  BizOperates = []
  NodeAutoSize = False
  UseLargeImageList = False
  DefaultNodeWidth = 90
  DefaultNodeHeight = 36
  EditMode = [emCenter, emVCenter, emWrap, emGrow]
  DefaultImageAlign = iaLC
  Options = [ocSelect, ocFocus, ocRect3D]
  Font.Charset = GB2312_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = #23435#20307
  Font.Style = []
  OnChanging = ocPositionChanging
end
object btnOK: TButton
  Left = 182
  Top = 348
  Width = 75
  Height = 21
  Caption = #30830#23450
  Default = True
  ModalResult = 1
  TabOrder = 1
end
object CancelBtn: TButton
  Left = 297
  Top = 348
  Width = 75
  Height = 21
  Cancel = True
  Caption = #21462#28040
  ModalResult = 2
  TabOrder = 0
end
-----------------------------------------------------------------------------

5、pas
-----------
注意重新把
procedure BizFormCreate(Sender: TObject);
    procedure BizFormDestroy(Sender: TObject);
    procedure ocPositionChanging(Sender: TObject; Node: TOrgChartNode; var Allow: Boolean);
3个事件与窗体和ocPosition对应事件关联
---------
unit SelectPositionDialog;

interface

uses
  Business.System, Business.Forms, Business.Model, Business.Model.Org;

type
  { TSelectPositionDialog }
  TSelectPositionDialog = class(TForm)
    lblPositions: TLabel;
    CancelBtn: TButton;
    btnOK: TButton;
    ocPosition: TOrgChart;
    procedure BizFormCreate(Sender: TObject);
    procedure BizFormDestroy(Sender: TObject);
    procedure ocPositionChanging(Sender: TObject; Node: TOrgChartNode; var Allow: Boolean);

    private FPositions: TStringList;
    private procedure Load(AOperator: TOperator);
    private function GetSelected: TOperatorPosition;
    private procedure SetSelected(Value: TOperatorPosition);

    public static function SelectPosition(AOperator: TOperator;
      var APosition: TOperatorPosition): Boolean;

    property Selected: TOperatorPosition read GetSelected write SetSelected;
  end;

implementation


{ TSelectPositionDialog }
procedure TSelectPositionDialog.Load(AOperator: TOperator);
var
  I: Integer;
  S: string;

  lPositions: TStringList;
  lPosition: TOperatorPosition;
begin
  lPositions := TStringList.Create;
  try
    lPositions.Duplicates := TDuplicates.dupIgnore;
    lPositions.Sorted := True;
    for I := 0 to AOperator.PositionCount - 1 do
    begin
      lPosition := AOperator.Positions[I];// as TOperatorPosition;
      S := lPosition.PersonMember.BizURL.URL;
      if FPositions.IndexOf(S) >= 0 then
        Continue;
      FPositions.AddObject(S, lPosition);
      while not SysUtils.SameText(S, JSConst.cOrgFilePrefix + '\root') do
      begin
        lPositions.Add(S);
        JSCommon.SplitStrRight(FileSys.FileUtils.PathDelim, S);
      end;
    end;
    ocPosition.BizURLs := lPositions;
    ocPosition.HandleNeeded;
    ocPosition.ReloadChart;
    ocPosition.FullExpand;
  finally
    lPositions.Free;
  end;
end;

function TSelectPositionDialog.GetSelected: TOperatorPosition;
var
  lIndex: Integer;
  lBizNode: TBizNode;
begin
  if ocPosition.Selected = nil then
    Result := nil
  else
  begin
    lBizNode := (ocPosition.Selected.Data as TBizNode);
    lIndex := FPositions.IndexOf(lBizNode.BizURL.URL);
    if lIndex <> -1 then
      Result := FPositions.Objects[lIndex] as TOperatorPosition
    else
      Result := nil;
  end;
end;

procedure TSelectPositionDialog.SetSelected(Value: TOperatorPosition);
var
  I: Integer;
  lNode: TOrgChartNode;
begin
  if Value <> nil then
  begin
    lNode := ocPosition.GetFirstNode;
    while lNode <> nil do
    begin
      if Value.PersonMember.BizURL.Equals((lNode.Data as TBizNode).BizURL) then
      begin
        ocPosition.Selected := lNode;
        Exit;
      end;
      lNode := lNode.GetNext;
    end;
  end;
  ocPosition.Selected := nil;
end;

static function TSelectPositionDialog.SelectPosition(AOperator: TOperator;
  var APosition: TOperatorPosition): Boolean;
var
  lDialog: TSelectPositionDialog;
begin
  lDialog := TSelectPositionDialog.Create(BizSys.GlobalContext);
  try
    lDialog.Load(AOperator);
    lDialog.Selected := APosition;
    Result := lDialog.ShowModal = Controls.mrOK;
    if Result then
      APosition := lDialog.Selected;
  finally
    lDialog.Free;
  end;
end;

procedure TSelectPositionDialog.BizFormCreate(Sender: TObject);
begin
  FPositions := TStringList.Create;
  FPositions.Duplicates := TDuplicates.dupIgnore;
  FPositions.Sorted := True;

  ocPosition.RootNodes.Clear;
  ocPosition.ShowOptions := [TBizObjectKind.boOrgan, TBizObjectKind.boDept,
    TBizObjectKind.boPositionMember, TBizObjectKind.boPersonMember];
end;

procedure TSelectPositionDialog.BizFormDestroy(Sender: TObject);
begin
  FPositions.Free;
end;

procedure TSelectPositionDialog.ocPositionChanging(Sender: TObject;
  Node: TOrgChartNode; var Allow: Boolean);
begin
  Allow := (Node <> nil) and ((Node.Data as TBizNode).NodeKind = TBizObjectKind.boPersonMember);
end;

end.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-23 02:59 , Processed in 0.047462 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表