Selaa lähdekoodia

Merge branch 'master' of http://192.168.1.41:3000/MaiXinRong/Measure

builder 6 vuotta sitten
vanhempi
commit
51f6bdfa43

+ 5 - 6
DataModules/BillsCompileDm.pas

@@ -1292,12 +1292,11 @@ var
 
   function GetNodeData(ANode: TBillsIDTreeNode; AOrder: Integer; AFullPath: string): string;
   const
-    sBillsJson = '"id": %d, "pid": %d, "order": %d, "full_path": "%s", "level": %d, "isleaf" : %d, ' +
-                 '"code": "%s", "b_code": "%s", "name": "%s", "unit": "%s", ' +
-                 '%s';
+    sBillsJson = '"id": %d, "pid": %d, "order": %d, "full_path": "%s", "level": %d, "is_leaf" : %d, ' +
+                 '"code": "%s", "b_code": "%s", "name": "%s", "unit": "%s"';
   begin
     Result := Format(sBillsJson, [ANode.Rec.ID.AsInteger, ANode.Rec.ParentID.AsInteger, AOrder, AFullPath, ANode.Level, Integer(not ANode.HasChildren),
-         ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString, ANode.Rec.Name.AsString, ANode.Rec.Units.AsString, '"tender_id": 2']);
+         ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString, ANode.Rec.Name.AsString, ANode.Rec.Units.AsString]);
   end;
 
   procedure ExportNode(ANode: TsdIDTreeNode; AOrder: Integer; AParentPath: string);
@@ -1324,9 +1323,9 @@ var
 begin
   sgs := TStringList.Create;
   try
-    sgs.Add('var BillsData = [');
+    sgs.Add('[');
     ExportNode(FBillsCompileTree.FirstNode, 1, '');
-    sgs.Strings[sgs.Count - 1] := sgs.Strings[sgs.Count - 1] + '];';
+    sgs.Strings[sgs.Count - 1] := sgs.Strings[sgs.Count - 1] + ']';
     sgs.SaveToFile(AFileName);
   finally
     sgs.Free;

+ 1 - 0
DataModules/StandardBillsDm.dfm

@@ -10,6 +10,7 @@ object StandardBillsData: TStandardBillsData
   end
   object sddStdBills: TsdDataSet
     Active = False
+    Filtered = False
     Provider = sdpStdBills
     Left = 216
     Top = 72

+ 51 - 0
DataModules/StandardBillsDm.pas

@@ -24,6 +24,8 @@ type
     procedure Open(AConnection: TADOConnection);
     procedure CalcCacheData(ANode:TsdIDTreeNode; AOrder: Integer; AParentPath: String);
 
+    procedure RecursiveExportBillsJson(const AFileName: string);
+
     property BillsTree: TsdIDTree read FBillsTree;
   end;
 
@@ -98,4 +100,53 @@ begin
   sddStdBills.AddIndex('sddBCode', 'B_Code');
 end;
 
+procedure TStandardBillsData.RecursiveExportBillsJson(
+  const AFileName: string);
+var
+  sgs: TStrings;
+
+  function GetNodeData(ANode: TsdIDTreeNode; AOrder: Integer; AFullPath: string): string;
+  const
+    sBillsJson = '"id": %d, "pid": %d, "order": %d, "full_path": "%s", "level": %d, "is_leaf" : %d, ' +
+                 '"code": "%s", "b_code": "%s", "name": "%s", "unit": "%s"';
+  begin
+    Result := Format(sBillsJson, [ANode.ID, ANode.Rec.ValueByName('ParentID').AsInteger, AOrder, AFullPath,
+         ANode.Rec.ValueByName('BillsLevel').AsInteger, Integer(not ANode.HasChildren),
+         ANode.Rec.ValueByName('Code').AsString, ANode.Rec.ValueByName('B_Code').AsString,
+         ANode.Rec.ValueByName('Name').AsString, ANode.Rec.ValueByName('Unit').AsString]);
+  end;
+
+  procedure ExportNode(ANode: TsdIDTreeNode; AOrder: Integer; AParentPath: string);
+  var
+    sNodePath: string;
+  begin
+    if not Assigned(ANode) then Exit;
+
+    if AParentPath = '' then
+      sNodePath := IntToStr(ANode.ID)
+    else
+      sNodePath := AParentPath + '.' + IntToStr(ANode.ID);
+
+    sgs.Strings[sgs.Count - 1] := sgs.Strings[sgs.Count - 1] + '{';
+    sgs.Add(Format('  %s', [AnsiToUtf8(GetNodeData(ANode, AOrder, sNodePath))]));
+    sgs.Add('}');
+    if Assigned(ANode.NextNode) then
+      sgs.Strings[sgs.Count - 1] := sgs.Strings[sgs.Count - 1] + ',';
+
+    ExportNode(ANode.FirstChild, 1, sNodePath);
+    ExportNode(ANode.NextSibling, AOrder + 1, AParentPath);
+  end;
+
+begin
+  sgs := TStringList.Create;
+  try
+    sgs.Add('[');
+    ExportNode(FBillsTree.FirstNode, 1, '');
+    sgs.Strings[sgs.Count - 1] := sgs.Strings[sgs.Count - 1] + ']';
+    sgs.SaveToFile(AFileName);
+  finally
+    sgs.Free;
+  end;
+end;
+
 end.

+ 6 - 0
Forms/MainFrm.dfm

@@ -1278,6 +1278,12 @@ object MainForm: TMainForm
       Action = actnImportSubTenderGatherGclExcel
       Category = 2
     end
+    object dxbtnExportStdJson: TdxBarButton
+      Caption = #23548#20986#26631#20934#28165#21333'json'#25968#25454
+      Category = 2
+      Hint = #23548#20986#26631#20934#28165#21333'json'#25968#25454
+      Visible = ivAlways
+    end
   end
   object Images: TImageList
     DrawingStyle = dsTransparent

+ 1 - 0
Forms/MainFrm.pas

@@ -191,6 +191,7 @@ type
     actnImportSubTenderGatherGcl: TAction;
     actnImportSubTenderGatherGclExcel: TAction;
     dxbtnImportSubTenderGatherExcel: TdxBarButton;
+    dxbtnExportStdJson: TdxBarButton;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;

+ 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.

+ 10 - 1
Frames/StandardBillsFme.dfm

@@ -142,11 +142,20 @@ object StandardBillsFrame: TStandardBillsFrame
       Caption = #28155#21152#28165#21333
       OnExecute = actnInsertBillsFromLibExecute
     end
+    object actnExportStdJson: TAction
+      Caption = #23548#20986#26631#20934#28165#21333'JSON'#25968#25454
+      OnExecute = actnExportStdJsonExecute
+    end
   end
   object dxpmStandardBills: TdxBarPopupMenu
     BarManager = MainForm.dxBarManager
-    ItemLinks = <>
+    ItemLinks = <
+      item
+        Item = MainForm.dxbtnExportStdJson
+        Visible = True
+      end>
     UseOwnFont = False
+    OnPopup = dxpmStandardBillsPopup
     Left = 184
     Top = 80
   end

+ 17 - 1
Frames/StandardBillsFme.pas

@@ -22,10 +22,13 @@ type
     actnInsertBillsFromLib: TAction;
     stdBills: TsdGridTreeDBA;
     odLib: TOpenDialog;
+    actnExportStdJson: TAction;
     procedure actnInsertBillsFromLibExecute(Sender: TObject);
     procedure zgBillsMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure spbtnLibsClick(Sender: TObject);
+    procedure dxpmStandardBillsPopup(Sender: TObject);
+    procedure actnExportStdJsonExecute(Sender: TObject);
   private
     FStandardLibs: TStandardLibs;
     FBillsType: TBillsType;
@@ -45,7 +48,7 @@ type
 implementation
 
 uses
-  SupportUnit, Globals, ConditionalDefines, UtilMethods;
+  SupportUnit, Globals, ConditionalDefines, UtilMethods, MainFrm;
 
 {$R *.dfm}
 
@@ -179,4 +182,17 @@ begin
   end;
 end;
 
+procedure TStandardBillsFrame.dxpmStandardBillsPopup(Sender: TObject);
+begin
+  SetDxBtnAction(actnExportStdJson, MainForm.dxbtnExportStdJson);
+end;
+
+procedure TStandardBillsFrame.actnExportStdJsonExecute(Sender: TObject);
+var
+  sFileName: string;
+begin
+  if SaveFile(sFileName, '.json') then
+    StandardLib.StandardBillsData.RecursiveExportBillsJson(sFileName);
+end;
+
 end.