| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | unit tpPartTenderSet;interfaceuses  Classes, tpPartTender, tpPeg, tpPricePartSettingFrm;type  TtpPartTenderSet = class  private    FPartTenders: TList;    FPartPegs: TStringList;    FPricePartInfo: TPricePartInfo;    FSetFrame: TObject;    function GetEndPricePart(ABegin: Double; APegs: TtpPegList): Double;    procedure ExecutePricePart(APegs: TtpPegList);    procedure ExecutePegPart(APegs: TtpPegList);    function GetPartTender(AIndex: Integer): TtpPartTender;    function GetTenderCount: Integer;  public    constructor Create;    destructor Destroy; override;    procedure PegPart(APegs: TtpPegList);    procedure PricePart(APegs: TtpPegList);    property TenderCount: Integer read GetTenderCount;    property PartTender[AIndex: Integer]: TtpPartTender read GetPartTender;    property SetFrame: TObject read FSetFrame write FSetFrame;  end;implementationuses  ZhAPI, mPegFilter, tpPartTenderSetFme, Math, ProgressHintFrm,  SysUtils, tpPegPartSettingFrm, Forms, Controls;{ TtpPartTenderSet }constructor TtpPartTenderSet.Create;begin  FPricePartInfo := TPricePartInfo.Create;  FPartTenders := TList.Create;  FPartPegs := TStringList.Create;end;destructor TtpPartTenderSet.Destroy;begin  FPartPegs.Free;  ClearObjects(FPartTenders);  FPartTenders.Free;  FPricePartInfo.Free;  inherited;end;procedure TtpPartTenderSet.ExecutePegPart(APegs: TtpPegList);var  i: Integer;  vPartTender: TtpPartTender;begin  Screen.Cursor := crHourGlass;  try    ClearObjects(FPartTenders);    for i := 0 to FPartPegs.Count - 1 do    begin      PegFilter.Filter(FPartPegs.Strings[i]);      vPartTender := TtpPartTender.Create;      FPartTenders.Add(vPartTender);      vPartTender.FilterPegs(PegFilter, APegs);    end;    TtpPartTenderSetFrame(FSetFrame).RefreshData;  finally    Screen.Cursor := crDefault;  end;end;procedure TtpPartTenderSet.ExecutePricePart(APegs: TtpPegList);var  iTender: Integer;  fBegin, fEnd: Double;  vPartTender: TtpPartTender;begin  Screen.Cursor := crHourGlass;  ShowProgressHint('正在进行标段划分(金额模式)运算...');  try    ClearObjects(FPartTenders);    fBegin := APegs.BeginPegNum;    fEnd := fBegin;    iTender := 1;    while fEnd < APegs.EndPegNum do    begin      UpdateProgressHint(Format('正在划分第%d个标段...', [iTender]));      fEnd := GetEndPricePart(fBegin, APegs);      UpdateProgressHint(Format('正在确认第%d个标段数据...', [iTender]));      vPartTender := TtpPartTender.Create;      FPartTenders.Add(vPartTender);      vPartTender.FilterPegs(fBegin, fEnd, APegs);      fBegin := fEnd;      Inc(iTender);    end;    TtpPartTenderSetFrame(FSetFrame).RefreshData;  finally    CloseProgressHint;    Screen.Cursor := crDefault;  end;end;function TtpPartTenderSet.GetEndPricePart(ABegin: Double;  APegs: TtpPegList): Double;var  fEnd1, fTotalPrice1: Double;  fTotalPrice: Double;begin  Result := ABegin + FPricePartInfo.MinLength * 1000;  if Result < APegs.EndPegNum then  begin    fTotalPrice := APegs.TrialTotalPrice(ABegin, Result);    while (fTotalPrice < FPricePartInfo.PartPrice) and (Result < APegs.EndPegNum) do    begin      Result := Min(APegs.EndPegNum, Result + FPricePartInfo.MinStep);      fTotalPrice := APegs.TrialTotalPrice(ABegin, Result);    end;    if (APegs.EndPegNum - Result) > FPricePartInfo.MinStep then    begin      fEnd1 := Result - FPricePartInfo.MinStep;      fTotalPrice1 := APegs.TrialTotalPrice(ABegin, fEnd1);      if Abs(fTotalPrice1 - FPricePartInfo.PartPrice) < Abs(fTotalPrice - FPricePartInfo.PartPrice) then        Result := fEnd1;    end    else      Result := APegs.EndPegNum;  end  else    Result := APegs.EndPegNum;end;function TtpPartTenderSet.GetPartTender(AIndex: Integer): TtpPartTender;begin  if AIndex < FPartTenders.Count then    Result := TtpPartTender(FPartTenders.Items[AIndex])  else    Result := nil;end;function TtpPartTenderSet.GetTenderCount: Integer;begin  Result := FPartTenders.Count;end;procedure TtpPartTenderSet.PegPart(APegs: TtpPegList);begin  if FPartPegs.Count = 0 then    FPartPegs.Add(APegs.BeginPeg+'~'+APegs.EndPeg);  if PegPartSetting(FPartPegs) then    ExecutePegPart(APegs);end;procedure TtpPartTenderSet.PricePart(APegs: TtpPegList);begin  if PricePartSetting(FPricePartInfo) then    ExecutePricePart(APegs);end;end.
 |