Jelajahi Sumber

在线审批使用的接收文件方法调整

MaiXinRong 9 tahun lalu
induk
melakukan
8b75eb9cc8
2 mengubah file dengan 132 tambahan dan 69 penghapusan
  1. 6 5
      Frames/ProjectManagerFme.pas
  2. 126 64
      Units/ProjectCommands.pas

+ 6 - 5
Frames/ProjectManagerFme.pas

@@ -109,8 +109,6 @@ type
     FCurPos: Integer;                        // 用来控制审核人的添加位置
     FCheckerList: TObjectList;
 
-
-
     function ReceiveFile(const AFileName: string; AFileMD5: string = ''; ANeedLock: Boolean = False): Boolean;
     function ImportFile(const AFileName: string; AFileMD5: string = ''): Boolean;
     procedure ConnectButtonWithAction;
@@ -476,14 +474,17 @@ begin
         vNode.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
         vNode.Rec.EndUpdate;
       end;
-      vNode.LocateInControl;
       Result := True;
     except
       Result := False;
     end;
   finally
-    if Recevier.MessageID = 1 then
-      ErrorMessage('当前标段处于打开状态,未能成功接收,请先关闭标段再次接收。');
+    case Recevier.MessageID of
+      0: vNode.LocateInControl;
+      1: ErrorMessage('当前标段处于打开状态,未能成功接收,请先关闭标段再次接收。');
+      2: ErrorMessage('下载数据与审核状态不一致,未能成功接收,请再次接收。');
+      3: ErrorMessage('升级数据失败,未能成功接收,请再次接收。');
+    end;
     Recevier.Free;
     FProjectManagerData.Save;
   end;

+ 126 - 64
Units/ProjectCommands.pas

@@ -80,11 +80,22 @@ type
   private
     FTempFolder: string;
     FFileType: string;
+    FXmlDocument: IXMLDocument;
+    // 导入后的节点
     FCurNode: TsdIDTreeNode;
     FProjectName: string;
     FFileName: string;
     FSelect: TsdIDTreeNode;
     FProjectData: TProjectData;
+    // 初次在线审批人,自上次Exe上报/审批
+    FStartAudit: Integer;
+    // 末次在线审批人,自上次Exe上报/审批
+    FEndAudit: Integer;
+    // 文件中的审核状态
+    FOrgAuditStatus: Integer;
+    // 应升级至的审核状态
+    FNewAuditStatus: Integer;
+
     FStageCount: Integer;
     FReply: Boolean;
     FLostStageCount: Integer;
@@ -92,26 +103,37 @@ type
     FNeedUpdate: Boolean;
     FLock: Boolean;
     FMessageID: Integer;
+    FIsReback: Boolean;
 
     function CheckOpen: Boolean;
     function GetNewTender: TsdIDTreeNode;
     procedure GetCurNode;
     procedure LoadProjectInfo(AXmlNode: IXMLNode);
     procedure LoadTenderProperty(AXmlNode: IXMLNode);
-    procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
-    procedure LoadXmlInfo;
-    procedure UpdateData(const AFileName: string);
+    procedure LoadInfoFromXmlDocument;
+    function CheckUpdateStatusValid: Boolean;
+    procedure ReadXmlInfo;
+    function UpdateData(const AFileName: string): Boolean;
   public
     constructor Create(ASelect: TsdIDTreeNode);
     destructor Destroy; override;
 
     function Receive(const AFileName: string): TsdIDTreeNode;
-    procedure ReceiveForLost(const AFileName: string; AStageCount: Integer; AReply: Boolean);
+    // 在线审批使用
+    // 原报、1审(Online)、2审(Online)、3审(Online)、4审、5审(Online)、6审、7审
+    // 则4审在Exe端打开项目时,AStartAudit=1,AEndAudit=3
+    //   6审在Exe端打开项目时,AStartAudit=AEndAudit=5
+    //   7审在Exe端打开项目时,AStartAudit=AEndAudit=0
+    function ReceiveForLost(const AFileName: string; AStartAudit, AEndAudit: Integer; AReply: Boolean = False): TsdIDTreeNode;
     // 供网络版使用
     // 原报已提交,1审已审核并提交后,此时除了2审人以外的参与人接收数据时不可生成二审数据
     property Lock: Boolean read FLock write FLock;
+    // 被打回的数据
+    property IsReback: Boolean read FIsReback write FIsReback;
     // 信息: 0[接收成功]
     //       1[接收失败,应接收节点打开状态]
+    //       2[接收失败,下载文件跟网页状态不一致]
+    //       3[接收失败,升级文件失败]
     property MessageID: Integer read FMessageID;
   end;
 
@@ -279,7 +301,7 @@ function TSubmitProject.Execute: Boolean;
 begin
   FFileType := '.rmf';
   FNeedUpdate := True;
-  FProjectData.LockedDataForSubmit;
+  //FProjectData.LockedDataForSubmit;
   Result := inherited Execute;
 end;
 
@@ -475,6 +497,62 @@ end;
 
 { TReceiveProject }
 
+function TReceiveProject.CheckUpdateStatusValid: Boolean;
+
+  procedure GetCurAuditStatus;
+  begin
+    {if FStageCount > 0 then
+      FLostStageCount := FStageCount - (AXmlNode.Attributes['AuditStatus'] + 1) - 1;
+
+    if FNeedUpdate then
+    begin
+      if FReply then
+        Result := -1
+      else if FStageCount > 0 then
+        Result := FStageCount - 1
+      else
+        Result := AXmlNode.Attributes['AuditStatus'] + 1
+    end
+    else
+      Result := AXmlNode.Attributes['AuditStatus'];}
+  end;
+var
+  ChildNodes: IXMLNodeList;
+  vProjInfo, vXmlElement: IXMLNode;
+begin
+  Result := True;
+  vXmlElement := FXmlDocument.DocumentElement;
+  ChildNodes := vXmlElement.ChildNodes;
+  vProjInfo := ChildNodes.FindNode('ProjectInfo');
+                                                  
+  FFileName := vProjInfo.Attributes['FileName'];
+  FNeedUpdate := vProjInfo.Attributes['NeedUpdate'];
+  FOrgAuditStatus := vProjInfo.Attributes['AuditStatus'];
+  if not FIsReback and FNeedUpdate then
+  begin
+    if FStartAudit <> 0 then
+    begin
+      if (FStartAudit <> FOrgAuditStatus + 1) or (FEndAudit < FStartAudit) then
+        Result := False
+      else
+        FLostStageCount := FEndAudit - FStartAudit + 1 + 1;
+    end
+    else
+      FLostStageCount := 1;
+
+    // 锁定的情况下
+    if FLock then
+      FLostStageCount := FLostStageCount - 1;
+
+    if FReply then
+      FNewAuditStatus := -1
+    else
+      FNewAuditStatus := FOrgAuditStatus + FLostStageCount;
+  end
+  else
+    FNewAuditStatus := FOrgAuditStatus;
+end;
+
 function TReceiveProject.CheckOpen: Boolean;
 begin
   Result := OpenProjectManager.ProjectIndex(FCurNode.ID) <> -1;
@@ -486,14 +564,17 @@ constructor TReceiveProject.Create(ASelect: TsdIDTreeNode);
 begin
   FSelect := ASelect;
   FTempFolder := GenerateTempFolder(GetTempFilePath);
-  FStageCount := -1;
   FReply := False;
   FLock := False;
   FMessageID := 0;
+  FIsReback := False;
+
+  FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
 end;
 
 destructor TReceiveProject.Destroy;
 begin
+  FXmlDocument := nil;
   DeleteFileOrFolder(FTempFolder);
   inherited;
 end;
@@ -524,15 +605,16 @@ begin
   Result.Rec.ValueByName('FileName').AsString := ExtractSimpleFileName(GetNewGUIDFileName(GetMyProjectsFilePath));
 end;
 
-procedure TReceiveProject.LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
+procedure TReceiveProject.LoadInfoFromXmlDocument;
 var
   ChildNodes: IXMLNodeList;
-  vProjInfo: IXMLNode;
+  vProjInfo, vXmlElement: IXMLNode;
 begin
-  ChildNodes := AXmlNode.ChildNodes;
+  vXmlElement := FXmlDocument.DocumentElement;
+  ChildNodes := vXmlElement.ChildNodes;
   vProjInfo := ChildNodes.FindNode('ProjectInfo');
   FProjectName := vProjInfo.Attributes['ProjectName'];
-  FFileName := vProjInfo.Attributes['FileName'];
+  
   GetCurNode;
   // 备份旧文件
   // 备份须放在这里的原因是,需要打开xml文件后,才能确认是否要备份文件以及应备份哪个文件
@@ -543,28 +625,7 @@ begin
 end;
 
 procedure TReceiveProject.LoadProjectInfo(AXmlNode: IXMLNode);
-
-  function GetCurAuditStatus: Integer;
-  begin
-    if FStageCount > 0 then
-      FLostStageCount := FStageCount - (AXmlNode.Attributes['AuditStatus'] + 1) - 1;
-    if FNeedUpdate then
-    begin
-      if FReply then
-        Result := -1
-      else if FStageCount > 0 then
-        Result := FStageCount - 1
-      else
-        Result := AXmlNode.Attributes['AuditStatus'] + 1
-    end
-    else
-      Result := AXmlNode.Attributes['AuditStatus'];
-  end;
-
 begin
-  if not FLock then
-    FNeedUpdate := AXmlNode.Attributes['NeedUpdate'];
-
   FCurNode.Rec.ValueByName('DealTotalPrice').AsFloat := AXmlNode.Attributes['DealTotalPrice'];
   FCurNode.Rec.ValueByName('PhaseTotalPrice').AsFloat := AXmlNode.Attributes['PhaseTotalPrice'];
   FCurNode.Rec.ValueByName('EndDealTotalPrice').AsFloat := AXmlNode.Attributes['EndDealTotalPrice'];
@@ -575,7 +636,7 @@ begin
   if AXmlNode.HasAttribute('Deal_BGLTotalPrice') then
     FCurNode.Rec.ValueByName('Deal_BGLTotalPrice').AsFloat := AXmlNode.Attributes['Deal_BGLTotalPrice'];
   FCurNode.Rec.ValueByName('PhaseCount').AsInteger := AXmlNode.Attributes['PhaseCount'];
-  FCurNode.Rec.ValueByName('AuditStatus').AsInteger := GetCurAuditStatus;
+  FCurNode.Rec.ValueByName('AuditStatus').AsInteger := FNewAuditStatus;
   FCurNode.Rec.ValueByName('CreateDate').AsString := FormatDateTime('yyyy-mm-dd', Date);
 
   if G_IsCloud then
@@ -591,65 +652,66 @@ begin
   // ToDo
 end;
 
-procedure TReceiveProject.LoadXmlInfo;
-var
-  FXmlDocument: IXMLDocument;
-  XmlNode: IXMLNode;
-  FRootList: IXMLNodeList;
+procedure TReceiveProject.ReadXmlInfo;
 begin
-  FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
-  try
-    FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
-    FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
-    XmlNode := FXmlDocument.DocumentElement;
-    LoadInfoFromXmlDocument(XmlNode);
-  finally
-    FRootList := nil;
-    FXmlDocument := nil;
-  end;
+  FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
+  FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
 end;
 
 function TReceiveProject.Receive(const AFileName: string): TsdIDTreeNode;
 begin
+  Result := nil;
   FFileType := ExtractFileExt(AFileName);
   UnZipFile(AFileName, FTempFolder);
-  LoadXmlInfo;
-  CopyFileOrFolder(FTempFolder + '\' + FFileName,
-    GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
-  UpdateData(GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
-  Result := FCurNode;
+  ReadXmlInfo;
+  if CheckUpdateStatusValid then
+  begin
+    if UpdateData(FTempFolder + '\' + FFileName) then
+    begin
+      LoadInfoFromXmlDocument;
+      CopyFileOrFolder(FTempFolder + '\' + FFileName,
+        GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
+      Result := FCurNode;
+    end
+    else
+      FMessageID := 3;
+  end
+  else
+    FMessageID := 2;
 end;
 
-procedure TReceiveProject.ReceiveForLost(const AFileName: string;
-  AStageCount: Integer; AReply: Boolean);
+function TReceiveProject.ReceiveForLost(const AFileName: string;
+  AStartAudit, AEndAudit: Integer; AReply: Boolean = False): TsdIDTreeNode;
 begin
-  FStageCount := AStageCount;
+  FStartAudit := AStartAudit;
+  FEndAudit := AEndAudit;
   FReply := AReply;
-  Receive(AFileName);
+  Result := Receive(AFileName);
 end;
 
-procedure TReceiveProject.UpdateData(const AFileName: string);
+function TReceiveProject.UpdateData(const AFileName: string): Boolean;
 var
   I: Integer;
 begin
-  if FNeedUpdate then
+  if not IsReback and FNeedUpdate then
   begin
+    Result := False;
     FProjectData := TProjectData.Create;
     try
       FProjectData.OpenForReceive(AFileName);
-      FProjectData.UpdateDataForReceive;
-      for I := 1 to FLostStageCount do
-      begin
-        FProjectData.LockedDataForSubmit;
+      FProjectData.LockedDataForSubmit;
+      for I := 0 to FLostStageCount - 1 do
         FProjectData.UpdateDataForReceive;
-      end;
       if FReply then
         FProjectData.LockedDataForReply;
       FProjectData.SaveForReceive(AFileName);
+      Result := True;
     finally
       FProjectData.Free;
     end;
-  end;
+  end
+  else
+    Result := True;
 end;
 
 { TTenderExport }