Bläddra i källkod

1. SignOnline, interface
2. New control export PDF file, for Reports & SignOnline

MaiXinRong 8 år sedan
förälder
incheckning
5c44674b0e

+ 1 - 0
DataModules/BillsCompileDm.pas

@@ -916,6 +916,7 @@ procedure TBillsCompileData.CalculateOrg(ABillsID: Integer);
 var
   vNode: TBillsIDTreeNode;
   iChild: Integer;
+  fValue: Double;
 begin
   vNode := TBillsIDTreeNode(BillsCompileTree.FindNode(ABillsID));
   if not Assigned(vNode) then Exit;

+ 130 - 0
DataModules/PHPWebDm.pas

@@ -110,6 +110,12 @@ type
     function ExistInServer(AWebID: Integer): Boolean;
     function GetNameFromURLProtocol(AURLProtocol: string): string;
 
+    function UploadFile(AUrl: string; AInFields, AInValues: array of string;
+      AFileName: string; var ErrorMessage: string): Boolean;
+    function UploadFiles(AUrl: string; AInFields, AInValues: array of string;
+      AUpFileFields, AUpFileNames: array of string; var ErrorMessage: string): Boolean;
+
+    function UrlGet(AUrl: string; APostParam: TStrings; var AResult: TStrings): Integer;
 
     property Account: string read FAccount write SetAccount;
     property UserID: Integer read FUserID write SetUserID;
@@ -778,6 +784,130 @@ begin
   end;  }
 end;
 
+function TPHPWeb.UploadFile(AUrl: string; AInFields,
+  AInValues: array of string; AFileName: string; var ErrorMessage: string): Boolean;
+var
+  IdDataStream: TIdMultiPartFormDataStream;
+  i: Integer;
+  sPostResult: string;
+  J: TCslJson;
+  vIdHttp: TIdHTTP;
+begin
+  Result := False;
+  if not FileExists(AFileName) then Exit;
+
+  IdDataStream := TIdMultiPartFormDataStream.Create;
+
+  vIdHTTP := TIdHTTP.Create(nil);
+  try
+    for i := Low(AInFields) to High(AInFields) do
+      IdDataStream.AddFormField(AInFields[i], AInValues[i]);
+
+    IdDataStream.AddFile('upfile', AFileName, 'text/plain');
+    IdDataStream.Position := 0;
+    try
+      sPostResult := vIdHTTP.Post(MeasureURL + AUrl, IdDataStream);
+
+      J := TCslJson.Create;
+      J.Text := Utf8ToAnsi(sPostResult);
+      Result := SameText(J.Value['status'], 'true');
+      if not Result then
+        ErrorMessage := J.Value['msg'];
+    finally
+      J.Free;
+    end;
+  finally
+    IdDataStream.Free;
+    vIdHttp.Free;
+  end;
+end;
+
+function TPHPWeb.UploadFiles(AUrl: string; AInFields, AInValues,
+  AUpFileFields, AUpFileNames: array of string;
+  var ErrorMessage: string): Boolean;
+var
+  IdDataStream: TIdMultiPartFormDataStream;
+  i: Integer;
+  sPostResult: string;
+  J: TCslJson;
+  vIdHttp: TIdHTTP;
+begin
+  Result := False;
+  for i := Low(AUpFileNames) to High(AUpFileNames) do
+    if not FileExists(AUpFileNames[i]) then Exit;
+
+  IdDataStream := TIdMultiPartFormDataStream.Create;
+
+  vIdHTTP := TIdHTTP.Create(nil);
+  try
+    for i := Low(AInFields) to High(AInFields) do
+      IdDataStream.AddFormField(AInFields[i], AInValues[i]);
+    for i := Low(AUpFileFields) to High(AUpFileFields) do
+      IdDataStream.AddFile(AUpFileFields[i], AUpFileNames[i], 'text/plain');
+    IdDataStream.Position := 0;
+    try
+      sPostResult := vIdHTTP.Post(MeasureURL + AUrl, IdDataStream);
+
+      J := TCslJson.Create;
+      J.Text := Utf8ToAnsi(sPostResult);
+      Result := SameText(J.Value['status'], 'true');
+      if not Result then
+        ErrorMessage := J.Value['msg'];
+    finally
+      J.Free;
+    end;
+  finally
+    IdDataStream.Free;
+    vIdHttp.Free;
+  end;
+end;
+
+function TPHPWeb.UrlGet(AUrl: string; APostParam: TStrings;
+  var AResult: TStrings): Integer;
+var
+  i: Integer;
+  postList: TStrings;
+  ssResponse: TStringStream;
+  bDone: Boolean;
+  vJson: TCslJson;
+  vIdHTTP: TIdHTTP;
+begin
+  Result := -1;
+  ssResponse := TStringStream.Create('');
+  vIdHTTP := TIdHTTP.Create(nil);
+  try
+    vIdHTTP.Post(AUrl, APostParam, ssResponse);
+    if (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then
+    begin
+      // Analyse Result Json
+      vJson := TCslJson.Create;
+      try
+        vJson.Text := Utf8ToAnsi(ssResponse.DataString);
+        if SameText(vJson.Value['status'], 'true') then
+        begin
+          vJson.ValueStrings('info', AResult);
+          Result := 1;
+        end
+        else if SameText(vJson.Value['status'], 'false') then
+        begin
+          AResult.Add(vJson.Value['msg']);
+          Result := 0;
+        end
+        else
+        begin
+          AResult.Add('²éѯÊý¾Ý³ö´í, ÇëÖØÊÔ');
+          Result := 0;
+        end;
+      finally
+        vJson.Free;
+      end;
+    end;
+  finally
+    vIdHTTP.Free;
+    ssResponse.Free;
+  end;
+end;
+
 initialization
 
 finalization

+ 80 - 65
DataModules/ProjectManagerDm.dfm

@@ -18,73 +18,88 @@ object ProjectManagerData: TProjectManagerData
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D65090001044E616D650608506172656E744944094669656C644E61
-      6D650608506172656E7449440844617461547970650203084461746153697A65
-      02040549734B6579080F4E65656450726F636573734E616D65090001044E616D
-      65060D4E6578745369626C696E674944094669656C644E616D65060D4E657874
-      5369626C696E6749440844617461547970650203084461746153697A65020405
-      49734B6579080F4E65656450726F636573734E616D65090001044E616D650604
-      4E616D65094669656C644E616D6506044E616D65084461746154797065021808
-      4461746153697A6503FF000549734B6579080F4E65656450726F636573734E61
-      6D65090001044E616D65060454797065094669656C644E616D65060454797065
-      0844617461547970650203084461746153697A6502040549734B6579080F4E65
-      656450726F636573734E616D65090001044E616D65060E4465616C546F74616C
-      5072696365094669656C644E616D65060E4465616C546F74616C507269636508
-      44617461547970650206084461746153697A6502080549734B6579080F4E6565
-      6450726F636573734E616D65090001044E616D65060F5068617365546F74616C
-      5072696365094669656C644E616D65060F5068617365546F74616C5072696365
-      0844617461547970650206084461746153697A6502080549734B6579080F4E65
-      656450726F636573734E616D65090001044E616D650611456E644465616C546F
-      74616C5072696365094669656C644E616D650611456E644465616C546F74616C
-      50726963650844617461547970650206084461746153697A6502080549734B65
-      79080F4E65656450726F636573734E616D65090001044E616D650613456E6443
-      68616E6765546F74616C5072696365094669656C644E616D650613456E644368
-      616E6765546F74616C5072696365084461746154797065020608446174615369
-      7A6502080549734B6579080F4E65656450726F636573734E616D65090001044E
-      616D65060D456E64546F74616C5072696365094669656C644E616D65060D456E
-      64546F74616C50726963650844617461547970650206084461746153697A6502
-      080549734B6579080F4E65656450726F636573734E616D65090001044E616D65
-      060D507265546F74616C5072696365094669656C644E616D65060D507265546F
-      74616C50726963650844617461547970650206084461746153697A6502080549
-      734B6579080F4E65656450726F636573734E616D65090001044E616D65060850
-      68617365506179094669656C644E616D65060850686173655061790844617461
-      547970650206084461746153697A6502080549734B6579080F4E65656450726F
-      636573734E616D65090001044E616D65060A5068617365436F756E7409466965
-      6C644E616D65060A5068617365436F756E740844617461547970650203084461
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650608506172656E744944094669656C644E616D650608506172656E74494408
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D65060D4E6578745369626C696E674944094669656C644E616D65
+      060D4E6578745369626C696E6749440844617461547970650203084461746153
+      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D6506044E616D65094669
+      656C644E616D6506044E616D650844617461547970650218084461746153697A
+      6503FF000549734B6579080F4E65656450726F636573734E616D650909507265
+      636973696F6E02000453697A6502000001044E616D6506045479706509466965
+      6C644E616D650604547970650844617461547970650203084461746153697A65
+      02040549734B6579080F4E65656450726F636573734E616D6509095072656369
+      73696F6E02000453697A6502000001044E616D65060E4465616C546F74616C50
+      72696365094669656C644E616D65060E4465616C546F74616C50726963650844
+      617461547970650206084461746153697A6502080549734B6579080F4E656564
+      50726F636573734E616D650909507265636973696F6E02000453697A65020000
+      01044E616D65060F5068617365546F74616C5072696365094669656C644E616D
+      65060F5068617365546F74616C50726963650844617461547970650206084461
+      746153697A6502080549734B6579080F4E65656450726F636573734E616D6509
+      09507265636973696F6E02000453697A6502000001044E616D650611456E6444
+      65616C546F74616C5072696365094669656C644E616D650611456E644465616C
+      546F74616C50726963650844617461547970650206084461746153697A650208
+      0549734B6579080F4E65656450726F636573734E616D65090950726563697369
+      6F6E02000453697A6502000001044E616D650613456E644368616E6765546F74
+      616C5072696365094669656C644E616D650613456E644368616E6765546F7461
+      6C50726963650844617461547970650206084461746153697A6502080549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D65060D456E64546F74616C5072696365094669
+      656C644E616D65060D456E64546F74616C507269636508446174615479706502
+      06084461746153697A6502080549734B6579080F4E65656450726F636573734E
+      616D650909507265636973696F6E02000453697A6502000001044E616D65060D
+      507265546F74616C5072696365094669656C644E616D65060D507265546F7461
+      6C50726963650844617461547970650206084461746153697A6502080549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D6506085068617365506179094669656C644E61
+      6D65060850686173655061790844617461547970650206084461746153697A65
+      02080549734B6579080F4E65656450726F636573734E616D6509095072656369
+      73696F6E02000453697A6502000001044E616D65060A5068617365436F756E74
+      094669656C644E616D65060A5068617365436F756E7408446174615479706502
+      03084461746153697A6502040549734B6579080F4E65656450726F636573734E
+      616D650909507265636973696F6E02000453697A6502000001044E616D65060B
+      4175646974537461747573094669656C644E616D65060B417564697453746174
+      75730844617461547970650203084461746153697A6502040549734B6579080F
+      4E65656450726F636573734E616D650909507265636973696F6E02000453697A
+      6502000001044E616D65060846696C654E616D65094669656C644E616D650608
+      46696C654E616D650844617461547970650201084461746153697A6503FF0005
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D65060A43726561746544617465094669
+      656C644E616D65060A4372656174654461746508446174615479706502010844
+      61746153697A6503FF000549734B6579080F4E65656450726F636573734E616D
+      650909507265636973696F6E02000453697A6502000001044E616D65060C4261
+      636B7570466F6C646572094669656C644E616D65060C4261636B7570466F6C64
+      65720844617461547970650218084461746153697A6502320549734B6579080F
+      4E65656450726F636573734E616D650909507265636973696F6E02000453697A
+      6502000001044E616D6506124465616C5F42474C546F74616C50726963650946
+      69656C644E616D6506124465616C5F42474C546F74616C507269636508446174
+      61547970650206084461746153697A6502080549734B6579080F4E6565645072
+      6F636573734E616D650909507265636973696F6E02000453697A650200000104
+      4E616D6506055765624944094669656C644E616D650605576562494408446174
+      61547970650203084461746153697A6502040549734B6579080F4E6565645072
+      6F636573734E616D650909507265636973696F6E02000453697A650200000104
+      4E616D65060A5765624F776E65724944094669656C644E616D65060A5765624F
+      776E657249440844617461547970650203084461746153697A6502040549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D65060B576562417574686F724944094669656C
+      644E616D65060B576562417574686F7249440844617461547970650203084461
       746153697A6502040549734B6579080F4E65656450726F636573734E616D6509
-      0001044E616D65060B4175646974537461747573094669656C644E616D65060B
-      41756469745374617475730844617461547970650203084461746153697A6502
-      040549734B6579080F4E65656450726F636573734E616D65090001044E616D65
-      060846696C654E616D65094669656C644E616D65060846696C654E616D650844
-      617461547970650201084461746153697A6503FF000549734B6579080F4E6565
-      6450726F636573734E616D65090001044E616D65060A43726561746544617465
-      094669656C644E616D65060A4372656174654461746508446174615479706502
-      01084461746153697A6503FF000549734B6579080F4E65656450726F63657373
-      4E616D65090001044E616D65060C4261636B7570466F6C646572094669656C64
-      4E616D65060C4261636B7570466F6C6465720844617461547970650218084461
-      746153697A6502320549734B6579080F4E65656450726F636573734E616D6509
-      0001044E616D6506124465616C5F42474C546F74616C5072696365094669656C
-      644E616D6506124465616C5F42474C546F74616C507269636508446174615479
-      70650206084461746153697A6502080549734B6579080F4E65656450726F6365
-      73734E616D65090001044E616D6506055765624944094669656C644E616D6506
-      0557656249440844617461547970650203084461746153697A6502040549734B
-      6579080F4E65656450726F636573734E616D65090001044E616D65060A576562
-      4F776E65724944094669656C644E616D65060A5765624F776E65724944084461
+      09507265636973696F6E02000453697A6502000001044E616D6506065765624D
+      4435094669656C644E616D6506065765624D4435084461746154797065020108
+      4461746153697A6503FF000549734B6579080F4E65656450726F636573734E61
+      6D650909507265636973696F6E02000453697A6502000001044E616D65060957
+      6562557365724944094669656C644E616D650609576562557365724944084461
       7461547970650203084461746153697A6502040549734B6579080F4E65656450
-      726F636573734E616D65090001044E616D65060B576562417574686F72494409
-      4669656C644E616D65060B576562417574686F72494408446174615479706502
-      03084461746153697A6502040549734B6579080F4E65656450726F636573734E
-      616D65090001044E616D6506065765624D4435094669656C644E616D65060657
-      65624D44350844617461547970650201084461746153697A6503FF000549734B
-      6579080F4E65656450726F636573734E616D65090001044E616D650609576562
-      557365724944094669656C644E616D6506095765625573657249440844617461
-      547970650203084461746153697A6502040549734B6579080F4E65656450726F
-      636573734E616D65090001044E616D65060E576562466F6C6465724C6576656C
-      094669656C644E616D65060E576562466F6C6465724C6576656C084461746154
-      7970650203084461746153697A6502040549734B6579080F4E65656450726F63
-      6573734E616D65090001044E616D6506065765624B6579094669656C644E616D
-      6506065765624B65790844617461547970650201084461746153697A6503FF00
-      0549734B6579080F4E65656450726F636573734E616D65090000}
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D65060E576562466F6C6465724C6576656C094669656C644E616D6506
+      0E576562466F6C6465724C6576656C0844617461547970650203084461746153
+      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D6506065765624B657909
+      4669656C644E616D6506065765624B6579084461746154797065020108446174
+      6153697A6503FF000549734B6579080F4E65656450726F636573734E616D6509
+      09507265636973696F6E02000453697A6502000000}
   end
   object sdvProjectsInfo: TsdDataView
     Active = False

+ 21 - 13
DataModules/ProjectManagerDm.pas

@@ -27,7 +27,6 @@ type
   private
     FConnection: TCommonConnection;
     FProjectsTree: TsdIDTree;
-    FBackupManager: TBackupManager;
 
     procedure UpdateManagerDataBase;
 
@@ -88,8 +87,6 @@ begin
   FProjectsTree.AutoExpand := True;
   FProjectsTree.SeedID := 1;
   FProjectsTree.DataView := sdvProjectsInfo;
-
-  FBackupManager := TBackupManager.Create;
 end;
 
 procedure TProjectManagerData.CreateNewProjectFile(const AName: string);
@@ -118,7 +115,6 @@ end;
 
 destructor TProjectManagerData.Destroy;
 begin
-  FBackupManager.Free;
   FProjectsTree.Free;
   FConnection.Free;
   inherited;
@@ -500,31 +496,43 @@ end;
 
 procedure TProjectManagerData.AddOpenTenderBackup(AProjectID: Integer);
 var
+  vBackupManager: TBackupManager;
   BackupRec, Rec: TsdDataRecord;
   sBackupFile: string;
 begin
   Rec := sddProjectsInfo.FindKey('idxID', AProjectID);
   if not Assigned(Rec) then Exit;
 
-  FBackupManager.LoadBackupFile(BackupPath(AProjectID));
-  if FBackupManager.LastestOpenBackupIsToday then Exit;
-  sBackupFile := FBackupManager.OpenBackupFile;
-  if FileExists(sBackupFile) then DeleteFile(sBackupFile);
-  ExportTender(Rec, sBackupFile);
+  vBackupManager := TBackupManager.Create;
+  try
+    vBackupManager.LoadBackupFile(BackupPath(AProjectID));
+    if vBackupManager.LastestOpenBackupIsToday then Exit;
+    sBackupFile := vBackupManager.OpenBackupFile;
+    if FileExists(sBackupFile) then DeleteFile(sBackupFile);
+    ExportTender(Rec, sBackupFile);
+  finally
+    vBackupManager.Free;
+  end;
 end;
 
 procedure TProjectManagerData.AddSaveTenderBackup(AProjectID: Integer);
 var
+  vBackupManager: TBackupManager;
   BackupRec, Rec: TsdDataRecord;
   sBackupFile: string;
 begin
   Rec := sddProjectsInfo.FindKey('idxID', AProjectID);
   if not Assigned(Rec) then Exit;
 
-  FBackupManager.LoadBackupFile(BackupPath(AProjectID));
-  sBackupFile := FBackupManager.SaveBackupFile;
-  if FileExists(sBackupFile) then DeleteFile(sBackupFile);
-  ExportTender(Rec, sBackupFile);
+  vBackupManager := TBackupManager.Create;
+  try
+    vBackupManager.LoadBackupFile(BackupPath(AProjectID));
+    sBackupFile := vBackupManager.SaveBackupFile;
+    if FileExists(sBackupFile) then DeleteFile(sBackupFile);
+    ExportTender(Rec, sBackupFile);
+  finally
+    vBackupManager.Free;
+  end;
 end;
 
 procedure TProjectManagerData.ExportTender(ARec: TsdDataRecord;

+ 60 - 0
Forms/RenameSignReportFrm.dfm

@@ -0,0 +1,60 @@
+object RenameSignReportForm: TRenameSignReportForm
+  Left = 595
+  Top = 380
+  Width = 374
+  Height = 163
+  Caption = #37325#21629#21517
+  Color = clBtnFace
+  Font.Charset = ANSI_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = #23435#20307
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  PixelsPerInch = 96
+  TextHeight = 12
+  object lblNeedRename: TLabel
+    Left = 38
+    Top = 17
+    Width = 276
+    Height = 12
+    Caption = #35813#25253#34920#24050#23384#22312#65292#33509#35201#20877#27425#19978#20256#65292#35831#37325#21629#21517#21518#20877#29983#25104#12290
+  end
+  object lblAffect: TLabel
+    Left = 38
+    Top = 40
+    Width = 288
+    Height = 12
+    Caption = #35813#21517#31216#19981#24433#21709#25253#34920#20869#30340#34920#22836#65292#20165#20316#26631#35782#20004#24352#21516#21517#25253#34920#12290
+  end
+  object edtName: TEdit
+    Left = 40
+    Top = 64
+    Width = 273
+    Height = 18
+    Ctl3D = False
+    ParentCtl3D = False
+    ReadOnly = True
+    TabOrder = 0
+    Text = 'edtName'
+  end
+  object btnOk: TButton
+    Left = 192
+    Top = 96
+    Width = 75
+    Height = 25
+    Caption = #30830#35748#29983#25104
+    TabOrder = 1
+    OnClick = btnOkClick
+  end
+  object btnCancel: TButton
+    Left = 280
+    Top = 96
+    Width = 75
+    Height = 25
+    Caption = #21462#28040
+    ModalResult = 2
+    TabOrder = 2
+  end
+end

+ 59 - 0
Forms/RenameSignReportFrm.pas

@@ -0,0 +1,59 @@
+unit RenameSignReportFrm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls;
+
+type
+  TRenameSignReportForm = class(TForm)
+    lblNeedRename: TLabel;
+    lblAffect: TLabel;
+    edtName: TEdit;
+    btnOk: TButton;
+    btnCancel: TButton;
+    procedure btnOkClick(Sender: TObject);
+  private
+    FDefaultName: string;
+    FPhaseIndex: Integer;
+  public
+    constructor Create(ADefaultName: string; APhaseIndex: Integer);
+    property DefaultName: string read FDefaultName;
+  end;
+
+function QuestRenameSignReport(var AName: string; APhaseIndex: Integer): Boolean;
+
+implementation
+
+function QuestRenameSignReport(var AName: string; APhaseIndex: Integer): Boolean;
+var
+  vQuestForm: TRenameSignReportForm;
+begin
+  vQuestForm := TRenameSignReportForm.Create(AName, APhaseIndex);
+  try
+    Result := vQuestForm.ShowModal = mrOk;
+  finally
+    vQuestForm.Free;
+  end;
+end;
+
+{$R *.dfm}
+
+procedure TRenameSignReportForm.btnOkClick(Sender: TObject);
+begin
+  ModalResult := mrOk;
+end;
+
+constructor TRenameSignReportForm.Create(ADefaultName: string;
+  APhaseIndex: Integer);
+begin
+  inherited Create(nil);
+  FDefaultName := ADefaultName;
+  edtName.Text := FDefaultName;
+  FPhaseIndex := APhaseIndex;
+  ClientHeight := 132;
+  ClientWidth := 366;
+end;
+
+end.

+ 16 - 3
Forms/ReportsFrm.pas

@@ -177,7 +177,7 @@ implementation
 uses
   UtilMethods, Math, Globals, ZhAPI, ReportAdjustFrm,
   Contnrs, mEncryptUnit, Printers, WinSpool, MainFrm, ConstUnit,
-  GclBillsGatherModel;
+  GclBillsGatherModel, ReportPdfHelper;
 
 {$R *.dfm}
 
@@ -517,13 +517,19 @@ begin
 end;
 
 procedure TReportsForm.xlbToPDFClick(Sender: TObject);
+var
+  sFileName: string;
 begin
   if _IsEncrypt or G_IsCloud then
   begin
     if extvReport.LeafCheckedCount > 0 then
       ExportAllSelectedPDFReports
     else
-      PreviewComXML.PrintPDF(PreviewBox.Canvas, PrintStartPage, PrintEndPage);
+    begin
+      sFileName := PreviewComXML.ReportName + '.pdf';
+      if SaveFile(sFileName, '.pdf') then
+        PdfHelper.ExportPages(PreviewComXML, sFileName, PrintStartPage, PrintEndPage);
+    end;
   end
   else
     TipMessage(GetHintStr, Handle);
@@ -1353,12 +1359,19 @@ procedure TReportsForm.PrintReport(ATemplateNode: TTemplateNode;
   end;
 
   procedure PrintTemplet;
+  var
+    sFileName: string;
   begin
     if isPDF then
-    begin
+    begin 
+      sFileName := BatchPrintXml.ReportName + '.pdf';
+      if SaveFile(sFileName, '.pdf') then
+        PdfHelper.ExportAllPages(BatchPrintXml, sFileName);
+      (*
       BatchPrintXml.PrintPDFAll(PreviewBox.Canvas);
       while not CheckPrinterReady do
         Sleep(1000);
+      *)
     end
     else if not isExcel then
       BatchPrintXml.PrintAll(PreviewBox.Canvas, 1)

+ 14 - 0
Forms/SignOnlineReportsFrm.dfm

@@ -11,6 +11,7 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
   Font.Name = #23435#20307
   Font.Style = []
   OldCreateOrder = False
+  Position = poMainFormCenter
   OnShow = FormShow
   PixelsPerInch = 96
   TextHeight = 12
@@ -27,6 +28,7 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
     Width = 225
     Height = 594
     Align = alLeft
+    HideSelection = False
     Indent = 19
     ReadOnly = True
     TabOrder = 0
@@ -56,6 +58,7 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
       Font.Name = #23435#20307
       Font.Style = []
       ParentFont = False
+      Visible = False
     end
     object pbGenerate: TPNGButton
       Left = 224
@@ -590,6 +593,17 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
     TabOrder = 2
     OnMouseWheelDown = msbReportsPreviewMouseWheelDown
     OnMouseWheelUp = msbReportsPreviewMouseWheelUp
+    object ImageEnView1: TImageEnView
+      Left = 0
+      Top = 0
+      Width = 561
+      Height = 345
+      Background = clBtnFace
+      ParentCtl3D = False
+      EnableInteractionHints = True
+      Visible = False
+      TabOrder = 0
+    end
   end
   object PreviewComXML: TPrintComXML
     PreviewRows = 1

+ 131 - 15
Forms/SignOnlineReportsFrm.pas

@@ -4,10 +4,11 @@ interface
 
 uses
   ProjectData, ReportManager, ReportConnection, ReportPrepare,
-  PrintComTypeDefUnit, ADODB, DB,
+  PrintComTypeDefUnit, ADODB, DB, SignReports,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, sdIDTree, sdDB, ComCtrls, ExtCtrls, VirtualTrees, PrintCom,
-  PrintComXML, MScrollBox, StdCtrls, Buttons, PNGButton;
+  PrintComXML, MScrollBox, StdCtrls, Buttons, PNGButton, ieview,
+  imageenview;
 
 const
   crNext = -25;
@@ -27,6 +28,7 @@ type
     btnNext: TButton;
     lblPages: TLabel;
     pbGenerate: TPNGButton;
+    ImageEnView1: TImageEnView;
     procedure FormShow(Sender: TObject);
     procedure tvReportsClick(Sender: TObject);
     procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
@@ -49,6 +51,10 @@ type
     procedure btnNextClick(Sender: TObject);
     procedure pbGenerateClick(Sender: TObject);
   private
+    FWebProjectID: Integer;
+    FWebTenderID: Integer;
+    FSignPhase: Integer;
+
     FProjectData: TProjectData;
     // 数据库管理
     FReportCon: TReportConnection;
@@ -58,10 +64,17 @@ type
     FPreviewList: TList;
     FCurPage: Integer;
 
+    FTempPath: string;
+
+    FPostedSignReports: TSignReports;
+
     procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
     procedure OnViewMouseDown(Sender: TObject;  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 
+    function SafeReportName(var AName: string): Boolean;
+
     procedure ExportReports(const AFileName: string);
+    procedure ExportPdfReports(const AFileName: string);
 
     procedure LoadReportTemplates;
 
@@ -94,7 +107,8 @@ implementation
 
 uses
   UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
-  ScFileArchiver, ZhAPI;
+  ScFileArchiver, ZhAPI, PHPWebDm, imageenio, ReportPdfHelper,
+  mProgressFrm, RenameSignReportFrm;
 
 {$R *.dfm}
 
@@ -116,11 +130,13 @@ end;
 destructor TSignOnlineReportsForm.Destroy;
 begin
   ClearObjects(FPreviewList);
-  FPreviewList.Free;                 
+  FPreviewList.Free;
   FReportCon.Free;
   FReportDataPrepare.Free;
   if Assigned(FProjectData) then
     FProjectData.Free;
+  if DirectoryExists(FTempPath) then
+    DeleteFileOrFolder(FTempPath);
   inherited;
 end;
 
@@ -140,6 +156,10 @@ procedure TSignOnlineReportsForm.Init(AProjNode: TsdIDTreeNode; ASignPhase: Inte
   end;
 
 begin
+  FWebProjectID := GetTopParent(AProjNode).Rec.ValueByName('WebID').AsInteger;
+  FWebTenderID := AProjNode.Rec.ValueByName('WebID').AsInteger;
+  FSignPhase := ASignPhase;
+
   FProjectData := TProjectData.Create;
   FProjectData.OpenForSignOnline(GetMyProjectsFilePath + AProjNode.Rec.ValueByName('FileName').AsString, ASignPhase);
   FReportDataPrepare := TReportPrepare.Create(FProjectData);
@@ -149,6 +169,11 @@ begin
   Caption := Format('生成签署报表  %s-第 %d 期', [getName(AProjNode), ASignPhase]);
 
   LoadReportTemplates;
+
+  FTempPath := GetAppTempPath + IntToStr(AProjNode.ID) + '\';
+  CreateDirectoryInDeep(FTempPath);
+
+  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', IntToStr(FWebTenderID), IntToStr(FSignPhase));
 end;
 
 procedure TSignOnlineReportsForm.LoadReportTemplates;
@@ -183,11 +208,18 @@ begin
   if Assigned(tvReports.Selected) then
   begin
     vTemplate := TTemplateNode(tvReports.Selected.Data);
+
+    pbGenerate.Visible := Assigned(vTemplate);
+    cbFillZero.Visible := Assigned(vTemplate);
+    pnlPageControl.Visible := Assigned(vTemplate);
+
+    FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', IntToStr(FWebTenderID), IntToStr(FSignPhase));
+    lblAlreadyUpload.Visible := Assigned(vTemplate) and Assigned(FPostedSignReports.FindSignReport(FSignPhase, vTemplate.TemplateName));
+
+    ReportTemplateManager.Current := vTemplate;
     if Assigned(vTemplate) then
-    begin
-      ReportTemplateManager.Current := vTemplate;
       LoadTemplateAndDisplay(vTemplate);
-    end;
+    tvReports.SetFocus;
   end;
 end;
 
@@ -505,14 +537,10 @@ procedure TSignOnlineReportsForm.InitPageSettings(APrintCom: TPrintComXML);
 begin
   // 设置页面大小
   APrintCom.setPageSize(ReportConfig.PageSize);
-  // 统一纸张大小
-  APrintCom.PrintPageSizeIdx := DMPAPER_A4;
-  {
   if ReportConfig.PageSize = 'A3' then
     APrintCom.PrintPageSizeIdx := DMPAPER_A3
   else if ReportConfig.PageSize = 'A4' then
     APrintCom.PrintPageSizeIdx := DMPAPER_A4;
-  }
   // 设置边距
   APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
   APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
@@ -936,6 +964,8 @@ begin
 
   LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
   LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
+
+  FPostedSignReports := TSignReports.Create;
 end;
 
 procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
@@ -1012,17 +1042,51 @@ end;
 procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
 begin
   FCurPage := Value;
-  PreviewPage(TImage(FPreviewList.Items[0]), FCurPage); 
+  PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
   lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
 end;
 
 procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
 var
-  sFileName: string;
+  sReportName, sZipFile, sPdfFile, sErrorMessage: string;
+  vInFields, vInValues: array [0..4] of string;
+  vUpFileFields, vUpFileNames: array [0..1] of string;
 begin
-  if SaveFile(sFileName, '.zip') then
+  sReportName := ReportTemplateManager.Current.TemplateName;
+  if SafeReportName(sReportName) then
   begin
-    ExportReports(sFileName);
+    CreateProgress('上传中,请等待...');
+    vInFields[0] := 'project';
+    vInValues[0] := IntToStr(FWebProjectID);
+    vInFields[1] := 'tender';
+    vInValues[1] := IntToStr(FWebTenderID);
+    vInFields[2] := 'phaseno';
+    vInValues[2] := IntToStr(FSignPhase);
+    vInFields[3] := 'name';
+    vInValues[3] := sReportName;
+    vInFields[4] := 'ownuid';
+    vInValues[4] := IntToStr(PHPWeb.UserID);
+
+    vUpFileFields[0] := 'upfile';
+    vUpFileNames[0] := GetTempFileName(FTempPath, '.zip');
+    ExportReports(vUpFileNames[0]);
+    vUpFileFields[1] := 'upspdf';
+    vUpFileNames[1] := GetTempFileName(FTempPath, '.pdf');
+    PdfHelper.ExportAllPages(PreviewComXML, vUpFileNames[1]);
+
+    if PHPWeb.UploadFiles('sign/create', vInFields, vInValues, vUpFileFields, vUpFileNames, sErrorMessage) then
+    begin
+      FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, 234);
+      lblAlreadyUpload.Visible := True;
+
+      CloseProgress;
+      TipMessage('上传完成。');
+    end
+    else
+    begin
+      CloseProgress;
+      WarningMessage(Format('%s, 上传数据失败,请重试。', [sErrorMessage]));
+    end;
   end;
 end;
 
@@ -1056,4 +1120,56 @@ begin
   end;
 end;
 
+procedure TSignOnlineReportsForm.ExportPdfReports(const AFileName: string);
+
+  procedure ExportReportPage(APage: Integer; const APageFileName: string);
+  var
+    imgEn: TImageEnView;
+  begin
+    imgEn := TImageEnView.Create(nil);
+    try
+      imgEn.Visible := False;
+      imgEn.Parent := Self;
+      imgEn.IO.CreatePDFFile(APageFileName);
+      imgEn.Bitmap.Height := PreviewComXML.PrintHeight;
+      imgEn.Bitmap.Width := PreviewComXML.PrintWidth;
+      PreviewComXML.PrintPreviewCanvas(APage, 0, imgEn.Bitmap.Canvas, False);
+      imgEn.IO.SaveToPDF;
+    finally
+      imgEn.Free;
+    end;
+  end;
+
+var
+  ATempFolder: String;
+  i: Integer;
+begin
+  ATempFolder := GenerateTempFolder(GetTempFilePath);
+  for i := 1 to PreviewComXML.TotalPages do
+  begin
+    ExportReportPage(i, Format('%s\%d.pdf', [ATempFolder, i]));
+  end;
+  ZipFolder(ATempFolder, AFileName);
+end;
+
+function TSignOnlineReportsForm.SafeReportName(var AName: string): Boolean;
+var
+  sOrgName: string;
+  iCount: Integer;
+  bHasQuest: Boolean;
+begin
+  Result := False;
+  sOrgName := AName;
+  iCount := 0;
+  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', IntToStr(FWebTenderID), IntToStr(FSignPhase));
+  while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
+  begin
+    Inc(iCount);
+    AName := Format('%s(%d)', [sOrgName, iCount]);
+  end;
+  Result := SameText(sOrgName, AName);
+  if not Result then
+    Result := QuestRenameSignReport(AName, FSignPhase);
+end;
+
 end.

+ 3 - 0
Frames/ProjectManagerFme.dfm

@@ -486,6 +486,7 @@ object ProjectManagerFrame: TProjectManagerFrame
     end
     object actnSignOnline: TAction
       Caption = #29983#25104#22312#32447#31614#32626
+      Visible = False
       OnExecute = actnSignOnlineExecute
       OnUpdate = actnSignOnlineUpdate
     end
@@ -522,10 +523,12 @@ object ProjectManagerFrame: TProjectManagerFrame
         Visible = True
       end
       item
+        BeginGroup = True
         Item = MainForm.dxbtnSignOnline
         Visible = True
       end
       item
+        BeginGroup = True
         Item = MainForm.dxbtnOpenBackupFolder
         Visible = True
       end>

+ 1 - 0
Frames/ProjectManagerFme.pas

@@ -1883,6 +1883,7 @@ procedure TProjectManagerFrame.actnSignOnlineUpdate(Sender: TObject);
   end;
 
 begin
+  TAction(Sender).Visible := G_IsCloud;
   TAction(Sender).Enabled := Assigned(stdProjects.IDTree.Selected) and
       (stdProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = 1) and
       HasCompletePhase(stdProjects.IDTree.Selected.Rec);

+ 2 - 1
TenderPartition/tpPartTenderSetFme.pas

@@ -156,7 +156,8 @@ end;
 procedure TtpPartTenderSetFrame.zgPartTendersInfoMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
-  if (Button = mbRight) and (FPartTenderSetData.TenderCount > 0) then
+  if (Button = mbRight) and (FPartTenderSetData.TenderCount > 0) and
+      (FCurPartTenderFrame.tobtnInPegs.Down or FCurPartTenderFrame.tobtnInGcls.Down) then
     dxpmPartTenders.PopupFromCursorPos;
 end;
 

+ 16 - 1
Units/CslJson.pas

@@ -27,6 +27,7 @@ uses
 
 type
   TOVArr = array of array of string;   // ObjectValuesArray
+  TStrArr = array of string;
 
   TCslJson = class
   private
@@ -54,6 +55,7 @@ type
     function ArrayElementPropertyCount(AElementText: string): Integer;   //  Json二维数组的元素的键值对个数
     function ArrayValues(AField: string): TOVArr;
 
+    procedure ValueStrings(AField: string; var AValue: TStrings);
   end;
 
 implementation
@@ -278,9 +280,22 @@ begin
   Result := FOVArr;
 end;
 
+procedure TCslJson.ValueStrings(AField: string; var AValue: TStrings);
+var
+  sText: string;
+  i, iECount: Integer;
+  vSL: TStringList;
+begin
+  AValue.Clear;
+  if AField = '' then Exit;
 
+  iECount := ArrayElementCount(AField);
+  if iECount = 0 then Exit;
 
+  for i := 1 to iECount do
+    AValue.Add(ArrayElementText(AField, i));
+end;
 
 end.
 
- 
+

+ 7 - 7
Units/ExportExcel.pas

@@ -69,7 +69,7 @@ type
     procedure DefineHeader(AXlsPage: TXlsCustomPage);
   protected
     procedure BeforeExport;
-    procedure EndExport;
+    procedure AfterExport;
   public
     constructor Create;
     destructor Destroy; override;
@@ -102,7 +102,7 @@ type
     procedure DefineHeader(AXlsPage: TXlsCustomPage);
   protected
     procedure BeforeExport;
-    procedure EndExport;
+    procedure AfterExport;
   public
     constructor Create;
     destructor Destroy; override;
@@ -396,7 +396,7 @@ begin
     if not FileExists(AFileName) or QuestMessage('存在同名文件,是否替换?') then
       CopyFile(PChar(FTempFile), PChar(AFileName), False);
   finally
-    EndExport;
+    AfterExport;
   end;
 end;
 
@@ -576,7 +576,7 @@ begin
   ShowProgressHint('导出0号台账Excel数据', FTree.Count);
 end;
 
-procedure TIDTreeExcelExportor.EndExport;
+procedure TIDTreeExcelExportor.AfterExport;
 begin
   CloseProgressHint;
   Screen.Cursor := crDefault;
@@ -671,9 +671,9 @@ begin
   inherited;
 end;
 
-procedure TMasterExcelExportor.EndExport;
+procedure TMasterExcelExportor.AfterExport;
 begin
-  CloseProgressHint;
+  Screen.Cursor := crDefault;
 end;
 
 procedure TMasterExcelExportor.ExportData(AXlsPage: TXlsCustomPage);
@@ -760,7 +760,7 @@ begin
     if not FileExists(AFileName) or QuestMessage('存在同名文件,是否替换?') then
       CopyFile(PChar(FTempFile), PChar(AFileName), False);
   finally
-    EndExport;
+    AfterExport;
   end;
 end;
 

+ 1 - 1
Units/TenderBackupManager.pas

@@ -80,7 +80,7 @@ end;
 
 procedure TBackupManager.LoadBackupFile(ABackupPath: string);
 begin
-  if FBackupPath = ABackupPath then Exit;
+  //if FBackupPath = ABackupPath then Exit;
   FBackupPath := ABackupPath;
   FOpenFiles.LoadBackupFiles(FBackupPath);
   FSaveFiles.LoadBackupFiles(ABackupPath);

+ 17 - 1
Units/UtilMethods.pas

@@ -41,6 +41,7 @@ type
   function GetTemplateXlsFileName: string;
   function GetBackupFilePath: string;
   function GetReportTemplatePath: string;
+  function GetAppTempPath: string;
 
   {Select & Save File Choose}
   function GetFilter(AExt: string): string;
@@ -80,7 +81,8 @@ type
   function GetTempFileDir: string;
   function GetTempFilePath: string;
   function GetTempName(ALength: Integer = 8): string;
-  function GetTempFileName: string;
+  function GetTempFileName: string; overload;
+  function GetTempFileName(const APath, AExt: string): string; overload;
   function GenerateTempFolder(AGeneratePath: string): string;
   function GetNewGUIDFileName(const AGeneratePath: string): string;
 
@@ -291,6 +293,13 @@ begin
   Result := GetAppFilePath + 'ReportTemplates\';
 end;
 
+function GetAppTempPath: string;
+begin
+  Result := GetAppFilePath + 'Temp\';
+  if DirectoryExists(Result) then
+    CreateDirectoryInDeep(Result);
+end;
+
 {Select & Save File Choose}
 
 function GetFilter(AExt: string): string;
@@ -820,6 +829,13 @@ begin
   end;
 end;
 
+function GetTempFileName(const APath, AExt: string): string;
+begin
+  Result := APath + GetTempName + AExt;
+  while FileExists(Result) do
+    Result := APath + GetTempName + AExt;
+end;
+
 function GenerateTempFolder(AGeneratePath: string): string;
 begin
   Result := AGeneratePath + GetTempName;