瀏覽代碼

在线签署前,强制更新项目

MaiXinRong 5 年之前
父節點
當前提交
3cde30a21b
共有 1 個文件被更改,包括 152 次插入2 次删除
  1. 152 2
      Frames/ProjectManagerFme.pas

+ 152 - 2
Frames/ProjectManagerFme.pas

@@ -175,6 +175,8 @@ type
 
     procedure LoadSignOnlineSwitch;
     procedure LoadEpureOnlineSwitch;
+    procedure LoadOnlineInfo;
+    procedure CheckOnlineSignStatusAndUpdate(ARec: TsdDataRecord);
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
@@ -1907,8 +1909,12 @@ begin
   LoadSignOnlineSwitch;
   if (FSignOnlineSwitch = 0) then
     WarningMessage('云端未开启在线签署功能。')
-  else if SelectOnlineSignPhase(iPhase, stdProjects.IDTree.Selected.Rec) then
-    SignOnline(stdProjects.IDTree.Selected, iPhase);
+  else
+  begin
+    CheckOnlineSignStatusAndUpdate(stdProjects.IDTree.Selected.Rec);
+    if SelectOnlineSignPhase(iPhase, stdProjects.IDTree.Selected.Rec) then
+      SignOnline(stdProjects.IDTree.Selected, iPhase);
+  end;
 end;
 
 procedure TProjectManagerFrame.actnSignOnlineUpdate(Sender: TObject);
@@ -2123,4 +2129,148 @@ begin
   vRec.EndUpdate;
 end;
 
+procedure TProjectManagerFrame.CheckOnlineSignStatusAndUpdate(
+  ARec: TsdDataRecord);
+
+  function SearchFileOnline(AURL: string; var ADownURL, AFolder, ASubFolder, ABidName, AMD5Web, AError: string; var AFolderID, ASubFolderID: Integer): Integer;
+  var vArr: TOVArr;
+  begin
+    Result := PHPWeb.Search(AURL, [''], [''], vArr);
+    AError := '';
+    if Result = 1 then
+    begin
+      if High(vArr) >= 0 then
+      begin
+        ADownURL := vArr[0, 0];
+        AFolder := vArr[0, 2];
+        ASubFolder := vArr[0, 3];
+        AMD5Web := vArr[0, 1];
+        AFolderID := StrToInt(vArr[0, 4]);
+        ASubFolderID := StrToInt(vArr[0, 5]);
+        ABidName := vArr[0, 6];
+      end
+      else
+        Result := 10;      // 返回10,表示无记录。用这个数字代表是否觉得怪异?没办法,0被占用了。
+    end
+    else if Result = 0 then
+      AError := PHPWeb.PageError('标段更新数据失败')
+    else if Result = -1 then
+      AError := PHPWeb.NetError('标段更新数据失败');
+  end;
+
+var
+  sSearchURL, sDownURL, sHint,
+  sMD5_UnLock, sError, sLocalFile: string;
+  iSearch, iFolderID, iSubFolderID: Integer;
+  bLock, bCanImp: Boolean;
+  vFileCheck: TTenderFileChecker;
+begin
+  GetLocalValues(ARec);
+  if FWebID = 0 then Exit;
+  LoadOnlineInfo;
+  // 先按正常接口找到最新的MD5码看是否需要更新
+  sSearchURL := Format('%stender/get/%d/update', [PHPWeb.MeasureURL, FWebID]);
+  iSearch := SearchFileOnline(sSearchURL, sDownURL, FWebFolder_OnLine, FWebSubFolder_OnLine, FWebBidName_OnLine, FWebMD5_OnLine, sError, iFolderID, iSubFolderID);
+
+  if iSearch = 1 then
+  begin
+    CheckWebFolders(iFolderID, iSubFolderID, FWebFolder_OnLine, FWebSubFolder_OnLine);
+    CheckBidName(FID, FWebBidName_OnLine);
+
+    // 打开前一定要先下载最新的标段文件(无论审核有没有通过)
+    if FWebMD5_OnLine <> FWebMD5_Local then
+      if not FileDownAndReceive(sDownURL, 1) then Exit;
+
+    // 编制人且项目末通过
+    if (FWebAuthorID = PHPWeb.UserID) and (FWebCheckStatusProject = csNotPass) then
+    begin
+      sHint := '本期计量审批不通过,你现在可以:' + #10#13 + '点击【是(Y)】重新开始本期计量,软件将打开本期上报时的数据,开始重新计量;' +
+        #10#13 +'点击【否(N)】查看不通过计量,软件将打开本期最后审批的数据,重新打开标段' + '可再次打开本确认窗口。';
+      if Application.MessageBox(PChar(sHint), '询问', MB_YESNO + MB_ICONQUESTION) = ID_Yes then
+      begin
+        // 查找原报的文件
+        sSearchURL := Format('%suser/get/%d/%d/report/file', [PHPWeb.MeasureURL, FWebID, FPhaseNo]);
+        case SearchFileOnline(sSearchURL, sDownURL, FWebFolder_OnLine, FWebSubFolder_OnLine, FWebBidName_OnLine, sMD5_UnLock, sError, iFolderID, iSubFolderID) of
+          1: ; // 原报文件已正确找到
+          0, -1:
+          begin
+            sHint := sError + ' 因网络出错,无法连接到云端以获取本期原报上传的文件,无法重新开始本期,请重试。';
+            Application.MessageBox(PChar(sHint), '警告', MB_OK + MB_ICONWARNING);
+            Exit;
+          end;
+        end;
+
+        if FileDownAndReceive(sDownURL, 2) then
+        begin
+          // 这里在线上创建新一期审批人列表、更改标段状态。不再使用同步更新等。
+          sSearchURL := Format('%suser/create/%d/%d/new/audit', [PHPWeb.MeasureURL, FWebID, FPhaseNo]);
+          case SearchFileOnline(sSearchURL, sDownURL, FWebFolder_OnLine, FWebSubFolder_OnLine, FWebBidName_OnLine, sMD5_UnLock, sError, iFolderID, iSubFolderID) of
+            1, 10:    // 执行到这里线上审核人列表已创建完毕。无需返回记录值,所以返回值为10。1是为了兼容。
+            begin
+              sHint := '【十分重要】:本期计量已重新开始,原报在本次上报完成前,请勿删除该标段或更换电脑。';
+              Application.MessageBox(PChar(sHint), '提示', MB_OK + MB_ICONINFORMATION);
+            end;
+
+            0, -1:
+            begin
+              sHint := sError + ' 因网络出错,无法在线上创建新一期审批人列表、提交项目状态等,请重试。';
+              Application.MessageBox(PChar(sHint), '警告', MB_OK + MB_ICONWARNING);
+              Exit;
+            end;
+          end;
+        end
+        else
+          Exit;
+      end;
+    end;
+  end
+  else if (iSearch = 10) then
+  begin
+    if not PHPWeb.ExistInServer(FWebID) then
+    begin
+      sHint :='该项目[' + FWebBidName_Local + ']在云端已被删除,点击"确定"后,可手动删除该项目。';
+      Application.MessageBox(PChar(sHint), '提示', MB_OK + MB_ICONINFORMATION);
+      Exit;
+    end;
+  end
+  else if (iSearch = 0) or (iSearch = -1) then
+  begin
+    sHint := sError + '(因网络出错,无法检测[' + FWebBidName_Local + ']在云端是否有更新,本次操作已取消,请重试)。';
+    Application.MessageBox(PChar(sHint), '警告', MB_OK + MB_ICONWARNING);
+    Exit;
+  end;
+end;
+
+procedure TProjectManagerFrame.LoadOnlineInfo;
+var
+  vPSArr: TStrArr;
+  vCArr: TOVArr;    // Checkers
+  sPicPath, sURL: string;
+begin
+  SetLength(vPSArr, 8);
+  sURL := Format('%smeasure/status/%d/get', [PHPWeb.MeasureURL, FWebID]);
+  if PHPWeb.Search(sURL, [''], [''], 3, vPSArr, vCArr) = 1 then
+  begin
+    FPhaseNo := StrToInt(vPSArr[0]);
+    FWebCheckStatusProject := TCheckStatus(StrToInt(vPSArr[1])-1);
+    FPhaseTotal := StrToInt(vPSArr[2]);
+    FWebFolder_OnLine := vPSArr[3];
+    FWebSubFolder_OnLine := vPSArr[4];
+    FWebOwnerName := vPSArr[5];
+    FWebOwnerCompany := vPSArr[6];
+    FWebOwnerRole := vPSArr[7];
+  end
+  else
+  begin
+    FPhaseNo := 0;
+    FWebCheckStatusProject := csNotBegin;
+    FPhaseTotal := 0;
+    FWebFolder_OnLine := '';
+    FWebSubFolder_OnLine := '';
+    FWebOwnerName := '';
+    FWebOwnerCompany := '';
+    FWebOwnerRole := '';
+  end;
+end;
+
 end.