Pārlūkot izejas kodu

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

MaiXinRong 8 gadi atpakaļ
vecāks
revīzija
59ec20e054

+ 2 - 2
DataModules/PHPWebDm.dfm

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

+ 8 - 9
DataModules/PHPWebDm.pas

@@ -149,7 +149,7 @@ implementation
 
 uses
   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;
 
@@ -915,7 +915,7 @@ function TPHPWeb.UrlGet(AUrl: string; APostParam: TStrings;
 var
   i: Integer;
   ssResponse: TStringStream;
-  vJson: TCslJson;
+  vJ: ISuperObject;
   vIdHTTP: TIdHTTP;
 begin
   Result := -1;
@@ -927,17 +927,16 @@ begin
     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
+        vJ := SO(Utf8ToAnsi(ssResponse.DataString));
+        if SameText(vJ['status'].AsString, 'true') then
         begin
-          AResult := vJson.Value['info'];
+          AResult := vJ['info'].AsString;
           Result := 1;
         end
-        else if SameText(vJson.Value['status'], 'false') then
+        else if SameText(vJ['status'].AsString, 'false') then
         begin
-          AResult := vJson.Value['msg'];
+          AResult := vJ['msg'].AsString;
           Result := 0;
         end
         else
@@ -946,7 +945,7 @@ begin
           Result := 0;
         end;
       finally
-        vJson.Free;
+        vJ := nil;
       end;
     end;
   finally

+ 14 - 2
Forms/MainFrm.dfm

@@ -1,6 +1,6 @@
 object MainForm: TMainForm
-  Left = 540
-  Top = 329
+  Left = 541
+  Top = 330
   Width = 750
   Height = 538
   ActiveControl = jpsMainProjectsManager
@@ -1113,6 +1113,18 @@ object MainForm: TMainForm
       Hint = #23450#20301#33267#20013#38388#35745#37327
       Visible = ivAlways
     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
   object Images: TImageList
     DrawingStyle = dsTransparent

+ 2 - 0
Forms/MainFrm.pas

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

+ 2 - 2
Forms/ProgressHintFrm.dfm

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

+ 17 - 0
Forms/SelectOnlineSignPhaseFrm.pas

@@ -23,6 +23,7 @@ type
   end;
 
 function SelectOnlineSignPhase(var APhase: Integer; AProjectRec: TsdDataRecord): Boolean;
+function SelectEpurePhase(var APhase: Integer; AProjectRec: TsdDataRecord): Boolean;
 
 implementation
 
@@ -44,6 +45,22 @@ begin
   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 }
 
 function TSelectOnlineSignPhaseForm.GetPhaseIndex: Integer;

+ 16 - 2
Forms/SignOnlineReportsFrm.dfm

@@ -1,6 +1,6 @@
 object SignOnlineReportsForm: TSignOnlineReportsForm
-  Left = 319
-  Top = 308
+  Left = 183
+  Top = 222
   AutoScroll = False
   ClientHeight = 644
   ClientWidth = 1295
@@ -538,6 +538,20 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
       ButtonStyle = pbsNoFrame
       OnClick = pbGenerateClick
     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
       Left = 974
       Top = 20

+ 229 - 76
Forms/SignOnlineReportsFrm.pas

@@ -15,6 +15,8 @@ const
   crPrevious = -26; 
   offset = 150;
 type
+  TUploadType = (utSign, utEpure);
+
   TSignOnlineReportsForm = class(TForm)
     tvReports: TTreeView;
     pnlBottom: TPanel;
@@ -29,6 +31,7 @@ type
     lblPages: TLabel;
     pbGenerate: TPNGButton;
     ImageEnView1: TImageEnView;
+    lblEpureHint: TLabel;
     procedure FormShow(Sender: TObject);
     procedure tvReportsClick(Sender: TObject);
     procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
@@ -67,6 +70,8 @@ type
 
     FTempPath: string;
 
+    FUploadType: TUploadType;
+    FLoadListUrl: string;
     FPostedSignReports: TSignReports;
 
     procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
@@ -74,9 +79,13 @@ type
 
     function SafeReportName(var AName: string): Boolean;
 
+    procedure ExportReportPage(APage: Integer; const APageFileName: string);
     procedure ExportReports(const AFileName: string);
     procedure ExportPdfReports(const AFileName: string);
 
+    procedure GenerateSignReport;
+    procedure GenerateEpureReport;
+
     procedure LoadReportTemplates;
 
     procedure PreviewPage(AImage: TImage; APageIndex: Integer);
@@ -97,19 +106,25 @@ type
     destructor Destroy; override;
 
     procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
+    // 特性初始化
+    procedure InitForSign;
+    procedure InitForEpure;
 
     property ProjectData: TProjectData read FProjectData;
     property CurPage: Integer read FCurPage write SetCurPage;
   end;
 
+// 在线签署
 procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
+// 插入计量草图(中间计量)
+procedure EpureOnline(AProjectNode: TsdIDTreeNode; AEpurePhase: Integer);
 
 implementation
 
 uses
   UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
   ScFileArchiver, ZhAPI, PHPWebDm, imageenio, ReportPdfHelper,
-  mProgressFrm, RenameSignReportFrm, Math;
+  mProgressFrm, RenameSignReportFrm, Math, superobject, ProgressHintFrm;
 
 {$R *.dfm}
 
@@ -120,12 +135,27 @@ begin
   vSignForm := TSignOnlineReportsForm.Create(nil);
   try
     vSignForm.Init(AProjectNode, ASignPhase);
+    vSignForm.InitForSign;
     vSignForm.ShowModal;
   finally
     vSignForm.Free;
   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 }
 
 destructor TSignOnlineReportsForm.Destroy;
@@ -173,8 +203,6 @@ begin
 
   FTempPath := GetAppTempPath + IntToStr(AProjNode.ID) + '\';
   CreateDirectoryInDeep(FTempPath);
-
-  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', FWebTenderID, FSignPhase);
 end;
 
 procedure TSignOnlineReportsForm.LoadReportTemplates;
@@ -214,7 +242,7 @@ begin
     cbFillZero.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));
 
     ReportTemplateManager.Current := vTemplate;
@@ -997,29 +1025,6 @@ begin
 end;
 
 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
   ATempFolder: String;
   i: Integer;
@@ -1056,55 +1061,11 @@ begin
 end;
 
 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
-  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;
 
 procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
@@ -1178,7 +1139,7 @@ begin
   Result := False;
   sOrgName := AName;
   iCount := 0;
-  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', FWebTenderID, FSignPhase);
+  FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
   while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
   begin
     Inc(iCount);
@@ -1195,4 +1156,196 @@ begin
   PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
 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.

+ 9 - 0
Frames/BillsGatherFme.dfm

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

+ 17 - 0
Frames/BillsGatherFme.pas

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

+ 17 - 1
Frames/ProjectFme.pas

@@ -184,6 +184,7 @@ type
     function CheckFileAndCloudChekerList: Boolean;
 
     procedure LocateMeasureBills(AID: Integer);
+    procedure LocateCompileBills(AID: Integer);
     procedure LocateZJJL(ABillsID: Integer);
 
     property ProjectData: TProjectData read FProjectData;
@@ -211,7 +212,7 @@ uses
   PhaseData, BGLDm, MainFrm, ZhAPI, SearchDm, PHPWebDm, ActiveX,
   ConstUnit, MD5Unit, sdIDTree, sdDB, mProgressFrm, ConditionalDefines,
   ProjectCommands, ProjectProperty, CheckerMemoFrm, BillsMeasureDm,
-  ProgressHintFrm, mProgressProFrm;
+  ProgressHintFrm, mProgressProFrm, BillsCompileDm;
 
 {$R *.dfm}
 
@@ -664,6 +665,7 @@ begin
   FBillsGatherFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
   FBillsGatherFrame.ShowPhaseData := FProjectData.ProjProperties.PhaseCount > 0;
   FBillsGatherFrame.OnLocateMeasureBills := LocateMeasureBills;
+  FBillsGatherFrame.OnLocateCompileBills := LocateCompileBills;
 end;
 
 procedure TProjectFrame.dxpmExpandBillsPopup(Sender: TObject);
@@ -1621,4 +1623,18 @@ begin
   FProjectData.PhaseData.ZJJLData.sdvZJJL.LocateInControl(Rec);
 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.

+ 9 - 0
Frames/ProjectManagerFme.dfm

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

+ 30 - 0
Frames/ProjectManagerFme.pas

@@ -65,6 +65,7 @@ type
     sbChecker: TScrollBox;
     actnSignOnline: TAction;
     actnGuest: TAction;
+    actnEpure: TAction;
     procedure actnOpenExecute(Sender: TObject);
     procedure actnDeleteExecute(Sender: TObject);
     procedure zgProjectsMouseDown(Sender: TObject; Button: TMouseButton;
@@ -97,6 +98,7 @@ type
     procedure actnSignOnlineUpdate(Sender: TObject);
     procedure actnGuestExecute(Sender: TObject);
     procedure actnGuestUpdate(Sender: TObject);
+    procedure actnEpureExecute(Sender: TObject);
   private
     FProjectManagerData: TProjectManagerData;
 
@@ -135,6 +137,7 @@ type
     FCheckerFrames: TObjectList;
 
     FSignOnlineSwitch: Integer;
+    FEpureOnlineSwitch: Integer;
 
     function ReceiveFile(const AFileName: string; AIsReback: Boolean = False): 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 LoadSignOnlineSwitch;
+    procedure LoadEpureOnlineSwitch;
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
@@ -204,6 +208,7 @@ begin
   SetDxBtnAction(actnRename, MainForm.dxbtnRename);
   SetDxBtnAction(actnSignOnline, MainForm.dxbtnSignOnline);
   SetDxBtnAction(actnGuest, MainForm.dxbtnGuest);
+  SetDxBtnAction(actnEpure, MainForm.dxbtnEpure);
 end;
 
 constructor TProjectManagerFrame.Create(AOwner: TComponent);
@@ -1972,4 +1977,29 @@ begin
   Result := not UserIsChecker(PHPWeb.UserID);
 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.

+ 14 - 1
Units/SignReports.pas

@@ -3,7 +3,7 @@ unit SignReports;
 interface
 
 uses
-  Classes, CslJson;
+  Classes, CslJson, superobject;
 
 type
   TSignReport = class
@@ -107,7 +107,20 @@ var
   vJ: TCslJson;
   sPhaseNo, sName, sOwnerID: string;
   iPhaseNo, iOwnerID: Integer;
+  //iSO: ISuperObject;
 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;
   try
     vJ.Text := AStr;