123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- unit tpBaseGatherData;
- interface
- uses
- Classes, tpGatherTree, tpPeg, BillsTree, tpSelectTenderNode,
- ProjectData, tpNoPegDm;
- type
- TtpBaseGatherData = class
- private
- FTree: TtpGatherTree;
- FPegs: TtpPegList;
- FNoPegTree: TtpGatherTree;
- FNoPegData: TtpNoPegData;
- function AddBillsNode(ANode: TBillsIDTreeNode; AParent: TtpGatherTreeNode): TtpGatherTreeNode;
- procedure CheckPeg(ANode: TtpGatherTreeNode);
- procedure AddBills(ANode: TBillsIDTreeNode; AParent: TtpGatherTreeNode);
- procedure GatherTender(ATender: TtpSelectTenderNode);
- function AddNoPegTreeNode(AOrgNode, AParent: TtpGatherTreeNode): TtpGatherTreeNode;
- procedure FilterNoPegTreeNode(AOrgNode, AParent: TtpGatherTreeNode);
- procedure FilterNoPegTree;
- public
- constructor Create;
- destructor Destroy; override;
- procedure GatherTenders(ATenders: TList);
- property Tree: TtpGatherTree read FTree;
- property Pegs: TtpPegList read FPegs;
- property NoPegData: TtpNoPegData read FNoPegData;
- end;
- implementation
- uses
- ProgressHintFrm, mPegFilter, Globals, UtilMethods, Forms, Controls;
- { TtpBaseGatherData }
- procedure TtpBaseGatherData.AddBills(ANode: TBillsIDTreeNode;
- AParent: TtpGatherTreeNode);
- var
- ACur: TtpGatherTreeNode;
- begin
- if not Assigned(ANode) then Exit;
- ACur := AddBillsNode(ANode, AParent);
- CheckPeg(ACur);
- AddBills(TBillsIDTreeNode(ANode.FirstChild), ACur);
- AddBills(TBillsIDTreeNode(ANode.NextSibling), AParent);
- end;
- function TtpBaseGatherData.AddBillsNode(ANode: TBillsIDTreeNode;
- AParent: TtpGatherTreeNode): TtpGatherTreeNode;
- var
- vNextSibling: TtpGatherTreeNode;
- vPeg: TtpPegNode;
- begin
- Result := FTree.FindNode(AParent, ANode.Rec);
- if not Assigned(Result) then
- begin
- vNextSibling := FTree.FindNextSibling(AParent, ANode.Rec);
- Result := FTree.AddNode(AParent, vNextSibling);
- Result.Code := ANode.Rec.Code.AsString;
- Result.B_Code := ANode.Rec.B_Code.AsString;
- Result.Name := ANode.Rec.Name.AsString;
- Result.Units := ANode.Rec.Units.AsString;
- Result.Price := ANode.Rec.Price.AsFloat;
- Result.DrawingCode := ANode.Rec.DrawingCode.AsString;
- end;
- Result.Quantity := Result.Quantity + ANode.Rec.Quantity.AsFloat;
- Result.TotalPrice := Result.TotalPrice + ANode.Rec.TotalPrice.AsFloat;
- end;
- procedure TtpBaseGatherData.CheckPeg(ANode: TtpGatherTreeNode);
- var
- vPegNode: TtpPegNode;
- begin
- if not Assigned(ANode) then Exit;
- if PegFilter.Filter(ANode.Name) then
- begin
- vPegNode := TtpPegNode.Create(ANode, PegFilter);
- FPegs.AddPegs(vPegNode);
- end;
- end;
- constructor TtpBaseGatherData.Create;
- begin
- FTree := TtpGatherTree.Create;
- FPegs := TtpPegList.Create;
- FNoPegTree := TtpGatherTree.Create;
- FNoPegData := TtpNoPegData.Create;
- end;
- destructor TtpBaseGatherData.Destroy;
- begin
- FNoPegData.Free;
- FNoPegTree.Free;
- FPegs.Free;
- FTree.Free;
- inherited;
- end;
- procedure TtpBaseGatherData.GatherTenders(ATenders: TList);
- var
- iTender: Integer;
- vTender: TtpSelectTenderNode;
- begin
- Screen.Cursor := crHourGlass;
- ShowProgressHint('正在汇总项目', ATenders.Count*2);
- try
- FTree.ClearTreeNodes;
- FPegs.Clear;
- for iTender := 0 to ATenders.Count - 1 do
- begin
- vTender := TtpSelectTenderNode(ATenders.Items[iTender]);
- GatherTender(vTender);
- end;
- FPegs.LoadRelaGclNodes;
- FPegs.SortPegs;
- FilterNoPegTree;
- finally
- CloseProgressHint;
- Screen.Cursor := crDefault;
- end;
- end;
- procedure TtpBaseGatherData.GatherTender(ATender: TtpSelectTenderNode);
- var
- vProjectData: TProjectData;
- procedure OpenProject;
- begin
- vProjectData := OpenProjectManager.FindProjectData(ATender.ID);
- if not Assigned(vProjectData) then
- begin
- vProjectData := TProjectData.Create;
- vProjectData.OpenForReport(GetMyProjectsFilePath + ATender.FileName);
- end;
- ATender.NodeCount := vProjectData.BillsCompileData.BillsCompileTree.Count;
- end;
- procedure FreeProject;
- begin
- if not Assigned(OpenProjectManager.FindProjectData(ATender.ID)) then
- vProjectData.Free;
- end;
- begin
- try
- UpdateProgressHint('正在打开项目: ' + ATender.Name);
- OpenProject;
- UpdateProgressPosition;
- UpdateProgressHint('正在汇总项目: ' + ATender.Name);
- with vProjectData.BillsCompileData do
- AddBills(TBillsIDTreeNode(BillsCompileTree.FirstNode), nil);
- UpdateProgressPosition;
- finally
- FreeProject;
- end;
- end;
- procedure TtpBaseGatherData.FilterNoPegTreeNode(
- AOrgNode, AParent: TtpGatherTreeNode);
- var
- vCur: TtpGatherTreeNode;
- begin
- if not Assigned(AOrgNode) then Exit;
- if not AOrgNode.RelaPeg then
- begin
- vCur := AddNoPegTreeNode(AOrgNode, AParent);
- FilterNoPegTreeNode(TtpGatherTreeNode(AOrgNode.FirstChild), vCur);
- end;
- FilterNoPegTreeNode(TtpGatherTreeNode(AOrgNode.NextSibling), AParent);
- end;
- function TtpBaseGatherData.AddNoPegTreeNode(AOrgNode,
- AParent: TtpGatherTreeNode): TtpGatherTreeNode;
- begin
- Result := FNoPegTree.AddNode(AParent);
- Result.Code := AOrgNode.Code;
- Result.B_Code := AOrgNode.B_Code;
- Result.Name := AOrgNode.Name;
- Result.Units := AOrgNode.Units;
- Result.Price := AOrgNode.Price;
- Result.Quantity := AOrgNode.Quantity;
- Result.TotalPrice := AOrgNode.TotalPrice;
- Result.DgnQuantity1 := AOrgNode.DgnQuantity1;
- Result.DgnQuantity2 := AOrgNode.DgnQuantity2;
- Result.DrawingCode := AOrgNode.DrawingCode;
- end;
- procedure TtpBaseGatherData.FilterNoPegTree;
- begin
- FTree.CheckRelaPeg;
- FilterNoPegTreeNode(TtpGatherTreeNode(FTree.Root.FirstChild), nil);
- FNoPegTree.CalculateAllParent;
- FNoPegData.LoadData(FNoPegTree);
- end;
- end.
|