|
@@ -0,0 +1,442 @@
|
|
|
|
+unit stgGatherGclCacheData;
|
|
|
|
+
|
|
|
|
+interface
|
|
|
|
+
|
|
|
|
+uses
|
|
|
|
+ CacheTree, SysUtils, BillsTree, Classes, sdDB, mDataRecord;
|
|
|
|
+
|
|
|
|
+type
|
|
|
|
+ TstgGclStageData = class
|
|
|
|
+ private
|
|
|
|
+ FDealQuantity: Double;
|
|
|
|
+ FDealTotalPrice: Double;
|
|
|
|
+ FQcQuantity: Double;
|
|
|
|
+ FQcTotalPrice: Double;
|
|
|
|
+ FQcBGLCode: string;
|
|
|
|
+ FQcBGLNum: string;
|
|
|
|
+
|
|
|
|
+ procedure AddBGLCodeAndNum(ACode, ANum: string);
|
|
|
|
+ public
|
|
|
|
+ procedure ClearData;
|
|
|
|
+ procedure AddStageData(AStageData: TstgGclStageData);
|
|
|
|
+ procedure AssignedData(AStageRecord: TStageRecord);
|
|
|
|
+
|
|
|
|
+ property DealQuantity: Double read FDealQuantity;
|
|
|
|
+ property DealTotalPrice: Double read FDealTotalPrice;
|
|
|
|
+ property QcQuantity: Double read FQcQuantity;
|
|
|
|
+ property QcTotalPrice: Double read FQcTotalPrice;
|
|
|
|
+ property QcBGLCode: string read FQcBGLCode;
|
|
|
|
+ property QcBGLNum: string read FQcBGLNum;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TstgGclSubTenderDetailData = class
|
|
|
|
+ private
|
|
|
|
+ FSerialNo: Integer;
|
|
|
|
+ FLeafXmjCode: string;
|
|
|
|
+ FDetailStage: TstgGclStageData;
|
|
|
|
+ public
|
|
|
|
+ constructor Create(ANode: TMeasureBillsIDTreeNode);
|
|
|
|
+ destructor Destroy; override;
|
|
|
|
+
|
|
|
|
+ property SerialNo: Integer read FSerialNo;
|
|
|
|
+ property LeafXmjCode: string read FLeafXmjCode;
|
|
|
|
+ property DetailStage: TstgGclStageData read FDetailStage;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TstgGclSubTenderStageData = class
|
|
|
|
+ private
|
|
|
|
+ FSubTenderID: Integer;
|
|
|
|
+ FGather: TstgGclStageData;
|
|
|
|
+ FDetails: TList;
|
|
|
|
+ function GetDetail(AIndex: Integer): TstgGclSubTenderDetailData;
|
|
|
|
+ function GetDetailCount: Integer;
|
|
|
|
+ public
|
|
|
|
+ constructor Create(ASubTenderID: Integer);
|
|
|
|
+ destructor Destroy; override;
|
|
|
|
+
|
|
|
|
+ function AddDetail(ANode: TMeasureBillsIDTreeNode): TstgGclSubTenderDetailData;
|
|
|
|
+
|
|
|
|
+ procedure CalculateGather;
|
|
|
|
+
|
|
|
|
+ property SubTenderID: Integer read FSubTenderID;
|
|
|
|
+ property Gather: TstgGclStageData read FGather;
|
|
|
|
+ property DetailCount: Integer read GetDetailCount;
|
|
|
|
+ property Detail[AIndex: Integer]: TstgGclSubTenderDetailData read GetDetail;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TstgGatherGcl = class
|
|
|
|
+ private
|
|
|
|
+ FID: Integer;
|
|
|
|
+ FB_Code: string;
|
|
|
|
+ FName: string;
|
|
|
|
+ FUnits: string;
|
|
|
|
+ FPrice: Double;
|
|
|
|
+
|
|
|
|
+ FGather: TstgGclStageData;
|
|
|
|
+ FSubTenders: TList;
|
|
|
|
+ function GetIsGclBills: Boolean;
|
|
|
|
+ function GetSubTender(AIndex: Integer): TstgGclSubTenderStageData;
|
|
|
|
+ function GetSubTenderCount: Integer;
|
|
|
|
+ public
|
|
|
|
+ constructor Create(AID: Integer; ARec: TBillsRecord);
|
|
|
|
+ destructor Destroy; override;
|
|
|
|
+
|
|
|
|
+ function FindSubTender(ASubTenderID: Integer): TstgGclSubTenderStageData;
|
|
|
|
+ function SafeSubTender(ASubTenderID: Integer): TstgGclSubTenderStageData;
|
|
|
|
+
|
|
|
|
+ procedure CalculateGather;
|
|
|
|
+
|
|
|
|
+ property ID: Integer read FID;
|
|
|
|
+ property B_Code: string read FB_Code;
|
|
|
|
+ property Name: string read FName;
|
|
|
|
+ property Units: string read FUnits;
|
|
|
|
+ property Price: Double read FPrice;
|
|
|
|
+
|
|
|
|
+ property SubTenderCount: Integer read GetSubTenderCount;
|
|
|
|
+ property SubTender[AIndex: Integer]: TstgGclSubTenderStageData read GetSubTender;
|
|
|
|
+
|
|
|
|
+ property Gather: TstgGclStageData read FGather;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TstgGatherGclSubTender = class
|
|
|
|
+ private
|
|
|
|
+ FID: Integer;
|
|
|
|
+ FRec: TsdDataRecord;
|
|
|
|
+ public
|
|
|
|
+ constructor Create(ARec: TsdDataRecord);
|
|
|
|
+
|
|
|
|
+ property ID: Integer read FID;
|
|
|
|
+ property Rec: TsdDataRecord read FRec;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TstgGatherGclCacheData = class
|
|
|
|
+ private
|
|
|
|
+ FGatherGcls: TList;
|
|
|
|
+ FSubTenders: TList;
|
|
|
|
+
|
|
|
|
+ function GetSubTenderCount: Integer;
|
|
|
|
+ function GetSubTender(AIndex: Integer): TstgGatherGclSubTender;
|
|
|
|
+ function GetGatherGcl(AIndex: Integer): TstgGatherGcl;
|
|
|
|
+ function GetGatherGclCount: Integer;
|
|
|
|
+ public
|
|
|
|
+ constructor Create;
|
|
|
|
+ destructor Destroy; override;
|
|
|
|
+
|
|
|
|
+ function FindSubTender(AID: Integer): TstgGatherGclSubTender;
|
|
|
|
+ function AddSubTender(ARec: TsdDataRecord): TstgGatherGclSubTender;
|
|
|
|
+
|
|
|
|
+ function FindGatherGcl(ARec: TBillsRecord): TstgGatherGcl;
|
|
|
|
+ function AddGatherGcl(ARec: TBillsRecord): TstgGatherGcl;
|
|
|
|
+
|
|
|
|
+ procedure CalculateAll;
|
|
|
|
+
|
|
|
|
+ property SubTenderCount: Integer read GetSubTenderCount;
|
|
|
|
+ property SubTender[AIndex: Integer]: TstgGatherGclSubTender read GetSubTender;
|
|
|
|
+
|
|
|
|
+ property GatherGclCount: Integer read GetGatherGclCount;
|
|
|
|
+ property GatherGcl[AIndex: Integer]: TstgGatherGcl read GetGatherGcl;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+implementation
|
|
|
|
+
|
|
|
|
+uses
|
|
|
|
+ ZhAPI, UtilMethods, Math;
|
|
|
|
+
|
|
|
|
+{ TstgGatherGcl }
|
|
|
|
+
|
|
|
|
+procedure TstgGatherGcl.CalculateGather;
|
|
|
|
+var
|
|
|
|
+ i: Integer;
|
|
|
|
+ vSubTender: TstgGclSubTenderDetailData;
|
|
|
|
+begin
|
|
|
|
+ FGather.ClearData;
|
|
|
|
+ for i := 0 to FSubTenders.Count - 1 do
|
|
|
|
+ begin
|
|
|
|
+ SubTender[i].CalculateGather;
|
|
|
|
+ FGather.AddStageData(SubTender[i].Gather);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+constructor TstgGatherGcl.Create(AID: Integer; ARec: TBillsRecord);
|
|
|
|
+begin
|
|
|
|
+ FSubTenders := TList.Create;
|
|
|
|
+ FGather := TstgGclStageData.Create;
|
|
|
|
+
|
|
|
|
+ FID := AID;
|
|
|
|
+ FB_Code := ARec.B_Code.AsString;
|
|
|
|
+ FName := ARec.Name.AsString;
|
|
|
|
+ FUnits := ARec.Units.AsString;
|
|
|
|
+ FPrice := ARec.Price.AsFloat;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+destructor TstgGatherGcl.Destroy;
|
|
|
|
+begin
|
|
|
|
+ FGather.Free;
|
|
|
|
+ ClearObjects(FSubTenders);
|
|
|
|
+ FSubTenders.Free;
|
|
|
|
+ inherited;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGcl.FindSubTender(
|
|
|
|
+ ASubTenderID: Integer): TstgGclSubTenderStageData;
|
|
|
|
+var
|
|
|
|
+ i: Integer;
|
|
|
|
+begin
|
|
|
|
+ Result := nil;
|
|
|
|
+ for i := 0 to FSubTenders.Count - 1 do
|
|
|
|
+ begin
|
|
|
|
+ if ASubTenderID = SubTender[i].SubTenderID then
|
|
|
|
+ begin
|
|
|
|
+ Result := SubTender[i];
|
|
|
|
+ Break;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGcl.GetIsGclBills: Boolean;
|
|
|
|
+begin
|
|
|
|
+ Result := FB_Code <> '';
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGcl.GetSubTender(
|
|
|
|
+ AIndex: Integer): TstgGclSubTenderStageData;
|
|
|
|
+begin
|
|
|
|
+ Result := TstgGclSubTenderStageData(FSubTenders.Items[AIndex]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGcl.GetSubTenderCount: Integer;
|
|
|
|
+begin
|
|
|
|
+ Result := FSubTenders.Count;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGcl.SafeSubTender(
|
|
|
|
+ ASubTenderID: Integer): TstgGclSubTenderStageData;
|
|
|
|
+begin
|
|
|
|
+ Result := FindSubTender(ASubTenderID);
|
|
|
|
+ if not Assigned(Result) then
|
|
|
|
+ begin
|
|
|
|
+ Result := TstgGclSubTenderStageData.Create(ASubTenderID);
|
|
|
|
+ FSubTenders.Add(Result);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{ TstgGatherGclCacheData }
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.AddGatherGcl(
|
|
|
|
+ ARec: TBillsRecord): TstgGatherGcl;
|
|
|
|
+begin
|
|
|
|
+ Result := FindGatherGcl(ARec);
|
|
|
|
+ if not Assigned(Result) then
|
|
|
|
+ begin
|
|
|
|
+ Result := TstgGatherGcl.Create(GatherGclCount + 1, ARec);
|
|
|
|
+ FGatherGcls.Add(Result);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.AddSubTender(
|
|
|
|
+ ARec: TsdDataRecord): TstgGatherGclSubTender;
|
|
|
|
+begin
|
|
|
|
+ Result := FindSubTender(ARec.ValueByName('ID').AsInteger);
|
|
|
|
+ if not Assigned(Result) then
|
|
|
|
+ begin
|
|
|
|
+ Result := TstgGatherGclSubTender.Create(ARec);
|
|
|
|
+ FSubTenders.Add(Result);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TstgGatherGclCacheData.CalculateAll;
|
|
|
|
+var
|
|
|
|
+ i: Integer;
|
|
|
|
+ vGcl: TstgGatherGcl;
|
|
|
|
+begin
|
|
|
|
+ for i := 0 to GatherGclCount - 1 do
|
|
|
|
+ begin
|
|
|
|
+ vGcl := GatherGcl[i];
|
|
|
|
+ vGcl.CalculateGather;
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+constructor TstgGatherGclCacheData.Create;
|
|
|
|
+begin
|
|
|
|
+ FGatherGcls := TList.Create;
|
|
|
|
+ FSubTenders := TList.Create;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+destructor TstgGatherGclCacheData.Destroy;
|
|
|
|
+begin
|
|
|
|
+ ClearObjects(FSubTenders);
|
|
|
|
+ FSubTenders.Free;
|
|
|
|
+ ClearObjects(FGatherGcls);
|
|
|
|
+ FGatherGcls.Free;
|
|
|
|
+ inherited;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.FindGatherGcl(ARec: TBillsRecord): TstgGatherGcl;
|
|
|
|
+var
|
|
|
|
+ i: Integer;
|
|
|
|
+ vGcl: TstgGatherGcl;
|
|
|
|
+ bMatch: Boolean;
|
|
|
|
+begin
|
|
|
|
+ Result := nil;
|
|
|
|
+ for i := 0 to FGatherGcls.Count - 1 do
|
|
|
|
+ begin
|
|
|
|
+ vGcl := TstgGatherGcl(FGatherGcls.Items[i]);
|
|
|
|
+ bMatch := (vGcl.B_Code = ARec.B_Code.AsString) and (vGcl.Name = ARec.Name.AsString)
|
|
|
|
+ and (vGcl.Units = ARec.Units.AsString)
|
|
|
|
+ and (CommonRoundTo(vGcl.Price - ARec.Price.AsFloat, -6) = 0);
|
|
|
|
+ if bMatch then
|
|
|
|
+ begin
|
|
|
|
+ Result := vGcl;
|
|
|
|
+ Break;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.FindSubTender(
|
|
|
|
+ AID: Integer): TstgGatherGclSubTender;
|
|
|
|
+var
|
|
|
|
+ i: Integer;
|
|
|
|
+begin
|
|
|
|
+ Result := nil;
|
|
|
|
+ for i := 0 to SubTenderCount - 1 do
|
|
|
|
+ begin
|
|
|
|
+ if SubTender[i].ID = AID then
|
|
|
|
+ begin
|
|
|
|
+ Result := SubTender[i];
|
|
|
|
+ Break;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.GetGatherGcl(
|
|
|
|
+ AIndex: Integer): TstgGatherGcl;
|
|
|
|
+begin
|
|
|
|
+ Result := TstgGatherGcl(FGatherGcls.Items[AIndex]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.GetGatherGclCount: Integer;
|
|
|
|
+begin
|
|
|
|
+ Result := FGatherGcls.Count;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.GetSubTender(AIndex: Integer): TstgGatherGclSubTender;
|
|
|
|
+begin
|
|
|
|
+ Result := TstgGatherGclSubTender(FSubTenders.Items[AIndex]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGatherGclCacheData.GetSubTenderCount: Integer;
|
|
|
|
+begin
|
|
|
|
+ Result := FSubTenders.Count;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{ TstgGatherGclSubTender }
|
|
|
|
+
|
|
|
|
+constructor TstgGatherGclSubTender.Create(ARec: TsdDataRecord);
|
|
|
|
+begin
|
|
|
|
+ FID := ARec.ValueByName('ID').AsInteger;
|
|
|
|
+ FRec := ARec;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{ TstgGclStageData }
|
|
|
|
+
|
|
|
|
+procedure TstgGclStageData.AddBGLCodeAndNum(ACode, ANum: string);
|
|
|
|
+var
|
|
|
|
+ sCode, sNum: string;
|
|
|
|
+begin
|
|
|
|
+ sCode := FQcBGLCode;
|
|
|
|
+ sNum := FQcBGLNum;
|
|
|
|
+ MergeRelaBGLAndNum(sCode, sNum, ACode, ANum);
|
|
|
|
+ FQcBGLCode := sCode;
|
|
|
|
+ FQcBGLNum := sNum;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TstgGclStageData.AddStageData(AStageData: TstgGclStageData);
|
|
|
|
+begin
|
|
|
|
+ FDealQuantity := FDealQuantity + AStageData.DealQuantity;
|
|
|
|
+ FDealTotalPrice := FDealTotalPrice + AStageData.DealTotalPrice;
|
|
|
|
+ FQcQuantity := FQcQuantity + AStageData.QcQuantity;
|
|
|
|
+ FQcTotalPrice := FQcTotalPrice + AStageData.QcTotalPrice;
|
|
|
|
+ AddBGLCodeAndNum(AStageData.QcBGLCode, AStageData.QcBGLNum);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TstgGclStageData.AssignedData(AStageRecord: TStageRecord);
|
|
|
|
+begin
|
|
|
|
+ FDealQuantity := AStageRecord.DealQuantity.AsFloat;
|
|
|
|
+ FDealTotalPrice := AStageRecord.DealTotalPrice.AsFloat;
|
|
|
|
+ FQcQuantity := AStageRecord.QcQuantity.AsFloat;
|
|
|
|
+ FQcTotalPrice := AStageRecord.QcTotalPrice.AsFloat;
|
|
|
|
+ FQcBGLCode := AStageRecord.QcBGLCode.AsString;
|
|
|
|
+ FQcBGLNum := AStageRecord.QcBGLNum.AsString;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TstgGclStageData.ClearData;
|
|
|
|
+begin
|
|
|
|
+ FDealQuantity := 0;
|
|
|
|
+ FDealTotalPrice := 0;
|
|
|
|
+ FQcQuantity := 0;
|
|
|
|
+ FQcTotalPrice := 0;
|
|
|
|
+ FQcBGLCode := '';
|
|
|
|
+ FQcBGLNum := '';
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{ TstgGclSubTenderStageData }
|
|
|
|
+
|
|
|
|
+function TstgGclSubTenderStageData.AddDetail(
|
|
|
|
+ ANode: TMeasureBillsIDTreeNode): TstgGclSubTenderDetailData;
|
|
|
|
+begin
|
|
|
|
+ Result := TstgGclSubTenderDetailData.Create(ANode);
|
|
|
|
+ FDetails.Add(Result);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TstgGclSubTenderStageData.CalculateGather;
|
|
|
|
+var
|
|
|
|
+ i: Integer;
|
|
|
|
+begin
|
|
|
|
+ FGather.ClearData;
|
|
|
|
+ for i := 0 to DetailCount - 1 do
|
|
|
|
+ FGather.AddStageData(Detail[i].DetailStage);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+constructor TstgGclSubTenderStageData.Create(ASubTenderID: Integer);
|
|
|
|
+begin
|
|
|
|
+ FSubTenderID := ASubTenderID;
|
|
|
|
+ FGather := TstgGclStageData.Create;
|
|
|
|
+ FDetails := TList.Create;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+destructor TstgGclSubTenderStageData.Destroy;
|
|
|
|
+begin
|
|
|
|
+ ClearObjects(FDetails);
|
|
|
|
+ FDetails.Free;
|
|
|
|
+ FGather.Free;
|
|
|
|
+ inherited;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGclSubTenderStageData.GetDetail(
|
|
|
|
+ AIndex: Integer): TstgGclSubTenderDetailData;
|
|
|
|
+begin
|
|
|
|
+ Result := TstgGclSubTenderDetailData(FDetails.Items[AIndex]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TstgGclSubTenderStageData.GetDetailCount: Integer;
|
|
|
|
+begin
|
|
|
|
+ Result := FDetails.Count;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{ TstgGclSubTenderDetailData }
|
|
|
|
+
|
|
|
|
+constructor TstgGclSubTenderDetailData.Create(ANode: TMeasureBillsIDTreeNode);
|
|
|
|
+begin
|
|
|
|
+ FSerialNo := ANode.MajorIndex + 1;
|
|
|
|
+ FDetailStage := TstgGclStageData.Create;
|
|
|
|
+ if Assigned(ANode.StageRec) then
|
|
|
|
+ FDetailStage.AssignedData(ANode.StageRec);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+destructor TstgGclSubTenderDetailData.Destroy;
|
|
|
|
+begin
|
|
|
|
+ FDetailStage.Free;
|
|
|
|
+ inherited;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+end.
|