فهرست منبع

Task #1205 部分历史数据打开后不保存, 保存数据时,检查临时文件是否能再次打开

MaiXinRong 9 سال پیش
والد
کامیت
94046fa469
2فایلهای تغییر یافته به همراه87 افزوده شده و 40 حذف شده
  1. 41 1
      Units/Connections.pas
  2. 46 39
      Units/ProjectData.pas

+ 41 - 1
Units/Connections.pas

@@ -61,6 +61,8 @@ type
   TEncryptConnection = class(TCommonConnection)
   private
     FFileHead: TDrawingFileHead;
+    function CheckFileValid(const AFileName: string): Boolean;
+
     procedure Encrypt;
     function Decrypt(const AFileName: string): string;
 
@@ -181,7 +183,10 @@ begin
       AutoEncryptFile(sTempFile, sEncryptFile);
       RefreshFileHead;
       WriteAndAddHead(sEncryptFile);
-      CopyFile(PChar(sEncryptFile), PChar(FOrgFile), False);
+      if CheckFileValid(sEncryptFile) then
+        CopyFile(PChar(sEncryptFile), PChar(FOrgFile), False)
+      else
+        Abort;
     finally
       DeleteFile(PChar(sTempFile));
       DeleteFile(PChar(sEncryptFile));
@@ -207,6 +212,7 @@ begin
   FFileName := Decrypt(AFileName);
   if FileExists(FFileName) then
   begin
+    RecoverFileHead(FFileName);
     InnerOpen(FFileName);
     DamageFileHead(FFileName);
   end
@@ -411,6 +417,40 @@ begin
   RecoverFileHead(AFileName);
 end;
 
+function TEncryptConnection.CheckFileValid(
+  const AFileName: string): Boolean;
+var
+  sConnectFile, sTempFile: string;
+  vCon: TADOConnection;
+begin
+  Result := False;
+  vCon := TADOConnection.Create(nil);
+  vCon.LoginPrompt := False;
+  sConnectFile := GetTempFileName;
+  sTempFile := GetTempFileName;
+  try
+    if FileExists(AFileName) then
+    begin
+      CopyFile(PChar(AFileName), PChar(sTempFile), False);
+      if CheckFileEncrypt(sTempFile) then
+      begin
+        ReadAndRemoveHead(sTempFile);
+        AutoDecryptFile(sTempFile, sConnectFile);
+      end
+      else
+        CopyFile(PChar(sTempFile), PChar(sConnectFile), False);
+      RecoverFileHead(sConnectFile);
+      vCon.ConnectionString := Format(SAdoConnectStr, [sConnectFile]);
+      vCon.Open;
+      Result := True;
+    end;
+  finally
+    DeleteFile(PChar(sConnectFile));
+    DeleteFile(PChar(sTempFile));
+    vCon.Free;
+  end;
+end;
+
 { TConnection }
 
 procedure TConnection.Close;

+ 46 - 39
Units/ProjectData.pas

@@ -469,42 +469,46 @@ end;
 
 procedure TProjectData.Save;
 begin
-  UpdateSysProgress(5, '正在保存数据');
-  SaveLastestPhaseMainData;
-  UpdateSysProgress(10, '正在保存数据');
-  if FPhaseData.Active then
-    FPhaseData.Save;
-  UpdateSysProgress(40, '正在保存数据');
-  FMainListData.Save;
-  FDealPaymentData.Save;
-  UpdateSysProgress(50, '正在保存数据');
-  FStaffData.Save;
-  UpdateSysProgress(60, '正在保存数据');
-  FBGLData.Save;
-  UpdateSysProgress(70, '正在保存数据');
-  FDealBillsData.Save;
-  UpdateSysProgress(80, '正在保存数据');
-
-  FProjectGLData.Save;
-  FDetailGLData.Save;
-  UpdateSysProgress(100, '正在保存数据');
-
-  FBillsCompileData.ReLockBaseData;
-  UpdateSysProgress(110, '正在保存数据');
-  FBillsData.Save;
-  UpdateSysProgress(170, '正在保存数据');
-
-  FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
-  FProjProperties.Save;
-  UpdateSysProgress(180, '正在保存数据');
-  FConnection.Save;
-  UpdateSysProgress(190, '正在保存数据');
-
-  ZipFolder(FTempFolder, FileName);
-  SaveInfoToManager;
-  UpdateSysProgress(200, '就绪');
-
-  ProjectManager.AddSaveTenderBackup(FProjectID);
+  try
+    UpdateSysProgress(5, '正在保存数据');
+    SaveLastestPhaseMainData;
+    UpdateSysProgress(10, '正在保存数据');
+    if (FPhaseData.Active) and (FPhaseIndex = ProjProperties.PhaseCount) then
+      FPhaseData.Save;
+    UpdateSysProgress(40, '正在保存数据');
+    FMainListData.Save;
+    FDealPaymentData.Save;
+    UpdateSysProgress(50, '正在保存数据');
+    FStaffData.Save;
+    UpdateSysProgress(60, '正在保存数据');
+    FBGLData.Save;
+    UpdateSysProgress(70, '正在保存数据');
+    FDealBillsData.Save;
+    UpdateSysProgress(80, '正在保存数据');
+
+    FProjectGLData.Save;
+    FDetailGLData.Save;
+    UpdateSysProgress(100, '正在保存数据');
+
+    FBillsCompileData.ReLockBaseData;
+    UpdateSysProgress(110, '正在保存数据');
+    FBillsData.Save;
+    UpdateSysProgress(170, '正在保存数据');
+
+    FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
+    FProjProperties.Save;
+    UpdateSysProgress(180, '正在保存数据');
+    FConnection.Save;
+    UpdateSysProgress(190, '正在保存数据');
+
+    ZipFolder(FTempFolder, FileName);
+    SaveInfoToManager;
+    UpdateSysProgress(200, '就绪');
+
+    ProjectManager.AddSaveTenderBackup(FProjectID);
+  except
+    ErrorMessage('保存数据出错。请重试,或联系纵横客服:企业QQ:800003850   客服热线:(0756)3850888');
+  end;
 end;
 
 procedure TProjectData.SaveInfoToManager;
@@ -534,20 +538,23 @@ procedure TProjectData.SetPhaseIndex(const Value: Integer);
     Result := Format('%s\Phase%d.dat', [TempPath, FPhaseIndex]);
   end;
 
-  procedure ReCreatePhaseData;
+  procedure ReCreatePhaseData(AOrgPhaseIndex: Integer);
   begin
-    if FPhaseData.Active then
+    if (FPhaseData.Active) and (AOrgPhaseIndex = ProjProperties.PhaseCount) then
       FPhaseData.Save;
     FPhaseData.Free;
     FPhaseData := TPhaseData.Create(Self);
   end;
 
+var
+  iOrgPhaseIndex: Integer;
 begin
   SaveLastestPhaseMainData;
   FProjectGLData.Save;
+  iOrgPhaseIndex := FPhaseIndex;
   FPhaseIndex := Value;
   ProjProperties.PhaseIndex := FPhaseIndex;
-  ReCreatePhaseData;
+  ReCreatePhaseData(iOrgPhaseIndex);
   FPhaseData.Open(GetPhaseFileName);
   ResetPhaseDataLink;
   // 须保存项目工料数据,重新加载当期的项目工料数据