Преглед на файлове

1. 总分包汇总,导入分包汇总数据
2. 总分包汇总,纠错数据完善

MaiXinRong преди 7 години
родител
ревизия
16034bc5b6

+ 3 - 3
DataModules/StageDm.pas

@@ -25,9 +25,6 @@ type
     FBeforeChangeQuantity: Double;
     FBeforeChangeTotalPrice: Double;
 
-    procedure BeforeBatchOperation;
-    procedure AfterBatchOperation;
-
     procedure UpdateParentRecord(ABillsID: Integer; ATotalPrice: Double; const AFieldName: string);
     procedure UpdateComplete(ABillsID: Integer; AQuantity, ATotalPrice: Double);
 
@@ -78,6 +75,9 @@ type
     procedure Open(AConnection: TADOConnection);
     procedure Save;
 
+    procedure BeforeBatchOperation;
+    procedure AfterBatchOperation;
+
     // 计算任一清单节点的价差金额,并增量汇总至父项
     procedure CalculatePriceMargin(ABillsID: Integer);
     // 计算材料调差节点

+ 7 - 4
DataModules/ZJJLDm.pas

@@ -534,9 +534,12 @@ procedure TZJJLData.CheckZjjlVerison;
     for i := 0 to sddZJJL.RecordCount - 1 do
     begin
       Rec := sddZJJL.Records[i];
-      SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
-      SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
-      SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
+      if Rec.ValueByName('CertificateCode').AsString <> '' then
+        SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
+      if Rec.ValueByName('FormulaMemo').AsString <> '' then
+        SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
+      if Rec.ValueByName('RelaFile').AsString <> '' then
+        SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
     end;
   end;
 
@@ -725,7 +728,7 @@ procedure TZJJLData.sdvZJJLBeforeValueChange(AValue: TsdValue;
 var
   sNewValue: string;
 begin
-  if CheckFieldNeedHistory(AValue.FieldName) then
+  if CheckFieldNeedHistory(AValue.FieldName) and not TPhaseData(FPhaseData).StageDataReadOnly then
   begin
     sNewValue := VarToStrDef(NewValue, '');
     if sNewValue <> AValue.AsString then

+ 14 - 0
Forms/MainFrm.dfm

@@ -416,6 +416,10 @@ object MainForm: TMainForm
           BeginGroup = True
           Item = dxbtnExportSumBaseFile
           Visible = True
+        end
+        item
+          Item = dxbtnImportSubTenderGather
+          Visible = True
         end>
     end
     object dxsiEdit: TdxBarSubItem
@@ -1173,6 +1177,10 @@ object MainForm: TMainForm
       Hint = #23548#20986#20998#21253#27719#24635#32467#26524
       Visible = ivAlways
     end
+    object dxbtnImportSubTenderGather: TdxBarButton
+      Action = actnImportSubTenderGather
+      Category = 0
+    end
   end
   object Images: TImageList
     DrawingStyle = dsTransparent
@@ -3352,6 +3360,12 @@ object MainForm: TMainForm
       OnExecute = actnExportSumBaseFileExecute
       OnUpdate = actnUnlockInfoUpdate
     end
+    object actnImportSubTenderGather: TAction
+      Category = 'File'
+      Caption = #23548#20837#20998#21253#27719#24635#25968#25454
+      OnExecute = actnImportSubTenderGatherExecute
+      OnUpdate = actnImportSubTenderGatherUpdate
+    end
   end
   object dxpmTabSet: TdxBarPopupMenu
     BarManager = dxBarManager

+ 21 - 0
Forms/MainFrm.pas

@@ -175,6 +175,8 @@ type
     dxbtnExportAllError: TdxBarButton;
     dxbtnExportStgResultExcel: TdxBarButton;
     dxbtnExportStgResult: TdxBarButton;
+    dxbtnImportSubTenderGather: TdxBarButton;
+    actnImportSubTenderGather: TAction;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
@@ -222,6 +224,8 @@ type
     procedure dxbtnHelpCenterClick(Sender: TObject);
     procedure actnExportSumBaseFileExecute(Sender: TObject);
     procedure dxbtnGatherSubTenderClick(Sender: TObject);
+    procedure actnImportSubTenderGatherExecute(Sender: TObject);
+    procedure actnImportSubTenderGatherUpdate(Sender: TObject);
   private
     FProjectManagerFrame: TProjectManagerFrame;
     FProjectFrames: TList;
@@ -929,4 +933,21 @@ begin
   end;
 end;
 
+procedure TMainForm.actnImportSubTenderGatherExecute(Sender: TObject);
+var
+  sFileName: string;
+begin
+  if CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0 then
+    WarningMessage('未开始计量,请在开始计量后再导入分包汇总数据。')
+  else if CurProjectFrame.ProjectData.StageDataReadOnly then
+    WarningMessage('当前正在查看往期数据,请切换至最新一起再导入分包汇总数据。')
+  else if SelectFile(sFileName, '.sgf') then
+    CurProjectFrame.ProjectData.ImportSubTenderGather(sFileName);
+end;
+
+procedure TMainForm.actnImportSubTenderGatherUpdate(Sender: TObject);
+begin
+  TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
+end;
+
 end.

+ 2 - 1
SubTenderGather/stgGather.pas

@@ -152,7 +152,8 @@ begin
   //if Assigned(ASourceNode.StageRec) and
   //   ((ASourceNode.StageRec.GatherQuantity.AsFloat <> 0) or (ASourceNode.StageRec.GatherTotalPrice.AsFloat <> 0)) then
   
-  if not ASourceNode.HasChildren then
+  //if not ASourceNode.HasChildren then
+  if (AGatherNode.IsSubTender) or (not ASourceNode.HasChildren) then
   begin
     vSubTender := AGatherNode.SafeSubTender(FCurSubTenderID);
     vSubTender.AddDetail(ASourceNode);

+ 7 - 1
SubTenderGather/stgGatherDm.dfm

@@ -59,7 +59,13 @@ object stgGatherData: TstgGatherData
       616D650608516342474C4E756D094669656C644E616D650608516342474C4E75
       6D0844617461547970650218084461746153697A6503FF000549734B6579080F
       4E65656450726F636573734E616D650809507265636973696F6E02000453697A
-      6502000000}
+      6502000001044E616D650609497353756D42617365094669656C644E616D6506
+      09497353756D426173650844617461547970650205084461746153697A650201
+      0549734B6579080F4E65656450726F636573734E616D65080950726563697369
+      6F6E02000453697A6502000001044E616D65060649734C656166094669656C64
+      4E616D65060649734C6561660844617461547970650205084461746153697A65
+      02010549734B6579080F4E65656450726F636573734E616D6508095072656369
+      73696F6E02000453697A6502000000}
   end
   object sdvGatherTree: TsdDataView
     Active = False

+ 17 - 0
SubTenderGather/stgGatherDm.pas

@@ -1,4 +1,5 @@
 unit stgGatherDm;
+// ½á¹ûչʾ£¬ÄÚ´æ±í
 
 interface
 
@@ -98,6 +99,8 @@ begin
   Rec.ValueByName('Name').AsString := ANode.Name;
   Rec.ValueByName('Units').AsString := ANode.Units;
   Rec.ValueByName('IsSubTender').AsBoolean := ANode.IsSubTender;
+  Rec.ValueByName('IsSumBase').AsBoolean := ANode.IsSumBase;
+  Rec.ValueByName('IsLeaf').AsBoolean := ANode.IsLeaf;
 
   Rec.ValueByName('DealQuantity').AsFloat := ANode.Gather.DealQuantity;
   Rec.ValueByName('DealTotalPrice').AsFloat := ANode.Gather.DealTotalPrice;
@@ -211,6 +214,16 @@ begin
 end;
 
 procedure TstgGatherData.LoadError(AError: TstgErrorInfo);
+
+  function GetSubTenderSerialNo(ANode: TstgGatherTreeNode; ATenderID: Integer): Integer;
+  var
+    vSource: TstgSubTenderStageData;
+  begin
+    vSource := ANode.FindSubTender(ATenderID);
+    if Assigned(vSource) then
+      Result := vSource.Detail[0].SerialNo;
+  end;
+
 var
   i, j, k: Integer;
   vRelaDetail: TstgGatherTreeNode;
@@ -228,6 +241,10 @@ begin
         Rec := sddErrorDetail.Add;
         Rec.ValueByName('TenderID').AsInteger := vRelaDetail.SubTender[j].SubTenderID;
         Rec.ValueByName('RelaCode').AsString := AError.RelaNode.Code + AError.RelaNode.B_Code;
+        if AError.RelaNode.IsLeaf then
+          Rec.ValueByName('RelaSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo
+        else
+          Rec.ValueByName('RelaSerialNo').AsInteger := GetSubTenderSerialNo(AError.RelaNode, vRelaDetailStage.SubTenderID);
         Rec.ValueByName('DetailCode').AsString := vRelaDetail.Code + vRelaDetail.B_Code;
         Rec.ValueByName('DetailSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo;
         Rec.ValueByName('ErrorType').AsInteger := AError.ErrorType;

+ 0 - 84
SubTenderGather/stgResultExportDm.dfm

@@ -1,84 +0,0 @@
-object stgResultExportData: TstgResultExportData
-  OldCreateOrder = False
-  Left = 27
-  Top = 244
-  Height = 202
-  Width = 270
-  object sdpBills: TsdADOProvider
-    Connection = acResult
-    TableName = 'Bills'
-    Left = 114
-    Top = 32
-  end
-  object sddBills: TsdDataSet
-    Active = False
-    Provider = sdpBills
-    Left = 114
-    Top = 96
-    FieldListData = {
-      0101044E616D6506024944094669656C644E616D650602494408446174615479
-      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
-      650608506172656E744944094669656C644E616D650608506172656E74494408
-      44617461547970650203084461746153697A6502040549734B6579080F4E6565
-      6450726F636573734E616D650909507265636973696F6E02000453697A650200
-      0001044E616D65060D4E6578745369626C696E674944094669656C644E616D65
-      060D4E6578745369626C696E6749440844617461547970650203084461746153
-      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
-      65636973696F6E02000453697A6502000001044E616D650604436F6465094669
-      656C644E616D650604436F64650844617461547970650218084461746153697A
-      6502320549734B6579080F4E65656450726F636573734E616D65090950726563
-      6973696F6E02000453697A6502000001044E616D650606425F436F6465094669
-      656C644E616D650606425F436F64650844617461547970650218084461746153
-      697A6502320549734B6579080F4E65656450726F636573734E616D6509095072
-      65636973696F6E02000453697A6502000001044E616D6506044E616D65094669
-      656C644E616D6506044E616D650844617461547970650218084461746153697A
-      6503C8000549734B6579080F4E65656450726F636573734E616D650909507265
-      636973696F6E02000453697A6502000001044E616D650605556E697473094669
-      656C644E616D650605556E697473084461746154797065021808446174615369
-      7A6502140549734B6579080F4E65656450726F636573734E616D650909507265
-      636973696F6E02000453697A6502000000}
-  end
-  object sdpStage: TsdADOProvider
-    Connection = acResult
-    TableName = 'Stage'
-    Left = 195
-    Top = 32
-  end
-  object sddStage: TsdDataSet
-    Active = False
-    Provider = sdpStage
-    Left = 195
-    Top = 96
-    FieldListData = {
-      0101044E616D65060742696C6C734944094669656C644E616D65060742696C6C
-      7349440844617461547970650203084461746153697A6502040549734B657908
-      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
-      7A6502000001044E616D65060C4465616C5175616E74697479094669656C644E
-      616D65060C4465616C5175616E74697479084461746154797065020608446174
-      6153697A6502080549734B6579080F4E65656450726F636573734E616D650909
-      507265636973696F6E02000453697A6502000001044E616D65060E4465616C54
-      6F74616C5072696365094669656C644E616D65060E4465616C546F74616C5072
-      6963650844617461547970650206084461746153697A6502080549734B657908
-      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
-      7A6502000001044E616D65060A51635175616E74697479094669656C644E616D
-      65060A51635175616E746974790844617461547970650206084461746153697A
-      6502080549734B6579080F4E65656450726F636573734E616D65090950726563
-      6973696F6E02000453697A6502000001044E616D65060C5163546F74616C5072
-      696365094669656C644E616D65060C5163546F74616C50726963650844617461
-      547970650206084461746153697A6502080549734B6579080F4E65656450726F
-      636573734E616D650909507265636973696F6E02000453697A6502000001044E
-      616D650609516342474C436F6465094669656C644E616D650609516342474C43
-      6F64650844617461547970650218084461746153697A6503FF000549734B6579
-      080F4E65656450726F636573734E616D650909507265636973696F6E02000453
-      697A6502000001044E616D650608516342474C4E756D094669656C644E616D65
-      0608516342474C4E756D0844617461547970650218084461746153697A6503FF
-      000549734B6579080F4E65656450726F636573734E616D650909507265636973
-      696F6E02000453697A6502000000}
-  end
-  object acResult: TADOConnection
-    LoginPrompt = False
-    Left = 40
-    Top = 32
-  end
-end

+ 0 - 125
SubTenderGather/stgResultExportDm.pas

@@ -1,125 +0,0 @@
-unit stgResultExportDm;
-
-interface
-
-uses
-  SysUtils, Classes, sdDB, sdProvider, stgGatherDm, ADODB, DB;
-
-type
-  TstgResultExportData = class(TDataModule)
-    sdpBills: TsdADOProvider;
-    sddBills: TsdDataSet;
-    sdpStage: TsdADOProvider;
-    sddStage: TsdDataSet;
-    acResult: TADOConnection;
-  private
-    FTempFile: string;
-    procedure LoadMemortyRecord(ARec: TsdDataRecord);
-
-    procedure BeforeExport;
-    procedure AfterExport;
-  public
-    procedure SaveTo(const AFileName: string);
-
-    procedure LoadMemoryGatherData(AGatherData: TstgGatherData);
-    procedure ExportGatherDataTo(AGatherData:TstgGatherData; const AFileName: string);
-  end;
-
-implementation
-
-uses
-  UtilMethods, ZhAPI, Connections, stgTables, ScAutoUpdateUnit;
-
-{$R *.dfm}
-
-{ TstgResultExportData }
-
-procedure TstgResultExportData.AfterExport;
-begin
-  if FileExists(FTempFile) then
-    DeleteFile(FTempFile);
-end;
-
-procedure TstgResultExportData.BeforeExport;
-
-  procedure UpdateDataTables;
-  var
-    Updater: TScUpdater;
-  begin
-    Updater := TScUpdater.Create;
-    try
-      Updater.ForceUpdate := True;
-      Updater.Open('', acResult, '', '');
-      Updater.AddTableDef(sStgBills, @tdStgBills, Length(tdStgBills), False, False);
-      Updater.AddTableDef(sStgStage, @tdStgStage, Length(tdStgStage), False, False);
-      Updater.ExcuteUpdate;
-    finally
-      Updater.Free;
-    end;
-  end;
-
-begin
-  FTempFile := GetTempFileName;
-  CopyFileOrFolder(GetEmptyDataBaseFileName, FTempFile);
-  acResult.ConnectionString := Format(SAdoConnectStr, [FTempFile]);
-  acResult.Open;
-  UpdateDataTables;
-  sddBills.Open;
-  sddStage.Open;
-end;
-
-procedure TstgResultExportData.ExportGatherDataTo(
-  AGatherData: TstgGatherData; const AFileName: string);
-begin
-  BeforeExport;
-  try
-    LoadMemoryGatherData(AGatherData);
-    SaveTo(AFileName);
-  finally
-    AfterExport;
-  end;
-end;
-
-procedure TstgResultExportData.LoadMemortyRecord(ARec: TsdDataRecord);
-var
-  vBills, vStage: TsdDataRecord;
-begin
-  vBills := sddBills.Add;
-  vBills.ValueByName('ID').AsInteger := ARec.ValueByName('ID').AsInteger;
-  vBills.ValueByName('ParentID').AsInteger := ARec.ValueByName('ParentID').AsInteger;
-  vBills.ValueByName('NextSiblingID').AsInteger := ARec.ValueByName('NextSiblingID').AsInteger;
-  vBills.ValueByName('Code').AsString := ARec.ValueByName('Code').AsString;
-  vBills.ValueByName('B_Code').AsString := ARec.ValueByName('B_Code').AsString;
-  vBills.ValueByName('Name').AsString := ARec.ValueByName('Name').AsString;
-  vBills.ValueByName('Units').AsString := ARec.ValueByName('Units').AsString;
-  vStage := sddStage.Add;
-  vStage.ValueByName('BillsID').AsInteger := ARec.ValueByName('ID').AsInteger;
-  vStage.ValueByName('DealQuantity').AsFloat := ARec.ValueByName('DealQuantity').AsFloat;
-  vStage.ValueByName('DealTotalPrice').AsFloat := ARec.ValueByName('DealTotalPrice').AsFloat;
-  vStage.ValueByName('QcQuantity').AsFloat := ARec.ValueByName('QcQuantity').AsFloat;
-  vStage.ValueByName('QcTotalPrice').AsFloat := ARec.ValueByName('QcTotalPrice').AsFloat;
-  vStage.ValueByName('QcBGLCode').AsString := ARec.ValueByName('QcBGLCode').AsString;
-  vStage.ValueByName('QcBGLNum').AsString := ARec.ValueByName('QcBGLNum').AsString;
-end;
-
-procedure TstgResultExportData.LoadMemoryGatherData(
-  AGatherData: TstgGatherData);
-var
-  i: Integer;
-  vRec: TsdDataRecord;
-begin
-  for i := 0 to AGatherData.sddGatherTree.RecordCount - 1 do
-  begin
-    vRec := AGatherData.sddGatherTree.Records[i];
-    LoadMemortyRecord(vRec);
-  end;
-end;
-
-procedure TstgResultExportData.SaveTo(const AFileName: string);
-begin
-  sddBills.Save;
-  sddStage.Save;
-  CopyFileOrFolder(FTempFile, AFileName);
-end;
-
-end.

+ 2 - 0
SubTenderGather/stgResultFrm.dfm

@@ -4,6 +4,7 @@ object stgResultForm: TstgResultForm
   Width = 1305
   Height = 675
   ActiveControl = zgGatherTree
+  BorderIcons = [biSystemMenu, biMaximize]
   Caption = #20998#21253#27719#24635
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
@@ -12,6 +13,7 @@ object stgResultForm: TstgResultForm
   Font.Name = 'MS Sans Serif'
   Font.Style = []
   OldCreateOrder = False
+  Position = poMainFormCenter
   PixelsPerInch = 96
   TextHeight = 13
   object jpsResult: TJimPages

+ 3 - 3
SubTenderGather/stgResultFrm.pas

@@ -3,7 +3,7 @@ unit stgResultFrm;
 interface
 
 uses
-  stgGatherDm, sdIDTree, UtilMethods, stgExcelExport, stgResultExportDm,
+  stgGatherDm, sdIDTree, UtilMethods, stgExcelExport, stgSubGatherFile,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, JimTabs, JimPages, sdGridDBA, sdGridTreeDBA, ZJGrid, ExtCtrls,
   StdCtrls, dxBar, ActnList;
@@ -174,11 +174,11 @@ end;
 procedure TstgResultForm.actnExportStgResultExecute(Sender: TObject);
 var
   sFileName: string;
-  vExportor: TstgResultExportData;
+  vExportor: TstgSubGatherFileExportor;
 begin
   if SaveFile(sFileName, '.sgf') then
   begin
-    vExportor := TstgResultExportData.Create(nil);
+    vExportor := TstgSubGatherFileExportor.Create;
     try
       vExportor.ExportGatherDataTo(FGatherData, sFileName);
     finally

+ 214 - 0
SubTenderGather/stgSubGatherFile.pas

@@ -0,0 +1,214 @@
+unit stgSubGatherFile;
+// µ¼Èëµ¼³ö»ã×ܽá¹û
+
+interface
+
+uses
+  stgSubGatherFileDm, ADODB, sdDB, stgGatherDm, SysUtils, StageDm, mDataRecord;
+
+type
+  TstgSubGatherFileHelper = class
+  private
+    FTempFile: string;
+    FConnection: TADOConnection;
+    FGatherData: TstgSubGatherData;
+  public
+    constructor Create;
+    destructor Destroy; override;
+
+    procedure Open(const AFileName: string);
+    procedure Close;
+    procedure SaveTo(const AFileName: string);
+
+    property Connection: TADOConnection read FConnection;
+    property GatherData: TstgSubGatherData read FGatherData;
+  end;
+
+  TstgSubGatherFileExportor = class(TstgSubGatherFileHelper)
+  private
+    procedure LoadMemoryRecord(ARec: TsdDataRecord);
+    procedure LoadMemoryGatherData(AGatherData: TstgGatherData);
+  public
+    procedure ExportGatherDataTo(AGatherData:TstgGatherData; const AFileName: string);
+  end;
+
+  TstgSubGatherFileImportor = class(TstgSubGatherFileHelper)
+  private
+    procedure ClearOldData(AStageData: TStageData);
+    procedure ImportGatherData(AStageData: TStageData);
+  public
+    procedure ImportGatherDataTo(AStageData: TStageData; const AFileName: string);
+  end;
+
+implementation
+
+
+uses
+  UtilMethods, ZhAPI, Connections, stgTables, ScAutoUpdateUnit, Math;
+
+{ TstgSubGatherFileExportor }
+
+procedure TstgSubGatherFileExportor.ExportGatherDataTo(
+  AGatherData: TstgGatherData; const AFileName: string);
+begin
+  Open(GetEmptyDataBaseFileName);
+  try
+    LoadMemoryGatherData(AGatherData);
+  finally                             
+    SaveTo(AFileName);
+  end;
+end;
+
+procedure TstgSubGatherFileExportor.LoadMemoryRecord(ARec: TsdDataRecord);
+var
+  vRec: TsdDataRecord;
+begin
+  vRec := GatherData.sddBills.Add;
+  vRec.ValueByName('ID').AsInteger := ARec.ValueByName('ID').AsInteger;
+  vRec.ValueByName('ParentID').AsInteger := ARec.ValueByName('ParentID').AsInteger;
+  vRec.ValueByName('NextSiblingID').AsInteger := ARec.ValueByName('NextSiblingID').AsInteger;
+  vRec.ValueByName('Code').AsString := ARec.ValueByName('Code').AsString;
+  vRec.ValueByName('B_Code').AsString := ARec.ValueByName('B_Code').AsString;
+  vRec.ValueByName('Name').AsString := ARec.ValueByName('Name').AsString;
+  vRec.ValueByName('Units').AsString := ARec.ValueByName('Units').AsString;
+  vRec.ValueByName('IsSumBase').AsBoolean := ARec.ValueByName('IsSumBase').AsBoolean;
+  vRec.ValueByName('IsLeaf').AsBoolean := ARec.ValueByName('IsLeaf').AsBoolean;
+  vRec.ValueByName('DealQuantity').AsFloat := ARec.ValueByName('DealQuantity').AsFloat;
+  vRec.ValueByName('DealTotalPrice').AsFloat := ARec.ValueByName('DealTotalPrice').AsFloat;
+  vRec.ValueByName('QcQuantity').AsFloat := ARec.ValueByName('QcQuantity').AsFloat;
+  vRec.ValueByName('QcTotalPrice').AsFloat := ARec.ValueByName('QcTotalPrice').AsFloat;
+  vRec.ValueByName('QcBGLCode').AsString := ARec.ValueByName('QcBGLCode').AsString;
+  vRec.ValueByName('QcBGLNum').AsString := ARec.ValueByName('QcBGLNum').AsString;
+end;
+
+procedure TstgSubGatherFileExportor.LoadMemoryGatherData(
+  AGatherData: TstgGatherData);
+var
+  i: Integer;
+  vRec: TsdDataRecord;
+begin
+  GatherData.sddBills.BeginUpdate;
+  try
+    for i := 0 to AGatherData.sddGatherTree.RecordCount - 1 do
+    begin
+      vRec := AGatherData.sddGatherTree.Records[i];
+      LoadMemoryRecord(vRec);
+    end;
+  finally
+    GatherData.sddBills.EndUpdate;
+  end;
+end;
+
+{ TstgSubGatherFileHelper }
+
+procedure TstgSubGatherFileHelper.Close;
+begin
+  FConnection.Close;
+  if FileExists(FTempFile) then
+    DeleteFile(FTempFile);
+end;
+
+constructor TstgSubGatherFileHelper.Create;
+begin
+  FConnection := TADOConnection.Create(nil);
+  FConnection.LoginPrompt := False;
+  FGatherData := TstgSubGatherData.Create(nil);
+end;
+
+destructor TstgSubGatherFileHelper.Destroy;
+begin
+  Close;
+  FGatherData.Free;
+  FConnection.Free;
+  inherited;
+end;
+
+procedure TstgSubGatherFileHelper.Open(const AFileName: string);
+
+  procedure UpdateDataTables;
+  var
+    Updater: TScUpdater;
+  begin
+    Updater := TScUpdater.Create;
+    try
+      Updater.ForceUpdate := True;
+      Updater.Open('', FConnection, '', '');
+      Updater.AddTableDef(sStgBills, @tdStgBills, Length(tdStgBills), False, False);
+      Updater.ExcuteUpdate;
+    finally
+      Updater.Free;
+    end;
+  end;
+
+begin
+  FTempFile := GetTempFileName;
+  CopyFileOrFolder(AFileName, FTempFile);
+  FConnection.ConnectionString := Format(SAdoConnectStr, [FTempFile]);
+  FConnection.Open;
+  UpdateDataTables;
+  GatherData.Open(FConnection);
+end;
+
+procedure TstgSubGatherFileHelper.SaveTo(const AFileName: string);
+begin
+  FGatherData.Save;
+  CopyFileOrFolder(FTempFile, AFileName);
+end;
+
+{ TstgSubGatherFileImportor }
+
+procedure TstgSubGatherFileImportor.ClearOldData(AStageData: TStageData);
+var
+  i: Integer;
+  vRec: TStageRecord;
+begin
+  for i := 0 to AStageData.sddStage.RecordCount - 1 do
+  begin
+    vRec := TStageRecord(AStageData.sddStage.Records[i]);
+    vRec.DealQuantity.AsFloat := 0;
+    vRec.DealTotalPrice.AsFloat := 0;
+    vRec.DealFlag.AsInteger := 0;
+    vRec.DealFormula.AsString := '';
+    vRec.QcQuantity.AsFloat := 0;
+    vRec.QcTotalPrice.AsFloat := 0;
+    vRec.QcFlag.AsInteger := 0;
+    vRec.QcFormula.AsString := '';
+    vRec.QcBGLCode.AsString := '';
+    vRec.QcBGLNum.AsString := '';
+  end;
+end;
+
+procedure TstgSubGatherFileImportor.ImportGatherData(
+  AStageData: TStageData);
+var
+  i: Integer;
+  vOrgRec: TsdDataRecord;
+  vStageRec: TStageRecord;
+begin
+  for i := 0 to GatherData.sddBills.RecordCount - 1 do
+  begin
+    vOrgRec := GatherData.sddBills.Records[i];
+    if vOrgRec.ValueByName('IsSumBase').AsBoolean and vOrgRec.ValueByName('IsLeaf').AsBoolean then
+    begin
+      vStageRec := AStageData.StageRecordWithAdd(vOrgRec.ValueByName('ID').AsInteger);
+      vStageRec.DealQuantity.AsFloat := vOrgRec.ValueByName('DealQuantity').AsFloat;
+    end;
+  end;
+end;
+
+procedure TstgSubGatherFileImportor.ImportGatherDataTo(
+  AStageData: TStageData; const AFileName: string);
+begin
+  Open(AFileName);
+  AStageData.sddStage.BeginUpdate;
+  AStageData.BeforeBatchOperation;
+  try
+    ClearOldData(AStageData);
+    ImportGatherData(AStageData);
+  finally
+    AStageData.AfterBatchOperation;
+    AStageData.sddStage.EndUpdate;
+  end;
+end;
+
+end.

+ 68 - 0
SubTenderGather/stgSubGatherFileDm.dfm

@@ -0,0 +1,68 @@
+object stgSubGatherData: TstgSubGatherData
+  OldCreateOrder = False
+  Left = 27
+  Top = 244
+  Height = 202
+  Width = 186
+  object sdpBills: TsdADOProvider
+    TableName = 'Bills'
+    Left = 35
+    Top = 32
+  end
+  object sddBills: TsdDataSet
+    Active = False
+    Provider = sdpBills
+    Left = 35
+    Top = 96
+    FieldListData = {
+      0101044E616D6506024944094669656C644E616D650602494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650608506172656E744944094669656C644E616D650608506172656E74494408
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D65060D4E6578745369626C696E674944094669656C644E616D65
+      060D4E6578745369626C696E6749440844617461547970650203084461746153
+      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D650604436F6465094669
+      656C644E616D650604436F64650844617461547970650218084461746153697A
+      6502320549734B6579080F4E65656450726F636573734E616D65090950726563
+      6973696F6E02000453697A6502000001044E616D650606425F436F6465094669
+      656C644E616D650606425F436F64650844617461547970650218084461746153
+      697A6502320549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D6506044E616D65094669
+      656C644E616D6506044E616D650844617461547970650218084461746153697A
+      6503C8000549734B6579080F4E65656450726F636573734E616D650909507265
+      636973696F6E02000453697A6502000001044E616D650605556E697473094669
+      656C644E616D650605556E697473084461746154797065021808446174615369
+      7A6502140549734B6579080F4E65656450726F636573734E616D650909507265
+      636973696F6E02000453697A6502000001044E616D650609497353756D426173
+      65094669656C644E616D650609497353756D4261736508446174615479706502
+      05084461746153697A6502010549734B6579080F4E65656450726F636573734E
+      616D650909507265636973696F6E02000453697A6502000001044E616D650606
+      49734C656166094669656C644E616D65060649734C6561660844617461547970
+      650205084461746153697A6502010549734B6579080F4E65656450726F636573
+      734E616D650909507265636973696F6E02000453697A6502000001044E616D65
+      060C4465616C5175616E74697479094669656C644E616D65060C4465616C5175
+      616E746974790844617461547970650206084461746153697A6502080549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D65060E4465616C546F74616C50726963650946
+      69656C644E616D65060E4465616C546F74616C50726963650844617461547970
+      650206084461746153697A6502080549734B6579080F4E65656450726F636573
+      734E616D650909507265636973696F6E02000453697A6502000001044E616D65
+      060A51635175616E74697479094669656C644E616D65060A51635175616E7469
+      74790844617461547970650206084461746153697A6502080549734B6579080F
+      4E65656450726F636573734E616D650909507265636973696F6E02000453697A
+      6502000001044E616D65060C5163546F74616C5072696365094669656C644E61
+      6D65060C5163546F74616C507269636508446174615479706502060844617461
+      53697A6502080549734B6579080F4E65656450726F636573734E616D65090950
+      7265636973696F6E02000453697A6502000001044E616D650609516342474C43
+      6F6465094669656C644E616D650609516342474C436F64650844617461547970
+      650218084461746153697A6503FF000549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650608516342474C4E756D094669656C644E616D650608516342474C4E756D08
+      44617461547970650218084461746153697A6503FF000549734B6579080F4E65
+      656450726F636573734E616D650909507265636973696F6E02000453697A6502
+      000000}
+  end
+end

+ 36 - 0
SubTenderGather/stgSubGatherFileDm.pas

@@ -0,0 +1,36 @@
+unit stgSubGatherFileDm;
+// 导入导出汇总结果,连接数据表
+
+interface
+
+uses
+  SysUtils, Classes, sdDB, sdProvider, ADODB, DB;
+
+type
+  TstgSubGatherData = class(TDataModule)
+    sdpBills: TsdADOProvider;
+    sddBills: TsdDataSet;
+  private
+  public
+    procedure Open(AConnection: TADOConnection);
+    procedure Save;
+  end;
+
+implementation
+
+{$R *.dfm}
+
+{ TstgSubGatherData }
+
+procedure TstgSubGatherData.Open(AConnection: TADOConnection);
+begin
+  sdpBills.Connection := AConnection;
+  sddBills.Open;
+end;
+
+procedure TstgSubGatherData.Save;
+begin
+  sddBills.Save;
+end;
+
+end.

+ 4 - 7
SubTenderGather/stgTables.pas

@@ -7,19 +7,16 @@ uses
 
 const
   sStgBills = 'Bills';
-  tdStgBills : array [0..6] of TScFieldDef = (
+  tdStgBills : array [0..14] of TScFieldDef = (
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     (FieldName: 'ParentID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'NextSiblingID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'B_Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Name'; FieldType: ftString; Size: 200; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
-    (FieldName: 'Units'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
-  );
-
-  sStgStage = 'Stage';
-  tdStgStage: array [0..6] of TScFieldDef = (
-    (FieldName: 'BillsID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    (FieldName: 'Units'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'IsSumBase'; FieldType: ftBoolean; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'IsLeaf'; FieldType: ftBoolean; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'DealQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'DealTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'QcQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),

+ 17 - 1
Units/ProjectData.pas

@@ -198,6 +198,7 @@ type
 
     procedure ImportCloudTenderFile(const AFileName: string);
     procedure ImportDmfFile(const AFileName: string);
+    procedure ImportSubTenderGather(const AFileName: string);
 
     function CheckPassword: Boolean;
 
@@ -270,7 +271,7 @@ implementation
 uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
-  StrUtils, sdProvider, CalcDecimal, Math;
+  StrUtils, sdProvider, CalcDecimal, Math, stgSubGatherFile;
 
 { TProjectData }
 
@@ -2200,4 +2201,19 @@ begin
   OpenForSignOnline(AFileName, APhaseIndex);
 end;
 
+procedure TProjectData.ImportSubTenderGather(const AFileName: string);
+var
+  vImportor: TstgSubGatherFileImportor;
+begin
+  if PhaseData.StageDataReadOnly then Exit;
+
+  vImportor := TstgSubGatherFileImportor.Create;
+  try
+    vImportor.ImportGatherDataTo(PhaseData.StageData, AFileName);
+  finally
+    CalculateAll;
+    vImportor.Free;
+  end;
+end;
+
 end.