123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738 |
- unit ProjectManagerDm;
- interface
- uses
- TenderBackupManager,
- SysUtils, Classes, DB, DBClient, Provider, ADODB, Connections, ZhAPI,
- sdDB, sdProvider, sdIDTree;
- type
- TProjectManagerData = class(TDataModule)
- sdpProjectsInfo: TsdADOProvider;
- sddProjectsInfo: TsdDataSet;
- sdvProjectsInfo: TsdDataView;
- sdpTenderProperty: TsdADOProvider;
- sddTenderProperty: TsdDataSet;
- sdvTenderProperty: TsdDataView;
- sdvProjectsSpare: TsdDataView;
- procedure sdvProjectsInfoGetText(var Text: String;
- ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
- DisplayText: Boolean);
- procedure sdvProjectsInfoFilterRecord(ARecord: TsdDataRecord;
- var Allow: Boolean);
- procedure DataModuleCreate(Sender: TObject);
- procedure sdvProjectsInfoBeforeDeleteRecord(ARecord: TsdDataRecord;
- var Allow: Boolean);
- private
- FConnection: TCommonConnection;
- FProjectsTree: TsdIDTree;
- procedure UpdateManagerDataBase;
- //procedure ReNameCurrentProject(const AName: string);
- procedure CreateNewProjectFile(const AName: string);
- procedure DeleteAllTenderFiles(ANode: TsdIDTreeNode);
- procedure DeleteAttachmentFiles(ANode: TsdIDTreeNode);
- function CreateBackupFolder(AProjectID: Integer): string;
- procedure ExportTender(ARec: TsdDataRecord; AFileName: string);
- function NewID: Integer;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Open;
- procedure Save;
- function HasProject: Boolean;
- function ExistProject(const AName: string; ANode: TsdIDTreeNode): Boolean;
- function ProjectID(const AName: string; ANode: TsdIDTreeNode): Integer;
- // 云版要记下网络文件夹的ID和层次。
- function InsertProject(const AName: string; APreNode: TsdIDTreeNode; AFolderID: Integer = -1; AFolderLevel: Integer = -1): TsdIDTreeNode;
- function InsertSubProject(const AName: string; AParent: TsdIDTreeNode; AFolderID: Integer = -1; AFolderLevel: Integer = -1): TsdIDTreeNode;
- function InsertTender(const AName: string; AParent: TsdIDTreeNode): TsdIDTreeNode;
- procedure Delete;
- procedure ReName(const AName: string; ANode: TsdIDTreeNode);
- procedure RestoreTender(AID: Integer);
- procedure RefreshSeedID;
- procedure CalculateParentInfo(AID: Integer);
- function BackupPath(AProjectID: Integer): String;
- procedure AddOpenTenderBackup(AProjectID: Integer);
- procedure AddSaveTenderBackup(AProjectID: Integer);
- property ProjectsTree: TsdIDTree read FProjectsTree;
- end;
- implementation
- uses
- UtilMethods, UpdateDataBase, ProjectCommands, PHPWebDm, ConstUnit, Math;
- {$R *.dfm}
- { TProjectManagerData }
- constructor TProjectManagerData.Create;
- begin
- inherited Create(nil);
- FConnection := TCommonConnection.Create;
- FProjectsTree := TsdIDTree.Create;
- FProjectsTree.KeyFieldName := 'ID';
- FProjectsTree.ParentFieldName := 'ParentID';
- FProjectsTree.NextSiblingFieldName := 'NextSiblingID';
- FProjectsTree.AutoCreateKeyID := True;
- FProjectsTree.AutoExpand := True;
- FProjectsTree.SeedID := 1;
- FProjectsTree.DataView := sdvProjectsInfo;
- end;
- procedure TProjectManagerData.CreateNewProjectFile(const AName: string);
- var
- TempFolder: string;
- begin
- try
- TempFolder := GenerateTempFolder(GetTempFilePath);
- CopyFileOrFolder(GetEmptyDataBaseFileName, TempFolder + '\Main.dat');
- ZipFolder(TempFolder, GetMyProjectsFilePath + AName);
- finally
- DeleteFileOrFolder(TempFolder);
- end;
- end;
- procedure TProjectManagerData.Delete;
- var
- orgParentID: Integer;
- begin
- if HasProject then
- begin
- orgParentID := FProjectsTree.Selected.ParentID;
- DeleteAttachmentFiles(FProjectsTree.Selected);
- DeleteAllTenderFiles(FProjectsTree.Selected);
- FProjectsTree.DeleteNode(FProjectsTree.Selected);
- CalculateParentInfo(orgParentID);
- Save;
- end;
- end;
- destructor TProjectManagerData.Destroy;
- begin
- FProjectsTree.Free;
- FConnection.Free;
- inherited;
- end;
- function TProjectManagerData.ExistProject(const AName: string;
- ANode: TsdIDTreeNode): Boolean;
- var
- vCur: TsdIDTreeNode;
- begin
- Result := False;
- if not Assigned(ANode) then Exit;
- vCur := ANode.FirstChild;
- while not Result and Assigned(vCur) do
- begin
- Result := vCur.Rec.ValueByName('Name').AsString = AName;
- vCur := vCur.NextSibling;
- end;
- end;
- function TProjectManagerData.HasProject: Boolean;
- begin
- Result := sddProjectsInfo.RecordCount > 0;
- end;
- function TProjectManagerData.InsertProject(const AName: string;
- APreNode: TsdIDTreeNode; AFolderID: Integer; AFolderLevel: Integer): TsdIDTreeNode;
- var
- vNew: TsdIDTreeNode;
- bOnLine, bCanCreate: Boolean;
- begin
- // 云版判断是否已存在的标准是服务端传来的ID,不是单机版所使用的名称。
- // 判断条件写在这里面不合适,因为云版调用不正确,应该写到方法外面。
- // 现在已经这样了,改起来麻烦,先补丁的方式用着。
- if G_IsCloud then
- bCanCreate := True
- else if (not G_IsCloud) and (not Assigned(APreNode)
- or not ExistProject(AName, APreNode.Parent)) then
- bCanCreate := True
- else
- bCanCreate := False;
- if bCanCreate then
- begin
- RefreshSeedID;
- if Assigned(APreNode) then
- vNew := FProjectsTree.Add(APreNode.ParentID, APreNode.NextSiblingID)
- else
- vNew := FProjectsTree.Add(-1, -1);
- vNew.Rec.BeginUpdate;
- vNew.Rec.ValueByName('Type').AsInteger := 0;
- vNew.Rec.ValueByName('Name').AsString := AName;
- {---------------------------------------------------------------------------
- 恼火的问题:直接写成下面这样,则第二句编译不进:
- if G_IsOnLine then
- vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
- 这里用局部变量bOnLine转接一下,能解决问题。
- ---------------------------------------------------------------------------}
- bOnLine := G_IsCloud;
- if bOnLine then
- begin
- vNew.Rec.ValueByName('WebID').AsInteger := AFolderID;
- vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
- vNew.Rec.ValueByName('WebFolderLevel').AsInteger := AFolderLevel;
- end;
- vNew.Rec.EndUpdate;
- Result := vNew;
- Save;
- end
- else
- raise Exception.Create('存在同名类别!');
- end;
- function TProjectManagerData.InsertSubProject(const AName: string;
- AParent: TsdIDTreeNode; AFolderID: Integer; AFolderLevel: Integer): TsdIDTreeNode;
- var
- vNew: TsdIDTreeNode;
- bOnLine, bCanCreate: Boolean;
- begin
- if G_IsCloud then
- bCanCreate := True
- else if (not G_IsCloud) and (not ExistProject(AName, AParent)) then
- bCanCreate := True
- else
- bCanCreate := False;
- if bCanCreate then
- begin
- RefreshSeedID;
- vNew := FProjectsTree.Add(AParent.ID, -1);
- vNew.Rec.ValueByName('Type').AsInteger := 0;
- vNew.Rec.ValueByName('Name').AsString := AName;
- {---------------------------------------------------------------------------
- 恼火的问题:直接写成下面这样,则第二句编译不进:
- if G_IsOnLine then
- vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
- 这里用局部变量bOnLine转接一下,能解决问题。
- ---------------------------------------------------------------------------}
- bOnLine := G_IsCloud;
- if bOnLine then
- begin
- vNew.Rec.ValueByName('WebID').AsInteger := AFolderID;
- vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
- vNew.Rec.ValueByName('WebFolderLevel').AsInteger := AFolderLevel;
- end;
- Result := vNew;
- Save;
- end
- else
- raise Exception.Create('存在同名类别!');
- end;
- function TProjectManagerData.InsertTender(const AName: string;
- AParent: TsdIDTreeNode): TsdIDTreeNode;
- var bOnLine: Boolean;
- begin
- if not ExistProject(AName, AParent) then
- begin
- RefreshSeedID;
- Result := FProjectsTree.Add(AParent.ID, -1);
- {---------------------------------------------------------------------------
- 恼火的问题:直接写成下面这样,则第二句编译不进:
- if G_IsOnLine then
- Result.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
- 这里用局部变量bOnLine转接一下,能解决问题。
- ---------------------------------------------------------------------------}
- // if G_IsOnLine then
- // Result.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID; // 编译不进
- bOnLine := G_IsCloud;
- if bOnLine then
- Result.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
-
- Result.Rec.ValueByName('Type').AsInteger := 1;
- Result.Rec.ValueByName('Name').AsString := AName;
- Result.Rec.ValueByName('PhaseCount').AsInteger := 0;
- Result.Rec.ValueByName('AuditStatus').AsInteger := 0;
- Result.Rec.ValueByName('FileName').AsString :=
- ExtractSimpleFileName(GetNewGUIDFileName(GetMyProjectsFilePath));
- Result.Rec.ValueByName('CreateDate').AsString := FormatDateTime('yyyy-mm-dd', Date);
- CreateNewProjectFile(Result.Rec.ValueByName('FileName').AsString);
- Save;
- end
- else
- raise Exception.Create('存在同名标段!');
- end;
- procedure TProjectManagerData.Open;
- var
- sFileName: string;
- FQuery: TADOQuery;
- begin
- sFileName := GetAppFilePath + 'Data\ProjectManager.dat';
- if FileEncrypted(sFileName) then
- SimpleDecrypt(sFileName, sFileName);
- FConnection.Open(sFileName);
- UpdateManagerDataBase;
- sdpProjectsInfo.Connection := FConnection.Connection;
- sddProjectsInfo.Open;
- sdvProjectsInfo.Open;
- sdvProjectsSpare.Open;
- sddProjectsInfo.AddIndex('idxID', 'ID');
- sdvProjectsInfo.IndexName := 'idxID';
- sdpTenderProperty.Connection := FConnection.Connection;
- sddTenderProperty.Open;
- sdvTenderProperty.Open;
- end;
- procedure TProjectManagerData.Save;
- begin
- sddTenderProperty.Save;
- sddProjectsInfo.Save;
- FConnection.Save;
- end;
- procedure TProjectManagerData.UpdateManagerDataBase;
- var
- vUpdator: TUpdateManagerDB;
- begin
- vUpdator := TUpdateManagerDB.Create;
- try
- vUpdator.Update(FConnection);
- finally
- vUpdator.Free;
- end;
- end;
- procedure TProjectManagerData.sdvProjectsInfoGetText(var Text: String;
- ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
- DisplayText: Boolean);
- function NumToAuditStatus(AValue: Integer): string;
- begin
- case AValue of
- -1:
- if ARecord.ValueByName('PhaseCount').AsInteger = 0 then
- Result := '原报'
- else
- Result := '批复';
- 0:
- Result := '原报';
- else
- Result := Format('%d 审', [AValue]);
- end;
- end;
- function GetFormatString(ADigitValue: TsdValue): string;
- begin
- if not ADigitValue.IsNull then
- begin
- case ADigitValue.AsInteger of
- 0: Result := '0';
- 1: Result := '0.#';
- 2: Result := '0.##';
- 3: Result := '0.###';
- 4: Result := '0.####';
- 5: Result := '0.#####';
- 6: Result := '0.######';
- 7: Result := '0.#######';
- 8: Result := '0.########';
- 9: Result := '0.#########';
- else
- Result := '0.##########';
- end;
- end
- else
- Result := '';
- end;
- function FormatCommonTotalPrice(ATotalPrice: Double): string;
- var
- sFormat: string;
- begin
- Result := Text;
- sFormat := GetFormatString(ARecord.ValueByName('CommonDigit'));
- if sFormat <> '' then
- Result := FormatFloat(sFormat, ATotalPrice);
- end;
- function FormatDealPayTotalPrice(ATotalPrice: Double): string;
- var
- sFormat: string;
- begin
- Result := Text;
- sFormat := GetFormatString(ARecord.ValueByName('DealPayDigit'));
- if sFormat <> '' then
- Result := FormatFloat(sFormat, ATotalPrice);
- end;
- begin
- if not Assigned(ARecord) then Exit;
- if SameText(AColumn.FieldName, 'AuditStatus') then
- if ARecord.ValueByName('Type').AsInteger = 1 then
- Text := NumToAuditStatus(AValue.AsInteger)
- else
- Text := ''
- else if DisplayText then
- begin
- if Pos('TotalPrice', AColumn.FieldName) > 0 then
- Text := FormatCommonTotalPrice(AValue.AsFloat)
- else if Pos('PhasePay', AColumn.FieldName) > 0 then
- Text := FormatDealPayTotalPrice(AValue.AsFloat);
- end;
- end;
- procedure TProjectManagerData.DeleteAllTenderFiles(ANode: TsdIDTreeNode);
- var
- iChild: Integer;
- begin
- if ANode.HasChildren then
- for iChild := 0 to ANode.ChildCount - 1 do
- DeleteAllTenderFiles(ANode.ChildNodes[iChild])
- else if ANode.Rec.ValueByName('Type').AsInteger = 1 then
- DeleteFile(GetMyProjectsFilePath + ANode.Rec.ValueByName('FileName').AsString);
- end;
- procedure TProjectManagerData.ReName(const AName: string;
- ANode: TsdIDTreeNode);
- begin
- ANode.Rec.ValueByName('Name').AsString := AName;
- Save;
- end;
- procedure TProjectManagerData.RestoreTender(AID: Integer);
- var
- vNode: TsdIDTreeNode;
- sRestoreFile: string;
- Exportor: TTenderExport;
- begin
- vNode := FProjectsTree.FindNode(AID);
- if not FileExists(GetMyProjectsFilePath + vNode.Rec.ValueByName('FileName').AsString) then Exit;
- sRestoreFile := GetBackUpFilePath + vNode.Rec.ValueByName('Name').AsString
- + '[' + FormatDateTime('yyyy-mm-dd hh,nn,ss', Now) + '].mtf';
- Exportor := TTenderExport.Create(vNode.Rec, sRestoreFile);
- try
- Exportor.Execute;
- finally
- Exportor.Free;
- end;
- end;
- procedure TProjectManagerData.sdvProjectsInfoFilterRecord(
- ARecord: TsdDataRecord; var Allow: Boolean);
- begin
- if G_IsCloud then
- begin
- if ARecord.ValueByName('WebUserID').AsInteger = PHPWeb.UserID then
- Allow := True
- else
- Allow := False;
- end
- else
- begin
- if ARecord.ValueByName('WebUserID').AsInteger = 0 then
- Allow := True
- else
- Allow := False;
- end;
- end;
- procedure TProjectManagerData.DataModuleCreate(Sender: TObject);
- begin
- // 单机版也要过滤:防止单机版程序能显示所有用户的项目。
- // if G_IsOnLine then
- sdvProjectsInfo.Filtered := True;
- sdvProjectsSpare.Filtered := True;
- end;
- function TProjectManagerData.NewID: Integer;
- var
- idxID: TsdIndex;
- begin
- if sddProjectsInfo.RecordCount > 0 then
- begin
- idxID := sddProjectsInfo.FindIndex('idxID');
- Result := idxID.Records[idxID.RecordCount - 1].ValueByName('ID').AsInteger + 1;
- end
- else
- Result := 1;
- end;
- procedure TProjectManagerData.RefreshSeedID;
- begin
- FProjectsTree.SeedID := NewID;
- end;
- function TProjectManagerData.BackupPath(AProjectID: Integer): String;
- var
- Rec: TsdDataRecord;
- begin
- Result := GetAppFilePath + 'FileBackup\TenderBackup';
- Rec := ProjectsTree.FindNode(AProjectID).Rec;
- if Rec.ValueByName('BackupFolder').AsString = '' then
- Rec.ValueByName('BackupFolder').AsString := CreateBackupFolder(AProjectID);
- Result := Result + '\' + Rec.ValueByName('BackupFolder').AsString + '\';
- end;
- function TProjectManagerData.CreateBackupFolder(
- AProjectID: Integer): string;
- function GetParentNames(ANode: TsdIDTreeNode): string;
- var
- stnParent: TsdIDTreeNode;
- begin
- Result := '';
- stnParent := ANode.Parent;
- while Assigned(stnParent) do
- begin
- if Result <> '' then
- Result := stnParent.Rec.ValueByName('Name').AsString + '--' + Result
- else
- Result := stnParent.Rec.ValueByName('Name').AsString;
- stnParent := stnParent.Parent;
- end;
- end;
- var
- stnNode: TsdIDTreeNode;
- sGUID, sPath: string;
- sgs: TStringList;
- begin
- stnNode := ProjectsTree.FindNode(AProjectID);
- Result := stnNode.Rec.ValueByName('BackupFolder').AsString;
- if Result <> '' then Exit;
- sPath := GetAppFilePath + 'FileBackup\TenderBackup\';
- sGUID := GetNewGUIDFileName(sPath);
- if FileExists(sGUID) then DeleteFile(sGUID);
- CreateDirectoryInDeep(sGUID);
- sgs := TStringList.Create;
- try
- sgs.Add('项目备份文件夹');
- sgs.Add(Format('项目名称:%s', [stnNode.Rec.ValueByName('Name').AsString]));
- sgs.Add(Format('所属项目:%s', [GetParentNames(stnNode)]));
- sgs.Add(Format('创建时间:%s', [DateTimeToStr(Now)]));
- finally
- sgs.SaveToFile(sGUID + '\说明.txt');
- sgs.Free;
- end;
- Result := ExtractSimpleFileName(sGUID)
- end;
- procedure TProjectManagerData.sdvProjectsInfoBeforeDeleteRecord(
- ARecord: TsdDataRecord; var Allow: Boolean);
- var
- sOrgFolder, sNewFolder: string;
- begin
- if ARecord.ValueByName('BackupFolder').AsString <> '' then
- begin
- sOrgFolder := GetAppFilePath + 'FileBackup\TenderBackup\'
- + ARecord.ValueByName('BackupFolder').AsString;
- sNewFolder := GetAppFilePath + 'FileBackup\RecycleBackup\'
- + ARecord.ValueByName('BackupFolder').AsString;
- CopyFileOrFolder(sOrgFolder, sNewFolder);
- DeleteFileOrFolder(sOrgFolder);
- end;
- end;
- procedure TProjectManagerData.AddOpenTenderBackup(AProjectID: Integer);
- var
- vBackupManager: TBackupManager;
- BackupRec, Rec: TsdDataRecord;
- sBackupFile: string;
- begin
- Rec := sddProjectsInfo.FindKey('idxID', AProjectID);
- if not Assigned(Rec) then Exit;
- vBackupManager := TBackupManager.Create;
- try
- vBackupManager.LoadBackupFile(BackupPath(AProjectID));
- if vBackupManager.LastestOpenBackupIsToday then Exit;
- sBackupFile := vBackupManager.OpenBackupFile;
- if FileExists(sBackupFile) then DeleteFile(sBackupFile);
- ExportTender(Rec, sBackupFile);
- finally
- vBackupManager.Free;
- end;
- end;
- procedure TProjectManagerData.AddSaveTenderBackup(AProjectID: Integer);
- var
- vBackupManager: TBackupManager;
- BackupRec, Rec: TsdDataRecord;
- sBackupFile: string;
- begin
- Rec := sddProjectsInfo.FindKey('idxID', AProjectID);
- if not Assigned(Rec) then Exit;
- vBackupManager := TBackupManager.Create;
- try
- vBackupManager.LoadBackupFile(BackupPath(AProjectID));
- sBackupFile := vBackupManager.SaveBackupFile;
- if FileExists(sBackupFile) then DeleteFile(sBackupFile);
- ExportTender(Rec, sBackupFile);
- finally
- vBackupManager.Free;
- end;
- end;
- procedure TProjectManagerData.ExportTender(ARec: TsdDataRecord;
- AFileName: string);
- var
- Exportor : TTenderExport;
- begin
- Exportor := TTenderExport.Create(ARec, AFileName);
- try
- Exportor.Execute;
- finally
- Exportor.Free;
- end;
- end;
- function TProjectManagerData.ProjectID(const AName: string;
- ANode: TsdIDTreeNode): Integer;
- var
- vCur: TsdIDTreeNode;
- begin
- Result := -1;
- if not Assigned(ANode) then Exit;
- vCur := ANode.FirstChild;
- while (Result = -1) and Assigned(vCur) do
- begin
- if vCur.Rec.ValueByName('Name').AsString = AName then
- Result := vCur.ID;
- vCur := vCur.NextSibling;
- end;
- end;
- procedure TProjectManagerData.DeleteAttachmentFiles(ANode: TsdIDTreeNode);
- var sDir: string;
- procedure DeleteAtch(ANode: TsdIDTreeNode);
- begin
- // 如果文件名为空,删除时会删除整个附件文件夹,危险!
- if ANode.Rec.ValueByName('FileName').AsString = '' then Exit;
- sDir := GetMyProjectsFilePath + 'Attachment\' + ANode.Rec.ValueByName('FileName').AsString;
- DeleteFolder(sDir);
- end;
- procedure DeleteNodes(ANode: TsdIDTreeNode);
- begin
- if ANode = nil then Exit;
- if ANode.FirstChild <> nil then
- DeleteNodes(ANode.FirstChild);
- if ANode.Rec.ValueByName('Type').AsInteger = 1 then
- DeleteAtch(ANode);
- if ANode.NextSibling <> nil then
- DeleteNodes(ANode.NextSibling);
- end;
- begin
- if not G_IsCloud then
- begin
- if not Assigned(ANode) then Exit;
- if ANode.Rec.ValueByName('Type').AsInteger = 0 then
- begin
- if Assigned(ANode.FirstChild) then
- DeleteNodes(ANode.FirstChild);
- end
- else
- DeleteAtch(ANode);
- end;
- end;
- procedure TProjectManagerData.CalculateParentInfo(AID: Integer);
- procedure ResetDigit(ANode: TsdIDTreeNode);
- var
- iChild, iCommonDigit, iDealPayDigit: Integer;
- vChild: TsdIDTreeNode;
- begin
- iCommonDigit := 0;
- iDealPayDigit := 0;
- for iChild := 0 to ANode.ChildCount - 1 do
- begin
- vChild := ANode.ChildNodes[iChild];
- iCommonDigit := Max(iCommonDigit, vChild.Rec.ValueByName('CommonDigit').AsInteger);
- iDealPayDigit := Max(iDealPayDigit, vChild.Rec.ValueByName('DealPayDigit').AsInteger);
- end;
- ANode.Rec.ValueByName('CommonDigit').AsInteger := iCommonDigit;
- ANode.Rec.ValueByName('DealPayDigit').AsInteger := iDealPayDigit;
- end;
- procedure ReCalculateInfo(ANode: TsdIDTreeNode);
- var
- fDeal, fDeal_BGL, fPhase, fEndDeal, fEndChange, fEnd, fPre, fPhasePay, fEndPhasePay: Double;
- iChild, iCommonDigit, iDealPayDigit: Integer;
- vChild: TsdIDTreeNode;
- begin
- fDeal := 0;
- fDeal_BGL := 0;
- fPhase := 0;
- fEndDeal := 0;
- fEndChange := 0;
- fEnd := 0;
- fPre := 0;
- fPhasePay := 0;
- fEndPhasePay := 0;
- iCommonDigit := - ANode.Rec.ValueByName('CommonDigit').AsInteger;
- iDealPayDigit := - ANode.Rec.ValueByName('DealPayDigit').AsInteger;
- for iChild := 0 to ANode.ChildCount - 1 do
- begin
- vChild := ANode.ChildNodes[iChild];
- fDeal := fDeal + vChild.Rec.ValueByName('DealTotalPrice').AsFloat;
- fDeal_BGL := fDeal_BGL + vChild.Rec.ValueByName('Deal_BGLTotalPrice').AsFloat;
- fPhase := fPhase + vChild.Rec.ValueByName('PhaseTotalPrice').AsFloat;
- fEndDeal := fEndDeal + vChild.Rec.ValueByName('EndDealTotalPrice').AsFloat;
- fEndChange := fEndChange + vChild.Rec.ValueByName('EndChangeTotalPrice').AsFloat;
- fEnd := fEnd + vChild.Rec.ValueByName('EndTotalPrice').AsFloat;
- fPre := fPre + vChild.Rec.ValueByName('PreTotalPrice').AsFloat;
- fPhasePay := fPhasePay + vChild.Rec.ValueByName('PhasePay').AsFloat;
- fEndPhasePay := fEndPhasePay + vChild.Rec.ValueByName('EndPhasePay').AsFloat;
- end;
- ANode.Rec.ValueByName('DealTotalPrice').AsFloat := CommonRoundTo(fDeal, iCommonDigit);
- ANode.Rec.ValueByName('Deal_BGLTotalPrice').AsFloat := CommonRoundTo(fDeal_BGL, iCommonDigit);
- ANode.Rec.ValueByName('PhaseTotalPrice').AsFloat := CommonRoundTo(fPhase, iCommonDigit);
- ANode.Rec.ValueByName('EndDealTotalPrice').AsFloat := CommonRoundTo(fEndDeal, iCommonDigit);
- ANode.Rec.ValueByName('EndChangeTotalPrice').AsFloat := CommonRoundTo(fEndChange, iCommonDigit);
- ANode.Rec.ValueByName('EndTotalPrice').AsFloat := CommonRoundTo(fEnd, iCommonDigit);
- ANode.Rec.ValueByName('PreTotalPrice').AsFloat := CommonRoundTo(fPre, iCommonDigit);
- ANode.Rec.ValueByName('PhasePay').AsFloat := CommonRoundTo(fPhasePay, iDealPayDigit);
- ANode.Rec.ValueByName('EndPhasePay').AsFloat := CommonRoundTo(fEndPhasePay, iDealPayDigit);
- end;
- var
- vNode, vChild: TsdIDTreeNode;
- iChild: Integer;
- begin
- if AID = -1 then Exit;
- vNode := ProjectsTree.FindNode(AID);
- if (not Assigned(vNode)) or (vNode.Rec.ValueByName('Type').AsInteger = 1) then Exit;
- ResetDigit(vNode);
- ReCalculateInfo(vNode);
- CalculateParentInfo(vNode.ParentID);
- end;
- end.
|