tpPartTenderSet.pas 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. unit tpPartTenderSet;
  2. interface
  3. uses
  4. Classes, tpPartTender, tpPeg, tpPricePartSettingFrm;
  5. type
  6. TtpPartTenderSet = class
  7. private
  8. FPartTenders: TList;
  9. FPartPegs: TStringList;
  10. FPricePartInfo: TPricePartInfo;
  11. FSetFrame: TObject;
  12. function GetEndPricePart(ABegin: Double; APegs: TtpPegList): Double;
  13. procedure ExecutePricePart(APegs: TtpPegList);
  14. procedure ExecutePegPart(APegs: TtpPegList);
  15. function GetPartTender(AIndex: Integer): TtpPartTender;
  16. function GetTenderCount: Integer;
  17. public
  18. constructor Create;
  19. destructor Destroy; override;
  20. procedure PegPart(APegs: TtpPegList);
  21. procedure PricePart(APegs: TtpPegList);
  22. property TenderCount: Integer read GetTenderCount;
  23. property PartTender[AIndex: Integer]: TtpPartTender read GetPartTender;
  24. property SetFrame: TObject read FSetFrame write FSetFrame;
  25. end;
  26. implementation
  27. uses
  28. ZhAPI, mPegFilter, tpPartTenderSetFme, Math, ProgressHintFrm,
  29. SysUtils, tpPegPartSettingFrm, Forms, Controls;
  30. { TtpPartTenderSet }
  31. constructor TtpPartTenderSet.Create;
  32. begin
  33. FPricePartInfo := TPricePartInfo.Create;
  34. FPartTenders := TList.Create;
  35. FPartPegs := TStringList.Create;
  36. end;
  37. destructor TtpPartTenderSet.Destroy;
  38. begin
  39. FPartPegs.Free;
  40. ClearObjects(FPartTenders);
  41. FPartTenders.Free;
  42. FPricePartInfo.Free;
  43. inherited;
  44. end;
  45. procedure TtpPartTenderSet.ExecutePegPart(APegs: TtpPegList);
  46. var
  47. i: Integer;
  48. vPartTender: TtpPartTender;
  49. begin
  50. Screen.Cursor := crHourGlass;
  51. try
  52. ClearObjects(FPartTenders);
  53. for i := 0 to FPartPegs.Count - 1 do
  54. begin
  55. PegFilter.Filter(FPartPegs.Strings[i]);
  56. vPartTender := TtpPartTender.Create;
  57. FPartTenders.Add(vPartTender);
  58. vPartTender.FilterPegs(PegFilter, APegs);
  59. end;
  60. TtpPartTenderSetFrame(FSetFrame).RefreshData;
  61. finally
  62. Screen.Cursor := crDefault;
  63. end;
  64. end;
  65. procedure TtpPartTenderSet.ExecutePricePart(APegs: TtpPegList);
  66. var
  67. iTender: Integer;
  68. fBegin, fEnd: Double;
  69. vPartTender: TtpPartTender;
  70. begin
  71. Screen.Cursor := crHourGlass;
  72. ShowProgressHint('正在进行标段划分(金额模式)运算...');
  73. try
  74. ClearObjects(FPartTenders);
  75. fBegin := APegs.BeginPegNum;
  76. fEnd := fBegin;
  77. iTender := 1;
  78. while fEnd < APegs.EndPegNum do
  79. begin
  80. UpdateProgressHint(Format('正在划分第%d个标段...', [iTender]));
  81. fEnd := GetEndPricePart(fBegin, APegs);
  82. UpdateProgressHint(Format('正在确认第%d个标段数据...', [iTender]));
  83. vPartTender := TtpPartTender.Create;
  84. FPartTenders.Add(vPartTender);
  85. vPartTender.FilterPegs(fBegin, fEnd, APegs);
  86. fBegin := fEnd;
  87. Inc(iTender);
  88. end;
  89. TtpPartTenderSetFrame(FSetFrame).RefreshData;
  90. finally
  91. CloseProgressHint;
  92. Screen.Cursor := crDefault;
  93. end;
  94. end;
  95. function TtpPartTenderSet.GetEndPricePart(ABegin: Double;
  96. APegs: TtpPegList): Double;
  97. var
  98. fEnd1, fTotalPrice1: Double;
  99. fTotalPrice: Double;
  100. begin
  101. Result := ABegin + FPricePartInfo.MinLength * 1000;
  102. if Result < APegs.EndPegNum then
  103. begin
  104. fTotalPrice := APegs.TrialTotalPrice(ABegin, Result);
  105. while (fTotalPrice < FPricePartInfo.PartPrice) and (Result < APegs.EndPegNum) do
  106. begin
  107. Result := Min(APegs.EndPegNum, Result + FPricePartInfo.MinStep);
  108. fTotalPrice := APegs.TrialTotalPrice(ABegin, Result);
  109. end;
  110. if (APegs.EndPegNum - Result) > FPricePartInfo.MinStep then
  111. begin
  112. fEnd1 := Result - FPricePartInfo.MinStep;
  113. fTotalPrice1 := APegs.TrialTotalPrice(ABegin, fEnd1);
  114. if Abs(fTotalPrice1 - FPricePartInfo.PartPrice) < Abs(fTotalPrice - FPricePartInfo.PartPrice) then
  115. Result := fEnd1;
  116. end
  117. else
  118. Result := APegs.EndPegNum;
  119. end
  120. else
  121. Result := APegs.EndPegNum;
  122. end;
  123. function TtpPartTenderSet.GetPartTender(AIndex: Integer): TtpPartTender;
  124. begin
  125. if AIndex < FPartTenders.Count then
  126. Result := TtpPartTender(FPartTenders.Items[AIndex])
  127. else
  128. Result := nil;
  129. end;
  130. function TtpPartTenderSet.GetTenderCount: Integer;
  131. begin
  132. Result := FPartTenders.Count;
  133. end;
  134. procedure TtpPartTenderSet.PegPart(APegs: TtpPegList);
  135. begin
  136. if FPartPegs.Count = 0 then
  137. FPartPegs.Add(APegs.BeginPeg+'~'+APegs.EndPeg);
  138. if PegPartSetting(FPartPegs) then
  139. ExecutePegPart(APegs);
  140. end;
  141. procedure TtpPartTenderSet.PricePart(APegs: TtpPegList);
  142. begin
  143. if PricePartSetting(FPricePartInfo) then
  144. ExecutePricePart(APegs);
  145. end;
  146. end.