소스 검색

Task #1217 导入算量软件0号台账接口数据

MaiXinRong 9 년 전
부모
커밋
ebb1332dfe
8개의 변경된 파일328개의 추가작업 그리고 4개의 파일을 삭제
  1. 62 0
      DataModules/DbTreeDm.pas
  2. 14 0
      Forms/MainFrm.dfm
  3. 11 0
      Forms/MainFrm.pas
  4. 1 0
      Units/BillsClipboard.pas
  5. 1 1
      Units/CacheTree.pas
  6. 231 0
      Units/DbTreeImport.pas
  7. 1 2
      Units/ExcelImport.pas
  8. 7 1
      Units/ProjectData.pas

+ 62 - 0
DataModules/DbTreeDm.pas

@@ -0,0 +1,62 @@
+unit DbTreeDm;
+
+interface
+
+uses
+  SysUtils, Classes, sdDB, sdProvider, DB, ADODB, sdIDTree;
+
+type
+  TDbTreeData = class(TDataModule)
+    acDbTree: TADOConnection;
+    sdpDbTree: TsdADOProvider;
+    sddDbTree: TsdDataSet;
+    sdvDbTree: TsdDataView;
+  private
+    FDbTree: TsdIDTree;
+
+    procedure LoadDbTree;
+    procedure OpenDbTree(const AFileName, ATableName: string);
+  public
+    constructor Create(const AFileName, ATableName: string);
+
+    property DbTree: TsdIDTree read FDbTree;
+  end;
+
+implementation
+
+uses
+  Connections;
+
+{$R *.dfm}
+
+{ TDbTreeData }
+
+constructor TDbTreeData.Create(const AFileName, ATableName: string);
+begin
+  inherited Create(nil);
+  OpenDbTree(AFileName, ATableName);
+  LoadDbTree;
+end;
+
+procedure TDbTreeData.LoadDbTree;
+begin
+  FDbTree := TsdIDTree.Create;
+  FDbTree.KeyFieldName := 'ID';
+  FDbTree.ParentFieldName := 'ParentID';
+  FDbTree.NextSiblingFieldName := 'NextSiblingID';
+  FDbTree.DataView := sdvDbTree;
+end;
+
+procedure TDbTreeData.OpenDbTree(const AFileName, ATableName: string);
+begin
+  acDbTree.ConnectionString := Format(SAdoConnectStr, [AFileName]);
+  acDbTree.Open;
+
+  sdpDbTree.TableName := ATableName;
+  sdpDbTree.Connection := acDbTree;
+
+  sddDbTree.Open;
+  sdvDbTree.Open;
+end;
+
+end.

+ 14 - 0
Forms/MainFrm.dfm

@@ -405,6 +405,10 @@ object MainForm: TMainForm
         item
           Item = dxtbnImportCloudTenderFile
           Visible = True
+        end
+        item
+          Item = dxbtnImportDmf
+          Visible = True
         end>
     end
     object dxsiEdit: TdxBarSubItem
@@ -1051,6 +1055,10 @@ object MainForm: TMainForm
       Hint = #21462#28040#38544#34255
       Visible = ivAlways
     end
+    object dxbtnImportDmf: TdxBarButton
+      Action = actnImportDmf
+      Category = 0
+    end
   end
   object Images: TImageList
     DrawingStyle = dsTransparent
@@ -3218,6 +3226,12 @@ object MainForm: TMainForm
       Caption = #25209#37327#25554#20837
       ImageIndex = 2
     end
+    object actnImportDmf: TAction
+      Category = 'File'
+      Caption = #23548#20837#31639#37327#36719#20214'0'#21495#21488#36134#25509#21475#25968#25454
+      OnExecute = actnImportDmfExecute
+      OnUpdate = actnImportCloudTenderFileUpdate
+    end
   end
   object dxpmTabSet: TdxBarPopupMenu
     BarManager = dxBarManager

+ 11 - 0
Forms/MainFrm.pas

@@ -156,6 +156,8 @@ type
     dxbtnInsertCol: TdxBarButton;
     dxbtnHidden: TdxBarButton;
     dxbtnCancelHidden: TdxBarButton;
+    dxbtnImportDmf: TdxBarButton;
+    actnImportDmf: TAction;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
@@ -199,6 +201,7 @@ type
       Shift: TShiftState);
     procedure actnReplyUpdate(Sender: TObject);
     procedure dxbtnTenderPartitionClick(Sender: TObject);
+    procedure actnImportDmfExecute(Sender: TObject);
   private
     FProjectManagerFrame: TProjectManagerFrame;
     FProjectFrames: TList;
@@ -835,4 +838,12 @@ begin
   PartTendersModel;
 end;
 
+procedure TMainForm.actnImportDmfExecute(Sender: TObject);
+var
+  sFileName: string;
+begin
+  if SelectFile(sFileName, '.dmf') then
+    CurProjectFrame.ProjectData.ImportDmfFile(sFileName);
+end;
+
 end.

+ 1 - 0
Units/BillsClipboard.pas

@@ -110,6 +110,7 @@ begin
   Clear;
   CopyData(ANode, ACount);
   SaveToStream;
+  SaveToXmlFile('E:\1.xml');
   SaveToClipboard(CF_BillsBlock);
 end;
 

+ 1 - 1
Units/CacheTree.pas

@@ -230,7 +230,7 @@ end;
 
 function TCacheNode.GetNodeID(ANode: TCacheNode): Integer;
 begin
-  if Assigned(ANode) then
+  if Assigned(ANode) and (ANode <> nil) then
     Result := ANode.ID
   else
     Result := -1;

+ 231 - 0
Units/DbTreeImport.pas

@@ -0,0 +1,231 @@
+unit DbTreeImport;
+
+interface
+
+uses
+  ProjectData, MCacheTree, DbTreeDm, Classes, sdIDTree;
+
+const
+  FirstPartID = 1;
+
+type
+  TDbTreeImport = class
+  private
+    FProjectData: TProjectData;
+    FCacheTree: TBillsCacheTree;
+
+    FFirstPart: TBillsCacheNode;
+    FDefautNext: TBillsCacheNode;
+
+    procedure BeginImport;
+    procedure EndImport;
+
+    procedure PrepareBaseTree;
+    procedure LoadBaseTree;
+
+    function AddDbNode(ADbNode: TsdIDTreeNode; AParent, ANextSibling: TBillsCacheNode): TBillsCacheNode;
+    procedure LoadDbTree(const AFileName, ATable: string);
+    procedure WriteDbTree;
+
+    function DecryptFile(const AFileName: string): string;
+  public
+    constructor Create(AProjectData: TProjectData);
+    destructor Destroy; override;
+
+    procedure ImportDbTree(const AFileName, ATable: string);
+  end;
+
+  procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
+
+implementation
+
+uses
+  UtilMethods, TransFile, mDataRecord, BillsDm, CacheTree, BillsTree,
+  ExcelImport, sdDB, SysUtils;
+
+procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
+var
+  vImport: TDbTreeImport;
+begin
+  vImport := TDbTreeImport.Create(AProjectData);
+  try
+    vImport.ImportDbTree(AFileName, 'Bills');
+  finally
+    vImport.Free;
+  end;
+end;
+
+{ TDbTreeImport }
+
+function TDbTreeImport.AddDbNode(ADbNode: TsdIDTreeNode; AParent,
+  ANextSibling: TBillsCacheNode): TBillsCacheNode;
+var
+  iChild: Integer;
+  vChild: TsdIDTreeNode;
+begin
+  if Assigned(ADbNode) and Assigned(AParent) then
+  begin
+    Result := FCacheTree.AddNode(AParent, ANextSibling);
+    Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
+    Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
+    Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
+    Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
+    Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat; 
+    Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
+    Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
+    Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
+
+    for iChild := 0 to ADbNode.ChildCount - 1 do
+      AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
+  end;
+end;
+
+procedure TDbTreeImport.BeginImport;
+begin
+  FCacheTree := TBillsCacheTree.Create;
+
+  FProjectData.DisConnectTree;
+  FProjectData.BillsData.DisableEvents;
+end;
+
+constructor TDbTreeImport.Create(AProjectData: TProjectData);
+begin
+  FProjectData := AProjectData;
+end;
+
+function TDbTreeImport.DecryptFile(const AFileName: string): string;
+begin
+  Result := GetTempFileName;
+  AutoDecryptFile(AFileName, Result);
+end;
+
+destructor TDbTreeImport.Destroy;
+begin
+  inherited;
+end;
+
+procedure TDbTreeImport.EndImport;
+begin
+  FCacheTree.Free;
+
+  FProjectData.BillsData.EnableEvents;
+  FProjectData.ReConnectTree;
+  FProjectData.BillsCompileData.CalculateAll;
+end;
+
+procedure TDbTreeImport.ImportDbTree(const AFileName, ATable: string);
+var
+  sDecryptFile: string;
+begin
+  sDecryptFile := DecryptFile(AFileName);
+  if not FileExists(sDecryptFile) then
+  begin
+    ErrorMessage('ÎÞ·¨´ò¿ªÎļþ¡£');
+    Exit;
+  end;
+
+  BeginImport;
+  try
+    LoadBaseTree;
+    PrepareBaseTree;
+    LoadDbTree(sDecryptFile, ATable);
+    WriteDbTree;
+  finally
+    EndImport;
+  end;
+end;
+
+procedure TDbTreeImport.LoadBaseTree;
+var
+  BaseImportor: TBillsExcelImport;
+begin
+  BaseImportor := TBillsExcelImport.Create(nil);
+  try
+    BaseImportor.ImportToTree(FCacheTree, GetTemplateBillsFileName);
+  finally
+    BaseImportor.Free;
+  end;
+end;
+
+procedure TDbTreeImport.LoadDbTree(const AFileName, ATable: string);
+var
+  vDbTreeData: TDbTreeData;
+  vFirstPart, vChild: TsdIDTreeNode;
+  iChild: Integer;
+begin
+  try
+    vDbTreeData := TDbTreeData.Create(AFileName, ATable);
+
+    vFirstPart := vDbTreeData.DbTree.FirstNode;
+    for iChild := 0 to vFirstPart.ChildCount - 1 do
+    begin
+      vChild := vFirstPart.ChildNodes[iChild];
+      if vChild.Rec.ValueByName('Code').AsString = '1-10' then
+        Break;
+      AddDbNode(vChild, FFirstPart, FDefautNext);
+    end;
+  finally
+    vDbTreeData.Free;
+  end;
+end;
+
+procedure TDbTreeImport.PrepareBaseTree;
+var
+  vClears: TList;
+  vChild: TBillsCacheNode;
+  i: Integer;
+begin
+  vClears := TList.Create;
+  try
+    FFirstPart := TBillsCacheNode(FCacheTree.FirstNode);
+    vChild := TBillsCacheNode(FFirstPart.FirstChild);
+    while Assigned(vChild) do
+    begin
+      if vChild.Code = '1-10' then
+      begin
+        FDefautNext := vChild;
+        Break;
+      end
+      else
+        vClears.Add(vChild);
+      vChild := TBillsCacheNode(vChild.NextSibling);
+    end;
+
+    for i := 0 to vClears.Count - 1 do
+      FCacheTree.DeleteNode(TBillsCacheNode(vClears.Items[i]));
+  finally
+    vClears.Free;
+  end;
+end;
+
+procedure TDbTreeImport.WriteDbTree;
+var
+  iNode: Integer;
+  Rec: TBillsRecord;
+  vNode: TBillsCacheNode;
+begin
+  FProjectData.BillsData.sddBills.BeginUpdate;
+  try
+    FProjectData.BillsData.sddBills.DeleteAll;
+    for iNode := 0 to FCacheTree.CacheNodes.Count - 1 do
+    begin
+      vNode := TBillsCacheNode(FCacheTree.CacheNodes.Items[iNode]);
+      Rec := TBillsRecord(FProjectData.BillsData.sddBills.Add);
+      Rec.ID.AsInteger := vNode.ID;
+      Rec.ParentID.AsInteger := vNode.ParentID;
+      Rec.NextSiblingID.AsInteger := vNode.NextSiblingID;
+      Rec.Code.AsString := vNode.Code;
+      Rec.B_Code.AsString := vNode.B_Code;
+      Rec.Name.AsString := vNode.Name;
+      Rec.Units.AsString := vNode.Units;
+      Rec.Price.AsFloat := vNode.Price;
+      Rec.Quantity.AsFloat := vNode.OrgQuantity;
+      Rec.DgnQuantity1.AsFloat := vNode.DgnQuantity1;
+      Rec.DgnQuantity2.AsFloat := vNode.DgnQuantity2;
+    end;
+  finally
+    FProjectData.BillsData.sddBills.EndUpdate;
+  end;
+end;
+
+end.

+ 1 - 2
Units/ExcelImport.pas

@@ -154,8 +154,6 @@ procedure TBillsExcelImport.BeginImport;
 begin
   FCurRow := 0;
   FCacheTree := TBillsCacheTree.Create;
-  FCacheTree.NewNodeID := 101;
-  FCacheTree.SeparateChar := '.';
   FCacheTree.AutoSort := True;
 end;
 
@@ -180,6 +178,7 @@ begin
   FCacheTree := ACacheTree;
   sChar := FCacheTree.SeparateChar;
   FCacheTree.SeparateChar := '.';
+  FCacheTree.NewNodeID := Max(FCacheTree.NewNodeID, 101);
 
   MSExcel.LoadFromFile(sFileName);
   LoadColumnsFromHead(FMSExcel.Sheets.Spreadsheet(0));

+ 7 - 1
Units/ProjectData.pas

@@ -179,6 +179,7 @@ type
     function CheckDataBaseInfo(APhaseCount, AAuditStatus: Integer): Boolean;
 
     procedure ImportCloudTenderFile(const AFileName: string);
+    procedure ImportDmfFile(const AFileName: string);
 
     function CheckPassword: Boolean;
 
@@ -238,7 +239,7 @@ implementation
 
 uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
-  mProgressProFrm, mDataRecord, ConditionalDefines;
+  mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport;
 
 { TProjectData }
 
@@ -1914,4 +1915,9 @@ begin
   FConnection.SaveDebugFile(AFileName);
 end;
 
+procedure TProjectData.ImportDmfFile(const AFileName: string);
+begin
+  ImportDbTreeTo(AFileName, Self);
+end;
+
 end.