Kaynağa Gözat

造价台账汇总表

MaiXinRong 5 yıl önce
ebeveyn
işleme
110ad6b5b7

+ 128 - 0
DataModules/ReportMemoryDm/rmBillsPhaseGatherDm.dfm

@@ -0,0 +1,128 @@
+object rmBillsPhaseGatherData: TrmBillsPhaseGatherData
+  OldCreateOrder = False
+  Left = 626
+  Top = 282
+  Height = 150
+  Width = 215
+  object cdsZjtzBills: TClientDataSet
+    Active = True
+    Aggregates = <>
+    Params = <>
+    Left = 40
+    Top = 32
+    Data = {
+      850200009619E0BD01000000180000001C000000000003000000850202494404
+      0001000000000008506172656E74494404000100000000000D4E657874536962
+      6C696E674944040001000000000004436F646501004A00000001000557494454
+      48020002006400044E616D6502004A000000010005574944544802000200FE01
+      05556E69747301004A000000010005574944544802000200280009636244676E
+      51747931080004000000000009636244676E5174793208000400000000000863
+      6244676E51747901004900000001000557494454480200020032000C6362546F
+      74616C507269636508000400000000000A73736344676E517479310800040000
+      0000000A73736344676E5174793208000400000000000973736344676E517479
+      01004900000001000557494454480200020032000D737363546F74616C507269
+      636508000400000000000A73687444676E5174793108000400000000000A7368
+      7444676E5174793208000400000000000973687444676E517479010049000000
+      01000557494454480200020032000D736874546F74616C507269636508000400
+      0000000009687444676E51747931080004000000000009687444676E51747932
+      080004000000000008687444676E517479010049000000010005574944544802
+      00020032000A546F74616C5072696365080004000000000009626744676E5174
+      7931080004000000000009626744676E51747932080004000000000008626744
+      676E51747901004900000001000557494454480200020032000F456E64516354
+      6F74616C5072696365080004000000000011456E644465616C546F74616C5072
+      6963650800040000000000074D656D6F53747202004A00000001000557494454
+      4802000200FE010000}
+    object cdsZjtzBillsID: TIntegerField
+      FieldName = 'ID'
+    end
+    object cdsZjtzBillsParentID: TIntegerField
+      FieldName = 'ParentID'
+    end
+    object cdsZjtzBillsNextSiblingID: TIntegerField
+      FieldName = 'NextSiblingID'
+    end
+    object cdsZjtzBillsCode: TWideStringField
+      FieldName = 'Code'
+      Size = 50
+    end
+    object cdsZjtzBillsName: TWideStringField
+      FieldName = 'Name'
+      Size = 255
+    end
+    object cdsZjtzBillsUnits: TWideStringField
+      FieldName = 'Units'
+    end
+    object cdsZjtzBillscbDgnQty1: TFloatField
+      FieldName = 'cbDgnQty1'
+    end
+    object cdsZjtzBillscbDgnQty2: TFloatField
+      FieldName = 'cbDgnQty2'
+    end
+    object cdsZjtzBillscbDgnQty: TStringField
+      FieldName = 'cbDgnQty'
+      Size = 50
+    end
+    object cdsZjtzBillscbTotalPrice: TFloatField
+      FieldName = 'cbTotalPrice'
+    end
+    object cdsZjtzBillssscDgnQty1: TFloatField
+      FieldName = 'sscDgnQty1'
+    end
+    object cdsZjtzBillssscDgnQty2: TFloatField
+      FieldName = 'sscDgnQty2'
+    end
+    object cdsZjtzBillssscDgnQty: TStringField
+      FieldName = 'sscDgnQty'
+      Size = 50
+    end
+    object cdsZjtzBillssscTotalPrice: TFloatField
+      FieldName = 'sscTotalPrice'
+    end
+    object cdsZjtzBillsshtDgnQty1: TFloatField
+      FieldName = 'shtDgnQty1'
+    end
+    object cdsZjtzBillsshtDgnQty2: TFloatField
+      FieldName = 'shtDgnQty2'
+    end
+    object cdsZjtzBillsshtDgnQty: TStringField
+      FieldName = 'shtDgnQty'
+      Size = 50
+    end
+    object cdsZjtzBillsshtTotalPrice: TFloatField
+      FieldName = 'shtTotalPrice'
+    end
+    object cdsZjtzBillshtDgnQty1: TFloatField
+      FieldName = 'htDgnQty1'
+    end
+    object cdsZjtzBillshtDgnQty2: TFloatField
+      FieldName = 'htDgnQty2'
+    end
+    object cdsZjtzBillshtDgnQty: TStringField
+      FieldName = 'htDgnQty'
+      Size = 50
+    end
+    object cdsZjtzBillsTotalPrice: TFloatField
+      FieldName = 'TotalPrice'
+    end
+    object cdsZjtzBillsbgDgnQty1: TFloatField
+      FieldName = 'bgDgnQty1'
+    end
+    object cdsZjtzBillsbgDgnQty2: TFloatField
+      FieldName = 'bgDgnQty2'
+    end
+    object cdsZjtzBillsbgDgnQty: TStringField
+      FieldName = 'bgDgnQty'
+      Size = 50
+    end
+    object cdsZjtzBillsEndQcTotalPrice: TFloatField
+      FieldName = 'EndQcTotalPrice'
+    end
+    object cdsZjtzBillsEndDealTotalPrice: TFloatField
+      FieldName = 'EndDealTotalPrice'
+    end
+    object cdsZjtzBillsMemoStr: TWideStringField
+      FieldName = 'MemoStr'
+      Size = 255
+    end
+  end
+end

+ 350 - 0
DataModules/ReportMemoryDm/rmBillsPhaseGatherDm.pas

@@ -0,0 +1,350 @@
+unit rmBillsPhaseGatherDm;
+
+interface
+
+uses
+  SysUtils, Classes, DB, DBClient, sdDB, sdIDTree,
+  ProjectData, MCacheTree, BillsTree, mDataRecord,
+  rmSelectProjectFrm;
+
+type
+  TrmBillsPhaseGatherData = class(TDataModule)
+    cdsZjtzBills: TClientDataSet;
+    cdsZjtzBillsID: TIntegerField;
+    cdsZjtzBillsParentID: TIntegerField;
+    cdsZjtzBillsNextSiblingID: TIntegerField;
+    cdsZjtzBillsCode: TWideStringField;
+    cdsZjtzBillsName: TWideStringField;
+    cdsZjtzBillsUnits: TWideStringField;
+    cdsZjtzBillscbDgnQty1: TFloatField;
+    cdsZjtzBillscbDgnQty2: TFloatField;
+    cdsZjtzBillscbDgnQty: TStringField;
+    cdsZjtzBillscbTotalPrice: TFloatField;
+    cdsZjtzBillssscDgnQty1: TFloatField;
+    cdsZjtzBillssscDgnQty2: TFloatField;
+    cdsZjtzBillssscDgnQty: TStringField;
+    cdsZjtzBillssscTotalPrice: TFloatField;
+    cdsZjtzBillsshtDgnQty1: TFloatField;
+    cdsZjtzBillsshtDgnQty2: TFloatField;
+    cdsZjtzBillsshtDgnQty: TStringField;
+    cdsZjtzBillsshtTotalPrice: TFloatField;
+    cdsZjtzBillshtDgnQty1: TFloatField;
+    cdsZjtzBillshtDgnQty2: TFloatField;
+    cdsZjtzBillshtDgnQty: TStringField;
+    cdsZjtzBillsTotalPrice: TFloatField;
+    cdsZjtzBillsbgDgnQty1: TFloatField;
+    cdsZjtzBillsbgDgnQty2: TFloatField;
+    cdsZjtzBillsbgDgnQty: TStringField;
+    cdsZjtzBillsEndQcTotalPrice: TFloatField;
+    cdsZjtzBillsEndDealTotalPrice: TFloatField;
+    cdsZjtzBillsMemoStr: TWideStringField;
+  private
+    FCacheTree: TSpecPhaseCacheTree;
+    FProjectData: TProjectData;
+
+    function GetDgnQuantity(ANum1, ANum2: Double): string;
+
+    procedure BeforeGather;
+    procedure AfterGather;
+
+    procedure OpenProject(AProject: TSelectProject);
+    procedure FreeProject;
+
+    function AddBillsNode(ANode: TBillsIDTreeNode;
+      AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
+
+    function AddSpecBillsNode(ANode: TsdIDTreeNode; AParent: TSpecPhaseCacheNode;
+      ASelectProject: TSelectProject): TSpecPhaseCacheNode;
+    function AddSpecBills(ANode: TsdIDTreeNode; AParent: TSpecPhaseCacheNode;
+      ASelectProject: TSelectProject): TSpecPhaseCacheNode;
+
+    function AddPhaseBillsNode(ANode: TsdIDTreeNode;
+      AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
+    function AddPhaseBills(ANode: TsdIDTreeNode;
+      AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
+
+    procedure GatherProject(AProject: TSelectProject);
+
+    procedure WriteNode(ANode: TSpecPhaseCacheNode);
+    procedure WriteData;
+  public
+    function AssignData(AProjects: TList): TDataSet;
+  end;
+
+implementation
+
+uses CacheTree, Globals, UtilMethods;
+
+{$R *.dfm}
+
+{ TrmBillsPhaseGatherData }
+
+function TrmBillsPhaseGatherData.AddBillsNode(ANode: TBillsIDTreeNode;
+  AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
+var
+  Rec: TBillsRecord;
+  iGatherCompare: Integer;
+  ANextSibling: TSpecPhaseCacheNode;
+begin
+  Rec := ANode.Rec;
+
+  if Rec.B_Code.AsString <> '' then
+    iGatherCompare := ReportConfig.GclCompare
+  else
+    iGatherCompare := ReportConfig.XmjCompare;
+  case iGatherCompare of
+    // 按编号
+    0: if (Rec.Code.asString <> '') or (Rec.B_Code.asString <> '') then
+         Result := FCacheTree.FindNode(AParent, Rec.Code.AsString, Rec.B_Code.AsString)
+       else
+         Result := FCacheTree.FindNode(AParent, Rec.Name.AsString);
+    // 按名称
+    1: Result := FCacheTree.FindNode(AParent, Rec.Name.AsString);
+    // 按编号+名称
+    2: Result := FCacheTree.FindNode(AParent, Rec.Code.AsString,
+           Rec.B_Code.AsString, Rec.Name.AsString);
+  end;
+
+  if not Assigned(Result) then
+  begin
+    ANextSibling := FCacheTree.FindNextSibling(AParent,
+        Rec.Code.AsString, Rec.B_Code.AsString);
+    Result := FCacheTree.AddNode(AParent, ANextSibling);
+    Result.Code := Rec.Code.AsString;
+    Result.B_Code := Rec.B_Code.AsString;
+    Result.Name := Rec.Name.AsString;
+    Result.Units := Rec.Units.AsString;
+  end;
+end;
+
+function TrmBillsPhaseGatherData.AddPhaseBills(ANode: TsdIDTreeNode;
+  AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
+begin
+  if not Assigned(ANode) then Exit;
+  // 按设置的层次汇总(Level从0开始取值)
+  case ReportConfig.GatherLevel of
+    // 项
+    0: if ANode.Level > 1 then Exit;
+    // 目
+    1: if ANode.Level > 2 then Exit;
+    // 节
+    2: if ANode.Level > 3 then Exit;
+    // 细目
+    3: if ANode.Level > 4 then Exit;
+    // 项目节
+    4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
+  end;
+  if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
+  Result := AddPhaseBillsNode(ANode, AParent);
+  AddPhaseBills(ANode.FirstChild, Result);
+  AddPhaseBills(ANode.NextSibling, AParent);
+end;
+
+function TrmBillsPhaseGatherData.AddPhaseBillsNode(ANode: TsdIDTreeNode;
+  AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
+var
+  vNode: TMeasureBillsIDTreeNode;
+  Rec: TBillsRecord;
+  StageRec: TStageRecord;
+begin
+  vNode :=  TMeasureBillsIDTreeNode(ANode);
+  Result := AddBillsNode(vNode, AParent);
+  Rec := vNode.Rec;
+  Result.TotalPrice := Result.TotalPrice + Rec.TotalPrice.AsFloat;
+
+  Result.htDgnQty1 := Result.htDgnQty1 + Rec.DealDgnQuantity1.AsFloat;
+  Result.htDgnQty2 := Result.htDgnQty2 + Rec.DealDgnQuantity2.AsFloat;
+  Result.bgDgnQty1 := Result.bgDgnQty1 + Rec.CDgnQuantity1.AsFloat;
+  Result.bgDgnQty2 := Result.bgDgnQty2 + Rec.CDgnQuantity2.AsFloat;
+
+  StageRec := vNode.StageRec;
+  if Assigned(StageRec) then
+  begin
+    Result.EndDealTotalPrice := Result.EndDealTotalPrice + StageRec.EndDealTotalPrice.AsFloat;
+    Result.EndQcTotalPrice := Result.EndQcTotalPrice + StageRec.EndQcTotalPrice.AsFloat;
+  end;
+end;
+
+function TrmBillsPhaseGatherData.AddSpecBills(ANode: TsdIDTreeNode;
+  AParent: TSpecPhaseCacheNode; ASelectProject: TSelectProject): TSpecPhaseCacheNode;
+begin
+  if not Assigned(ANode) then Exit;
+  // 按设置的层次汇总(Level从0开始取值)
+  case ReportConfig.GatherLevel of
+    // 项
+    0: if ANode.Level > 1 then Exit;
+    // 目
+    1: if ANode.Level > 2 then Exit;
+    // 节
+    2: if ANode.Level > 3 then Exit;
+    // 细目
+    3: if ANode.Level > 4 then Exit;
+    // 项目节
+    4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
+  end;
+  if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
+
+  Result := AddSpecBillsNode(ANode, AParent, ASelectProject);
+  AddSpecBills(ANode.FirstChild, Result, ASelectProject);
+  AddSpecBills(ANode.NextSibling, AParent, ASelectProject);
+end;
+
+function TrmBillsPhaseGatherData.AddSpecBillsNode(ANode: TsdIDTreeNode;
+  AParent: TSpecPhaseCacheNode;
+  ASelectProject: TSelectProject): TSpecPhaseCacheNode;
+var
+  vNode: TBillsIDTreeNode;
+  Rec: TBillsRecord;
+begin
+  vNode := TBillsIDTreeNode(ANode);
+  Result := AddBillsNode(vNode, AParent);
+
+  Rec := vNode.Rec;
+  if ASelectProject.IsPD then
+  begin
+    Result.cbDgnQty1 := Rec.DgnQuantity1.AsFloat;
+    Result.cbDgnQty2 := Rec.DgnQuantity2.AsFloat;
+    Result.cbTotalPrice := Rec.TotalPrice.AsFloat;
+  end
+  else if ASelectProject.IsCddSc then
+  begin
+    Result.sscDgnQty1 := Rec.DgnQuantity1.AsFloat;
+    Result.sscDgnQty2 := Rec.DgnQuantity2.AsFloat;
+    Result.sscTotalPrice := Rec.TotalPrice.AsFloat;
+  end
+  else if ASelectProject.IsCddHt then
+  begin
+    Result.shtDgnQty1 := Rec.DgnQuantity1.AsFloat;
+    Result.shtDgnQty2 := Rec.DgnQuantity2.AsFloat;
+    Result.shtTotalPrice := Rec.TotalPrice.AsFloat;
+  end;
+end;
+
+procedure TrmBillsPhaseGatherData.AfterGather;
+begin
+  cdsZjtzBills.EnableControls;
+
+  FCacheTree.Free;
+end;
+
+function TrmBillsPhaseGatherData.AssignData(AProjects: TList): TDataSet;
+var
+  iProject: Integer;
+begin
+  BeforeGather;
+  try
+    for iProject := 0 to AProjects.Count - 1 do
+      GatherProject(AProjects[iProject]);
+    WriteData;
+  finally
+    Result := cdsZjtzBills;
+    AfterGather;
+  end;
+end;
+
+procedure TrmBillsPhaseGatherData.BeforeGather;
+begin
+  FCacheTree := TSpecPhaseCacheTree.Create;
+
+  cdsZjtzBills.DisableControls;
+  cdsZjtzBills.Active := True;
+  cdsZjtzBills.EmptyDataSet;
+end;
+
+procedure TrmBillsPhaseGatherData.FreeProject;
+begin
+  if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
+    FProjectData.Free;
+end;
+
+procedure TrmBillsPhaseGatherData.GatherProject(AProject: TSelectProject);
+begin
+  OpenProject(AProject);
+  try
+    if AProject.IsPD or AProject.IsCddSc or AProject.IsCddHt then
+      AddSpecBills(FProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, AProject)
+    else
+      AddPhaseBills(FProjectData.BillsMeasureData.BillsMeasureTree.FirstNode, nil);
+  finally
+    FreeProject;
+  end;
+end;
+
+function TrmBillsPhaseGatherData.GetDgnQuantity(ANum1,
+  ANum2: Double): string;
+begin
+  Result := '';
+  if ANum1 <> 0 then
+  begin
+    Result := FloatToStr(ANum1);
+    if ANum2 <> 0 then
+      Result := Result + '/' + FloatToStr(ANum2);
+  end;
+end;
+
+procedure TrmBillsPhaseGatherData.OpenProject(AProject: TSelectProject);
+var
+  Rec: TsdDataRecord;
+begin
+  FProjectData := OpenProjectManager.FindProjectData(AProject.ProjectID);
+  if not Assigned(FProjectData) then
+  begin
+    Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);
+    FProjectData := TProjectData.Create;
+    if AProject.IsPD or AProject.IsCddSc or AProject.IsCddHt then
+      FProjectData.OpenForReport(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString)
+    else
+      FProjectData.OpenForReport3(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);
+  end;
+end;
+
+procedure TrmBillsPhaseGatherData.WriteData;
+begin
+  WriteNode(TSpecPhaseCacheNode(FCacheTree.FirstNode));
+end;
+
+procedure TrmBillsPhaseGatherData.WriteNode(ANode: TSpecPhaseCacheNode);
+begin
+  if not Assigned(ANode) then Exit;
+
+  cdsZjtzBills.Append;
+  cdsZjtzBillsID.AsInteger := ANode.ID;
+  cdsZjtzBillsParentID.AsInteger := ANode.ParentID;
+  cdsZjtzBillsNextSiblingID.AsInteger := ANode.NextSiblingID;
+
+  cdsZjtzBillsCode.AsString := ANode.Code;
+  cdsZjtzBillsName.AsString := ANode.Name;
+  cdsZjtzBillsUnits.AsString := ANode.Units;
+
+  cdsZjtzBillscbDgnQty1.AsFloat := ANode.cbDgnQty1;
+  cdsZjtzBillscbDgnQty2.AsFloat := ANode.cbDgnQty2;
+  cdsZjtzBillscbDgnQty.AsString := GetDgnQuantity(ANode.cbDgnQty1, ANode.cbDgnQty2);
+  cdsZjtzBillscbTotalPrice.AsFloat := ANode.cbTotalPrice;
+
+  cdsZjtzBillssscDgnQty1.AsFloat := ANode.sscDgnQty1;
+  cdsZjtzBillssscDgnQty2.AsFloat := ANode.sscDgnQty2;
+  cdsZjtzBillssscDgnQty.AsString := GetDgnQuantity(ANode.sscDgnQty1, ANode.sscDgnQty2);
+  cdsZjtzBillssscTotalPrice.AsFloat := ANode.sscTotalPrice;
+
+  cdsZjtzBillsshtDgnQty1.AsFloat := ANode.shtDgnQty1;
+  cdsZjtzBillsshtDgnQty2.AsFloat := ANode.shtDgnQty2;
+  cdsZjtzBillsshtDgnQty.AsString := GetDgnQuantity(ANode.shtDgnQty1, ANode.shtDgnQty2);
+  cdsZjtzBillsshtTotalPrice.AsFloat := ANode.shtTotalPrice;
+
+  cdsZjtzBillshtDgnQty1.AsFloat := ANode.htDgnQty1;
+  cdsZjtzBillshtDgnQty2.AsFloat := ANode.htDgnQty2;
+  cdsZjtzBillshtDgnQty.AsString := GetDgnQuantity(ANode.htDgnQty1, ANode.htDgnQty2);
+  cdsZjtzBillsTotalPrice.AsFloat := ANode.TotalPrice;
+
+  cdsZjtzBillsbgDgnQty1.AsFloat := ANode.bgDgnQty1;
+  cdsZjtzBillsbgDgnQty2.AsFloat := ANode.bgDgnQty2;
+  cdsZjtzBillsbgDgnQty.AsString := GetDgnQuantity(ANode.bgDgnQty1, ANode.bgDgnQty2);
+  cdsZjtzBillsEndQcTotalPrice.AsFloat := ANode.EndQcTotalPrice;
+  cdsZjtzBillsEndDealTotalPrice.AsFloat := ANode.EndDealTotalPrice;
+  cdsZjtzBills.Post;
+
+  WriteNode(TSpecPhaseCacheNode(ANode.FirstChild));
+  WriteNode(TSpecPhaseCacheNode(ANode.NextSibling));
+end;
+
+end.

+ 1 - 0
Forms/rmSelectProjectFrm.dfm

@@ -105,6 +105,7 @@ object ProjectSelectForm: TProjectSelectForm
     FrozenRow = 0
     OnGetCellText = zgResultGetCellText
     OnSetCellText = zgResultSetCellText
+    Anchors = [akLeft, akTop, akRight]
   end
   object stdSelectProject: TsdGridTreeDBA
     Columns = <

+ 123 - 1
Forms/rmSelectProjectFrm.pas

@@ -12,7 +12,8 @@ type
   // 批准概算 Approved Budget
   // 多合同 Deal
   // 甘肃高管局定制 Mental1
-  TMultiSelectType = (mstCommon, mstE_PCD, mstE_A, mstDeal, mstMental1);
+  // 导则 造价台账汇总
+  TMultiSelectType = (mstCommon, mstE_PCD, mstE_A, mstDeal, mstMental1, mstZjtz);
 
   // 所选项目
   TSelectProject = class
@@ -24,6 +25,8 @@ type
     FIsCDD: Boolean;
     FIsAB: Boolean;
     FIsDeal: Boolean;
+    FIsCddSc: Boolean;
+    FIsCddHt: Boolean;
   public
     property ProjectID: Integer read FProjectID write FProjectID;
     property IsTender: Boolean read FIsTender write FIsTender;
@@ -36,6 +39,10 @@ type
     property IsAB: Boolean read FIsAB write FIsAB;
     // 多合同项目(二三部分,土地征拆、监理等)
     property IsDeal: Boolean read FIsDeal write FIsDeal;
+    // 施工图设计审查预算
+    property IsCddSc: Boolean read FIsCddSc write FIsCddSc;
+    // 施工图设计合同费用
+    property IsCddHt: Boolean read FIsCddHt write FIsCddHt;
   end;
 
   TProjectSelectForm = class(TForm)
@@ -79,10 +86,14 @@ type
     procedure SetPDProject(AProjecID: Integer);
     procedure SetCDDProject(AProjectID: Integer);
     procedure SetABProject(AProjectID: Integer);
+    procedure SetCddScProject(AProjectID: Integer);
+    procedure SetCddHtProject(AProjectID: Integer);
 
     function HasPDProject: Boolean;
     function HasCDDProject: Boolean;
     function HasABProject: Boolean;
+    function HasCddScProject: Boolean;
+    function HasCddHtProject: Boolean;
 
     procedure InitForm;
     procedure InitResultGrid;
@@ -148,6 +159,15 @@ begin
             if SelectProject.IsDeal then
               zgResult.Cells[2, zgResult.RowCount - 1].Text := 'True';
           end;
+        mstZjtz:
+          begin
+            if SelectProject.IsPD then
+              zgResult.Cells[2, zgResult.RowCount - 1].Text := 'True';
+            if SelectProject.IsCddSc then
+              zgResult.Cells[3, zgResult.RowCount - 1].Text := 'True';
+            if SelectProject.IsCddHt then
+              zgResult.Cells[4, zgResult.RowCount - 1].Text := 'True';
+          end;
       end;
     end;
   end;
@@ -184,6 +204,8 @@ begin
       iLimitProjectCount := 3
     else if FMultiSelectType = mstE_A then
       iLimitProjectCount := 2
+    else if FMultiSelectType = mstZjtz then
+      iLimitProjectCount := 4
     else
       iLimitProjectCount := 2;
   end;
@@ -196,6 +218,8 @@ begin
         ModalResult := mrOk
       else if (FMultiSelectType = mstE_A) and HasABProject then
         ModalResult := mrOk
+      else if (FMultiSelectType = mstZjtz) and HasPDProject and HasCddScProject and HasCddHtProject then
+        ModalResult := mrOk
       else if FMultiSelectType in [mstCommon, mstDeal, mstMental1] then
         ModalResult := mrOk;
     end
@@ -417,12 +441,30 @@ procedure TProjectSelectForm.InitResultGrid;
     zgResult.ColWidths[2] := 42;
   end;
 
+  procedure InitZjtzResultGrid;
+  begin
+    zgResult.ColCount := 5;
+    zgResult.RowCount := 1;
+    zgResult.Cells[1, 0].Text := '所选项目';
+    zgResult.ColWidths[1] := 200;
+    zgResult.Cells[2, 0].Text := '初步设计概算';
+    zgResult.CellClass.Cols[2] := TZjCheckBoxCell;
+    zgResult.ColWidths[2] := 47;
+    zgResult.Cells[3, 0].Text := '施工图设计审查预算';
+    zgResult.CellClass.Cols[3] := TZjCheckBoxCell;
+    zgResult.ColWidths[3] := 60;
+    zgResult.Cells[4, 0].Text := '施工图设计合同费用';
+    zgResult.CellClass.Cols[4] := TZjCheckBoxCell;
+    zgResult.ColWidths[4] := 60;
+  end;
+
 begin
   case FMultiSelectType of
     mstCommon: InitCommonResultGrid;
     mstE_PCD: InitE_PCDResultGrid;
     mstE_A: InitE_AResultGrid;
     mstDeal: InitDealResultGrid;
+    mstZjtz: InitZjtzResultGrid;
   end;
 end;
 
@@ -442,6 +484,11 @@ begin
               else Value := 'False';
       mstDeal: if SelectProject.IsDeal then Value := 'True'
                else Value := 'False';
+      mstZjtz: if ((ACoord.X = 2) and SelectProject.IsPD) or
+                  ((ACoord.X = 3) and SelectProject.IsCddSc) or
+                  ((ACoord.X = 4) and SelectProject.IsCddHt)
+               then Value := 'True'
+               else Value := 'False';
     end;
   end;
 end;
@@ -463,6 +510,13 @@ begin
             SetCDDProject(SelectProject.ProjectID);
         mstE_A: SetABProject(SelectProject.ProjectID);
         mstDeal: SelectProject.IsDeal := True;
+        mstZjtz:
+          if ACoord.X = 2 then
+            SetPDProject(SelectProject.ProjectID)
+          else if ACoord.X = 3 then
+            SetCddScProject(SelectProject.ProjectID)
+          else if ACoord.X = 4 then
+            SetCddHtProject(SelectProject.ProjectID);
       end
     else
       case FMultiSelectType of
@@ -473,6 +527,13 @@ begin
             SelectProject.IsCDD := False;
         mstE_A: SelectProject.IsAB := False;
         mstDeal: SelectProject.IsDeal := False;
+        mstZjtz:
+          if ACoord.X = 2 then
+            SelectProject.IsPD := False
+          else if ACoord.X = 3 then
+            SelectProject.IsCddSc := False
+          else if ACoord.X = 4 then
+            SelectProject.IsCddHt := False;
       end;
   end;
   zgResult.InvalidateCol(ACoord.X);
@@ -492,12 +553,15 @@ begin
     mstE_PCD: Caption := Caption + ',并勾选初步设计、施工图设计项目';
     mstE_A: Caption := Caption + ',并勾选批准概(预)算项目';
     mstDeal: Caption := Caption + ',并勾选其中的多合同项目';
+    mstZjtz: Caption := Caption + ',并勾选初步设计、施工图设计审查预算、施工图设计合同费用项目';
   end;
 
   // 甘肃高管局定制,隐藏结果表
   iWidth := GetSystemMetrics(SM_CXFRAME);
   if FMultiSelectType = mstMental1 then
     ClientWidth := 384
+  else if FMultiSelectType = mstZjtz then
+    ClientWidth := 809
   else
     ClientWidth := 729;
 end;
@@ -632,4 +696,62 @@ begin
   end;
 end;
 
+function TProjectSelectForm.HasCddHtProject: Boolean;
+var
+  i: Integer;
+  SelectProject: TSelectProject;
+begin
+  Result := False;
+  for i := 0 to FSelectProjects.Count - 1 do
+  begin
+    SelectProject := TSelectProject(FSelectProjects.Items[i]);
+    if SelectProject.IsCddHt then
+    begin
+      Result := True;
+      Break;
+    end;
+  end;
+end;
+
+function TProjectSelectForm.HasCddScProject: Boolean;
+var
+  i: Integer;
+  SelectProject: TSelectProject;
+begin
+  Result := False;
+  for i := 0 to FSelectProjects.Count - 1 do
+  begin
+    SelectProject := TSelectProject(FSelectProjects.Items[i]);
+    if SelectProject.IsCddSc then
+    begin
+      Result := True;
+      Break;
+    end;
+  end;
+end;
+
+procedure TProjectSelectForm.SetCddHtProject(AProjectID: Integer);
+var
+  i: Integer;
+  SelectProject: TSelectProject;
+begin
+  for i := 0 to FSelectProjects.Count - 1 do
+  begin
+    SelectProject := TSelectProject(FSelectProjects.Items[i]);
+    SelectProject.IsCddHt := SelectProject.ProjectID = AProjectID;
+  end;
+end;
+
+procedure TProjectSelectForm.SetCddScProject(AProjectID: Integer);
+var
+  i: Integer;
+  SelectProject: TSelectProject;
+begin
+  for i := 0 to FSelectProjects.Count - 1 do
+  begin
+    SelectProject := TSelectProject(FSelectProjects.Items[i]);
+    SelectProject.IsCddSc := SelectProject.ProjectID = AProjectID;
+  end;
+end;
+
 end.

+ 185 - 0
Units/MCacheTree.pas

@@ -326,6 +326,75 @@ type
     procedure SaveTreeToFile(const AFileName: string);
   end;
 
+  TSpecPhaseCacheNode = class(TCacheNode)
+  private
+    FCode: string;
+    FB_Code: string;
+    FName: string;
+    FUnits: string;
+
+    FTotalPrice: Double;
+
+    FEndDealTotalPrice: Double;
+    FEndQcTotalPrice: Double;
+
+    FhtDgnQty1: Double;
+    FhtDgnQty2: Double;
+    FbgDgnQty1: Double;
+    FbgDgnQty2: Double;
+
+    FcbDgnQty1: Double;
+    FcbDgnQty2: Double;
+    FcbTotalPrice: Double;
+
+    FsscDgnQty1: Double;
+    FsscDgnQty2: Double;
+    FsscTotalPrice: Double;
+
+    FshtDgnQty1: Double;
+    FshtDgnQty2: Double;
+    FshtTotalPrice: Double;
+  public
+    property Code: string read FCode write FCode;
+    property B_Code: string read FB_Code write FB_Code;
+    property Name: string read FName write FName;
+    property Units: string read FUnits write FUnits;
+
+    property TotalPrice: Double read FTotalPrice write FTotalPrice; 
+
+    property EndDealTotalPrice: Double read FEndDealTotalPrice write FEndDealTotalPrice;
+    property EndQcTotalPrice: Double read FEndQcTotalPrice write FEndQcTotalPrice;
+
+    property htDgnQty1: Double read FhtDgnQty1 write FhtDgnQty1;
+    property htDgnQty2: Double read FhtDgnQty2 write FhtDgnQty2;
+    property bgDgnQty1: Double read FbgDgnQty1 write FbgDgnQty1;
+    property bgDgnQty2: Double read FbgDgnQty2 write FbgDgnQty2;
+
+    property cbDgnQty1: Double read FcbDgnQty1 write FcbDgnQty1;
+    property cbDgnQty2: Double read FcbDgnQty2 write FcbDgnQty2;
+    property cbTotalPrice: Double read FcbTotalPrice write FcbTotalPrice;
+    
+    property sscDgnQty1: Double read FsscDgnQty1 write FsscDgnQty1;
+    property sscDgnQty2: Double read FsscDgnQty2 write FsscDgnQty2;
+    property sscTotalPrice: Double read FsscTotalPrice write FsscTotalPrice;
+
+    property shtDgnQty1: Double read FshtDgnQty1 write FshtDgnQty1;
+    property shtDgnQty2: Double read FshtDgnQty2 write FshtDgnQty2;
+    property shtTotalPrice: Double read FshtTotalPrice write FshtTotalPrice;
+  end;
+
+  TSpecPhaseCacheTree = class(TCacheTree)
+  private 
+    function GetNewNode: TSpecPhaseCacheNode;
+  public
+    function AddNode(AParent: TCacheNode; ANextSibling: TCacheNode = nil): TSpecPhaseCacheNode;
+
+    function FindNextSibling(AParent: TCacheNode; ACode, AB_Code: string): TSpecPhaseCacheNode;
+    function FindNode(AParent: TCacheNode; ACode, AB_Code: string): TSpecPhaseCacheNode; overload;
+    function FindNode(AParent: TCacheNode; AName: string): TSpecPhaseCacheNode; overload;
+    function FindNode(AParent: TCacheNode; ACode, AB_Code, AName: string): TSpecPhaseCacheNode; overload;
+  end;
+
 implementation
 
 uses
@@ -1077,4 +1146,120 @@ begin
   end;
 end;
 
+{ TSpecPhaseCacheTree }
+
+function TSpecPhaseCacheTree.AddNode(AParent,
+  ANextSibling: TCacheNode): TSpecPhaseCacheNode;
+begin
+  Result := GetNewNode();
+  if Assigned(ANextSibling) then
+    ANextSibling.InsertPreSibling(Result)
+  else if Assigned(AParent) then
+    AParent.InsertChild(Result)
+  else
+    Root.InsertChild(Result);
+end;
+
+function TSpecPhaseCacheTree.FindNextSibling(AParent: TCacheNode; ACode,
+  AB_Code: string): TSpecPhaseCacheNode;
+var
+  Node: TSpecPhaseCacheNode;
+  sCodeID, sCodeID2, sB_CodeID, sB_CodeID2: string;
+begin
+  if Assigned(AParent) then
+    Node := TSpecPhaseCacheNode(AParent.FirstChild)
+  else
+    Node := TSpecPhaseCacheNode(Root.FirstChild);
+  Result := nil;
+  if (ACode = '') and (AB_Code = '') then Exit;
+  sCodeID := ConvertDigitCode(ACode, 3, '-');
+  sB_CodeID := ConvertDigitCode(AB_Code, 4, '-');
+  while Assigned(Node) do
+  begin
+    sCodeID2 := ConvertDigitCode(Node.Code, 3, '-');
+    sB_CodeID2 := ConvertDigitCode(Node.B_Code, 4, '-');
+    if (sCodeID <> '') and (sCodeID < sCodeID2) then
+    begin
+      Result := Node;
+      Break;
+    end
+    else if sB_CodeID < sB_CodeID2 then
+    begin
+      Result := Node;
+      Break;
+    end;
+    Node := TSpecPhaseCacheNode(Node.NextSibling);
+  end;
+end;
+
+function TSpecPhaseCacheTree.FindNode(AParent: TCacheNode; ACode,
+  AB_Code: string): TSpecPhaseCacheNode;
+var
+  Node: TSpecPhaseCacheNode;
+begin
+  if Assigned(AParent) then
+    Node := TSpecPhaseCacheNode(AParent.FirstChild)
+  else
+    Node := TSpecPhaseCacheNode(Root.FirstChild);
+  Result := nil;
+  while Assigned(Node) do
+  begin
+    if (Node.Code = ACode) and (Node.B_Code = AB_Code) then
+    begin
+      Result := Node;
+      Break;
+    end;
+    Node := TSpecPhaseCacheNode(Node.NextSibling);
+  end;
+end;
+
+function TSpecPhaseCacheTree.FindNode(AParent: TCacheNode;
+  AName: string): TSpecPhaseCacheNode;
+var
+  Node: TSpecPhaseCacheNode;
+begin
+  if Assigned(AParent) then
+    Node := TSpecPhaseCacheNode(AParent.FirstChild)
+  else
+    Node := TSpecPhaseCacheNode(Root.FirstChild);
+  Result := nil;
+  while Assigned(Node) do
+  begin
+    if SameText(Node.Name, AName) then
+    begin
+      Result := Node;
+      Break;
+    end;
+    Node := TSpecPhaseCacheNode(Node.NextSibling);
+  end;
+end;
+
+function TSpecPhaseCacheTree.FindNode(AParent: TCacheNode; ACode, AB_Code,
+  AName: string): TSpecPhaseCacheNode;
+var
+  Node: TSpecPhaseCacheNode;
+begin
+  if Assigned(AParent) then
+    Node := TSpecPhaseCacheNode(AParent.FirstChild)
+  else
+    Node := TSpecPhaseCacheNode(Root.FirstChild);
+  Result := nil;
+  while Assigned(Node) do
+  begin
+    if SameText(Node.Code, ACode) and SameText(Node.B_Code, AB_Code)
+        and SameText(Node.Name, AName) then
+    begin
+      Result := Node;
+      Break;
+    end;
+    Node := TSpecPhaseCacheNode(Node.NextSibling);
+  end;
+end;
+
+function TSpecPhaseCacheTree.GetNewNode: TSpecPhaseCacheNode;
+begin
+  Result := TSpecPhaseCacheNode.Create(Self, GetNewNodeID);
+  CacheNodes.Add(Result);
+end;
+
 end.

+ 13 - 2
Units/ReportManager.pas

@@ -9,6 +9,7 @@ uses
   rmOtherReport1Dm, rmGcl_XmjBillsDm, rmGclBillsPlaneDm,
   rmMentalCustomized1Dm, rmCustomized2Dm, rmHaBaiCustomizedDm,
   rmWeiWuZjjlGatherDm, rmZhongKaiDm, rmWuJiuZqzfGatherDm, rmBGBillsGatherDm,
+  rmBillsPhaseGatherDm,
   rmTestFrm,
   ReportInteractInfo,
   Classes, ScFileArchiver, IniFiles, Graphics, DB, ProjectData,
@@ -228,6 +229,7 @@ type
     FrmZhongKaiData: TrmZhongKaiData;
     FrmWuJiuZqzfGatherData: TrmWuJiuZqzfGatherData;
     FrmBGBillsGatherData: TrmBGBillsGatherData;
+    FrmBillsPhaseGatherData: TrmBillsPhaseGatherData;
 
     FMemoryQuery: TADOQuery;
 
@@ -236,6 +238,7 @@ type
     FProjects: TList;         // 普通汇总
     FE_PCDProjects: TList;    // 须选择初步设计,施工图设计
     FE_AProjects: TList;      // 须选择批准概算
+    FZjtzProjects: TList;     // 须选择初步设计,施工图设计审查预算,施工图设计合同费用
     FDealProjects: TList;     // 可选择多合同项目
 
     function OpenProject(ARec: TsdDataRecord): TProjectData;
@@ -669,6 +672,7 @@ begin
   FrmZhongKaiData := TrmZhongKaiData.Create(nil);
   FrmWuJiuZqzfGatherData := TrmWuJiuZqzfGatherData.Create(nil);
   FrmBGBillsGatherData := TrmBGBillsGatherData.Create(nil);
+  FrmBillsPhaseGatherData := TrmBillsPhaseGatherData.Create(nil);
 
   FMemoryQuery := TADOQuery.Create(nil);
 
@@ -678,6 +682,7 @@ begin
   FE_PCDProjects := TList.Create;
   FE_AProjects := TList.Create;
   FDealProjects := TList.Create;
+  FZjtzProjects := TList.Create;
 end;
 
 destructor TMemoryReportManager.Destroy;
@@ -691,9 +696,12 @@ begin
   FE_AProjects.Free;
   ClearObjects(FDealProjects);
   FDealProjects.Free;
+  ClearObjects(FZjtzProjects);
+  FZjtzProjects.Free;
 
   FMemoryQuery.Free;
 
+  FrmBillsPhaseGatherData.Free;
   FrmBGBillsGatherData.Free;
   FrmWuJiuZqzfGatherData.Free;
   FrmZhongKaiData.Free;
@@ -741,7 +749,7 @@ end;
 function TMemoryReportManager.GetMemoryDataSet(
   ADataSetID: Integer; AProjectData: TProjectData): TDataSet;
 begin
-  //ADataSetID := 60;
+  //ADataSetID := 61;
   case ADataSetID of
     1: Result := FrmGridHeaderData.AssginData(AProjectData);   // 各表表头
     2: Result := FrmGclBillsBGData.AssignData(AProjectData, rmtPhaseGather, rmgtGather); // 工程量清单[本期完成]
@@ -762,7 +770,7 @@ begin
        // 内蒙古哈白定制表(支表2, 支表3, 支表14, 支表3-1, 支表4-1, 会签)
        52, 53, 54, 55,
        // 内蒙古306国道定制(支表2, 支表3, 支表3-1, 支表4-1)
-       57, 58, 60:
+       57, 58, 60, 61:
        // 中开高速定制表(支表2, 支表3)
         Result := SelectProjectsAndAssignData(ADataSetID);
     14: Result := FrmGclBillsBGData.AssignData(AProjectData, rmtPhaseDeal, rmgtGather); // 工程量清单[本期合同]
@@ -843,6 +851,7 @@ begin
     20, 36: SelectFrm.MultiSelectType := mstE_A;
     32: SelectFrm.MultiSelectType := mstDeal;
     40: SelectFrm.MultiSelectType := mstMental1;
+    61: SelectFrm.MultiSelectType := mstZjtz;
     else SelectFrm.MultiSelectType := mstCommon;
   end;
 
@@ -867,6 +876,7 @@ begin
     13, 33: Projects := FE_PCDProjects;
     20, 36: Projects := FE_AProjects;
     32: Projects := FDealProjects;
+    61: Projects := FZjtzProjects;
     else Projects := FProjects;
   end;
 
@@ -912,6 +922,7 @@ begin
       57: Result := FrmZhongKaiData.AssignData(FTenders, zkgt2);
       58: Result := FrmZhongKaiData.AssignData(FTenders, zkgt3);
       60: Result := FrmBGBillsGatherData.AssignData(FTenders);
+      61: Result := FrmBillsPhaseGatherData.AssignData(FTenders);
       else Result := FrmBillsGatherData.AssignData(FTenders);
     end;
   end;