ProjGather.pas 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. unit ProjGather;
  2. interface
  3. uses
  4. Classes, ProjGatherTree, GatherProjInfo, ProjectData, BillsTree, CalcData;
  5. type
  6. TProjGather = class;
  7. TWriteGatherData = procedure (AGather: TProjGather) of Object;
  8. TProjGather = class
  9. private
  10. FWriter: TWriteGatherData;
  11. FXmjCompare: Integer;
  12. FGclCompare: Integer;
  13. FTree: TProjGatherTree;
  14. FProjs: TList;
  15. FProjectData: TProjectData;
  16. procedure OpenProjectData(AProj: TGatherProjInfo);
  17. procedure FreeProjectData;
  18. function FindBillsNode(ANode: TBillsIDTreeNode; AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  19. function CreateBillsNode(ANode: TBillsIDTreeNode; AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  20. procedure AddProjCalcData(AProjCalc: TProjCalc; ANode: TBillsIDTreeNode);
  21. function GatherBillsNode(ANode: TBillsIDTreeNode; AParent: TProjGatherTreeNode;
  22. AProjIndex: Integer): TProjGatherTreeNode;
  23. procedure GatherBills(ANode: TBillsIDTreeNode; AParent: TProjGatherTreeNode; AProjIndex: Integer);
  24. procedure GatherProj(AProj: TGatherProjInfo; AProjIndex: Integer);
  25. public
  26. constructor Create(AWriter: TWriteGatherData; AXmjCompare, AGclCompare: Integer);
  27. destructor Destroy; override;
  28. procedure Gather(AProjs: TList);
  29. property Projs: TList read FProjs;
  30. property Tree: TProjGatherTree read FTree;
  31. end;
  32. implementation
  33. uses
  34. Globals, UtilMethods, sdIDTree, sdDB, mDataRecord, BillsMeasureDm;
  35. { TProjGather }
  36. procedure TProjGather.AddProjCalcData(AProjCalc: TProjCalc;
  37. ANode: TBillsIDTreeNode);
  38. var
  39. StageRec: TStageRecord;
  40. begin
  41. AProjCalc.Compile.Org.AddQuantity(ANode.Rec.OrgQuantity.AsFloat);
  42. AProjCalc.Compile.Org.AddTotalPrice(ANode.Rec.OrgTotalPrice.AsFloat);
  43. AProjCalc.Compile.Mis.AddQuantity(ANode.Rec.MisQuantity.AsFloat);
  44. AProjCalc.Compile.Mis.AddTotalPrice(ANode.Rec.MisTotalPrice.AsFloat);
  45. AProjCalc.Compile.Oth.AddQuantity(ANode.Rec.OthQuantity.AsFloat);
  46. AProjCalc.Compile.Oth.AddTotalPrice(ANode.Rec.OthTotalPrice.AsFloat);
  47. AProjCalc.Compile.SubTotal.AddQuantity(ANode.Rec.Quantity.AsFloat);
  48. AProjCalc.Compile.SubTotal.AddTotalPrice(ANode.Rec.TotalPrice.AsFloat);
  49. AProjCalc.AddMeasure.Deal.AddQuantity(ANode.Rec.AddDealQuantity.AsFloat);
  50. AProjCalc.AddMeasure.Deal.AddTotalPrice(ANode.Rec.AddDealTotalPrice.AsFloat);
  51. AProjCalc.AddMeasure.Qc.AddQuantity(ANode.Rec.AddQcQuantity.AsFloat);
  52. AProjCalc.AddMeasure.Qc.AddTotalPrice(ANode.Rec.AddQcTotalPrice.AsFloat);
  53. AProjCalc.AddMeasure.Gather.AddQuantity(ANode.Rec.AddGatherQuantity.AsFloat);
  54. AProjCalc.AddMeasure.Gather.AddTotalPrice(ANode.Rec.AddGatherTotalPrice.AsFloat);
  55. AProjCalc.DgnQuantity1 := AProjCalc.DgnQuantity1 + ANode.Rec.DgnQuantity1.AsFloat;
  56. AProjCalc.DgnQuantity2 := AProjCalc.DgnQuantity2 + ANode.Rec.DgnQuantity2.AsFloat;
  57. AProjCalc.DealDgnQuantity1 := AProjCalc.DealDgnQuantity1 + ANode.Rec.DealDgnQuantity1.AsFloat;
  58. AProjCalc.DealDgnQuantity2 := AProjCalc.DealDgnQuantity2 + ANode.Rec.DealDgnQuantity2.AsFloat;
  59. AProjCalc.CDgnQuantity1 := AProjCalc.CDgnQuantity1 + ANode.Rec.CDgnQuantity1.AsFloat;
  60. AProjCalc.CDgnQuantity2 := AProjCalc.CDgnQuantity2 + ANode.Rec.CDgnQuantity2.AsFloat;
  61. StageRec := ANode.StageRec;
  62. if Assigned(StageRec) then
  63. begin
  64. AProjCalc.CurMeasure.Deal.AddQuantity(StageRec.DealQuantity.AsFloat);
  65. AProjCalc.CurMeasure.Deal.AddTotalPrice(StageRec.DealTotalPrice.AsFloat);
  66. AProjCalc.CurMeasure.Qc.AddQuantity(StageRec.QcQuantity.AsFloat);
  67. AProjCalc.CurMeasure.Qc.AddTotalPrice(StageRec.QcTotalPrice.AsFloat);
  68. AProjCalc.CurMeasure.Gather.AddQuantity(StageRec.GatherQuantity.AsFloat);
  69. AProjCalc.CurMeasure.Gather.AddTotalPrice(StageRec.GatherTotalPrice.AsFloat);
  70. AProjCalc.PreMeasure.Deal.AddQuantity(StageRec.PreDealQuantity.AsFloat);
  71. AProjCalc.PreMeasure.Deal.AddTotalPrice(StageRec.PreDealTotalPrice.AsFloat);
  72. AProjCalc.PreMeasure.Qc.AddQuantity(StageRec.PreQcQuantity.AsFloat);
  73. AProjCalc.PreMeasure.Qc.AddTotalPrice(StageRec.PreQcTotalPrice.AsFloat);
  74. AProjCalc.PreMeasure.Gather.AddQuantity(StageRec.PreGatherQuantity.AsFloat);
  75. AProjCalc.PreMeasure.Gather.AddTotalPrice(StageRec.PreGatherTotalPrice.AsFloat);
  76. AProjCalc.EndMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  77. AProjCalc.EndMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  78. AProjCalc.EndMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  79. AProjCalc.EndMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  80. AProjCalc.EndMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  81. AProjCalc.EndMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  82. end;
  83. end;
  84. constructor TProjGather.Create(AWriter: TWriteGatherData;
  85. AXmjCompare, AGclCompare: Integer);
  86. begin
  87. FWriter := AWriter;
  88. FXmjCompare := AXmjCompare;
  89. FGclCompare := AGclCompare;
  90. end;
  91. function TProjGather.CreateBillsNode(ANode: TBillsIDTreeNode;
  92. AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  93. var
  94. vNextSibling: TProjGatherTreeNode;
  95. begin
  96. vNextSibling := FTree.FindNextSibling(AParent, ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString);
  97. if ANode.ID < 100 then
  98. Result := FTree.AddNode(AParent, vNextSibling, ANode.ID)
  99. else
  100. Result := FTree.AddNode(AParent, vNextSibling);
  101. Result.Code := ANode.Rec.Code.AsString;
  102. Result.B_Code := ANode.Rec.B_Code.AsString;
  103. Result.Name := ANode.Rec.Name.AsString;
  104. Result.Units := ANode.Rec.Units.AsString;
  105. Result.Price := ANode.Rec.Price.AsFloat;
  106. Result.XiangCode := ANode.Rec.XiangCode.AsString;
  107. Result.MuCode := ANode.Rec.MuCode.AsString;
  108. Result.JieCode := ANode.Rec.JieCode.AsString;
  109. Result.XiMuCode := ANode.Rec.XimuCode.AsString;
  110. Result.IndexCode := ANode.Rec.IndexCode.AsString;
  111. end;
  112. destructor TProjGather.Destroy;
  113. begin
  114. inherited;
  115. end;
  116. function TProjGather.FindBillsNode(ANode: TBillsIDTreeNode;
  117. AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  118. var
  119. iCompareType: Integer;
  120. begin
  121. if ANode.ID > 100 then
  122. begin
  123. if ANode.Rec.B_Code.AsString <> '' then
  124. iCompareType := FGclCompare
  125. else
  126. iCompareType := FXmjCompare;
  127. case iCompareType of
  128. // °´±àºÅ
  129. 0: if (ANode.Rec.Code.AsString <> '') or (ANode.Rec.B_Code.asString <> '') then
  130. Result := FTree.FindNode(AParent, ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString, ANode.Rec.Price.AsFloat)
  131. else
  132. Result := FTree.FindNode(AParent, ANode.Rec.Name.AsString, ANode.Rec.Price.AsFloat);
  133. // °´Ãû³Æ
  134. 1: Result := FTree.FindNode(AParent, ANode.Rec.Name.AsString, ANode.Rec.Price.AsFloat);
  135. // °´±àºÅ+Ãû³Æ
  136. 2: Result := FTree.FindNode(AParent, ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString, ANode.Rec.Name.AsString, ANode.Rec.Price.AsFloat);
  137. end;
  138. end
  139. else
  140. Result := FTree.FindNode(ANode.ID);
  141. end;
  142. procedure TProjGather.FreeProjectData;
  143. begin
  144. if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
  145. FProjectData.Free;
  146. end;
  147. procedure TProjGather.Gather(AProjs: TList);
  148. var
  149. i: Integer;
  150. begin
  151. FProjs := AProjs;
  152. FTree := TProjGatherTree.Create(FProjs.Count);
  153. FTree.NewNodeID := 101;
  154. try
  155. for i := 0 to FProjs.Count - 1 do
  156. GatherProj(TGatherProjInfo(FProjs.Items[i]), i);
  157. FTree.CalculateAll;
  158. if Assigned(FWriter) then
  159. FWriter(Self);
  160. finally
  161. FTree.Free;
  162. end;
  163. end;
  164. procedure TProjGather.GatherBills(ANode: TBillsIDTreeNode;
  165. AParent: TProjGatherTreeNode; AProjIndex: Integer);
  166. var
  167. vCur: TProjGatherTreeNode;
  168. begin
  169. if not Assigned(ANode) then Exit;
  170. vCur := GatherBillsNode(ANode, AParent, AProjIndex);
  171. GatherBills(TBillsIDTreeNode(ANode.FirstChild), vCur, AProjIndex);
  172. GatherBills(TBillsIDTreeNode(ANode.NextSibling), AParent, AProjIndex );
  173. end;
  174. function TProjGather.GatherBillsNode(ANode: TBillsIDTreeNode;
  175. AParent: TProjGatherTreeNode; AProjIndex: Integer): TProjGatherTreeNode;
  176. begin
  177. Result := FindBillsNode(ANode, AParent);
  178. if not Assigned(Result) then
  179. Result := CreateBillsNode(ANode, AParent);
  180. AddProjCalcData(Result.GatherCalc, ANode);
  181. AddProjCalcData(Result.Proj[AProjIndex], ANode);
  182. end;
  183. procedure TProjGather.GatherProj(AProj: TGatherProjInfo; AProjIndex: Integer);
  184. begin
  185. OpenProjectData(AProj);
  186. try
  187. with FProjectData.BillsMeasureData do
  188. GatherBills(TMeasureBillsIDTreeNode(BillsMeasureTree.FirstNode), nil, AProjIndex);
  189. finally
  190. FreeProjectData;
  191. end;
  192. end;
  193. procedure TProjGather.OpenProjectData(AProj: TGatherProjInfo);
  194. begin
  195. FProjectData := OpenProjectManager.FindProjectData(AProj.ProjectID);
  196. if not Assigned(FProjectData) then
  197. begin
  198. FProjectData := TProjectData.Create;
  199. FProjectData.OpenForReport3(GetMyProjectsFilePath + AProj.FileName);
  200. end;
  201. end;
  202. end.