123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- unit tpPartTenderSet;
- interface
- uses
- 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;
- implementation
- uses
- 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.
|