{ 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; |