起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 718|回复: 10

【共享】个人封装的“组织机构公共库”

[复制链接]
发表于 2009-9-29 15:37:34 | 显示全部楼层 |阅读模式
鉴于不少同学总是在问关于组织机构相关操作的一些问题,本人共享一部分本人封装的“组织机构公共库”中的类,希望对大家有用:

{ 组织机构工具类 }

TOrgUtils = class
  public
    { 显示选择组织单元对话框 }
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string): Boolean; overload;
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string;
      ACanSelecteKinds: TBizObjectKinds): Boolean; overload;
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
      ASelectViewKind: TSelectViewKind): Boolean; overload;
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
      ASelectViewKind: TSelectViewKind; AMultiSelect: Boolean): Boolean; overload;
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
      AOrgTreeRootKind: TOrgTreeRootKind; AOrgTreeRooFileName: string;
      AMultiSelect: Boolean): Boolean; overload;
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
      ASelectViewKind: TSelectViewKind; AOrgTreeRootKind: TOrgTreeRootKind;
      AOrgTreeRooFileName: string; AMultiSelect: Boolean): Boolean; overload;
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string; AUnchangeableOrgURLs: TStrings;
      ACanSelecteKinds: TBizObjectKinds): Boolean; overload;
    { 参数:环境、选择后的OrgURL列表、对话框标题、能够选择的组织机构对象类型、
            组织机构树的根类型、组织机构树根文件名、 是否允许多选、不允许改变的OrgURLs}
    static function ShowSelectOrgUnitDialog(AContext: TContext;
      AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
      ASelectViewKind: TSelectViewKind; AOrgTreeRootKind: TOrgTreeRootKind;
      AOrgTreeRooFileName: string; AMultiSelect: Boolean;
      AUnchangeableOrgURLs: TStrings): Boolean; overload;

    { 显示选择组织单元对话框,并且将选择结果填充到指定的数据集中 }
    static function ShowSelectOrgUnitDialog(AContext: TContext; ADataSet: TDataSet;
      AOrgURLs: TStrings; ACaption: string; var ADisplayNames: string;
      ACanSelecteKinds: TBizObjectKinds; AMultiSelect, AGetPersonMember: Boolean): boolean; overload;


    { 根据指定的 OrgURL , 得到指定类型节点的ID。字符串解析,不操作数据库,效率高 }
    static procedure GetOrgUnitID(const AOrgURL: string;
      const AOrgKind: TBizObjectKind; var AID: string);
    static procedure GetOrgUnitIDName(const AOrgURL: string;
      const AOrgKind: TBizObjectKind; var AID, AName: string);

    { 根据指定的 GUID 得到组织单元ID }
    static function GetOrgUnitIDByGUID(AGUID: string): string;

    { 根据指定的人员成员URL,得到其机构、部门、岗位成员和人员成员的ID }
    static procedure GetOrganDeptPositionPersonID(const APersonMemberURL: string;
      var AOrganID, ADeptID, APositionID, APersonID: string);
    { 根据指定的人员成员URL,得到其机构、部门、岗位成员和人员成员的ID和显示名称 }
    static procedure GetOrganDeptPositionPersonIDName(const AOrgURL: string;
      var AOrganID, AOrganName, ADeptID, ADeptName, APositionID, APositionName,
      APersonID, APersonName: string);
    { 根据指定部门、岗位成员和人员成员的ID,得到所属机构的ID }
    static function GetOrganIDByDeptPositionPersonID(const ADeptID,
      APositionID, APersonID: string): string;

    { 根据部门和岗位成员ID得到其下的人员成员ID列表 }
    static procedure GetPersonMemberIDsByDeptPositionMemberID(ADeptID,
      APositionMemberID: string; APersonMemberIDs: TStrings);
    { 根据人员成员的文件名得到其所在部门的文件名 }
    static function GetDeptFileNameByPersonMemberFileName(APersonMemberFileName: string): string;

    { 获取 OrgURL 下包含的所有人员成员 }
    static procedure GetAllPersonMemberURLs(AOrgURL: string; APersonMemberURLs: TStrings);
    { 获取OrgURLs中包含的所有人员成员 }
    static procedure GetAllPersonMemberURLsByOrgURLs(APersonMemberURLs, AOrgURLs: TStrings);

    { 排除人员成员URL列表中相同的人员 }
    static procedure ExcludeSamePerson(APersonMemberURLs: TStrings);
    { 排除人员成员URL列表中的当前人员 }
    static procedure ExcludeCurrentPerson(APersonMemberURLs: TStrings);

    { 获取属于某个岗位的所有人员成员 }
    static procedure GetAllPersonMemberURLsByPosition(APositionURL: string; APersonMemberURLs: TStrings);
    { 获取属于某个机构下的人员成员,不包括子机构 }
    static procedure GetAllPersonMemberURLsByOrgan(AOrganID: string; APersonMemberURLs: TStrings);
    { 获取属于某个机构、岗位的所有人员成员 }
    static procedure GetAllPersonMemberURLsByOrganPosition(AOrganID, APositionID: string;
      APersonMemberURLs: TStrings);
    { 获取指定部门ID, 岗位ID下的人员成员 }
    static procedure GetAllPersonMemberURLsByDeptPosition(ADeptID, APositionID: string;
      APersonMemberURLs: TStrings);

    { 获取指定部门ID下的所有人员成员 }
    static procedure GetAllPersonMemberURLsByDept(ADeptID: string; APersonMemberURLs: TStrings);

    { 获取指定指定组织单元、指定类型的管理者URL列表 }
    static procedure GetManagerURLs(AOrgURL: string; AOrgURLs: TStrings; AKind: string); overload;
    static procedure GetManagerURLs(AOrgURL: string; AOrgURLs: TStrings; AKind: string; GetAll: boolean); overload;
    { 获取指定(机构)部门的管理者URL列表 }
    static procedure GetDeptManagerURLs(ADeptID: string; AOrgURls: TStrings; AKind: string; GetAll: boolean); overload;
    static procedure GetDeptManagerURLs(ADeptID: string; AOrgURls: TStrings; AKind: string); overload;
    static procedure GetDeptManagerURLs(ADeptID: string; AOrgURls: TStrings); overload;
    { 获取指定人员的管理者的URL }
    static procedure GetPersonMemberManagerURLs(APersonMemberURL: string;
      AManagerURLs: TStrings; AKind: string);
    { 获取指定人员OrgURL的部门管理者,包括二级部门管理者 }
    static procedure GetPersonMemberDeptManager(APersonMemberURL: string; ADeptManagerURLs: TStrings);
    { 得到指定组织单元管理的下属。参数:指定的组织单元、下属URL列表,管理权限类型 }
    static procedure GetUnderling(AOrgURL: string; AOrgURLs: TStrings; AKind: string);
    { 指定的管理者下面是否包含指定的下属组织单元 }
    static function ManagerIncludeOrgUnit(AManagerURL, AOrgURL: string): boolean;
    { 得到指定组织单元管理的直接上司。参数:指定的组织单元、上司URL列表,管理权限类型 }
    static procedure GetHigherUp(AOrgURL: string; AOrgURLs: TStrings; AKind: string); overload;
    { 得到直接主管上司 }
    static procedure GetHigherUp(AOrgURL: string; AOrgURLs: TStrings); overload;

    { 获取指定部门、岗位、人员ID对应组织单元的OrgURL }
    static procedure GetOrgUnitURLs(ADeptID, APositionID, APersonID: string; AOrgURls: TStrings);

    { 获取当前用户的部门、岗位、人员ID }
    static procedure GetCurrentUserInfo(var ADeptID, APositionID, AUserID: string);
    { 得到当前用户管理的所有下属组织单元URL列表 }
    static function GetCurrentUserSubordinationURLs: TStrings;
    { 排除不在当前用户管理权限内的组织单元URL }
    static procedure ExcludeNotInCurrentUserManageRight(AOrgURLs: TStrings);

    { 兼容性保留 }
    static function GetOrgURLDisplayNames(AOrgURLs: TStrings): string;
    { 得到组织机构OrgURLs的显示名称,超过 AUniteLevel 之后的显示为 ... ,AUniteLevel为-1取所有 }
    static function GetOrgURLsDisplayName(AOrgURLs: TStrings; AUniteLevel: integer): string; overload;
    { AUniteLevel为3 }
    static function GetOrgURLsDisplayName(AOrgURLs: TStrings): string; overload;
    { 得到组织单元的显示名称,只取到机构。格式:机构.部门.岗位.人员 }
    static function GetOrgUnitDisplayNames(AOrgURL: string): string;

    { 得到组织单元的 GUID }
    static function GetOrgUnitGUID(AOrgURL: string): string;
    { 得到人员的 GUID }
    static function GetPersonGUID(APersonID: string): string;
    { 得到岗位的 GUID }
    static function GetPositionGUID(APositionID: string): string;
    { 得到机构或者部门的 GUID }
    static function GetDeptGUID(AID: string): string;

    { 检查人员ID是否存在 }
    static function PersonIDExist(APersonID: string): boolean;
    { 指定部门ID是否是多级子部门 }
    static function IsChildrenDept(ADeptID: string): boolean;

    { 当前人员所在机构 }
    static function CurrentOrgan: TOrgUnit;
    { 当前人员所在部门 }
    static function CurrentDept: TOrgUnit;
    { 当前人员所在岗位成员 }
    static function CurrentPositionMember: TOrgUnit;
    { 当前人员所在人员成员 }
    static function CurrentPersonMember: TOrgUnit;
    { 当前岗位 }
    static function CurrentPosition: TOperatorPosition;
    { 当前操作者 }
    static function CurrentOperator: TOperator;
  end;
回复

使用道具 举报

 楼主| 发表于 2009-9-29 15:41:25 | 显示全部楼层

TOrgUtils实现部分

{ TOrgUtils }

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption, [],
    TSelectViewKind.vkOrgTree, TOrgTreeRootKind.rkOrgRoot, '', True);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string;
  ACanSelecteKinds: TBizObjectKinds): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption,
    ACanSelecteKinds, TSelectViewKind.vkOrgTree, TOrgTreeRootKind.rkOrgRoot,
    '', True);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
  ASelectViewKind: TSelectViewKind): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption,
    ACanSelecteKinds, ASelectViewKind, TOrgTreeRootKind.rkOrgRoot, '', True);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
  ASelectViewKind: TSelectViewKind; AMultiSelect: Boolean): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption,
    ACanSelecteKinds, ASelectViewKind, TOrgTreeRootKind.rkOrgRoot, '', AMultiSelect);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
  AOrgTreeRootKind: TOrgTreeRootKind; AOrgTreeRooFileName: string;
  AMultiSelect: Boolean): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption,
    ACanSelecteKinds, TSelectViewKind.vkOrgTree, AOrgTreeRootKind,
    AOrgTreeRooFileName, AMultiSelect);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
  ASelectViewKind: TSelectViewKind; AOrgTreeRootKind: TOrgTreeRootKind;
  AOrgTreeRooFileName: string; AMultiSelect: Boolean): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption,
    ACanSelecteKinds, TSelectViewKind.vkOrgTree, AOrgTreeRootKind,
    AOrgTreeRooFileName, AMultiSelect, nil);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string; AUnchangeableOrgURLs: TStrings;
  ACanSelecteKinds: TBizObjectKinds): Boolean;
begin
  Result := ShowSelectOrgUnitDialog(AContext, AOrgURLs, ACaption, ACanSelecteKinds,
    TSelectViewKind.vkOrgTree, TOrgTreeRootKind.rkOrgRoot, '', True, AUnchangeableOrgURLs);
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext;
  AOrgURLs: TStrings; ACaption: string; ACanSelecteKinds: TBizObjectKinds;
  ASelectViewKind: TSelectViewKind; AOrgTreeRootKind: TOrgTreeRootKind;
  AOrgTreeRooFileName: string; AMultiSelect: Boolean;
  AUnchangeableOrgURLs: TStrings): Boolean;
var
  lDialog: TSelectOrgUnitDialog;
begin
  lDialog := TSelectOrgUnitDialog.Create(AContext);
  try
    if ACaption <> '' then
      lDialog.Caption := ACaption;
    if ACanSelecteKinds <> [] then
      lDialog.CanSelecteKinds := ACanSelecteKinds;
    lDialog.SelectViewKind := ASelectViewKind;
    lDialog.OrgTreeRootKind := AOrgTreeRootKind;
    if AOrgTreeRooFileName <> '' then
      lDialog.OrgTreeRooFileName := AOrgTreeRooFileName;
    lDialog.SelectedOrgURLs := AOrgURLs;
    lDialog.MultiSelect := AMultiSelect;
    lDialog.UnchangeableOrgURLs := AUnchangeableOrgURLs;

    Result := lDialog.Execute;
    AOrgURLs.Assign(lDialog.SelectedOrgURLs);
  finally
    lDialog.Free;
  end;
end;

static function TOrgUtils.ShowSelectOrgUnitDialog(AContext: TContext; ADataSet: TDataSet;
  AOrgURLs: TStrings; ACaption: string; var ADisplayNames: string;
  ACanSelecteKinds: TBizObjectKinds; AMultiSelect, AGetPersonMember: Boolean): boolean;
var
  lOrgURLs, lPersonMemberURLs: TStrings;
  I: integer;
  lOrgURL, lOrgKind: string;
  lOrganID, lOrganName, lDeptID, lDeptName, lPositionID, lPositionName, lPersonID, lPersonName: string;
  lOrgURLList: TStrings;
begin
  if not ADataSet.Active then
    ADataSet.Active := True;

  lOrgURLs := TStringList.Create;
  lPersonMemberURLs := TStringList.Create;
  try
    ADataSet.First;
    while not ADataSet.Eof do
    begin
      lOrgURLs.Add(ADataSet.FieldByName('FOrgURL').AsString);
      ADataSet.Next;
    end;

    Result := TOrgUtils.ShowSelectOrgUnitDialog(AContext, lOrgURLs, ACaption,
      ACanSelecteKinds, TSelectViewKind.vkOrgTree, AMultiSelect);
    if Result then
    begin
      TDataSetUtils.DeleteAllRecord(ADataSet);  //先删除所有记录

      if AGetPersonMember then
      begin
        TOrgUtils.GetAllPersonMemberURLsByOrgURLs(lPersonMemberURLs, lOrgURLs);
        lOrgURLList := lPersonMemberURLs;
      end
      else
        lOrgURLList := lOrgURLs;

      for I := 0 to lOrgURLList.Count - 1 do
      begin
        lOrgURL := lOrgURLList[I];
        lOrgKind := FileSys.FileUtils.GetFileExt(lOrgURL);
        TOrgUtils.GetOrganDeptPositionPersonIDName(lOrgURL, lOrganID, lOrganName,
          lDeptID, lDeptName, lPositionID, lPositionName, lPersonID, lPersonName);

        { 填写数据集的相关字段 }
        ADataSet.Append;
        ADataSet.FieldByName('FOrgURL').AsString := SysUtils.UpperCase(lOrgURL);
        ADataSet.FieldByName('FOrgKind').AsString := SysUtils.UpperCase(lOrgKind);
        ADataSet.FieldByName('FPerson').AsString := lPersonName;
        ADataSet.FieldByName('FPersonID').AsString := lPersonID;
        ADataSet.FieldByName('FPosition').AsString := lPositionName;
        ADataSet.FieldByName('FPositionID').AsString := lPositionID;
        ADataSet.FieldByName('FDept').AsString := lDeptName;
        ADataSet.FieldByName('FDeptID').AsString := lDeptID;
        ADataSet.FieldByName('FOrgan').AsString := lOrganName;
        ADataSet.FieldByName('FOrganID').AsString := lOrganID;
        ADataSet.Post;
      end;
      ADisplayNames := TOrgUtils.GetOrgURLsDisplayName(lOrgURLs, -1);
    end;
  finally
    lOrgURLs.Free;
    lPersonMemberURLs.Free;
  end;
end;

static procedure TOrgUtils.GetOrgUnitID(const AOrgURL: string;
  const AOrgKind: TBizObjectKind; var AID: string);
var
  lURLs: TStrings;
  I: integer;
  lURL: string;
  lKind: TBizObjectKind;
begin
  lURLs := TStringList.Create;
  try
    FileSys.FileUtils.ExpandFileList(AOrgURL, lURLs);
    for I := 0 to lURLs.Count - 1 do
    begin
      lURL := lURLs[I];
      lKind := BizSys.BizSystem.GetObjectKind(lURL);
      if lKind = AOrgKind then
      begin
        AID := FileSys.FileUtils.GetFileNameNoExt(lURL);
        Break;
      end;
    end;
  finally
    lURLs.Free;
  end;
end;

static procedure TOrgUtils.GetOrgUnitIDName(const AOrgURL: string;
  const AOrgKind: TBizObjectKind; var AID, AName: string);
var
  lBizURL: TBizURL;
  lOrgUnit: TOrgUnit;
begin
  lBizURL := TBizURL.Create;
  try
    lBizURL.URL := AOrgURL;
    lOrgUnit := OrgSys.OrgSystem.GetUnit(lBizURL);
    while lOrgUnit <> nil do
    begin
      if lOrgUnit.OrgKind = AOrgKind then
      begin
        AID := lOrgUnit.ID;
        AName := lOrgUnit.DisplayName;
        Break;
      end;
      lOrgUnit := lOrgUnit.Parent;
    end;
  finally
    lBizURL.Free;
  end;
end;

static function TOrgUtils.GetOrgUnitIDByGUID(AGUID: string): string;
const
  cSQL = 'select FID from TORGSYSTEM where TORGSYSTEM.FGUID = :GUID and TORGSYSTEM.FDELETELEVEL = 0';
var
  lPositionID, lURL: string;
  lQuery: TQuery;
begin
  lQuery := TQuery.Create(nil);
  try
    lQuery.ConnectionString := BizObjConsts.cSysDatabaseConnectionString;
    lQuery.CommandText := cSQL;
    lQuery.Params.ParamByName('GUID').AsString := AGUID;
    lQuery.Active := True;

    Result := lQuery.FieldByName('FID').AsString;
  finally
    lQuery.Free;
  end;
end;

static procedure TOrgUtils.GetOrganDeptPositionPersonID(const APersonMemberURL: string;
  var AOrganID, ADeptID, APositionID, APersonID: string);
var
  lStrings: TStrings;
  lPersonMemberURL: string;
  I: integer;
  lString, lID, lExtName: string;
  lBizObjectKind: TBizObjectKind;
  lDeptID: string;
begin
  lDeptID := '';

  lStrings := TStringList.Create;
  try
    lPersonMemberURL := FileSys.FileUtils.RemoveFilePrefix(APersonMemberURL);
    jsCommon.SplitStrEx(FileSys.FileUtils.PathDelim, lPersonMemberURL, lStrings);
    for I := lStrings.Count - 1 downto 0 do
    begin
      lString := lStrings[I];
      jsCommon.SplitStr('.', lString, lID, lExtName);
      lExtName := FileSys.cExtDelim + lExtName;  //后缀名需要再加上'.'
      lBizObjectKind := BizSys.BizSystem.GetObjectKindByExtName(lExtName);
      case lBizObjectKind of
        TBizObjectKind.boOrgan:
          begin
            AOrganID := lID;
            Break;
          end;
        TBizObjectKind.boDept:
          begin
            if lDeptID = '' then  //取直接部门
            begin
              lDeptID := lID;

              ADeptID := lID;
            end;
          end;
        TBizObjectKind.boPositionMember:
          APositionID := lID;
        TBizObjectKind.boPersonMember:
          APersonID := lID;
      end;
    end;
  finally
    lStrings.Free;
  end;
end;

static procedure TOrgUtils.GetOrganDeptPositionPersonIDName(const AOrgURL: string;
  var AOrganID, AOrganName, ADeptID, ADeptName, APositionID, APositionName,
  APersonID, APersonName: string);
var
  lBizURL: TBizURL;
  lOrgUnit: TOrgUnit;
  lDeptID: string;
begin
  lBizURL := TBizURL.Create;
  try
    lBizURL.URL := AOrgURL;
    lOrgUnit := Org.OrgSys.OrgSystem.GetUnit(lBizURL);
    while lOrgUnit <> nil do
    begin
      case lOrgUnit.OrgKind of
        TBizObjectKind.boPersonMember:
          begin
            APersonID := lOrgUnit.ID;
            APersonName := lOrgUnit.DisplayName;
          end;
        TBizObjectKind.boPositionMember:
          begin
            APositionID := lOrgUnit.ID;
            APositionName := lOrgUnit.DisplayName;
          end;
        TBizObjectKind.boDept:
          begin
            if lDeptID = '' then  //取直接部门
            begin
              lDeptID := lOrgUnit.ID;

              ADeptID := lOrgUnit.ID;
              ADeptName := lOrgUnit.DisplayName;
            end;
          end;
        TBizObjectKind.boOrgan:
          begin
            AOrganID := lOrgUnit.ID;
            AOrganName := lOrgUnit.DisplayName;
            Break;
          end;
        TBizObjectKind.boPosition:
          begin
            APositionID := lOrgUnit.ID;
            APositionName := lOrgUnit.DisplayName;
            Break;
          end;
      end;
      lOrgUnit := lOrgUnit.Parent;
    end;
  finally
    lBizURL.Free;
  end;
end;

static function TOrgUtils.GetOrganIDByDeptPositionPersonID(const ADeptID,
  APositionID, APersonID: string): string;
var
  lOrgURL: TOrgURL;
  lOrganID: string;
begin
  lOrgURL := TOrgURL.Create(ADeptID, APositionID, APersonID);
  try
    TOrgUtils.GetOrgUnitID(lOrgURL.BizURL.URL, TBizObjectKind.boOrgan, lOrganID);
    Result := lOrganID;
  finally
    lOrgURL.Free;
  end;
end;

static procedure TOrgUtils.GetPersonMemberIDsByDeptPositionMemberID(ADeptID,
  APositionMemberID: string; APersonMemberIDs: TStrings);
var
  lPositionMember: TOrgUnit;
  lFileList: TStrings;
  lPath: string;
  lSearchParam: TSearchFileParam;
  I: integer;
  lID: string;
begin
  lPositionMember := OrgSys.OrgSystem.FindUnit(ADeptID, APositionMemberID, '');
  if lPositionMember <> nil then
  begin
    lFileList := TStringList.Create;
    try
      lPath := FileSys.FileUtils.AddPathSeparator(lPositionMember.BizURL.FileName);
      lSearchParam.MatchFileName := '*.psm';
      FileSys.FileSystem.SearchFile(lPath, lSearchParam, lFileList);

      for I := 0 to lFileList.Count - 1 do
      begin
        lID := FileSys.FileUtils.GetFileNameNoExt(lFileList[I]);
        APersonMemberIDs.Add(lID);
      end;
    finally
      lFileList.Free;
    end;
  end;
end;

static function TOrgUtils.GetDeptFileNameByPersonMemberFileName(APersonMemberFileName: string): string;
var
  lBizURL: TBizURL;
  lOrgUnit: TOrgUnit;
begin
  lBizURL := TBizURL.Create;
  try
    lBizURL.FileName := APersonMemberFileName;
    lOrgUnit := OrgSys.OrgSystem.GetUnit(lBizURL);
    while lOrgUnit <> nil do
    begin
      if lOrgUnit.OrgKind = TBizObjectKind.boDept then
      begin
        Result := lOrgUnit.BizURL.FileName;
        Break;
      end;
      lOrgUnit := lOrgUnit.Parent;
    end;
  finally
    lBizURL.Free;
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLs(AOrgURL: string;
  APersonMemberURLs: TStrings);
var
  lOrgURLs: TStrings;
begin
  lOrgURLs := TStringList.Create;
  try
    lOrgURLs.Add(AOrgURL);
    TOrgUtils.GetAllPersonMemberURLsByOrgURLs(APersonMemberURLs, lOrgURLs);
  finally
    lOrgURLs.Free;
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLsByOrgURLs(APersonMemberURLs, AOrgURLs: TStrings);
var
  I: integer;
  lURL: string;
  lKind: TBizObjectKind;
  lParam: TSearchFileParam;
begin
  for I := 0 to AOrgURLs.Count - 1 do
  begin
    lURL := AOrgURLs[I];
    lKind := BizSys.BizSystem.GetObjectKind(lURL);

    case lKind of
      TBizObjectKind.boPersonMember:
        APersonMemberURLs.Add(lURL);
      TBizObjectKind.boPosition:
        GetAllPersonMemberURLsByPosition(lURL, APersonMemberURLs);
      TBizObjectKind.boOrgan, TBizObjectKind.boDept, TBizObjectKind.boPositionMember:
        begin
          lParam.MatchFileName := '*.psm';
          lParam.SearchSubPath := True;
          FileSys.FileSystem.SearchFile(lURL + '\', lParam, APersonMemberURLs);
        end;
    else
      raise Exception.Create('无效的组织单元类型');
    end;
  end;
end;

static procedure TOrgUtils.ExcludeSamePerson(APersonMemberURLs: TStrings);
var
  I: integer;
  lPersonIDs: TStrings;
  lOrgURL: string;
  lID: string;
  lIndex: integer;
begin
  lPersonIDs := TStringList.Create;
  try
    for I := APersonMemberURLs.Count - 1 downto 0 do
    begin
      lOrgURL := APersonMemberURLs[I];
      TOrgUtils.GetOrgUnitID(lOrgURL, TBizObjectKind.boPersonMember, lID);
      lIndex := lPersonIDs.IndexOf(lID);
      if lIndex = -1 then
        lPersonIDs.Add(lID)
      else
        APersonMemberURLs.Delete(I);
    end;
  finally
    lPersonIDs.Free;
  end;
end;

static procedure TOrgUtils.ExcludeCurrentPerson(APersonMemberURLs: TStrings);
var
  I: integer;
  lOrgURL: string;
  lPersonID: string;
begin
  for I := APersonMemberURLs.Count - 1 downto 0 do
  begin
    lOrgURL := APersonMemberURLs[I];
    TOrgUtils.GetOrgUnitID(lOrgURL, TBizObjectKind.boPersonMember, lPersonID);
    if SysUtils.SameText(lPersonID, TCommonComponentLibrary.UserSystem.CurrentPersonMember.ID) then
      APersonMemberURLs.Delete(I);
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLsByPosition(APositionURL: string;
  APersonMemberURLs: TStrings);
const
  cSelectPositionPersonMemberSQL = 'SELECT ''Org:'' || TORGSYSTEM.FPATH || TORGSYSTEM.FFILENAME as FFullFileName FROM TORGSYSTEM' +
  ' WHERE TORGSYSTEM.FKIND = ''.PSM'' and TORGSYSTEM.FDELETELEVEL = 0 and TORGSYSTEM.FPOSITION = ''%s'' ORDER BY TORGSYSTEM.FSEQUENCE';
var
  lPositionID, lURL: string;
  lQuery: TQuery;
begin
  lQuery := TQuery.Create(nil);
  try
    lPositionID := FileSys.FileUtils.GetFileNameNoExt(APositionURL);
    lQuery.ConnectionString := BizObjConsts.cSysDatabaseConnectionString;
    lQuery.CommandText := SysUtils.Format(cSelectPositionPersonMemberSQL, [lPositionID]);
    lQuery.Active := True;

    while not lQuery.Eof do
    begin
      lURL := BizSys.BizSystem.FileName2URL(lQuery.FieldByName('FFullFileName').AsString);
      if APersonMemberURLs.IndexOf(lURL) = -1 then
        APersonMemberURLs.Add(lURL);
      lQuery.Next;
    end;
  finally
    lQuery.Free;
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLsByOrgan(AOrganID: string; APersonMemberURLs: TStrings);
const
  cSelectPersonMemberSQL = 'SELECT ''Org:'' || TORGSYSTEM.FPATH || TORGSYSTEM.FFILENAME as FFullFileName FROM TORGSYSTEM' +
  ' WHERE TORGSYSTEM.FKIND = ''.PSM'' and TORGSYSTEM.FDELETELEVEL = 0 and TORGSYSTEM.FORGAN = ''%s'' ORDER BY TORGSYSTEM.FSEQUENCE';
var
  lPositionID, lURL: string;
  lQuery: TQuery;
begin
  lQuery := TQuery.Create(nil);
  try
    lQuery.ConnectionString := BizObjConsts.cSysDatabaseConnectionString;
    lQuery.CommandText := SysUtils.Format(cSelectPersonMemberSQL, [AOrganID]);
    lQuery.Active := True;

    while not lQuery.Eof do
    begin
      lURL := BizSys.BizSystem.FileName2URL(lQuery.FieldByName('FFullFileName').AsString);
      if APersonMemberURLs.IndexOf(lURL) = -1 then
        APersonMemberURLs.Add(lURL);
      lQuery.Next;
    end;
  finally
    lQuery.Free;
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLsByOrganPosition(AOrganID, APositionID: string;
  APersonMemberURLs: TStrings);
const
  cSelectPersonMemberSQL = 'SELECT ''Org:'' || TORGSYSTEM.FPATH || TORGSYSTEM.FFILENAME as FFullFileName FROM TORGSYSTEM' +
  ' WHERE TORGSYSTEM.FKIND = ''.PSM'' and TORGSYSTEM.FDELETELEVEL = 0 and TORGSYSTEM.FORGAN = ''%s'' and TORGSYSTEM.FPOSITION = ''%s'' ORDER BY TORGSYSTEM.FSEQUENCE';
var
  lPositionID, lURL: string;
  lQuery: TQuery;
begin
  lQuery := TQuery.Create(nil);
  try
    lQuery.ConnectionString := BizObjConsts.cSysDatabaseConnectionString;
    lQuery.CommandText := SysUtils.Format(cSelectPersonMemberSQL, [AOrganID, APositionID]);
    lQuery.Active := True;

    while not lQuery.Eof do
    begin
      lURL := BizSys.BizSystem.FileName2URL(lQuery.FieldByName('FFullFileName').AsString);
      if APersonMemberURLs.IndexOf(lURL) = -1 then
        APersonMemberURLs.Add(lURL);
      lQuery.Next;
    end;
  finally
    lQuery.Free;
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLsByDeptPosition(ADeptID, APositionID: string;
  APersonMemberURLs: TStrings);
var
  lOrgExpr: string;
  lOrgURLs: TStrings;
begin
  lOrgURLs := TStringList.Create;
  try
    lOrgExpr := 'OrgChildren(OrgKey(''%s'', ''%s'', ''''), OrgCondition(''*.PSM'', '''', ''''), True, False)';
    OrgSys.OrgSystem.GetBizURLsByOrgExpr(SysUtils.Format(lOrgExpr, [ADeptID, APositionID]),
      lOrgURLs);

    APersonMemberURLs.AddStrings(lOrgURLs);
  finally
    lOrgURLs.Free;
  end;
end;

static procedure TOrgUtils.GetAllPersonMemberURLsByDept(ADeptID: string;
  APersonMemberURLs: TStrings);
var
  lOrgExpr: string;
  lOrgURLs: TStrings;
begin
  lOrgURLs := TStringList.Create;
  try
    lOrgExpr := 'OrgChildren(OrgKey(''%s'', '''', ''''), OrgCondition(''*.PSM'', '''', ''''), True, False)';
    OrgSys.OrgSystem.GetBizURLsByOrgExpr(SysUtils.Format(lOrgExpr, [ADeptID]), lOrgURLs);

    APersonMemberURLs.AddStrings(lOrgURLs);
  finally
    lOrgURLs.Free;
  end;
end;

static procedure TOrgUtils.GetManagerURLs(AOrgURL: string; AOrgURLs: TStrings; AKind: string);
begin
  TOrgUtils.GetManagerURLs(AOrgURL, AOrgURLs, AKind, False);
end;

static procedure TOrgUtils.GetManagerURLs(AOrgURL: string; AOrgURLs: TStrings; AKind: string;
  GetAll: boolean);
const
  cExpr = 'OrgManager(OrgKey(''%s'', ''%s'', ''%s''), ''%s'', %s)';
var
  lOrgURLs: TStrings;
  lGetAll, lExpr: string;
  lOrganID, lDeptID, lPositionID, lPersonID: string;
begin
  lOrgURLs := TStringList.Create;
  try
    TOrgUtils.GetOrganDeptPositionPersonID(AOrgURL, lOrganID, lDeptID, lPositionID, lPersonID);
    if GetAll then lGetAll := 'False'
    else lGetAll := 'True';
    lExpr := SysUtils.Format(cExpr, [lDeptID, lPositionID, lPersonID, AKind, lGetAll]);
    OrgSys.OrgSystem.GetBizURLsByOrgExpr(lExpr, lOrgURLs);
    TOrgUtils.GetAllPersonMemberURLsByOrgURLs(AOrgURLs, lOrgURLs);
  finally
    lOrgURLs.Free;
  end;
end;

static procedure TOrgUtils.GetDeptManagerURLs(ADeptID: string;
  AOrgURls: TStrings; AKind: string; GetAll: boolean);
const
  cExpr = 'OrgManager(OrgKey(''%s'', '''', ''''), ''%s'', %s)';
var
  lGetAll, lExpr: string;
  lOrgURLs: TStrings;
begin
  lOrgURLs := TStringList.Create;
  try
    if GetAll then
      lGetAll := 'False'
    else
      lGetAll := 'True';

    lExpr := SysUtils.Format(cExpr, [ADeptID, AKind, lGetAll]);
    OrgSys.OrgSystem.GetBizURLsByOrgExpr(lExpr, lOrgURLs);
    TOrgUtils.GetAllPersonMemberURLsByOrgURLs(AOrgURLs, lOrgURLs);
  finally
    lOrgURLs.Free;
  end;
end;

static procedure TOrgUtils.GetDeptManagerURLs(ADeptID: string; AOrgURls: TStrings; AKind: string);
begin
  GetDeptManagerURLs(ADeptID, AOrgURls, AKind, False);
end;

static procedure TOrgUtils.GetDeptManagerURLs(ADeptID: string; AOrgURls: TStrings);
var
  lKind: string;
begin
  lKind := TManageRightUtils.KindToStr(TManageRightKind.Admin);
  TOrgUtils.GetDeptManagerURLs(ADeptID, AOrgURls, lKind);
end;

static procedure TOrgUtils.GetPersonMemberManagerURLs(APersonMemberURL: string;
  AManagerURLs: TStrings; AKind: string);
const
  cPersonMemberExpr = 'OrgManager(OrgKey(''%s'', ''%s'', ''%s''), ''%s'', True)';  //直接管理者
  cPositionMemberExpr = 'OrgManager(OrgKey(''%s'', ''%s'', ''''), ''%s'', True)';  //岗位成员
  cPositionExpr = 'OrgManager(OrgKey('''', ''%s'', ''''), ''%s'', True)';  //岗位成员
  cDeptExpr = 'OrgManager(OrgKey(''%s'', '''', ''''), ''%s'', True)';  //直接管理者
var
  lBizURL: TBizURL;
  lPersonMemberURL: TOrgURL;
  lExpr: string;
  lOrgURLs: TStrings;
  lGetManagerByPosition: boolean;
  I: integer;
  lManagerOrganID,
  lPersonOrganID: string;
begin
  lGetManagerByPosition := False;

  lBizURL := TBizURL.Create;
  try
    lBizURL.URL := APersonMemberURL;

    lOrgURLs := TStringList.Create;
    lPersonMemberURL := TOrgURL.Create(lBizURL);
    try
      { 1. 先取人员成员的直接管理者 }
      lExpr := SysUtils.Format(cPersonMemberExpr, [lPersonMemberURL.DeptID,
        lPersonMemberURL.PositionID, lPersonMemberURL.PersonID, AKind]);
      OrgSys.OrgSystem.GetBizURLsByOrgExpr(lExpr, lOrgURLs);
      { 2. 如果当员成员没有取到直接管理者, 就取其所在岗位成员的的直接管理者 }
      if lOrgURLs.Count = 0 then
      begin
        lExpr := SysUtils.Format(cPositionMemberExpr,
          [lPersonMemberURL.DeptID, lPersonMemberURL.PositionID, AKind]);
        OrgSys.OrgSystem.GetBizURLsByOrgExpr(lExpr, lOrgURLs);
      end;
      { 3. 1和2没有取到, 就取其所在岗位的的直接管理者 }
      if lOrgURLs.Count = 0 then
      begin
        lExpr := SysUtils.Format(cPositionExpr, [lPersonMemberURL.PositionID, AKind]);
        OrgSys.OrgSystem.GetBizURLsByOrgExpr(lExpr, lOrgURLs);
        if lOrgURLs.Count > 0 then
          lGetManagerByPosition := True;
      end;
      { 4. 否则,就取其所在部门的直接管理者 }
      if lOrgURLs.Count = 0 then
      begin
        lExpr := SysUtils.Format(cDeptExpr, [lPersonMemberURL.DeptID, AKind]);
        OrgSys.OrgSystem.GetBizURLsByOrgExpr(lExpr, lOrgURLs);
      end;

      TOrgUtils.GetAllPersonMemberURLsByOrgURLs(AManagerURLs, lOrgURLs);  //只获取人员成员
      { 过滤本公司的 }
      TOrgUtils.GetOrgUnitID(APersonMemberURL, TBizObjectKind.boOrgan, lPersonOrganID);
      if lGetManagerByPosition then
      begin
        for I := AManagerURLs.Count - 1 downto  0 do
        begin
          TOrgUtils.GetOrgUnitID(AManagerURLs[I], TBizObjectKind.boOrgan, lManagerOrganID);
          if not SysUtils.SameText(lPersonOrganID, lManagerOrganID) then
            AManagerURLs.Delete(I);
        end;
      end;
    finally
      lPersonMemberURL.Free;
      lOrgURLs.Free;
    end;
  finally
    lBizURL.Free;
  end;
end;

static procedure TOrgUtils.GetPersonMemberDeptManager(APersonMemberURL: string;
  ADeptManagerURLs: TStrings);
var
  lBizURL: TBizURL;
  lUnit: TOrgUnit;
  lDeptID: string;
begin
  lBizURL := TBizURL.Create;
  try
    lBizURL.URL := APersonMemberURL;
    lUnit := OrgSys.OrgSystem.FindUnit(lBizURL);
    while lUnit <> nil do
    begin
      if lUnit.OrgKind = TBizObjectKind.boDept then
        GetDeptManagerURLs(lUnit.ID, ADeptManagerURLs);

      lUnit := lUnit.Parent;
    end;
  finally
    lBizURL.Free;
  end;
end;

static procedure TOrgUtils.GetUnderling(AOrgURL: string; AOrgURLs: TStrings; AKind: string);
var
  lBizURL: TBizURL;
  lOrgUnit: TOrgUnit;
  lItems: TOrgSubordinationItems;
  lItem: TOrgSubordinationItem;
  I: Integer;
  lOrgURL: TOrgURL;
begin
  lBizURL := TBizURL.Create;
  lItems := TOrgSubordinationItems.Create;
  try
    lBizURL.URL := AOrgURL;

    lOrgUnit := OrgSys.OrgSystem.GetUnit(lBizURL);
    OrgSys.OrgSystem.GetAllSubordination(lOrgUnit, lItems);

    for I := 0 to lItems.Count - 1 do
    begin
      lItem := TOrgSubordinationItem(lItems.Items[I]);
      if lItem.Kind = AKind then
      begin
        lOrgURL := TOrgURL.Create(lItem.DeptID, lItem.PositionID, lItem.PersonID);
        try
          AOrgURLs.Add(lOrgURL.BizURL.URL);
        finally
          lOrgURL.Free;
        end;
      end;
    end;
  finally
    lItems.Free;
    lBizURL.Free;
  end;
end;

static function TOrgUtils.ManagerIncludeOrgUnit(AManagerURL, AOrgURL: string): boolean;
var
  lKind: string;
  lOrgURLs: TStrings;
  lIndex: integer;
begin
  lOrgURLs := TStringList.Create;
  try
    lKind := TManageRightUtils.KindToStr(TManageRightKind.Admin);
    TOrgUtils.GetManagerURLs(AOrgURL, lOrgURLs, lKind, True);
    lIndex := lOrgURLs.IndexOf(AManagerURL);
    Result := lIndex <> -1;
  finally
    lOrgURLs.Free;
  end;
end;

static procedure TOrgUtils.GetHigherUp(AOrgURL: string; AOrgURLs: TStrings;
  AKind: string);
var
  I: integer;
  lCurrentOrgURL, lOrgURL: string;
  lDeptID, lOrganID: string;
begin
  { 1、取所在部门的管理者 }
  GetOrgUnitID(AOrgURL, TBizObjectKind.boDept, lDeptID);
  GetDeptManagerURLs(lDeptID, AOrgURLs, AKind, False);

  { 2、排除自己就是部门管理者的情况 }
  lCurrentOrgURL := TCommonComponentLibrary.UserSystem.CurrentPersonMember.BizURL.URL;
  for I := AOrgURLs.Count - 1 downto 0 do
  begin
    lOrgURL := AOrgURLs[I];
    {如果自己就是所在部门的管理者, 排除}
    if SysUtils.SameText(lOrgURL, lCurrentOrgURL) then
      AOrgURLs.Delete(I);
  end;

  { 3、如果把自己排除后管理者列表为空,就取机构的管理者 }
  if AOrgURLs.Count = 0 then
  begin
    GetOrgUnitID(AOrgURL, TBizObjectKind.boOrgan, lOrganID);
    GetDeptManagerURLs(lOrganID, AOrgURLs, AKind, False);
  end;
end;

static procedure TOrgUtils.GetHigherUp(AOrgURL: string; AOrgURLs: TStrings);
begin
  GetHigherUp(AOrgURL, AOrgURLs, '');
end;

static procedure TOrgUtils.GetOrgUnitURLs(ADeptID, APositionID, APersonID: string; AOrgURls: TStrings);
var
  lOrgUnit: TOrgUnit;
begin
  lOrgUnit := OrgSys.OrgSystem.GetUnit(ADeptID, APositionID, APersonID);
  AOrgURls.Add(lOrgUnit.BizURL.URL);
end;

static procedure TOrgUtils.GetCurrentUserInfo(var ADeptID, APositionID,
  AUserID: string);
var
  lContext: TContext;
  lOpr, lPos: TContext;
begin
  lContext := TCommonComponentLibrary.UserSystem.CurrentPosition.Context;
  lOpr := lContext.GetParentContext(BizSys.IL_PERSON);
  AUserID := TOperator(lOpr.Owner).ID;
  lPos := lContext.FindParentContext(BizSys.IL_POSITION);
  if lPos = nil then
  begin
    ADeptID := '';
    APositionID := '';
  end
  else
  begin
    AUserID := TOperatorPosition(lPos.Owner).PersonMember.ID;
    ADeptID := TOperatorPosition(lPos.Owner).PositionMember.Parent.ID;
    APositionID := TOperatorPosition(lPos.Owner).PositionMember.ID;
  end;
end;

static function TOrgUtils.GetCurrentUserSubordinationURLs: TStrings;
const
  SPersonSubordination = 'OrgSubordination(OrgParent(OrgSelect(' +
    'OrgCondition(''%s.PSM'', '''', '''')), '''', False, True), '''')';
  SPersonMemberSubordination = 'OrgSubordination(OrgParent(OrgKey(''%s'', ''%s'', ''%s''), '''', False, True), '''')';
var
  lDept, lPos, lOpr: string;
  lOrgExpr: string;
  I, J: Integer;
  lDupted: TStrings;
  lSubordinationURLs: TStringList;
begin
  lDupted := TStringList.Create;
  lSubordinationURLs := TStringList.Create;
  try
    lSubordinationURLs.Sorted := True;
    lSubordinationURLs.Duplicates := TDuplicates.dupIgnore;

    lDept := '';
    lPos := '';
    lOpr := '';
    GetCurrentUserInfo(lDept, lPos, lOpr);
    for I := 0 to TSystemCore.Operator.PositionList.Count - 1 do
    begin
      lOpr := TOperatorPosition(TSystemCore.Operator.PositionList.Objects[I]).PersonMember.ID;
      lOrgExpr := SysUtils.Format(SPersonSubordination, [lOpr]);
      OrgSys.OrgSystem.GetBizURLsByOrgExpr(lOrgExpr, lDupted);
      for J := 0 to lDupted.Count - 1 do
        lSubordinationURLs.Add(lDupted[J]);
    end;
    Result := lSubordinationURLs;
  finally
    lDupted.Free;
  end;
end;

static procedure TOrgUtils.ExcludeNotInCurrentUserManageRight(AOrgURLs: TStrings);
var
  lSubordinationURLs: TStrings;
  I, J: Integer;
  lSubordinationURL, lURL: string;
  lCopyStr: string;
begin
  lSubordinationURLs := GetCurrentUserSubordinationURLs;
  try
    if lSubordinationURLs.Count = 0 then
      lSubordinationURLs.Add(TCommonComponentLibrary.UserSystem.CurrentDept.BizURL.URL);

    for I := 0 to lSubordinationURLs.Count - 1 do
    begin
      lSubordinationURL := FileSys.FileUtils.RemoveFilePrefix(lSubordinationURLs[I]);
      for J := AOrgURLs.Count - 1 downto 0 do
      begin
        lURL := FileSys.FileUtils.RemoveFilePrefix(AOrgURLs[J]);
        lCopyStr := StringUtils.Copy(lURL, 1, Length(lSubordinationURL));
        if not SysUtils.SameText(lSubordinationURL, lCopyStr) then
        begin
          AOrgURLs.Delete(J);
        end;
      end;
    end;
  finally
    lSubordinationURLs.Free;
  end;
end;

static function TOrgUtils.GetOrgURLDisplayNames(AOrgURLs: TStrings): string;
begin
  Result := GetOrgURLsDisplayName(AOrgURLs);
end;

static function TOrgUtils.GetOrgURLsDisplayName(AOrgURLs: TStrings;
  AUniteLevel: integer): string;
var
  I: integer;
  lFileName: string;
  lDisplayName, lDisplayNames: string;
  lObjectKind: TBizObjectKind;
  lOrganFileName, lOrganDisplayName: string;
begin
  for I := 0 to AOrgURLs.Count - 1 do
  begin
    if not BizSys.BizSystem.URLExists(AOrgURLs[I]) then Continue;

    lFileName := BizSys.BizSystem.URL2FileName(AOrgURLs[I]);
    lObjectKind := BizSys.BizSystem.GetObjectKind(lFileName);

    if (I < AUniteLevel) or (AUniteLevel = -1) then
    begin
      lDisplayName := FileSys.FileSystem.FileGetDisplayName(lFileName);

      //如果是部门,显示名称中要加上所属机构的名称
      if lObjectKind = TBizObjectKind.boDept then
      begin
        lOrganFileName := FileSys.FileUtils.GetDirectory(lFileName);
        lOrganDisplayName := FileSys.FileSystem.FileGetDisplayName(lOrganFileName);
        lDisplayName := jsCommon.UniteStr('.', lOrganDisplayName, lDisplayName);
      end;

      lDisplayNames := jsCommon.UniteStr('; ', lDisplayNames, lDisplayName);
    end
    else
    begin
      lDisplayNames := lDisplayNames + '...';
      Break;
    end;
  end;
  Result := lDisplayNames;
end;

static function TOrgUtils.GetOrgURLsDisplayName(AOrgURLs: TStrings): string;
begin
  Result := GetOrgURLsDisplayName(AOrgURLs, 3);
end;

static function TOrgUtils.GetOrgUnitDisplayNames(AOrgURL: string): string;
var
  lOrgURL: string;
  lBizURL: TBizURL;
  lOrgUnit: TOrgUnit;
  lDisplayNames: string;
begin
  lBizURL := TBizURL.Create;
  try
    lOrgURL := AOrgURL;
    while lOrgURL <> '' do
    begin
      lBizURL.URL := lOrgURL;
      if BizSys.BizSystem.URLExists(lBizURL) then
      begin
        lOrgUnit := OrgSys.OrgSystem.GetUnit(lBizURL);
        Break;
      end;
      lOrgURL := FileSys.FileUtils.GetDirectory(lOrgURL);
    end;

    while lOrgUnit <> nil do
    begin
      lDisplayNames := jsCommon.UniteStr('.', lOrgUnit.DisplayName, lDisplayNames);

      if lOrgUnit.OrgKind = TBizObjectKind.boOrgan then Break;
      lOrgUnit := lOrgUnit.Parent;
    end;
  finally
    lBizURL.Free;
  end;

  Result := lDisplayNames;
end;

static function TOrgUtils.GetOrgUnitGUID(AOrgURL: string): string;
var
  lFileName: string;
  lSpecInfo: TFileSpecInfo;
begin
  Result := '';

  lFileName := BizSys.BizSystem.URL2FileName(AOrgURL);
  lSpecInfo := FileSys.FileSystem.GetSpecInfo(lFileName);
  if lSpecInfo <> nil then
    Result := lSpecInfo.GUID;
end;

static function TOrgUtils.GetPersonGUID(APersonID: string): string;
var
  lPerson: TPerson;
begin
  lPerson := OrgSys.OrgSystem.FindPerson(APersonID);
  if lPerson <> nil then
    Result := GetOrgUnitGUID(lPerson.BizURL.URL)
  else
    Result := '';
end;

static function TOrgUtils.GetPositionGUID(APositionID: string): string;
var
  lPosition: TPosition;
begin
  lPosition := OrgSys.OrgSystem.FindPosition(APositionID);
  if lPosition <> nil then
    Result := GetOrgUnitGUID(lPosition.BizURL.URL)
  else
    Result := '';
end;

static function TOrgUtils.GetDeptGUID(AID: string): string;
var
  lOrgURL: TOrgURL;
begin
  lOrgURL := TOrgURL.Create(AID, '', '');
  try
    Result := GetOrgUnitGUID(lOrgURL.BizURL.URL);
  finally
    lOrgURL.Free;
  end;
end;

static function TOrgUtils.PersonIDExist(APersonID: string): boolean;
var
  lPerson: TPerson;
begin
  lPerson := OrgSys.OrgSystem.FindPerson(APersonID);
  Result := lPerson <> nil;
end;

static function TOrgUtils.IsChildrenDept(ADeptID: string): boolean;
var
  lUnit: TOrgUnit;
begin
  lUnit := OrgSys.OrgSystem.GetUnit(ADeptID, '', '');
  Result := (lUnit.Parent.OrgKind = TBizObjectKind.boDept);
end;

static function TOrgUtils.CurrentOrgan: TOrgUnit;
begin
  Result := TCommonComponentLibrary.UserSystem.CurrentOrgan;
end;

static function TOrgUtils.CurrentDept: TOrgUnit;
begin
  Result := TCommonComponentLibrary.UserSystem.CurrentDept;
end;

static function TOrgUtils.CurrentPositionMember: TOrgUnit;
begin
  Result := TCommonComponentLibrary.UserSystem.CurrentPositionMember;
end;

static function TOrgUtils.CurrentPersonMember: TOrgUnit;
begin
  Result := TCommonComponentLibrary.UserSystem.CurrentPersonMember;
end;

static function TOrgUtils.CurrentPosition: TOperatorPosition;
begin
  Result := TCommonComponentLibrary.UserSystem.CurrentPosition;
end;

static function TOrgUtils.CurrentOperator: TOperator;
begin
  Result := TCommonComponentLibrary.UserSystem.CurrentUser;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-29 15:43:20 | 显示全部楼层

通用的“组织单元选择对话框”

个人封装的支持多种视图选择、姓名定位查找人员,“系统分组”、“个人自定义分组”等功能的通用对话框,如下图:

通用选择组织单元对话框.jpg

79.47 KB, 下载次数: 357

回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-29 15:44:57 | 显示全部楼层

资源包下载

上述资源压缩包下载:

组织机构公共库.rar

32.3 KB, 下载次数: 145

回复 支持 反对

使用道具 举报

发表于 2009-9-30 09:22:48 | 显示全部楼层
看看
回复 支持 反对

使用道具 举报

发表于 2009-10-22 16:49:07 | 显示全部楼层
感谢!
回复 支持 反对

使用道具 举报

发表于 2009-11-18 12:46:49 | 显示全部楼层

如何导到studio呢?

如何导到studio呢?
回复 支持 反对

使用道具 举报

发表于 2009-11-18 13:09:18 | 显示全部楼层
应用业务资源管理器粘贴
回复 支持 反对

使用道具 举报

发表于 2009-11-18 13:26:06 | 显示全部楼层

复制过去出错哦

复制过去出错哦
回复 支持 反对

使用道具 举报

发表于 2009-11-18 13:28:26 | 显示全部楼层
错误贴出来看看
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-14 16:59 , Processed in 0.051729 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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