unit tpGatherGcl; interface uses Classes, tpGatherTree; type TtpGatherGclRela = class private FRelaGcl: TtpGatherTreeNode; FRelaPegXmj: TtpGatherTreeNode; public constructor Create(AGcl, APegXmj: TtpGatherTreeNode); property RelaGcl: TtpGatherTreeNode read FRelaGcl; property RelaPegXmj: TtpGatherTreeNode read FRelaPegXmj; end; TtpGatherGcl = class private FID: Integer; FRelas: TList; FIndexCode: string; FB_Code: string; FName: string; FUnits: string; FPrice: Double; FQuantity: Double; FTotalPrice: Double; function GetRela(AIndex: Integer): TtpGatherGclRela; function GetRelaCount: Integer; public constructor Create(AID: Integer; AGcl, APegXmj: TtpGatherTreeNode); destructor Destroy; override; procedure GatherNode(AGcl, APegXmj: TtpGatherTreeNode); property ID: Integer read FID; property IndexCode: string read FIndexCode; property B_Code: string read FB_Code; property Name: string read FName; property Units: string read FUnits; property Price: Double read FPrice; property Quantity: Double read FQuantity; property TotalPrice: Double read FTotalPrice; property RelaCount: Integer read GetRelaCount; property Rela[AIndex: Integer]: TtpGatherGclRela read GetRela; end; TtpGatherGclList = class private FGcls: TList; FNewID: Integer; function FindGatherGcl(ANode: TtpGatherTreeNode): TtpGatherGcl; function NewGatherGcl(AGcl, APegXmj: TtpGatherTreeNode): TtpGatherGcl; function GetGcl(AIndex: Integer): TtpGatherGcl; function GetGclCount: Integer; public constructor Create; destructor Destroy; override; procedure GatherNode(AGcl, APegXmj: TtpGatherTreeNode); property GclCount: Integer read GetGclCount; property Gcl[AIndex: Integer]: TtpGatherGcl read GetGcl; end; implementation uses UtilMethods, SysUtils, ZhAPI; { TtpGatherGcl } constructor TtpGatherGcl.Create(AID: Integer; AGcl, APegXmj: TtpGatherTreeNode); var vRela: TtpGatherGclRela; begin FID := AID; FRelas := TList.Create; vRela := TtpGatherGclRela.Create(AGcl, APegXmj); FRelas.Add(vRela); FB_Code := AGcl.B_Code; FIndexCode := B_CodeToIndexCode(FB_Code); FName := AGcl.Name; FUnits := AGcl.Units; FPrice := AGcl.Price; FQuantity := AGcl.Quantity; FTotalPrice := AGcl.TotalPrice; end; destructor TtpGatherGcl.Destroy; begin ClearObjects(FRelas); FRelas.Free; inherited; end; procedure TtpGatherGcl.GatherNode(AGcl, APegXmj: TtpGatherTreeNode); var vRela: TtpGatherGclRela; begin vRela := TtpGatherGclRela.Create(AGcl, APegXmj); FRelas.Add(vRela); FQuantity := FQuantity + AGcl.Quantity; FTotalPrice := FTotalPrice + AGcl.TotalPrice; end; function TtpGatherGcl.GetRela(AIndex: Integer): TtpGatherGclRela; begin Result := TtpGatherGclRela(FRelas.Items[AIndex]); end; function TtpGatherGcl.GetRelaCount: Integer; begin Result := FRelas.Count; end; { TtpGatherGclList } constructor TtpGatherGclList.Create; begin FGcls := TList.Create; FNewID := 0; end; destructor TtpGatherGclList.Destroy; begin ClearObjects(FGcls); FGcls.Free; inherited; end; function TtpGatherGclList.FindGatherGcl( ANode: TtpGatherTreeNode): TtpGatherGcl; var iGcl: Integer; vGcl: TtpGatherGcl; begin Result := nil; for iGcl := 0 to FGcls.Count - 1 do begin vGcl := TtpGatherGcl(FGcls.Items[iGcl]); if SameText(vGcl.B_Code, ANode.B_Code) and SameText(vGcl.Name, ANode.Name) and SameText(vGcl.Units, ANode.Units) and (vGcl.Price - ANode.Price < 0.0001) then begin Result := vGcl; Break; end; end; end; procedure TtpGatherGclList.GatherNode(AGcl, APegXmj: TtpGatherTreeNode); var vGcl: TtpGatherGcl; begin vGcl := FindGatherGcl(AGcl); if Assigned(vGcl) then vGcl.GatherNode(AGcl, APegXmj) else vGcl := NewGatherGcl(AGcl, APegXmj); end; function TtpGatherGclList.GetGcl(AIndex: Integer): TtpGatherGcl; begin Result := TtpGatherGcl(FGcls.Items[AIndex]); end; function TtpGatherGclList.GetGclCount: Integer; begin Result := FGcls.Count; end; function TtpGatherGclList.NewGatherGcl( AGcl, APegXmj: TtpGatherTreeNode): TtpGatherGcl; begin Result := TtpGatherGcl.Create(FNewID, AGcl, APegXmj); FGcls.Add(Result); Inc(FNewID); end; { TtpGatherGclRela } constructor TtpGatherGclRela.Create(AGcl, APegXmj: TtpGatherTreeNode); begin FRelaGcl := AGcl; FRelaPegXmj := APegXmj; end; end.