tpPartTender.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. unit tpPartTender;
  2. interface
  3. uses
  4. Classes, tpPeg, mPegFilter, tpPeg_GclDm, tpGatherGcl, tpPegGclGatherDm;
  5. type
  6. // According to the OD Peg
  7. TtpPartTender = class
  8. private
  9. FInPegs: TList;
  10. FTotalPrice: Double;
  11. FRelaPegs: TList;
  12. FRelaTotalPrice: Double;
  13. FBeginPeg: string;
  14. FBeginPegNum: Double;
  15. FEndPeg: string;
  16. FEndPegNum: Double;
  17. FInPegData: TtpPeg_GclData;
  18. FInGclGatherData: TtpPegGclGatherData;
  19. FRelaPegData: TtpPeg_GclData;
  20. procedure ResetPegInfo(APegFilter: TPegFilter); overload;
  21. function GetPegsTotalPrice(APegs: TList): Double;
  22. procedure Calculate;
  23. procedure GatherInGclBills;
  24. procedure ExecuteFilter(APegs: TtpPegList);
  25. function GetInPeg(AIndex: Integer): TtpPegNode;
  26. function GetInPegCount: Integer;
  27. function GetRelaPeg(AIndex: Integer): TtpPegNode;
  28. function GetRelaPegCount: Integer;
  29. public
  30. constructor Create;
  31. destructor Destroy; override;
  32. procedure Clear;
  33. procedure FilterPegs(APegFilter: TPegFilter; APegs: TtpPegList); overload;
  34. procedure FilterPegs(ABeginPegNum, AEndPegNum: Double; APegs: TtpPegList); overload;
  35. property BeginPeg: string read FBeginPeg;
  36. property BeginPegNum: Double read FBeginPegNum;
  37. property EndPeg: string read FEndPeg;
  38. property EndPegNum: Double read FEndPegNum;
  39. property InPegCount: Integer read GetInPegCount;
  40. property InPeg[AIndex: Integer]: TtpPegNode read GetInPeg;
  41. property TotalPrice: Double read FTotalPrice;
  42. property RelaPegCount: Integer read GetRelaPegCount;
  43. property RelaPeg[AIndex: Integer]: TtpPegNode read GetRelaPeg;
  44. property RelaTotalPrice: Double read FRelaTotalPrice;
  45. property InPegData: TtpPeg_GclData read FInPegData;
  46. property InGclGatherData: TtpPegGclGatherData read FInGclGatherData;
  47. property RelaPegData: TtpPeg_GclData read FRelaPegData;
  48. end;
  49. implementation
  50. uses
  51. ZhAPI, tpGatherTree, UtilMethods;
  52. { TtpPartTender }
  53. procedure TtpPartTender.Calculate;
  54. begin
  55. FTotalPrice := GetPegsTotalPrice(FInPegs);
  56. FRelaTotalPrice := GetPegsTotalPrice(FRelaPegs);
  57. end;
  58. procedure TtpPartTender.Clear;
  59. begin
  60. FInPegs.Clear;
  61. FRelaPegs.Clear;
  62. end;
  63. constructor TtpPartTender.Create;
  64. begin
  65. FInPegs := TList.Create;
  66. FRelaPegs := TList.Create;
  67. FInPegData := TtpPeg_GclData.Create(nil);
  68. FInGclGatherData :=TtpPegGclGatherData.Create(nil);
  69. FRelaPegData := TtpPeg_GclData.Create(nil);
  70. end;
  71. destructor TtpPartTender.Destroy;
  72. begin
  73. Clear;
  74. FRelaPegData.Free;
  75. FInGclGatherData.Free;
  76. FInPegData.Free;
  77. FRelaPegs.Free;
  78. FInPegs.Free;
  79. inherited;
  80. end;
  81. procedure TtpPartTender.FilterPegs(APegFilter: TPegFilter; APegs: TtpPegList);
  82. begin
  83. ResetPegInfo(APegFilter);
  84. ExecuteFilter(APegs);
  85. end;
  86. procedure TtpPartTender.ExecuteFilter(APegs: TtpPegList);
  87. var
  88. iPeg: Integer;
  89. vPegNode: TtpPegNode;
  90. begin
  91. for iPeg := 0 to APegs.Count - 1 do
  92. begin
  93. vPegNode := APegs.Peg[iPeg];
  94. if vPegNode.IsPegIn(FBeginPegNum, FEndPegNum) then
  95. FInPegs.Add(vPegNode)
  96. else if vPegNode.IsPegRela(FBeginPegNum, FEndPegNum) then
  97. FRelaPegs.Add(vPegNode);
  98. end;
  99. Calculate;
  100. FInPegData.LoadData(FInPegs);
  101. FRelaPegData.LoadData(FRelaPegs);
  102. GatherInGclBills;
  103. end;
  104. procedure TtpPartTender.FilterPegs(ABeginPegNum, AEndPegNum: Double;
  105. APegs: TtpPegList);
  106. begin
  107. Clear;
  108. FBeginPegNum := ABeginPegNum;
  109. FBeginPeg := Num2Peg(FBeginPegNum);
  110. FEndPegNum := AEndPegNum;
  111. FEndPeg := Num2Peg(FEndPegNum);
  112. ExecuteFilter(APegs);
  113. end;
  114. procedure TtpPartTender.GatherInGclBills;
  115. var
  116. vGcls: TtpGatherGclList;
  117. iPeg, iGcl: Integer;
  118. vPeg: TtpPegNode;
  119. begin
  120. vGcls := TtpGatherGclList.Create;
  121. try
  122. for iPeg := 0 to FInPegs.Count - 1 do
  123. begin
  124. vPeg := TtpPegNode(FInPegs.Items[iPeg]);
  125. for iGcl := 0 to vPeg.RelaGclNodes.Count - 1 do
  126. vGcls.GatherNode(TtpGatherTreeNode(vPeg.RelaGclNodes.Items[iGcl]), vPeg.RelaNode);
  127. end;
  128. FInGclGatherData.LoadGclGatherData(vGcls);
  129. finally
  130. vGcls.Free;
  131. end;
  132. end;
  133. function TtpPartTender.GetInPeg(AIndex: Integer): TtpPegNode;
  134. begin
  135. Result := TtpPegNode(FInPegs.Items[AIndex]);
  136. end;
  137. function TtpPartTender.GetInPegCount: Integer;
  138. begin
  139. Result := FInPegs.Count;
  140. end;
  141. function TtpPartTender.GetPegsTotalPrice(APegs: TList): Double;
  142. var
  143. iPeg: Integer;
  144. vPeg: TtpPegNode;
  145. begin
  146. Result := 0;
  147. for iPeg := 0 to APegs.Count - 1 do
  148. begin
  149. vPeg := TtpPegNode(APegs.Items[iPeg]);
  150. Result := Result + vPeg.RelaNode.TotalPrice;
  151. end;
  152. end;
  153. function TtpPartTender.GetRelaPeg(AIndex: Integer): TtpPegNode;
  154. begin
  155. Result := TtpPegNode(FRelaPegs.Items[AIndex]);
  156. end;
  157. function TtpPartTender.GetRelaPegCount: Integer;
  158. begin
  159. Result := FRelaPegs.Count;
  160. end;
  161. procedure TtpPartTender.ResetPegInfo(APegFilter: TPegFilter);
  162. begin
  163. Clear;
  164. FBeginPeg := APegFilter.BeginPeg;
  165. FBeginPegNum := APegFilter.BeginPegNum;
  166. FEndPeg := APegFilter.EndPeg;
  167. FEndPegNum := APegFilter.EndPegNum;
  168. end;
  169. end.