Explorar o código

高级进度条,加入文件校验。

CSL %!s(int64=9) %!d(string=hai) anos
pai
achega
3e82e86f38
Modificáronse 3 ficheiros con 71 adicións e 15 borrados
  1. 19 0
      DataModules/PHPWebDm.pas
  2. 4 4
      Forms/mProgressProFrm.dfm
  3. 48 11
      Frames/ProjectFme.pas

+ 19 - 0
DataModules/PHPWebDm.pas

@@ -93,6 +93,7 @@ type
       ACategory, AMemo, APhaseName: string; var ANewFileName: string): Boolean;
     function GetAttachmentFileList(AWebID: Integer; var vArr: TOVArr): Boolean;
     function zip(AFileArr: array of string): string;
+    function CheckZip(AZipFile: string; AFileCount: Integer): Boolean;   // 检测zip是否能够正确解压出所有文件。
     function TempName(ALength: Integer = 12): string;
     function WebPath: string;
     function UserPath: string;
@@ -261,6 +262,24 @@ begin
   end;
 end;
 
+function TPHPWeb.CheckZip(AZipFile: string; AFileCount: Integer): Boolean;
+var vUnZip: TVCLUnZip;
+begin
+  vUnZip := TVCLUnZip.Create(nil);
+  try
+    vUnZip.ZipName := AZipFile;
+    vUnZip.DestDir := 'C:\Temp\MeasureTemp\';
+    vUnZip.DoAll := True;
+    vUnZip.RecreateDirs := True;
+    vUnZip.RetainAttributes := True;
+    vUnZip.OverwriteMode := Always;
+    Result := (AFileCount = vUnZip.UnZip);
+  finally
+    DeleteFolder(vUnZip.DestDir);
+    vUnZip.Free;
+  end;
+end;
+
 
 function TPHPWeb.UpDataFile(AUserID, ATenderID, APhaseNo: Integer; AFile, AMD5_JL: string;
   AIsSubmit: Boolean; var AResultStr: string; ACheckPassed: Boolean; ACheckerMemo: string): Boolean;

+ 4 - 4
Forms/mProgressProFrm.dfm

@@ -4,7 +4,7 @@ object ProgressProForm: TProgressProForm
   BorderIcons = []
   BorderStyle = bsNone
   Caption = #25552#31034
-  ClientHeight = 252
+  ClientHeight = 236
   ClientWidth = 428
   Color = clWindow
   Font.Charset = DEFAULT_CHARSET
@@ -21,7 +21,7 @@ object ProgressProForm: TProgressProForm
     Left = 0
     Top = 0
     Width = 428
-    Height = 252
+    Height = 236
     Align = alClient
     Brush.Style = bsClear
     OnMouseDown = Shape1MouseDown
@@ -73,13 +73,13 @@ object ProgressProForm: TProgressProForm
     Left = 16
     Top = 125
     Width = 393
-    Height = 116
+    Height = 104
     TabStop = False
     BorderStyle = bsNone
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clGray
     Font.Height = -12
-    Font.Name = #23435#20307
+    Font.Name = #24494#36719#38597#40657
     Font.Style = []
     ParentFont = False
     ReadOnly = True

+ 48 - 11
Frames/ProjectFme.pas

@@ -755,7 +755,7 @@ begin
     if ProjectData.PhaseIndex < ProjectData.ProjProperties.PhaseCount then
       btnPass.Enabled := False
     else
-      btnPass.Enabled := CheckerFrame.Me.IsChecking;    
+      btnPass.Enabled := CheckerFrame.Me.IsChecking;
 
     btnNotPass.Enabled := btnPass.Enabled;
     btnPass.Left := jcbAudit.Left + jcbAudit.Width + 5;
@@ -779,8 +779,11 @@ var sURL, sAppFile, sJsonFile_Bills, sJsonFile_Common, sAppFile_UnLock,
   bSubmit: Boolean;
   vExportor: TTenderExport;
   vCF: TCheckerMemoForm;
+  bNeedFreeEarlier: Boolean;
+  iFile: Integer;
 begin
   bSubmit := False;
+  bNeedFreeEarlier := False;
   sAppFile := PHPWeb.UserPath + 'ProjectFile.rmf';
   // 只有编制人才真正需要该文件存在
   sAppFile_UnLock := PHPWeb.UserPath + 'ProjectFile_UnLock';
@@ -828,8 +831,15 @@ begin
         vExportor.Free;
       end;
       ProgressProRun('生成无锁文件。OK');
-      ProjectData.SubmitProject(sAppFile);
-      ProgressProRun('生成待审核文件。OK');
+      ProgressProRun('生成并检验待审核文件...', 0);
+      if not ProjectData.SubmitProject(sAppFile) then
+        if not ProjectData.SubmitProject(sAppFile) then
+        begin
+          bNeedFreeEarlier := True;
+          Application.MessageBox('Sorry!待审核文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', '提示', MB_OK + MB_ICONWARNING);
+          Exit;
+        end;
+      ProgressProRun('生成并检验待审核文件。OK', 10, pmtEdit);
     end
     else if ProjectData.CurUserIsChecker then
     begin
@@ -856,8 +866,15 @@ begin
       ProgressProCreate(100, '本地数据文件上传到云端');
       ProjectData.Save;
       ProgressProRun('保存本地数据。OK');
-      ProjectData.SubmitProject(sAppFile);
-      ProgressProRun('生成待审核文件。OK');
+      ProgressProRun('生成并检验待审核文件...', 0);
+      if not ProjectData.SubmitProject(sAppFile) then
+        if not ProjectData.SubmitProject(sAppFile) then
+        begin
+          bNeedFreeEarlier := True;
+          Application.MessageBox('Sorry!待审核文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', '提示', MB_OK + MB_ICONWARNING);
+          Exit;
+        end;
+      ProgressProRun('生成并检验待审核文件。OK', 10, pmtEdit);
     end
     else if ProjectData.CurUserIsOwner then
     begin
@@ -884,11 +901,20 @@ begin
       ProgressProCreate(100, '本地数据文件上传到云端');
       ProjectData.Save;
       ProgressProRun('保存本地数据。OK');
-      ProjectData.ReplyProject(sAppFile);
-      ProgressProRun('生成批复文件。OK');
+      ProgressProRun('生成并检验待批复文件...', 0);
+      if not ProjectData.ReplyProject(sAppFile) then
+        if not ProjectData.ReplyProject(sAppFile) then
+        begin
+          bNeedFreeEarlier := True;
+          Application.MessageBox('Sorry!批复文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', '提示', MB_OK + MB_ICONWARNING);
+          Exit;
+        end;
+      ProgressProRun('生成并检验待批复文件。OK', 10, pmtEdit);
     end;
   finally
     vCF.Free;
+    if bNeedFreeEarlier then
+      ProgressProFree;
   end;
 
   try
@@ -899,11 +925,23 @@ begin
     // 上传清单,每期都传,可覆盖旧的。
     ProjectData.ExportJson_Bills(sJsonFile_Bills);
     ProjectData.ExportJson_Common(sJsonFile_Common);
-    ProgressProRun('生成Web汇总数据文件。OK', 5);
+    ProgressProRun('生成Web汇总数据文件。OK');
+    ProgressProRun('生成并检验up数据包文件...', 0);
     sZipFile := PHPWeb.zip([sAppFile, sJsonFile_Bills, sJsonFile_Common, sAppFile_UnLock]);
-    ProgressProRun('数据文件打包。OK', 5);
+
+    if FileExists(sAppFile_UnLock) then
+      iFile := 4
+    else
+      iFile := 3;
+    if not PHPWeb.CheckZip(sZipFile, iFile) then
+    begin
+      Application.MessageBox('up数据包文件无法通过检验请重试!如果重试后仍不能解决该问题,请联系纵横客服。', '提示', MB_OK + MB_ICONWARNING);
+      Exit;
+    end;
+
+    ProgressProRun('生成并检验up数据包文件。OK', 10, pmtEdit);
     try
-      ProgressProRun('上传数据包到云端...', 0);
+      ProgressProRun('上传数据包到云端...(温馨提示:请不要乱点哦,Windows容易死机)', 0);
       if PHPWeb.UpDataFile(PHPWeb.UserID, ProjectData.WebID, ProjectData.PhaseIndex,
         sZipFile, sMD5_JL, bSubmit, sResult, ACheckPassed, sCheckerMemo) then
       begin
@@ -954,7 +992,6 @@ begin
         btnPass.Enabled := False;
         btnNotPass.Enabled := btnPass.Enabled;
         pnlProjectCheckStatus.Visible := CheckerFrame.OwnerFrame.CheckStatus = csFinished;
-        ProgressProRun('本地刷新显示。OK', 5);
 
         Application.MessageBox('^_^ 恭喜!数据已成功上传到云端服务器。', '提示', MB_OK + MB_ICONINFORMATION);
       end