| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 | unit tpBaseGatherData;interfaceuses  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;implementationuses  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.
 |