فهرست منبع

1. EpureOnline
2. upload report image, cut 1% blank edge
3. BillsGather, locate CompileBills

MaiXinRong 8 سال پیش
والد
کامیت
59ec20e054

+ 2 - 2
DataModules/PHPWebDm.dfm

@@ -1,8 +1,8 @@
 object PHPWeb: TPHPWeb
 object PHPWeb: TPHPWeb
   OldCreateOrder = False
   OldCreateOrder = False
   OnCreate = DataModuleCreate
   OnCreate = DataModuleCreate
-  Left = 771
-  Top = 216
+  Left = 772
+  Top = 217
   Height = 226
   Height = 226
   Width = 281
   Width = 281
 end
 end

+ 8 - 9
DataModules/PHPWebDm.pas

@@ -149,7 +149,7 @@ implementation
 
 
 uses
 uses
   MD5Unit, IdMultipartFormData, VCLUnZip, VCLZip,
   MD5Unit, IdMultipartFormData, VCLUnZip, VCLZip,
-  IniFiles, Forms, UtilMethods, Variants, ConstUnit, ScUtils;{, Controls, Windows}
+  IniFiles, Forms, UtilMethods, Variants, ConstUnit, ScUtils, superobject;{, Controls, Windows}
 
 
 var g_PHPWeb: TPHPWeb;
 var g_PHPWeb: TPHPWeb;
 
 
@@ -915,7 +915,7 @@ function TPHPWeb.UrlGet(AUrl: string; APostParam: TStrings;
 var
 var
   i: Integer;
   i: Integer;
   ssResponse: TStringStream;
   ssResponse: TStringStream;
-  vJson: TCslJson;
+  vJ: ISuperObject;
   vIdHTTP: TIdHTTP;
   vIdHTTP: TIdHTTP;
 begin
 begin
   Result := -1;
   Result := -1;
@@ -927,17 +927,16 @@ begin
     if (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then
     if (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then
     begin
     begin
       // Analyse Result Json
       // Analyse Result Json
-      vJson := TCslJson.Create;
       try
       try
-        vJson.Text := Utf8ToAnsi(ssResponse.DataString);
-        if SameText(vJson.Value['status'], 'true') then
+        vJ := SO(Utf8ToAnsi(ssResponse.DataString));
+        if SameText(vJ['status'].AsString, 'true') then
         begin
         begin
-          AResult := vJson.Value['info'];
+          AResult := vJ['info'].AsString;
           Result := 1;
           Result := 1;
         end
         end
-        else if SameText(vJson.Value['status'], 'false') then
+        else if SameText(vJ['status'].AsString, 'false') then
         begin
         begin
-          AResult := vJson.Value['msg'];
+          AResult := vJ['msg'].AsString;
           Result := 0;
           Result := 0;
         end
         end
         else
         else
@@ -946,7 +945,7 @@ begin
           Result := 0;
           Result := 0;
         end;
         end;
       finally
       finally
-        vJson.Free;
+        vJ := nil;
       end;
       end;
     end;
     end;
   finally
   finally

+ 14 - 2
Forms/MainFrm.dfm

@@ -1,6 +1,6 @@
 object MainForm: TMainForm
 object MainForm: TMainForm
-  Left = 540
-  Top = 329
+  Left = 541
+  Top = 330
   Width = 750
   Width = 750
   Height = 538
   Height = 538
   ActiveControl = jpsMainProjectsManager
   ActiveControl = jpsMainProjectsManager
@@ -1113,6 +1113,18 @@ object MainForm: TMainForm
       Hint = #23450#20301#33267#20013#38388#35745#37327
       Hint = #23450#20301#33267#20013#38388#35745#37327
       Visible = ivAlways
       Visible = ivAlways
     end
     end
+    object dxbtnEpure: TdxBarButton
+      Caption = #25554#20837#35745#37327#33609#22270
+      Category = 0
+      Hint = #25554#20837#35745#37327#33609#22270
+      Visible = ivAlways
+    end
+    object dxbtnLocateCompileBills: TdxBarButton
+      Caption = #23450#20301#33267#21488#36134#20998#35299
+      Category = 0
+      Hint = #23450#20301#33267#21488#36134#20998#35299
+      Visible = ivAlways
+    end
   end
   end
   object Images: TImageList
   object Images: TImageList
     DrawingStyle = dsTransparent
     DrawingStyle = dsTransparent

+ 2 - 0
Forms/MainFrm.pas

@@ -166,6 +166,8 @@ type
     dxbtnLocateMeasureBills: TdxBarButton;
     dxbtnLocateMeasureBills: TdxBarButton;
     dxbtnGuest: TdxBarButton;
     dxbtnGuest: TdxBarButton;
     dxbtnLocateZJJL: TdxBarButton;
     dxbtnLocateZJJL: TdxBarButton;
+    dxbtnEpure: TdxBarButton;
+    dxbtnLocateCompileBills: TdxBarButton;
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;

+ 2 - 2
Forms/ProgressHintFrm.dfm

@@ -1,6 +1,6 @@
 object ProgressHintForm: TProgressHintForm
 object ProgressHintForm: TProgressHintForm
-  Left = 408
-  Top = 407
+  Left = 409
+  Top = 408
   BorderStyle = bsNone
   BorderStyle = bsNone
   ClientHeight = 106
   ClientHeight = 106
   ClientWidth = 540
   ClientWidth = 540

+ 17 - 0
Forms/SelectOnlineSignPhaseFrm.pas

@@ -23,6 +23,7 @@ type
   end;
   end;
 
 
 function SelectOnlineSignPhase(var APhase: Integer; AProjectRec: TsdDataRecord): Boolean;
 function SelectOnlineSignPhase(var APhase: Integer; AProjectRec: TsdDataRecord): Boolean;
+function SelectEpurePhase(var APhase: Integer; AProjectRec: TsdDataRecord): Boolean;
 
 
 implementation
 implementation
 
 
@@ -44,6 +45,22 @@ begin
   end;
   end;
 end;
 end;
 
 
+function SelectEpurePhase(var APhase: Integer; AProjectRec: TsdDataRecord): Boolean;
+var
+  vSelectFrm: TSelectOnlineSignPhaseForm;
+begin
+  Result := False;
+  vSelectFrm := TSelectOnlineSignPhaseForm.Create(nil);
+  try
+    vSelectFrm.Init(AProjectRec);
+    Result := vSelectFrm.ShowModal = mrOk;
+    if Result then
+      APhase := vSelectFrm.PhaseIndex;
+  finally
+    vSelectFrm.Free;
+  end;
+end;
+
 { TSelectOnlineSignPhaseForm }
 { TSelectOnlineSignPhaseForm }
 
 
 function TSelectOnlineSignPhaseForm.GetPhaseIndex: Integer;
 function TSelectOnlineSignPhaseForm.GetPhaseIndex: Integer;

+ 16 - 2
Forms/SignOnlineReportsFrm.dfm

@@ -1,6 +1,6 @@
 object SignOnlineReportsForm: TSignOnlineReportsForm
 object SignOnlineReportsForm: TSignOnlineReportsForm
-  Left = 319
-  Top = 308
+  Left = 183
+  Top = 222
   AutoScroll = False
   AutoScroll = False
   ClientHeight = 644
   ClientHeight = 644
   ClientWidth = 1295
   ClientWidth = 1295
@@ -538,6 +538,20 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
       ButtonStyle = pbsNoFrame
       ButtonStyle = pbsNoFrame
       OnClick = pbGenerateClick
       OnClick = pbGenerateClick
     end
     end
+    object lblEpureHint: TLabel
+      Left = 9
+      Top = 16
+      Width = 204
+      Height = 16
+      Caption = #35831#36873#25321#38656#35201#28155#21152#33609#22270#30340#25253#34920
+      Font.Charset = ANSI_CHARSET
+      Font.Color = clRed
+      Font.Height = -16
+      Font.Name = #23435#20307
+      Font.Style = [fsBold]
+      ParentFont = False
+      Visible = False
+    end
     object cbFillZero: TCheckBox
     object cbFillZero: TCheckBox
       Left = 974
       Left = 974
       Top = 20
       Top = 20

+ 229 - 76
Forms/SignOnlineReportsFrm.pas

@@ -15,6 +15,8 @@ const
   crPrevious = -26; 
   crPrevious = -26; 
   offset = 150;
   offset = 150;
 type
 type
+  TUploadType = (utSign, utEpure);
+
   TSignOnlineReportsForm = class(TForm)
   TSignOnlineReportsForm = class(TForm)
     tvReports: TTreeView;
     tvReports: TTreeView;
     pnlBottom: TPanel;
     pnlBottom: TPanel;
@@ -29,6 +31,7 @@ type
     lblPages: TLabel;
     lblPages: TLabel;
     pbGenerate: TPNGButton;
     pbGenerate: TPNGButton;
     ImageEnView1: TImageEnView;
     ImageEnView1: TImageEnView;
+    lblEpureHint: TLabel;
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure tvReportsClick(Sender: TObject);
     procedure tvReportsClick(Sender: TObject);
     procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
     procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
@@ -67,6 +70,8 @@ type
 
 
     FTempPath: string;
     FTempPath: string;
 
 
+    FUploadType: TUploadType;
+    FLoadListUrl: string;
     FPostedSignReports: TSignReports;
     FPostedSignReports: TSignReports;
 
 
     procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
     procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
@@ -74,9 +79,13 @@ type
 
 
     function SafeReportName(var AName: string): Boolean;
     function SafeReportName(var AName: string): Boolean;
 
 
+    procedure ExportReportPage(APage: Integer; const APageFileName: string);
     procedure ExportReports(const AFileName: string);
     procedure ExportReports(const AFileName: string);
     procedure ExportPdfReports(const AFileName: string);
     procedure ExportPdfReports(const AFileName: string);
 
 
+    procedure GenerateSignReport;
+    procedure GenerateEpureReport;
+
     procedure LoadReportTemplates;
     procedure LoadReportTemplates;
 
 
     procedure PreviewPage(AImage: TImage; APageIndex: Integer);
     procedure PreviewPage(AImage: TImage; APageIndex: Integer);
@@ -97,19 +106,25 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
 
 
     procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
     procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
+    // 特性初始化
+    procedure InitForSign;
+    procedure InitForEpure;
 
 
     property ProjectData: TProjectData read FProjectData;
     property ProjectData: TProjectData read FProjectData;
     property CurPage: Integer read FCurPage write SetCurPage;
     property CurPage: Integer read FCurPage write SetCurPage;
   end;
   end;
 
 
+// 在线签署
 procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
 procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
+// 插入计量草图(中间计量)
+procedure EpureOnline(AProjectNode: TsdIDTreeNode; AEpurePhase: Integer);
 
 
 implementation
 implementation
 
 
 uses
 uses
   UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
   UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
   ScFileArchiver, ZhAPI, PHPWebDm, imageenio, ReportPdfHelper,
   ScFileArchiver, ZhAPI, PHPWebDm, imageenio, ReportPdfHelper,
-  mProgressFrm, RenameSignReportFrm, Math;
+  mProgressFrm, RenameSignReportFrm, Math, superobject, ProgressHintFrm;
 
 
 {$R *.dfm}
 {$R *.dfm}
 
 
@@ -120,12 +135,27 @@ begin
   vSignForm := TSignOnlineReportsForm.Create(nil);
   vSignForm := TSignOnlineReportsForm.Create(nil);
   try
   try
     vSignForm.Init(AProjectNode, ASignPhase);
     vSignForm.Init(AProjectNode, ASignPhase);
+    vSignForm.InitForSign;
     vSignForm.ShowModal;
     vSignForm.ShowModal;
   finally
   finally
     vSignForm.Free;
     vSignForm.Free;
   end;
   end;
 end;
 end;
 
 
+procedure EpureOnline(AProjectNode: TsdIDTreeNode; AEpurePhase: Integer);
+var
+  vEpureForm: TSignOnlineReportsForm;
+begin
+  vEpureForm := TSignOnlineReportsForm.Create(nil);
+  try
+    vEpureForm.Init(AProjectNode, AEpurePhase);
+    vEpureForm.InitForEpure;
+    vEpureForm.ShowModal;
+  finally
+    vEpureForm.Free;
+  end;
+end;
+
 { TSignOnlineReportsForm }
 { TSignOnlineReportsForm }
 
 
 destructor TSignOnlineReportsForm.Destroy;
 destructor TSignOnlineReportsForm.Destroy;
@@ -173,8 +203,6 @@ begin
 
 
   FTempPath := GetAppTempPath + IntToStr(AProjNode.ID) + '\';
   FTempPath := GetAppTempPath + IntToStr(AProjNode.ID) + '\';
   CreateDirectoryInDeep(FTempPath);
   CreateDirectoryInDeep(FTempPath);
-
-  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', FWebTenderID, FSignPhase);
 end;
 end;
 
 
 procedure TSignOnlineReportsForm.LoadReportTemplates;
 procedure TSignOnlineReportsForm.LoadReportTemplates;
@@ -214,7 +242,7 @@ begin
     cbFillZero.Visible := Assigned(vTemplate);
     cbFillZero.Visible := Assigned(vTemplate);
     pnlPageControl.Visible := Assigned(vTemplate);
     pnlPageControl.Visible := Assigned(vTemplate);
 
 
-    FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', FWebTenderID, FSignPhase);
+    FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
     lblAlreadyUpload.Visible := Assigned(vTemplate) and Assigned(FPostedSignReports.FindSignReport(FSignPhase, vTemplate.TemplateName));
     lblAlreadyUpload.Visible := Assigned(vTemplate) and Assigned(FPostedSignReports.FindSignReport(FSignPhase, vTemplate.TemplateName));
 
 
     ReportTemplateManager.Current := vTemplate;
     ReportTemplateManager.Current := vTemplate;
@@ -997,29 +1025,6 @@ begin
 end;
 end;
 
 
 procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
 procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
-
-  procedure ExportReportPage(APage: Integer; const APageFileName: string);
-  var
-    bmp: TBitmap;
-    img: TJPEGImage;
-  begin
-    bmp := TBitmap.Create;
-    img := TJPEGImage.Create;
-    try
-      bmp.Height := PreviewComXML.ReportSize.Y;
-      bmp.Width := PreviewComXML.ReportSize.X;
-      PreviewComXML.PrintPreviewCanvas(APage, 0, bmp.Canvas, False);
-
-      img.Assign(bmp);
-      img.CompressionQuality := 100;
-      img.Compress;
-      img.SaveToFile(APageFileName);
-    finally
-      bmp.Free;
-      img.Free;
-    end;
-  end;
-
 var
 var
   ATempFolder: String;
   ATempFolder: String;
   i: Integer;
   i: Integer;
@@ -1056,55 +1061,11 @@ begin
 end;
 end;
 
 
 procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
 procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
-var
-  sReportName, sZipFile, sPdfFile, sErrorMessage: string;
-  vInFields, vInValues: array [0..5] of string;
-  vUpFileFields, vUpFileNames: array [0..1] of string;
 begin
 begin
-  if PreviewComXML.TotalPages > 200 then
-  begin
-    TipMessage('该报表不支持在线签署功能。');
-    Exit;
-  end;
-
-  sReportName := ReportTemplateManager.Current.TemplateName;
-  if SafeReportName(sReportName) then
-  begin
-    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);
-    vInFields[5] := 'widhei';
-    vInValues[5] := Format('%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]);
-
-    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;
+  if FUploadType = utSign then
+    GenerateSignReport
+  else if FUploadType = utEpure then
+    GenerateEpureReport;
 end;
 end;
 
 
 procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
 procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
@@ -1178,7 +1139,7 @@ begin
   Result := False;
   Result := False;
   sOrgName := AName;
   sOrgName := AName;
   iCount := 0;
   iCount := 0;
-  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', FWebTenderID, FSignPhase);
+  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
   while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
   while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
   begin
   begin
     Inc(iCount);
     Inc(iCount);
@@ -1195,4 +1156,196 @@ begin
   PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
   PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
 end;
 end;
 
 
+procedure TSignOnlineReportsForm.InitForEpure;
+begin
+  Caption := '插入计量草图';
+  FUploadType := utEpure;
+  lblEpureHint.Visible := True;
+
+  FLoadListUrl := 'sign/list';
+  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
+end;
+
+procedure TSignOnlineReportsForm.InitForSign;
+begin
+  Caption := '在线签署';
+  FUploadType := utSign;
+  lblEpureHint.Visible := False;
+
+  FLoadListUrl := 'sign/list';
+  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
+end;
+
+procedure TSignOnlineReportsForm.GenerateEpureReport;
+
+  function CreateOnlineEpureReport(const AReportName: string; var AResult: string): Boolean;
+  var
+    sgsParam: TStrings;
+    sMessage: string;
+    iResult: Integer;
+  begin
+    Result := False;
+    sgsParam := TStringList.Create;
+    try
+      sgsParam.Add(Format('project=%d', [FWebProjectID]));
+      sgsParam.Add(Format('tender=%d', [FWebTenderID]));
+      sgsParam.Add(Format('phaseno=%d', [FSignPhase]));
+      sgsParam.Add(Format('name=%s', [AReportName]));
+      sgsParam.Add(Format('ownuid=%d', [PHPWeb.UserID]));
+      sgsParam.Add(Format('widhei=%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]));
+      sgsParam.Add(Format('totalnum=%d', [PreviewComXML.TotalPages]));
+
+      iResult := PHPWeb.UrlGet(PHPWeb.MeasureURL + 'intermediate/create', sgsParam, AResult);
+      case iResult of
+        0: WarningMessage('网络错误:' + AResult);
+        -1: WarningMessage('网络错误:无法连接到云端');
+      end;
+      Result := (iResult = 1) and (AResult <> '');
+    finally
+      sgsParam.Free;
+    end;
+  end;
+
+  function UploadEpureReport(const ASignid, AMd5_sign: string): Boolean;
+  var
+    ATempFolder, sFileName, sMessage: String;
+    vInFields, vInValues: array [0..1] of string;
+    vUpFileFields, vUpFileNames: array [0..0] of string;
+    i: Integer;
+  begin
+    Result := False;
+    ATempFolder := GenerateTempFolder(GetTempFilePath);
+    vInFields[0] := 'signid';
+    vInValues[0] := ASignid;
+    vInFields[1] := 'md5_sign';
+    vInValues[1] := AMd5_sign;
+    ShowProgressHint('正在上传数据...', PreviewComXML.TotalPages);
+    try
+      for i := 1 to PreviewComXML.TotalPages do
+      begin
+        sFileName := Format('%s\%d.jpg', [ATempFolder, i]);
+        ExportReportPage(i, sFileName);
+
+        vUpFileFields[0] := 'imediate';
+        vUpFileNames[0] := sFileName;
+
+        if not PHPWeb.UploadFiles('intermediate/upload', vInFields, vInValues, vUpFileFields, vUpFileNames, sMessage) then
+        begin
+          WarningMessage(sMessage);
+          Abort;
+        end;
+        UpdateProgressPosition(i);
+      end;
+      Result := True;
+    finally
+      CloseProgressHint;
+      DeleteFileOrFolder(ATempFolder);
+    end;
+  end;
+
+var
+  sReportName, sResult: string;
+  vJ: ISuperObject;
+begin
+  sReportName := ReportTemplateManager.Current.TemplateName;
+  if SafeReportName(sReportName) then
+  begin
+    if CreateOnlineEpureReport(sReportName, sResult) then
+    begin
+      try
+        vJ := SO(sResult);
+        if UploadEpureReport(vJ['signid'].AsString, vJ['md5_sign'].AsString) then
+          TipMessage('上传完成。');
+      finally
+        FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, PHPWeb.UserID);
+        vJ := nil;
+      end;
+    end;
+  end;
+end;
+
+procedure TSignOnlineReportsForm.GenerateSignReport;
+var
+  sReportName, sZipFile, sPdfFile, sErrorMessage: string;
+  vInFields, vInValues: array [0..5] of string;
+  vUpFileFields, vUpFileNames: array [0..1] of string;
+begin
+  if PreviewComXML.TotalPages > 200 then
+  begin
+    TipMessage('该报表不支持在线签署功能。');
+    Exit;
+  end;
+
+  sReportName := ReportTemplateManager.Current.TemplateName;
+  if SafeReportName(sReportName) then
+  begin
+    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);
+    vInFields[5] := 'widhei';
+    vInValues[5] := Format('%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]);
+
+    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, PHPWeb.UserID);
+      lblAlreadyUpload.Visible := True;
+
+      CloseProgress;
+      TipMessage('上传完成。');
+    end
+    else
+    begin
+      CloseProgress;
+      WarningMessage(Format('%s, 上传数据失败,请重试。', [sErrorMessage]));
+    end;
+  end;
+end;
+
+procedure TSignOnlineReportsForm.ExportReportPage(APage: Integer;
+  const APageFileName: string);
+var
+  bmp, bmpCut: TBitmap;
+  img: TJPEGImage;
+  iCutHeight, iCutWidth, iCutTop, iCutLeft, iCutRight, iCutBottom: Integer;
+begin
+  bmp := TBitmap.Create;
+  bmpCut := TBitmap.Create;
+  img := TJPEGImage.Create;
+  try
+    bmp.Height := PreviewComXML.ReportSize.Y;
+    bmp.Width := PreviewComXML.ReportSize.X;
+    PreviewComXML.PrintPreviewCanvas(APage, 0, bmp.Canvas, False);
+
+    iCutHeight := Round(PreviewComXML.ReportSize.Y / 200);
+    iCutWidth := Round(PreviewComXML.ReportSize.X / 200);
+    bmpCut.Height := PreviewComXML.ReportSize.Y - iCutHeight * 2;
+    bmpCut.Width := PreviewComXML.ReportSize.X - iCutWidth * 2;
+    bmpCut.Canvas.CopyRect(Rect(0, 0, bmpCut.Width, bmpCut.Height), bmp.Canvas, Rect(iCutWidth, iCutHeight, bmp.Width - iCutWidth, bmp.Height - iCutHeight));
+
+    img.Assign(bmpCut);
+    img.CompressionQuality := 100;
+    img.Compress;
+    img.SaveToFile(APageFileName);
+  finally
+    bmpCut.Free;
+    bmp.Free;
+    img.Free;
+  end;
+end;
+
 end.
 end.

+ 9 - 0
Frames/BillsGatherFme.dfm

@@ -1243,6 +1243,10 @@ object BillsGatherFrame: TBillsGatherFrame
       item
       item
         Item = MainForm.dxbtnLocateMeasureBills
         Item = MainForm.dxbtnLocateMeasureBills
         Visible = True
         Visible = True
+      end
+      item
+        Item = MainForm.dxbtnLocateCompileBills
+        Visible = True
       end>
       end>
     UseOwnFont = False
     UseOwnFont = False
     OnPopup = dxpmDetailGclPopup
     OnPopup = dxpmDetailGclPopup
@@ -1257,5 +1261,10 @@ object BillsGatherFrame: TBillsGatherFrame
       OnExecute = actnLocateMeasureBillsExecute
       OnExecute = actnLocateMeasureBillsExecute
       OnUpdate = actnLocateMeasureBillsUpdate
       OnUpdate = actnLocateMeasureBillsUpdate
     end
     end
+    object actnLocateCompileBills: TAction
+      Caption = #23450#20301#33267#21488#36134#20998#35299
+      OnExecute = actnLocateCompileBillsExecute
+      OnUpdate = actnLocateCompileBillsUpdate
+    end
   end
   end
 end
 end

+ 17 - 0
Frames/BillsGatherFme.pas

@@ -36,6 +36,7 @@ type
     dxpmDetailGcl: TdxBarPopupMenu;
     dxpmDetailGcl: TdxBarPopupMenu;
     alBillsGather: TActionList;
     alBillsGather: TActionList;
     actnLocateMeasureBills: TAction;
     actnLocateMeasureBills: TAction;
+    actnLocateCompileBills: TAction;
     procedure zgGclBillsCellGetColor(Sender: TObject; ACoord: TPoint;
     procedure zgGclBillsCellGetColor(Sender: TObject; ACoord: TPoint;
       var AColor: TColor);
       var AColor: TColor);
     procedure tobtnDetailGclClick(Sender: TObject);
     procedure tobtnDetailGclClick(Sender: TObject);
@@ -44,11 +45,14 @@ type
     procedure actnLocateMeasureBillsUpdate(Sender: TObject);
     procedure actnLocateMeasureBillsUpdate(Sender: TObject);
     procedure zgDetailGclMouseDown(Sender: TObject; Button: TMouseButton;
     procedure zgDetailGclMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
       Shift: TShiftState; X, Y: Integer);
+    procedure actnLocateCompileBillsExecute(Sender: TObject);
+    procedure actnLocateCompileBillsUpdate(Sender: TObject);
   private
   private
     FBillsGatherData: TBillsGatherData;
     FBillsGatherData: TBillsGatherData;
     FShowPhaseData: Boolean;
     FShowPhaseData: Boolean;
     FShowPriceChange: Boolean;
     FShowPriceChange: Boolean;
     FOnLocateMeasureBills: TLocateBillsEvent;
     FOnLocateMeasureBills: TLocateBillsEvent;
+    FOnLocateCompileBills: TLocateBillsEvent;
 
 
     procedure SetColumnVisible(const AColumn: string; AVisible: Boolean);
     procedure SetColumnVisible(const AColumn: string; AVisible: Boolean);
 
 
@@ -64,6 +68,7 @@ type
     property ShowPhaseData: Boolean read FShowPhaseData write SetShowPhaseData;
     property ShowPhaseData: Boolean read FShowPhaseData write SetShowPhaseData;
 
 
     property OnLocateMeasureBills: TLocateBillsEvent read FOnLocateMeasureBills write FOnLocateMeasureBills;
     property OnLocateMeasureBills: TLocateBillsEvent read FOnLocateMeasureBills write FOnLocateMeasureBills;
+    property OnLocateCompileBills: TLocateBillsEvent read FOnLocateCompileBills write FOnLocateCompileBills;
   end;
   end;
 
 
 implementation
 implementation
@@ -204,6 +209,7 @@ end;
 procedure TBillsGatherFrame.dxpmDetailGclPopup(Sender: TObject);
 procedure TBillsGatherFrame.dxpmDetailGclPopup(Sender: TObject);
 begin
 begin
   SetDxBtnAction(actnLocateMeasureBills, MainForm.dxbtnLocateMeasureBills);
   SetDxBtnAction(actnLocateMeasureBills, MainForm.dxbtnLocateMeasureBills);
+  SetDxBtnAction(actnLocateCompileBills, MainForm.dxbtnLocateCompileBills);
 end;
 end;
 
 
 procedure TBillsGatherFrame.actnLocateMeasureBillsExecute(Sender: TObject);
 procedure TBillsGatherFrame.actnLocateMeasureBillsExecute(Sender: TObject);
@@ -224,5 +230,16 @@ begin
     dxpmDetailGcl.PopupFromCursorPos;
     dxpmDetailGcl.PopupFromCursorPos;
 end;
 end;
 
 
+procedure TBillsGatherFrame.actnLocateCompileBillsExecute(Sender: TObject);
+begin
+  if Assigned(saDetailGcl.DataView.Current) and Assigned(FOnLocateCompileBills) then
+    FOnLocateCompileBills(saDetailGcl.DataView.Current.ValueByName('RelaBillsID').AsInteger);
+end;
+
+procedure TBillsGatherFrame.actnLocateCompileBillsUpdate(Sender: TObject);
+begin
+  TAction(Sender).Enabled := Assigned(saDetailGcl.DataView.Current) and Assigned(FOnLocateCompileBills);
+end;
+
 end.
 end.
 
 

+ 17 - 1
Frames/ProjectFme.pas

@@ -184,6 +184,7 @@ type
     function CheckFileAndCloudChekerList: Boolean;
     function CheckFileAndCloudChekerList: Boolean;
 
 
     procedure LocateMeasureBills(AID: Integer);
     procedure LocateMeasureBills(AID: Integer);
+    procedure LocateCompileBills(AID: Integer);
     procedure LocateZJJL(ABillsID: Integer);
     procedure LocateZJJL(ABillsID: Integer);
 
 
     property ProjectData: TProjectData read FProjectData;
     property ProjectData: TProjectData read FProjectData;
@@ -211,7 +212,7 @@ uses
   PhaseData, BGLDm, MainFrm, ZhAPI, SearchDm, PHPWebDm, ActiveX,
   PhaseData, BGLDm, MainFrm, ZhAPI, SearchDm, PHPWebDm, ActiveX,
   ConstUnit, MD5Unit, sdIDTree, sdDB, mProgressFrm, ConditionalDefines,
   ConstUnit, MD5Unit, sdIDTree, sdDB, mProgressFrm, ConditionalDefines,
   ProjectCommands, ProjectProperty, CheckerMemoFrm, BillsMeasureDm,
   ProjectCommands, ProjectProperty, CheckerMemoFrm, BillsMeasureDm,
-  ProgressHintFrm, mProgressProFrm;
+  ProgressHintFrm, mProgressProFrm, BillsCompileDm;
 
 
 {$R *.dfm}
 {$R *.dfm}
 
 
@@ -664,6 +665,7 @@ begin
   FBillsGatherFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
   FBillsGatherFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
   FBillsGatherFrame.ShowPhaseData := FProjectData.ProjProperties.PhaseCount > 0;
   FBillsGatherFrame.ShowPhaseData := FProjectData.ProjProperties.PhaseCount > 0;
   FBillsGatherFrame.OnLocateMeasureBills := LocateMeasureBills;
   FBillsGatherFrame.OnLocateMeasureBills := LocateMeasureBills;
+  FBillsGatherFrame.OnLocateCompileBills := LocateCompileBills;
 end;
 end;
 
 
 procedure TProjectFrame.dxpmExpandBillsPopup(Sender: TObject);
 procedure TProjectFrame.dxpmExpandBillsPopup(Sender: TObject);
@@ -1621,4 +1623,18 @@ begin
   FProjectData.PhaseData.ZJJLData.sdvZJJL.LocateInControl(Rec);
   FProjectData.PhaseData.ZJJLData.sdvZJJL.LocateInControl(Rec);
 end;
 end;
 
 
+procedure TProjectFrame.LocateCompileBills(AID: Integer);
+var
+  vNode: TsdIDTreeNode;
+begin
+  dxsbViewControl.SelectedItem := dxsbViewControl.Groups[0].Items[xbiBillsCompile.Tag];
+  ChangeView(xbiBillsCompile.Tag);
+  with FProjectData.BillsCompileData do
+  begin
+    vNode := BillsCompileTree.FindNode(AID);
+    if Assigned(vNode) then
+      sdvBillsCompile.LocateInControl(vNode.Rec);
+  end;
+end;
+
 end.
 end.

+ 9 - 0
Frames/ProjectManagerFme.dfm

@@ -495,6 +495,11 @@ object ProjectManagerFrame: TProjectManagerFrame
       OnExecute = actnGuestExecute
       OnExecute = actnGuestExecute
       OnUpdate = actnGuestUpdate
       OnUpdate = actnGuestUpdate
     end
     end
+    object actnEpure: TAction
+      Caption = #25554#20837#35745#37327#33609#22270
+      OnExecute = actnEpureExecute
+      OnUpdate = actnSignOnlineUpdate
+    end
   end
   end
   object dxpmProjectManager: TdxBarPopupMenu
   object dxpmProjectManager: TdxBarPopupMenu
     BarManager = MainForm.dxBarManager
     BarManager = MainForm.dxBarManager
@@ -533,6 +538,10 @@ object ProjectManagerFrame: TProjectManagerFrame
         Visible = True
         Visible = True
       end
       end
       item
       item
+        Item = MainForm.dxbtnEpure
+        Visible = True
+      end
+      item
         Item = MainForm.dxbtnGuest
         Item = MainForm.dxbtnGuest
         Visible = True
         Visible = True
       end
       end

+ 30 - 0
Frames/ProjectManagerFme.pas

@@ -65,6 +65,7 @@ type
     sbChecker: TScrollBox;
     sbChecker: TScrollBox;
     actnSignOnline: TAction;
     actnSignOnline: TAction;
     actnGuest: TAction;
     actnGuest: TAction;
+    actnEpure: TAction;
     procedure actnOpenExecute(Sender: TObject);
     procedure actnOpenExecute(Sender: TObject);
     procedure actnDeleteExecute(Sender: TObject);
     procedure actnDeleteExecute(Sender: TObject);
     procedure zgProjectsMouseDown(Sender: TObject; Button: TMouseButton;
     procedure zgProjectsMouseDown(Sender: TObject; Button: TMouseButton;
@@ -97,6 +98,7 @@ type
     procedure actnSignOnlineUpdate(Sender: TObject);
     procedure actnSignOnlineUpdate(Sender: TObject);
     procedure actnGuestExecute(Sender: TObject);
     procedure actnGuestExecute(Sender: TObject);
     procedure actnGuestUpdate(Sender: TObject);
     procedure actnGuestUpdate(Sender: TObject);
+    procedure actnEpureExecute(Sender: TObject);
   private
   private
     FProjectManagerData: TProjectManagerData;
     FProjectManagerData: TProjectManagerData;
 
 
@@ -135,6 +137,7 @@ type
     FCheckerFrames: TObjectList;
     FCheckerFrames: TObjectList;
 
 
     FSignOnlineSwitch: Integer;
     FSignOnlineSwitch: Integer;
+    FEpureOnlineSwitch: Integer;
 
 
     function ReceiveFile(const AFileName: string; AIsReback: Boolean = False): Boolean;
     function ReceiveFile(const AFileName: string; AIsReback: Boolean = False): Boolean;
     function ImportFile(const AFileName: string; AFileMD5: string = ''): Boolean;
     function ImportFile(const AFileName: string; AFileMD5: string = ''): Boolean;
@@ -166,6 +169,7 @@ type
     procedure OnLineChecker(AAr: TOVArr; var ABegin, AEnd: Integer; var AOnLineEndIsOwner: Boolean);
     procedure OnLineChecker(AAr: TOVArr; var ABegin, AEnd: Integer; var AOnLineEndIsOwner: Boolean);
 
 
     procedure LoadSignOnlineSwitch;
     procedure LoadSignOnlineSwitch;
+    procedure LoadEpureOnlineSwitch;
   public
   public
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -204,6 +208,7 @@ begin
   SetDxBtnAction(actnRename, MainForm.dxbtnRename);
   SetDxBtnAction(actnRename, MainForm.dxbtnRename);
   SetDxBtnAction(actnSignOnline, MainForm.dxbtnSignOnline);
   SetDxBtnAction(actnSignOnline, MainForm.dxbtnSignOnline);
   SetDxBtnAction(actnGuest, MainForm.dxbtnGuest);
   SetDxBtnAction(actnGuest, MainForm.dxbtnGuest);
+  SetDxBtnAction(actnEpure, MainForm.dxbtnEpure);
 end;
 end;
 
 
 constructor TProjectManagerFrame.Create(AOwner: TComponent);
 constructor TProjectManagerFrame.Create(AOwner: TComponent);
@@ -1972,4 +1977,29 @@ begin
   Result := not UserIsChecker(PHPWeb.UserID);
   Result := not UserIsChecker(PHPWeb.UserID);
 end;
 end;
 
 
+procedure TProjectManagerFrame.actnEpureExecute(Sender: TObject);
+var
+  iPhase: Integer;
+begin
+  LoadEpureOnlineSwitch;
+  if (FEpureOnlineSwitch = 0) then
+    WarningMessage('云端未开启在线签署功能。')
+  else if SelectOnlineSignPhase(iPhase, stdProjects.IDTree.Selected.Rec) then
+    EpureOnline(stdProjects.IDTree.Selected, iPhase);
+end;
+
+procedure TProjectManagerFrame.LoadEpureOnlineSwitch;
+var
+  iResult: Integer;
+  sResult: string;
+begin
+  FEpureOnlineSwitch := 0;
+  iResult := PHPWeb.UrlGet(PhPWeb.MeasureURL + 'intermediate/switch', nil, sResult);
+  case iResult of
+    1: FEpureOnlineSwitch := StrToIntDef(sResult, 0);
+    0: WarningMessage('网络错误:' + sResult);
+    -1: WarningMessage('网络错误:无法连接到云端');
+  end;
+end;
+
 end.
 end.

+ 14 - 1
Units/SignReports.pas

@@ -3,7 +3,7 @@ unit SignReports;
 interface
 interface
 
 
 uses
 uses
-  Classes, CslJson;
+  Classes, CslJson, superobject;
 
 
 type
 type
   TSignReport = class
   TSignReport = class
@@ -107,7 +107,20 @@ var
   vJ: TCslJson;
   vJ: TCslJson;
   sPhaseNo, sName, sOwnerID: string;
   sPhaseNo, sName, sOwnerID: string;
   iPhaseNo, iOwnerID: Integer;
   iPhaseNo, iOwnerID: Integer;
+  //iSO: ISuperObject;
 begin
 begin
+  {*
+  try
+    iSO := SO(AStr);
+    sPhaseNo := iSO['phaseno'].AsString;
+    sName := iSO['name'].AsString;
+    sOwnerID := iSO['ownuid'].AsString;
+    if (sPhaseNo <> '') and TryStrToInt(sPhaseNo, iPhaseNo) and (sName <> '') and (sOwnerID <> '') and TryStrToInt(sOwnerID, iOwnerID) then
+      AddSignReport(iPhaseNo, sName, iOwnerID);
+  finally
+    iSO := nil;
+  end;
+  *}
   vJ := TCslJson.Create;
   vJ := TCslJson.Create;
   try
   try
     vJ.Text := AStr;
     vJ.Text := AStr;