Browse Source

Merge branch 'master' of http://192.168.1.12:3000/maixinrong/measure

builder 8 years ago
parent
commit
9a82b83c94

+ 1 - 1
DataModules/PHPWebDm.pas

@@ -451,7 +451,7 @@ begin
   vStream := TMemoryStream.Create;
   vStream := TMemoryStream.Create;
   vIdHTTP := TIdHTTP.Create(nil);
   vIdHTTP := TIdHTTP.Create(nil);
   try
   try
-    while (not bOK) and (iFlag < 3) do   // ³¢ÊÔ3´Î
+    while (not bOK) and (iFlag < 2) do   // ³¢ÊÔ2´Î
       SafeDownFile(ASourceURL, ALocalFile);
       SafeDownFile(ASourceURL, ALocalFile);
 
 
     Result := bOK;
     Result := bOK;

+ 7 - 0
DataModules/ReportMemoryDm/rmWeiWuZjjlGatherDm.pas

@@ -52,6 +52,7 @@ type
     FDanWeiName: string;
     FDanWeiName: string;
 
 
     FIndexCode: string;
     FIndexCode: string;
+    FSerialNo: Integer;
 
 
     function MergeStr(AStr1, AStr2: string): string;
     function MergeStr(AStr1, AStr2: string): string;
   public
   public
@@ -256,6 +257,7 @@ begin
   FDanWeiName := GetNameDanWei(vLeafXmj);
   FDanWeiName := GetNameDanWei(vLeafXmj);
 
 
   FIndexCode := B_CodeToIndexCode(FBillsCode);
   FIndexCode := B_CodeToIndexCode(FBillsCode);
+  FSerialNo := ANode.MajorIndex;
 end;
 end;
 
 
 procedure TZjjl.Merge(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);
 procedure TZjjl.Merge(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);
@@ -291,6 +293,9 @@ begin
   FBillsOthTotalPrice := FBillsOthTotalPrice + ANode.Rec.OthTotalPrice.AsFloat;
   FBillsOthTotalPrice := FBillsOthTotalPrice + ANode.Rec.OthTotalPrice.AsFloat;
   FBillsQuantity := FBillsQuantity + ANode.Rec.Quantity.AsFloat;
   FBillsQuantity := FBillsQuantity + ANode.Rec.Quantity.AsFloat;
   FBillsTotalPrice := FBillsTotalPrice + ANode.Rec.TotalPrice.AsFloat;
   FBillsTotalPrice := FBillsTotalPrice + ANode.Rec.TotalPrice.AsFloat;
+
+  if ANode.MajorIndex < FSerialNo then
+    FSerialNo := ANode.MajorIndex;
 end;
 end;
 
 
 function TZjjl.MergeStr(AStr1, AStr2: string): string;
 function TZjjl.MergeStr(AStr1, AStr2: string): string;
@@ -323,6 +328,8 @@ function TrmWeiWuZjjlGatherData.AssignData(
     vZjjl1 := TZjjl(Item1);
     vZjjl1 := TZjjl(Item1);
     vZjjl2 := TZjjl(Item2);
     vZjjl2 := TZjjl(Item2);
     Result := CompareStr(vZjjl1.FIndexCode, vZjjl2.FIndexCode);
     Result := CompareStr(vZjjl1.FIndexCode, vZjjl2.FIndexCode);
+    if Result = 0 then
+      Result := vZjjl1.FSerialNo - vZjjl2.FSerialNo;
   end;
   end;
 
 
 begin
 begin

+ 2 - 2
Dprs/CSL/Measure_Cloud.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MajorVer=3
 MinorVer=1
 MinorVer=1
 Release=3
 Release=3
-Build=1121
+Build=1129
 Debug=0
 Debug=0
 PreRelease=0
 PreRelease=0
 Special=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化云版
 FileDescription=纵横结算决算计量一体化云版
-FileVersion=3.1.3.1121
+FileVersion=3.1.3.1129
 InternalName=
 InternalName=
 LegalCopyright=
 LegalCopyright=
 LegalTrademarks=
 LegalTrademarks=

+ 11 - 1
Dprs/CSL/Measure_Cloud.dpr

@@ -216,7 +216,16 @@ uses
   OtherMeasureFme in '..\..\Frames\OtherMeasureFme.pas' {OtherMeasureFrame: TFrame},
   OtherMeasureFme in '..\..\Frames\OtherMeasureFme.pas' {OtherMeasureFrame: TFrame},
   ProjGatherSelectFme in '..\..\ProjGather\ProjGatherSelectFme.pas' {ProjGatherSelectFrame: TFrame},
   ProjGatherSelectFme in '..\..\ProjGather\ProjGatherSelectFme.pas' {ProjGatherSelectFrame: TFrame},
   rpgZoneGatherControl in '..\..\Report\ProjGather\Zone\rpgZoneGatherControl.pas',
   rpgZoneGatherControl in '..\..\Report\ProjGather\Zone\rpgZoneGatherControl.pas',
-  rpgZoneProjGatherSelectFrm in '..\..\Report\ProjGather\Zone\rpgZoneProjGatherSelectFrm.pas' {rpgZoneProjGatherSelectForm};
+  rpgZoneProjGatherSelectFrm in '..\..\Report\ProjGather\Zone\rpgZoneProjGatherSelectFrm.pas' {rpgZoneProjGatherSelectForm},
+  SetGuestFrm in '..\..\Forms\SetGuestFrm.pas' {SetGuestForm},
+  LogUtils in '..\..\Units\LogUtils.pas',
+  ReportPdfHelper in '..\..\Units\ReportPdfHelper.pas',
+  SelectOnlineSignPhaseFrm in '..\..\Forms\SelectOnlineSignPhaseFrm.pas' {SelectOnlineSignPhaseForm},
+  SignOnlineReportsFrm in '..\..\Forms\SignOnlineReportsFrm.pas' {SignOnlineReportsForm},
+  SignReports in '..\..\Units\SignReports.pas',
+  TemplateManagerHelper in '..\..\Units\TemplateManagerHelper.pas',
+  RenameSignReportFrm in '..\..\Forms\RenameSignReportFrm.pas' {RenameSignReportForm},
+  rmWeiWuZjjlGatherDm in '..\..\DataModules\ReportMemoryDm\rmWeiWuZjjlGatherDm.pas' {rmWeiWuZjjlGatherData: TDataModule};
 
 
 {$R *.res}
 {$R *.res}
 
 
@@ -313,6 +322,7 @@ begin
     if CheckDogExists then
     if CheckDogExists then
     begin
     begin
       Application.CreateForm(TMainForm, MainForm);
       Application.CreateForm(TMainForm, MainForm);
+  Application.CreateForm(TSetGuestForm, SetGuestForm);
   end;
   end;
     Application.Run;
     Application.Run;
   end;
   end;

BIN
Dprs/CSL/Measure_Cloud.res


+ 15 - 15
Forms/FindUserFrm.dfm

@@ -1,10 +1,10 @@
 object FindUserForm: TFindUserForm
 object FindUserForm: TFindUserForm
-  Left = 934
-  Top = 272
+  Left = 244
+  Top = 376
   ActiveControl = edtMail
   ActiveControl = edtMail
   BorderStyle = bsDialog
   BorderStyle = bsDialog
   Caption = #28155#21152#23457#25209#20154
   Caption = #28155#21152#23457#25209#20154
-  ClientHeight = 387
+  ClientHeight = 327
   ClientWidth = 567
   ClientWidth = 567
   Color = clBtnFace
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Charset = DEFAULT_CHARSET
@@ -14,14 +14,14 @@ object FindUserForm: TFindUserForm
   Font.Style = []
   Font.Style = []
   OldCreateOrder = False
   OldCreateOrder = False
   Position = poScreenCenter
   Position = poScreenCenter
-  OnCreate = FormCreate
+  OnActivate = FormActivate
   PixelsPerInch = 96
   PixelsPerInch = 96
   TextHeight = 17
   TextHeight = 17
   object JimPageControl1: TJimPageControl
   object JimPageControl1: TJimPageControl
     Left = 0
     Left = 0
     Top = 0
     Top = 0
     Width = 567
     Width = 567
-    Height = 387
+    Height = 327
     ActivePage = JimPageControl1Page1
     ActivePage = JimPageControl1Page1
     ActivePageIndex = 0
     ActivePageIndex = 0
     Align = alClient
     Align = alClient
@@ -35,15 +35,15 @@ object FindUserForm: TFindUserForm
       Left = 0
       Left = 0
       Top = 24
       Top = 24
       Width = 567
       Width = 567
-      Height = 363
+      Height = 303
       TabName = 'Page1'
       TabName = 'Page1'
-      Caption = #26597#35810#26032#23457#25209#20154
-      object lbl1: TLabel
-        Left = 32
+      Caption = 'sssssssss'
+      object lblHint1: TLabel
+        Left = 37
         Top = 24
         Top = 24
-        Width = 508
+        Width = 482
         Height = 19
         Height = 19
-        Caption = #36755#20837#23457#25209#20154#30340#36890#34892#24080#21495#27880#20876#37038#31665#65292#26597#35810#24182#30830#35748#29992#25143#21518#65292#28857#20987#8220#20351#29992'Ta'#8221#23436#25104#28155#21152#23457#25209#20154#12290
+        Caption = #36755#20837#23457#25209#20154#30340#36890#34892#24080#21495#27880#20876#37038#31665#65292#26597#35810#24182#30830#35748#21518#65292#28857#20987#8220#20351#29992'Ta'#8221#23436#25104#28155#21152#23457#25209#20154#12290
         Font.Charset = DEFAULT_CHARSET
         Font.Charset = DEFAULT_CHARSET
         Font.Color = clGray
         Font.Color = clGray
         Font.Height = -13
         Font.Height = -13
@@ -51,7 +51,7 @@ object FindUserForm: TFindUserForm
         Font.Style = []
         Font.Style = []
         ParentFont = False
         ParentFont = False
       end
       end
-      object lbl2: TLabel
+      object lblHint2: TLabel
         Left = 69
         Left = 69
         Top = 64
         Top = 64
         Width = 90
         Width = 90
@@ -108,9 +108,9 @@ object FindUserForm: TFindUserForm
       end
       end
       object pnlUser: TPanel
       object pnlUser: TPanel
         Left = 0
         Left = 0
-        Top = 113
+        Top = 120
         Width = 567
         Width = 567
-        Height = 250
+        Height = 183
         Align = alBottom
         Align = alBottom
         BevelOuter = bvNone
         BevelOuter = bvNone
         TabOrder = 2
         TabOrder = 2
@@ -200,7 +200,7 @@ object FindUserForm: TFindUserForm
       Left = 0
       Left = 0
       Top = 24
       Top = 24
       Width = 567
       Width = 567
-      Height = 363
+      Height = 303
       TabName = 'Page2'
       TabName = 'Page2'
       TabVisible = False
       TabVisible = False
       Caption = #24120#29992#23457#25209#20154
       Caption = #24120#29992#23457#25209#20154

+ 131 - 62
Forms/FindUserFrm.pas

@@ -4,6 +4,8 @@
   单元说明:  查找审核人。
   单元说明:  查找审核人。
 
 
   作者时间:  Chenshilong, 2014-07-11
   作者时间:  Chenshilong, 2014-07-11
+  
+              2017.06.19 该窗口定制太深,不通用,改成通用查询窗口。
 *******************************************************************************}
 *******************************************************************************}
 
 
 unit FindUserFrm;
 unit FindUserFrm;
@@ -20,8 +22,8 @@ type
     JimPageControl1: TJimPageControl;
     JimPageControl1: TJimPageControl;
     JimPageControl1Page1: TJimPage;
     JimPageControl1Page1: TJimPage;
     JimPageControl1Page2: TJimPage;
     JimPageControl1Page2: TJimPage;
-    lbl1: TLabel;
-    lbl2: TLabel;
+    lblHint1: TLabel;
+    lblHint2: TLabel;
     edtMail: TcxTextEdit;
     edtMail: TcxTextEdit;
     btnSearch: TcxButton;
     btnSearch: TcxButton;
     pnlUser: TPanel;
     pnlUser: TPanel;
@@ -35,27 +37,28 @@ type
     btnAdd: TcxButton;
     btnAdd: TcxButton;
     lblHint: TLabel;
     lblHint: TLabel;
     procedure btnSearchClick(Sender: TObject);
     procedure btnSearchClick(Sender: TObject);
-    procedure FormCreate(Sender: TObject);
     procedure edtMailKeyDown(Sender: TObject; var Key: Word;
     procedure edtMailKeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
       Shift: TShiftState);
     procedure btnAddClick(Sender: TObject);
     procedure btnAddClick(Sender: TObject);
     procedure edtMailClick(Sender: TObject);
     procedure edtMailClick(Sender: TObject);
+    procedure FormActivate(Sender: TObject);
   private
   private
-    FProjectData: TObject;
     FOwner: TObject;
     FOwner: TObject;
-    procedure SetProjectData(const Value: TObject);
-    procedure SetOwner(const Value: TObject);
+    FType: Integer;    // 0审批人, 1关注人。
+    FWebID: Integer;
+    FPhaseIndex: Integer;
+    FAccount: string;
     { Private declarations }
     { Private declarations }
   public
   public
     { Public declarations }
     { Public declarations }
-     property ProjectData: TObject read FProjectData write SetProjectData;
-     property Owner: TObject read FOwner write SetOwner;
+     // AType调用类型: 0审批人, 1关注人。 AValuesArr:第一个值WebID,第二个值PhaseIndex。
+     constructor Create(AOwner: TObject; AType: Integer; AValuesArr: array of Integer);
   end;
   end;
 
 
 implementation
 implementation
 
 
-uses PHPWebDm, ConstUnit, ProjectData, CheckerFme, ProjectFme,
-  OrderCheckerFme;
+uses PHPWebDm, ConstUnit, CheckerFme, ProjectFme, ProjectManagerFme,
+  OrderCheckerFme, SetGuestFrm;
 
 
 {$R *.dfm}
 {$R *.dfm}
 
 
@@ -64,41 +67,63 @@ var
   PicPath: string;
   PicPath: string;
 
 
 procedure TFindUserForm.btnSearchClick(Sender: TObject);
 procedure TFindUserForm.btnSearchClick(Sender: TObject);
-var bUsed, bSelf, bFull: Boolean;
+var bChecker, bSelf, bFull, bGuest: Boolean;
 begin
 begin
   Screen.Cursor := crHourGlass;
   Screen.Cursor := crHourGlass;
   try
   try
+    FAccount := Trim(edtMail.Text);
     UserArr := VarArrayOf(['avatar', 'name', 'jobs', 'company', 'uid']);
     UserArr := VarArrayOf(['avatar', 'name', 'jobs', 'company', 'uid']);
-    case PHPWeb.Search(PHPWeb.MeasureURL + 'user/get/search', ['uemail'], [AnsiToUtf8(Trim(edtMail.Text))], UserArr) of
+    case PHPWeb.Search(PHPWeb.MeasureURL + 'user/get/search', ['uemail'], [AnsiToUtf8(FAccount)], UserArr) of
       1:
       1:
       begin
       begin
         lblHint.Caption := '';
         lblHint.Caption := '';
-        lblUserName.Caption := TOrderCheckerFrame(Owner).IsMe(StrToInt(UserArr[4]), UserArr[1]) ;
+        lblUserName.Caption := TOrderCheckerFrame(FOwner).IsMe(StrToInt(UserArr[4]), UserArr[1]) ;
         lblUserRole.Caption := UserArr[2];
         lblUserRole.Caption := UserArr[2];
         lblUserCompany.Caption := UserArr[3];
         lblUserCompany.Caption := UserArr[3];
         PicPath := PHPWeb.UserPath + '1_' + UserArr[4] + '.jpg';
         PicPath := PHPWeb.UserPath + '1_' + UserArr[4] + '.jpg';
         if PHPWeb.DownFile(UserArr[0], PicPath) then
         if PHPWeb.DownFile(UserArr[0], PicPath) then
           imgUserPic.Picture.LoadFromFile(PicPath);
           imgUserPic.Picture.LoadFromFile(PicPath);
         pnlUser.Visible := True;
         pnlUser.Visible := True;
-        bUsed := TCheckerFrame(TOrderCheckerFrame(Owner).Owner).InCheckerList(StrToInt(UserArr[4]));
         bSelf := StrToInt(UserArr[4]) = PHPWeb.UserID;
         bSelf := StrToInt(UserArr[4]) = PHPWeb.UserID;
-        bFull := (TCheckerFrame(TOrderCheckerFrame(Owner).Owner).List.Count >= 15);   // AddFrame包含在List.Count中,等效于原报不在List.Count中
-        btnAdd.Enabled := (not bUsed) and (not bSelf) and (not bFull);
-
-        if bFull then
-          btnAdd.Caption := '限添加14人'
-        else if bSelf then
-          btnAdd.Caption := '不能添加自己'
-        else if bUsed then
-          btnAdd.Caption := '已使用'
-        else
-          btnAdd.Caption := '使用Ta';
 
 
+        case FType of
+          0:
+          begin
+            bChecker := TCheckerFrame(TOrderCheckerFrame(FOwner).Owner).InCheckerList(StrToInt(UserArr[4]));
+            // AddFrame包含在List.Count中,等效于原报不在List.Count中
+            bFull := (TCheckerFrame(TOrderCheckerFrame(FOwner).Owner).List.Count >= 15);
+            btnAdd.Enabled := (not bChecker) and (not bSelf) and (not bFull);
+
+            if bFull then
+              btnAdd.Caption := '限添加14人'
+            else if bSelf then
+              btnAdd.Caption := '不能添加自己'
+            else if bChecker then
+              btnAdd.Caption := '已使用'
+            else
+              btnAdd.Caption := '使用Ta';
+          end;
+
+          1:
+          begin
+            bChecker := TProjectManagerFrame(TSetGuestForm(FOwner).Owner).UserIsChecker(StrToInt(UserArr[4]));     // 判断是否是参与人
+            bGuest := TSetGuestForm(FOwner).HasGuest(StrToInt(UserArr[4]));
+            btnAdd.Enabled := (not bChecker) and (not bGuest);
+
+            if bChecker then
+              btnAdd.Caption := '已是参与人'
+            else if bGuest then
+              btnAdd.Caption := '已是关注人'
+            else
+              btnAdd.Caption := '使用Ta';
+          end;
+        else ;
+        end;
       end;
       end;
       -1:
       -1:
       begin
       begin
-        Application.MessageBox(PChar(PHPWeb.NetError('无法查询用户')),
-            '警告', MB_OK + MB_ICONWARNING);
+//        Application.MessageBox(PChar(PHPWeb.NetError('无法查询用户')),
+//            '警告', MB_OK + MB_ICONWARNING);
         lblHint.Caption := '没有找到该用户的相关信息!';
         lblHint.Caption := '没有找到该用户的相关信息!';
         pnlUser.Visible := False;
         pnlUser.Visible := False;
         btnAdd.Enabled := False;
         btnAdd.Enabled := False;
@@ -106,8 +131,8 @@ begin
       end;
       end;
       0:
       0:
       begin
       begin
-        Application.MessageBox(PChar(PHPWeb.PageError('无法查询用户' + '[' + edtMail.Text + ']')),
-            '警告', MB_OK + MB_ICONWARNING);
+//        Application.MessageBox(PChar(PHPWeb.PageError('无法查询用户' + '[' + edtMail.Text + ']')),
+//            '警告', MB_OK + MB_ICONWARNING);
         lblHint.Caption := '没有找到该用户的相关信息!';
         lblHint.Caption := '没有找到该用户的相关信息!';
         pnlUser.Visible := False;
         pnlUser.Visible := False;
         btnAdd.Enabled := False;
         btnAdd.Enabled := False;
@@ -119,15 +144,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFindUserForm.FormCreate(Sender: TObject);
-begin
-  lblHint.Caption := '';
-  pnlUser.Visible := False;
-
-  if G_IsTest then
-    edtMail.Text := 'sp1@qq.com';
-end;
-
 procedure TFindUserForm.edtMailKeyDown(Sender: TObject; var Key: Word;
 procedure TFindUserForm.edtMailKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
   Shift: TShiftState);
 begin
 begin
@@ -138,36 +154,60 @@ end;
 procedure TFindUserForm.btnAddClick(Sender: TObject);
 procedure TFindUserForm.btnAddClick(Sender: TObject);
 var sURL: string;
 var sURL: string;
   vArr: array of string;
   vArr: array of string;
-  vProj: TProjectData;
   vOwner: TCheckerFrame;
   vOwner: TCheckerFrame;
 begin
 begin
-  sURL := PHPWeb.MeasureURL + 'user/add/audit/measure';
   vArr := VarArrayOf(['msg']);
   vArr := VarArrayOf(['msg']);
-  vProj := TProjectData(ProjectData);
-  // 标段ID(网络)、谁添加的、添加的谁、期号
-  if PHPWeb.Search(sURL, ['pmid', 'creatoruid', 'auditoruid', 'numpname'],
-    [IntToStr(vProj.WebID), IntToStr(PHPWeb.UserID), UserArr[4],
-    IntToStr(vProj.PhaseIndex)], vArr) = 1 then
-  begin
-    btnAdd.Enabled := False;
-    btnAdd.Caption := '添加成功';
-    vOwner := TCheckerFrame(TOrderCheckerFrame(Owner).Owner);
-    vOwner.AddNewChecker(cftChecker, StrToInt(UserArr[4]), UserArr[1], UserArr[2], UserArr[3], PicPath, '', csNotBegin, '', -1);
-    vOwner.RepairOrder;
-    vOwner.RepairDelete(True);
-  end;
-end;
 
 
-procedure TFindUserForm.SetProjectData(const Value: TObject);
-begin
-  FProjectData := Value;
-end;
+  case FType of
+    0:
+    begin
+      sURL := PHPWeb.MeasureURL + 'user/add/audit/measure';    // 添加审批人
+      // 标段ID(网络)、谁添加的、添加的谁、期号
+      if PHPWeb.Search(sURL, ['pmid', 'creatoruid', 'auditoruid', 'numpname'],
+        [IntToStr(FWebID), IntToStr(PHPWeb.UserID), UserArr[4], IntToStr(FPhaseIndex)], vArr) = 1 then
+      begin
+        btnAdd.Enabled := False;
+        btnAdd.Caption := '添加成功';
+        vOwner := TCheckerFrame(TOrderCheckerFrame(FOwner).Owner);
+        vOwner.AddNewChecker(cftChecker, StrToInt(UserArr[4]), UserArr[1], UserArr[2], UserArr[3], PicPath, '', csNotBegin, '', -1);
+        vOwner.RepairOrder;
+        vOwner.RepairDelete(True);
 
 
-procedure TFindUserForm.SetOwner(const Value: TObject);
-begin
-  FOwner := Value;
-end;
+        // 如果他也是关注人,则移除关注人
+        sURL := PHPWeb.MeasureURL + 'tender/concernaudit/del';   // 取消关注人
+        case PHPWeb.Search(sURL, ['tenderid', 'uid'], [InttoStr(FwebID), UserArr[4]], vArr) of
+          1:
+          begin
 
 
+          end;
+          -1:
+          begin
+            Application.MessageBox(PChar(PHPWeb.NetError('该用户原是关注人,自动取消关注人失败,请手工取消')),
+                '警告', MB_OK + MB_ICONWARNING);
+            Exit;
+          end;
+          0:
+          begin
+            Application.MessageBox(PChar(PHPWeb.PageError('该用户原是关注人,自动取消关注人失败,请手工取消')),
+                '警告', MB_OK + MB_ICONWARNING);
+            Exit;
+          end;
+        end;
+      end;
+    end;
+    1:
+    begin
+      sURL := PHPWeb.MeasureURL + 'tender/concernaudit/create';    // 添加关注人
+      // 标段ID(网络)、添加的谁
+      if PHPWeb.Search(sURL, ['tenderid', 'uid'], [IntToStr(FWebID), UserArr[4]], vArr) = 1 then
+      begin
+        btnAdd.Enabled := False;
+        btnAdd.Caption := '添加成功';
+        TSetGuestForm(FOwner).AddGuest(StrToInt(UserArr[4]), UserArr[1], FAccount);
+      end;
+    end;
+  end;  
+end;
 
 
 procedure TFindUserForm.edtMailClick(Sender: TObject);
 procedure TFindUserForm.edtMailClick(Sender: TObject);
 begin
 begin
@@ -216,4 +256,33 @@ begin
   end;
   end;
 end;
 end;
 
 
+constructor TFindUserForm.Create(AOwner: TObject; AType: Integer; AValuesArr: array of Integer);
+var sName: string;
+begin
+  inherited Create(nil);
+  FOwner := AOwner;
+  FType := AType;
+  FWebID := AValuesArr[0];
+  FPhaseIndex := AValuesArr[1];
+
+  lblHint.Caption := '';
+  pnlUser.Visible := False;
+
+  case AType of
+    0: sName := '审批人';
+    1: sName := '关注人';
+  else sName := '用户';
+  end;
+
+  self.Caption := '添加' + sName;
+  JimPageControl1Page1.Caption := Format('查询新%s', [sName]);
+  lblHint1.Caption := Format('输入%s的通行帐号注册邮箱,查询并确认后,点击“使用Ta”完成添加%s。', [sName, sName]);
+  lblHint2.Caption := Format('添加新%s', [sName]);
+end;
+
+procedure TFindUserForm.FormActivate(Sender: TObject);
+begin
+  Self.Top := Self.Top + 60;
+end;
+
 end.
 end.

+ 6 - 0
Forms/MainFrm.dfm

@@ -1101,6 +1101,12 @@ object MainForm: TMainForm
       Hint = #23450#20301#33267#35745#37327#21488#36134
       Hint = #23450#20301#33267#35745#37327#21488#36134
       Visible = ivAlways
       Visible = ivAlways
     end
     end
+    object dxbtnGuest: TdxBarButton
+      Caption = #28155#21152#20851#27880#20154
+      Category = 0
+      Hint = #28155#21152#20851#27880#20154
+      Visible = ivAlways
+    end
   end
   end
   object Images: TImageList
   object Images: TImageList
     DrawingStyle = dsTransparent
     DrawingStyle = dsTransparent

+ 1 - 0
Forms/MainFrm.pas

@@ -164,6 +164,7 @@ type
     dxbtnExportTpExcel: TdxBarButton;
     dxbtnExportTpExcel: TdxBarButton;
     dxbtnHelpCenter: TdxBarButton;
     dxbtnHelpCenter: TdxBarButton;
     dxbtnLocateMeasureBills: TdxBarButton;
     dxbtnLocateMeasureBills: TdxBarButton;
+    dxbtnGuest: TdxBarButton;
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;

+ 141 - 0
Forms/SetGuestFrm.dfm

@@ -0,0 +1,141 @@
+object SetGuestForm: TSetGuestForm
+  Left = 986
+  Top = 309
+  BorderStyle = bsDialog
+  Caption = #35774#32622#26631#27573#20851#27880#20154
+  ClientHeight = 450
+  ClientWidth = 504
+  Color = clBtnFace
+  Font.Charset = ANSI_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -15
+  Font.Name = #24494#36719#38597#40657
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  PixelsPerInch = 96
+  TextHeight = 20
+  object btnAdd: TButton
+    Left = 8
+    Top = 5
+    Width = 97
+    Height = 29
+    Caption = #28155#21152#20851#27880#20154
+    TabOrder = 0
+    OnClick = btnAddClick
+  end
+  object zgGuest: TZJGrid
+    Left = 8
+    Top = 39
+    Width = 489
+    Height = 378
+    Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
+    OptionsEx = []
+    ColCount = 4
+    RowCount = 6
+    ShowGridLine = False
+    DefaultColWidth = 73
+    DefaultFixedRowHeight = 25
+    DefaultRowHeight = 23
+    Selection.AlphaBlend = False
+    Selection.TransparentColor = False
+    FrozenCol = 0
+    FrozenRow = 0
+    OnCellGetFont = zgGuestCellGetFont
+    OnMouseDown = zgGuestMouseDown
+  end
+  object btnOK: TButton
+    Left = 418
+    Top = 420
+    Width = 75
+    Height = 25
+    Caption = #30830#23450
+    ModalResult = 1
+    TabOrder = 2
+  end
+  object zaGuest: TZjGridDBA
+    Columns = <
+      item
+        Title.Caption = #22995#21517
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -15
+        Title.Font.Name = #24494#36719#38597#40657
+        Title.Font.Style = []
+        Alignment = taCenter
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = #24494#36719#38597#40657
+        Font.Style = []
+        FieldName = 'Name'
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #36134#21495
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -15
+        Title.Font.Name = #24494#36719#38597#40657
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = #24494#36719#38597#40657
+        Font.Style = []
+        FieldName = 'Account'
+        Width = 200
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #25805#20316
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -15
+        Title.Font.Name = #24494#36719#38597#40657
+        Title.Font.Style = []
+        Alignment = taCenter
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = #24494#36719#38597#40657
+        Font.Style = []
+        FieldName = 'Operate'
+        ReadOnly = True
+      end>
+    DataSet = cdsGuest
+    Grid = zgGuest
+    ExtendRowCount = 5
+    Left = 352
+    Top = 104
+  end
+  object cdsGuest: TClientDataSet
+    Active = True
+    Aggregates = <>
+    Params = <>
+    Left = 384
+    Top = 104
+    Data = {
+      760000009619E0BD010000001800000004000000000003000000760002494404
+      00010000000000044E616D6501004A0000000100055749445448020002002800
+      074163636F756E7401004A000000010005574944544802000200C800074F7065
+      7261746501004A00000001000557494454480200020028000000}
+    object cdsGuestID: TIntegerField
+      FieldName = 'ID'
+    end
+    object cdsGuestName: TWideStringField
+      FieldName = 'Name'
+    end
+    object cdsGuestAccount: TWideStringField
+      FieldName = 'Account'
+      Size = 100
+    end
+    object cdsGuestOperate: TWideStringField
+      FieldName = 'Operate'
+    end
+  end
+end

+ 221 - 0
Forms/SetGuestFrm.pas

@@ -0,0 +1,221 @@
+{*******************************************************************************
+  单元名称:  FindUserFrm.pas
+
+  单元说明:  设置游客帐号,标段关注人。
+
+  作者时间:  Chenshilong, 2017-06-19
+*******************************************************************************}
+
+unit SetGuestFrm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, ZJGrid, ZjGridDBA, DB, DBClient, sdDB;
+
+type
+  TSetGuestForm = class(TForm)
+    btnAdd: TButton;
+    zgGuest: TZJGrid;
+    btnOK: TButton;
+    zaGuest: TZjGridDBA;
+    cdsGuest: TClientDataSet;
+    cdsGuestID: TIntegerField;
+    cdsGuestName: TWideStringField;
+    cdsGuestAccount: TWideStringField;
+    cdsGuestOperate: TWideStringField;
+    procedure btnAddClick(Sender: TObject);
+    procedure zgGuestCellGetFont(Sender: TObject; ACoord: TPoint;
+      AFont: TFont);
+    procedure zgGuestMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+  private
+    { Private declarations }
+    FWebID: Integer;
+    FOwner: TObject;
+
+    procedure GetGuests;
+    function Col(AGridDBA: TZjGridDBA; FieldName: string): Integer;
+    procedure SetOwner(const Value: TObject);
+
+  public
+    { Public declarations }
+    constructor Create(AWebID: Integer);
+    procedure AddGuest(AID: Integer; AName, AEmail: string);
+    function HasGuest(AID: Integer): Boolean;
+    property Owner: TObject read FOwner write SetOwner;
+  end;
+
+var
+  SetGuestForm: TSetGuestForm;
+
+implementation
+
+uses FindUserFrm, PHPWebDm, CSLJson;
+
+{$R *.dfm}
+
+procedure TSetGuestForm.AddGuest(AID: Integer; AName, AEmail: string);
+begin
+  cdsGuest.Append;
+  cdsGuestID.AsInteger := AID;
+  cdsGuestName.AsString := AName;
+  cdsGuestAccount.AsString := AEmail;
+  cdsGuestOperate.AsString := '取消关注';
+  cdsGuest.Post;
+end;
+
+procedure TSetGuestForm.btnAddClick(Sender: TObject);
+var
+  FindUserForm: TFindUserForm;
+begin
+  FindUserForm := TFindUserForm.Create(self, 1, [FWebID, -1]);
+  try
+    FindUserForm.ShowModal;
+  finally
+    FindUserForm.Free;
+  end;
+end;
+
+function TSetGuestForm.Col(AGridDBA: TZjGridDBA;
+  FieldName: string): Integer;
+begin
+  Result := AGridDBA.ColumnIndex(FieldName) + 1;
+end;
+
+constructor TSetGuestForm.Create(AWebID: Integer);
+var i: Integer;
+begin
+  inherited Create(nil);
+  FWebID := AWebID;
+  GetGuests;
+
+// for test
+//  for i := 1 to 5 do
+//  begin
+//    cdsGuest.Append;
+//    cdsGuestID.AsString := IntToStr(i);
+//    cdsGuestName.AsString := 'aaa' + IntToStr(i);
+//    cdsGuestAccount.AsString := 'aaaa@qq.com';
+//    cdsGuestOperate.AsString := '取消关注';
+//    cdsGuest.Post;
+//  end;
+end;
+
+procedure TSetGuestForm.GetGuests;
+var sURL: string;
+  UserArr: TOVArr;
+  i: Integer;
+begin
+  Screen.Cursor := crHourGlass;
+  try
+    sURL := Format('%stender/%s/concernaudit/list', [PHPWeb.MeasureURL, InttoStr(FwebID)]);   // AAAAAA 查询标段的关注人
+    case PHPWeb.Search(sURL, [], [], UserArr) of
+      1:
+      begin
+        if cdsGuest.RecordCount > 0 then
+          cdsGuest.EmptyDataSet;
+
+        for i := Low(UserArr) to High(UserArr) do
+        begin
+          cdsGuest.Append;
+          cdsGuestID.AsString := UserArr[i, 0];
+          cdsGuestName.AsString := UserArr[i, 1];
+          cdsGuestAccount.AsString := UserArr[i, 2];
+          cdsGuestOperate.AsString := '取消关注';
+          cdsGuest.Post;
+        end;
+
+        cdsGuest.First;
+      end;
+      -1:
+      begin
+        Application.MessageBox(PChar(PHPWeb.NetError('无法查询到关注人')),
+            '警告', MB_OK + MB_ICONWARNING);
+        Exit;
+        close;
+      end;
+      0:
+      begin
+        Application.MessageBox(PChar(PHPWeb.PageError('无法查询到关注人')),
+            '警告', MB_OK + MB_ICONWARNING);
+        Exit;
+        close;
+      end;
+    end;
+  finally
+    Screen.Cursor := crDefault;
+  end;
+end;
+
+function TSetGuestForm.HasGuest(AID: Integer): Boolean;
+begin
+  Result := False;
+  cdsGuest.First;
+  while not cdsGuest.Eof do
+  begin
+    if cdsGuestID.AsInteger = AID then
+    begin
+      Result := True;
+      Break;
+    end;
+
+    cdsGuest.Next;
+  end;
+end;
+
+procedure TSetGuestForm.SetOwner(const Value: TObject);
+begin
+  FOwner := Value;
+end;
+
+procedure TSetGuestForm.zgGuestCellGetFont(Sender: TObject; ACoord: TPoint;
+  AFont: TFont);
+begin
+  if ACoord.X = Col(zaGuest, 'Operate') then
+    AFont.Color := clBlue;
+end;
+
+procedure TSetGuestForm.zgGuestMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+  var s, sURL: string;
+  vArr: array of string;
+begin
+
+  if ((zgGuest.CurCol = Col(zaGuest, 'Operate')) and (zgGuest.CurRow <= cdsGuest.RecordCount)) then
+  begin
+    s := Format('确定要取消用户“%s”对该标段的关注吗?', [cdsGuestName.AsString]);
+    if Application.MessageBox(PChar(s), '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
+       Exit;
+
+    Screen.Cursor := crHourGlass;
+    vArr := VarArrayOf(['msg']);
+    try
+      sURL := PHPWeb.MeasureURL + 'tender/concernaudit/del';   // 取消关注人
+
+      case PHPWeb.Search(sURL, ['tenderid', 'uid'], [InttoStr(FwebID), cdsGuestID.AsString], vArr) of
+        1:
+        begin
+          cdsGuest.Delete;
+        end;
+        -1:
+        begin
+          Application.MessageBox(PChar(PHPWeb.NetError('无法取消关注人')),
+              '警告', MB_OK + MB_ICONWARNING);
+          Exit;
+        end;
+        0:
+        begin
+          Application.MessageBox(PChar(PHPWeb.PageError('无法取消关注人')),
+              '警告', MB_OK + MB_ICONWARNING);
+          Exit;
+        end;
+      end;
+    finally
+      Screen.Cursor := crDefault;
+    end;
+  end;
+end;
+
+end.

+ 3 - 3
Frames/OrderCheckerFme.pas

@@ -229,12 +229,12 @@ procedure TOrderCheckerFrame.shpAddMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var
 var
   FindUserForm: TFindUserForm;
   FindUserForm: TFindUserForm;
+  vPD: TProjectData;
 begin
 begin
   if Button = mbLeft then
   if Button = mbLeft then
   begin
   begin
-    FindUserForm := TFindUserForm.Create(nil);
-    FindUserForm.ProjectData := TCheckerFrame(Owner).ProjectData;
-    FindUserForm.Owner := Self;
+    vPD := TProjectData(TCheckerFrame(Owner).ProjectData);
+    FindUserForm := TFindUserForm.Create(Self, 0, [vPD.WebID, vPD.PhaseIndex]);
     try
     try
       FindUserForm.ShowModal;
       FindUserForm.ShowModal;
     finally
     finally

+ 12 - 3
Frames/ProjectFme.pas

@@ -261,6 +261,9 @@ begin
     ButtonControl_NewPhase;
     ButtonControl_NewPhase;
     ButtonControl_UpToWeb;
     ButtonControl_UpToWeb;
     RepairAudits;
     RepairAudits;
+
+    if FProjectData.IsGuest then
+      tobtnUpFile.Visible := False;
   end;
   end;
 end;
 end;
 
 
@@ -537,7 +540,7 @@ procedure TProjectFrame.dxsbViewControlItemClick(Sender: TObject;
       if (Item.Tag = xbiBillsCompile.Tag) or (Item.Tag = xbiBillsMeasure.Tag) then
       if (Item.Tag = xbiBillsCompile.Tag) or (Item.Tag = xbiBillsMeasure.Tag) then
         CheckUpFile;
         CheckUpFile;
 
 
-      tobtnUpFile.Visible := Item.Tag = xbiBillsMeasure.Tag;
+      tobtnUpFile.Visible := (Item.Tag = xbiBillsMeasure.Tag) and (not ProjectData.IsGuest);
       if (tobtnUpFile.Visible = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
       if (tobtnUpFile.Visible = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
         jpsAssistant.ActivePage := jpsAssistantStandardBills;
         jpsAssistant.ActivePage := jpsAssistantStandardBills;
     end;
     end;
@@ -816,7 +819,12 @@ begin
     if ProjectData.PhaseIndex < ProjectData.ProjProperties.PhaseCount then
     if ProjectData.PhaseIndex < ProjectData.ProjProperties.PhaseCount then
       btnPass.Enabled := False
       btnPass.Enabled := False
     else
     else
-      btnPass.Enabled := CheckerFrame.Me.IsChecking;
+    begin
+      if CheckerFrame.Me <> nil then
+        btnPass.Enabled := CheckerFrame.Me.IsChecking
+      else         // 游客,关注人身份
+        btnPass.Enabled := False;
+    end;
 
 
     btnNotPass.Enabled := btnPass.Enabled;
     btnNotPass.Enabled := btnPass.Enabled;
     btnPass.Left := jcbAudit.Left + jcbAudit.Width + 5;
     btnPass.Left := jcbAudit.Left + jcbAudit.Width + 5;
@@ -1279,7 +1287,8 @@ begin
     begin
     begin
       if ProjectData.CurUserIsAuthor then
       if ProjectData.CurUserIsAuthor then
         Result := ((iC = 1) or (iC = iNo + 1))
         Result := ((iC = 1) or (iC = iNo + 1))
-      else if FCheckerFrame.InCheckerList(PHPWeb.UserID) then
+//      else if FCheckerFrame.InCheckerList(PHPWeb.UserID) then      // 这个条件会漏掉关注人
+      else
         Result := (iC = iNo + 1);
         Result := (iC = iNo + 1);
     end
     end
     else
     else

+ 13 - 1
Frames/ProjectManagerFme.dfm

@@ -415,7 +415,7 @@ object ProjectManagerFrame: TProjectManagerFrame
       Height = 20
       Height = 20
       Align = alTop
       Align = alTop
       BorderStyle = bsNone
       BorderStyle = bsNone
-      Color = clPurple
+      Color = clWindow
       ParentColor = False
       ParentColor = False
       TabOrder = 1
       TabOrder = 1
     end
     end
@@ -490,6 +490,11 @@ object ProjectManagerFrame: TProjectManagerFrame
       OnExecute = actnSignOnlineExecute
       OnExecute = actnSignOnlineExecute
       OnUpdate = actnSignOnlineUpdate
       OnUpdate = actnSignOnlineUpdate
     end
     end
+    object actnGuest: TAction
+      Caption = #26631#27573#20851#27880#20154
+      OnExecute = actnGuestExecute
+      OnUpdate = actnGuestUpdate
+    end
   end
   end
   object dxpmProjectManager: TdxBarPopupMenu
   object dxpmProjectManager: TdxBarPopupMenu
     BarManager = MainForm.dxBarManager
     BarManager = MainForm.dxBarManager
@@ -528,6 +533,13 @@ object ProjectManagerFrame: TProjectManagerFrame
         Visible = True
         Visible = True
       end
       end
       item
       item
+        Item = MainForm.dxbtnGuest
+        Visible = True
+      end
+      item
+        Visible = True
+      end
+      item
         BeginGroup = True
         BeginGroup = True
         Item = MainForm.dxbtnOpenBackupFolder
         Item = MainForm.dxbtnOpenBackupFolder
         Visible = True
         Visible = True

+ 143 - 85
Frames/ProjectManagerFme.pas

@@ -64,6 +64,7 @@ type
     actnOpenBackupFolder: TAction;
     actnOpenBackupFolder: TAction;
     sbChecker: TScrollBox;
     sbChecker: TScrollBox;
     actnSignOnline: TAction;
     actnSignOnline: TAction;
+    actnGuest: TAction;
     procedure actnOpenExecute(Sender: TObject);
     procedure actnOpenExecute(Sender: TObject);
     procedure actnDeleteExecute(Sender: TObject);
     procedure actnDeleteExecute(Sender: TObject);
     procedure zgProjectsMouseDown(Sender: TObject; Button: TMouseButton;
     procedure zgProjectsMouseDown(Sender: TObject; Button: TMouseButton;
@@ -94,6 +95,8 @@ type
     procedure pnlProgressClick(Sender: TObject);
     procedure pnlProgressClick(Sender: TObject);
     procedure actnSignOnlineExecute(Sender: TObject);
     procedure actnSignOnlineExecute(Sender: TObject);
     procedure actnSignOnlineUpdate(Sender: TObject);
     procedure actnSignOnlineUpdate(Sender: TObject);
+    procedure actnGuestExecute(Sender: TObject);
+    procedure actnGuestUpdate(Sender: TObject);
   private
   private
     FProjectManagerData: TProjectManagerData;
     FProjectManagerData: TProjectManagerData;
 
 
@@ -128,7 +131,8 @@ type
     FPhaseNo: Integer;
     FPhaseNo: Integer;
 
 
     FCurPos: Integer;                         // 用来控制审核人的添加位置
     FCurPos: Integer;                         // 用来控制审核人的添加位置
-    FCheckerList: TObjectList;
+    FCheckers: TOVArr;
+    FCheckerFrames: TObjectList;
 
 
     FSignOnlineSwitch: Integer;
     FSignOnlineSwitch: Integer;
 
 
@@ -172,6 +176,8 @@ type
     function CurRec: TsdDataRecord;
     function CurRec: TsdDataRecord;
     function CurRecAttachmentPath: string;
     function CurRecAttachmentPath: string;
     function AttachmentFileCountsWithoutManageFile(ANode: TsdIDTreeNode): Integer;
     function AttachmentFileCountsWithoutManageFile(ANode: TsdIDTreeNode): Integer;
+    function UserIsChecker(UserID: Integer): Boolean; // 判断指定ID的用户是否是参与人
+    function IsGuest: Boolean;
     property ProjectCheckStatus: TCheckStatus read FWebCheckStatusProject;
     property ProjectCheckStatus: TCheckStatus read FWebCheckStatusProject;
   end;
   end;
 
 
@@ -181,7 +187,8 @@ uses
   MainFrm, UtilMethods, ProjectCommands, Globals, ConfigDoc, ConstUnit,
   MainFrm, UtilMethods, ProjectCommands, Globals, ConfigDoc, ConstUnit,
   WebNewTenderFrm, PHPWebDm, Math, mProgressFrm, ProgressHintFrm,
   WebNewTenderFrm, PHPWebDm, Math, mProgressFrm, ProgressHintFrm,
   ShellAPI, ProjectFme, SelectOnlineSignPhaseFrm, SignOnlineReportsFrm,
   ShellAPI, ProjectFme, SelectOnlineSignPhaseFrm, SignOnlineReportsFrm,
-  ConditionalDefines;
+  ConditionalDefines, SetGuestFrm;
+
 
 
 {$R *.dfm}
 {$R *.dfm}
 
 
@@ -196,12 +203,13 @@ begin
   SetDxBtnAction(actnOpenBackupFolder, MainForm.dxbtnOpenBackupFolder);
   SetDxBtnAction(actnOpenBackupFolder, MainForm.dxbtnOpenBackupFolder);
   SetDxBtnAction(actnRename, MainForm.dxbtnRename);
   SetDxBtnAction(actnRename, MainForm.dxbtnRename);
   SetDxBtnAction(actnSignOnline, MainForm.dxbtnSignOnline);
   SetDxBtnAction(actnSignOnline, MainForm.dxbtnSignOnline);
+  SetDxBtnAction(actnGuest, MainForm.dxbtnGuest);
 end;
 end;
 
 
 constructor TProjectManagerFrame.Create(AOwner: TComponent);
 constructor TProjectManagerFrame.Create(AOwner: TComponent);
 begin
 begin
   inherited;
   inherited;
-  FCheckerList := TObjectList.Create;
+  FCheckerFrames := TObjectList.Create;
   FProjectManagerData := ProjectManager;
   FProjectManagerData := ProjectManager;
   FProjectManagerData.Open;
   FProjectManagerData.Open;
   stdProjects.IDTree := FProjectManagerData.ProjectsTree;
   stdProjects.IDTree := FProjectManagerData.ProjectsTree;
@@ -394,9 +402,10 @@ begin
 
 
       if not MainForm.CurProjectFrame.CheckFileAndCloudChekerList then
       if not MainForm.CurProjectFrame.CheckFileAndCloudChekerList then
       begin
       begin
-        sHint := '项目校验:“' + FWebBidName_OnLine + '”文件中的审批人和云端的审批人不一致,' +
-          '禁止继续操作,项目即将关闭!请删除本地项目重新从云端获取,' +
-          '重新获取后如果仍然存在同样的问题,请联系纵横服务人员以寻求帮助。';
+        sHint := '“'+ FWebBidName_OnLine +'”无法打开,本地与云端审批人不一致。' + #10#13 +
+          '1、如当前项目审批不通过并已重新开始计量:请回到原电脑操作;' + #10#13 +
+          '2、审批中/审批完成项目:请删除本地项目重新从云端获取。' + #10#13 +
+          '如仍然存在同样问题,请联系纵横服务人员。';
         Application.MessageBox(PChar(sHint), '文件错误', MB_OK +MB_ICONWARNING);
         Application.MessageBox(PChar(sHint), '文件错误', MB_OK +MB_ICONWARNING);
         MainForm.actnCloseProject.Execute;
         MainForm.actnCloseProject.Execute;
         Exit;
         Exit;
@@ -1036,75 +1045,74 @@ procedure TProjectManagerFrame.ShowProjectInfoTopAndCheckers;
 var
 var
   vPSArr: TStrArr;
   vPSArr: TStrArr;
   vCArr: TOVArr;    // Checkers
   vCArr: TOVArr;    // Checkers
-  vChecker: TOrderCheckerFrame;
   sPicPath, sURL: string;
   sPicPath, sURL: string;
 
 
-  procedure AddChecker(AType: TCheckerFrameType; AArr: array of string);
-  begin
-    vChecker := TOrderCheckerFrame.Create(self);
-    FCheckerList.Add(vChecker);
-    vChecker.Owner := Self;
-    sbChecker.VertScrollBar.Range := sbChecker.VertScrollBar.Range + vChecker.Height;
-    sbChecker.Height := Min(sbChecker.Height + vChecker.Height, pnlWeb.Height - pnlProject.Height);
-    vChecker.Parent := sbChecker;
-    vChecker.Top := FCurPos;
-    FCurPos := FCurPos + vChecker.Height;
-    vChecker.Align := alTop;
-
-    sPicPath := PHPWeb.UserPath + '1_' + AArr[0] + '.jpg';
-    PHPWeb.DownFile(AArr[4], sPicPath);
-    vChecker.Init(AType, StrToInt(AArr[0]), AArr[1], AArr[3],
-      AArr[2], sPicPath, AArr[6], TCheckStatus(StrToInt(AArr[5])-1), AArr[8], StrToInt(AArr[7]));
-    vChecker.Name := 'ProjectOrderFrame' + AArr[0];
-  end;
-
-  procedure RepairOrder;
-  var k: Integer;
-  begin
-    for k := 0 to sbChecker.ControlCount - 1 do
-      TOrderCheckerFrame(sbChecker.Controls[k]).Order := k + 1;
-  end;
-
-  procedure ShowProjectCheckers;
-  var i, j, n: Integer;
+    procedure ShowProjectCheckers;
+    var i, j, k, n: Integer;
     vOwner: array of string;  // 业主信息
     vOwner: array of string;  // 业主信息
-  begin
-    FCheckerList.Clear;
-    sbChecker.Height := 0;
-    FCurPos := 0;
 
 
-    n := Length(vCArr[Low(vCArr)]);
-    SetLength(vOwner, n);
-    sbChecker.VertScrollBar.Range := 0;
-    for i := Low(vCArr) to High(vCArr) do
+        procedure AddCheckerFrame(AType: TCheckerFrameType; AArr: array of string);
+        var vChecker: TOrderCheckerFrame;
+        begin
+          vChecker := TOrderCheckerFrame.Create(self);
+          FCheckerFrames.Add(vChecker);
+          vChecker.Owner := Self;
+          sbChecker.VertScrollBar.Range := sbChecker.VertScrollBar.Range + vChecker.Height;
+          sbChecker.Height := Min(sbChecker.Height + vChecker.Height, pnlWeb.Height - pnlProject.Height);
+          vChecker.Parent := sbChecker;
+          vChecker.Top := FCurPos;
+          FCurPos := FCurPos + vChecker.Height;
+          vChecker.Align := alTop;
+
+          sPicPath := PHPWeb.UserPath + '1_' + AArr[0] + '.jpg';
+          PHPWeb.DownFile(AArr[4], sPicPath);
+          vChecker.Init(AType, StrToInt(AArr[0]), AArr[1], AArr[3],
+            AArr[2], sPicPath, AArr[6], TCheckStatus(StrToInt(AArr[5])-1), AArr[8], StrToInt(AArr[7]));
+          vChecker.Name := 'ProjectOrderFrame' + AArr[0];
+        end;
     begin
     begin
-      if StrToInt(vCArr[i, 0]) = PHPWeb.UserID then
-        FWebCheckStatusMy := TCheckStatus(StrToInt(vCArr[i, 5])-1);
+      sbChecker.Height := 0;
+      FCurPos := 0;
 
 
-      if StrToInt(vCArr[i, 0]) = FWebOwnerID then
+      n := Length(vCArr[Low(vCArr)]);
+      SetLength(vOwner, n);
+      sbChecker.VertScrollBar.Range := 0;
+      for i := Low(vCArr) to High(vCArr) do
       begin
       begin
-        for j := 0 to n - 1 do
-          vOwner[j] := vCArr[i, j];
+        if StrToInt(vCArr[i, 0]) = PHPWeb.UserID then
+          FWebCheckStatusMy := TCheckStatus(StrToInt(vCArr[i, 5])-1);
+
+        if StrToInt(vCArr[i, 0]) = FWebOwnerID then
+        begin
+          for j := 0 to n - 1 do
+            vOwner[j] := vCArr[i, j];
+
+          Continue;
+        end;
 
 
-        Continue;
+        AddCheckerFrame(cftChecker, vCArr[i]);
       end;
       end;
+      if vOwner[0] <> '' then
+        AddCheckerFrame(cftOwner, vOwner);
 
 
-      AddChecker(cftChecker, vCArr[i]);
-    end;
-    if vOwner[0] <> '' then
-      AddChecker(cftOwner, vOwner);
-    RepairOrder;
+      for k := 0 to sbChecker.ControlCount - 1 do
+        TOrderCheckerFrame(sbChecker.Controls[k]).Order := k + 1;
 
 
-    OnLineChecker(vCArr, FOnLineCheckerBegin, FOnLineCheckerEnd, FOnLineCheckerEndIsOwner);
-  end;
+      OnLineChecker(vCArr, FOnLineCheckerBegin, FOnLineCheckerEnd, FOnLineCheckerEndIsOwner);
+    end;
 
 
 begin
 begin
+  FCheckerFrames.Clear;
   GetLocalValues(CurRec);
   GetLocalValues(CurRec);
   if FWebID = 0 then Exit;
   if FWebID = 0 then Exit;
   SetLength(vPSArr, 8);
   SetLength(vPSArr, 8);
   sURL := Format('%smeasure/status/%d/get', [PHPWeb.MeasureURL, FWebID]);
   sURL := Format('%smeasure/status/%d/get', [PHPWeb.MeasureURL, FWebID]);
+  SetLength(FCheckers, 0);
   if PHPWeb.Search(sURL, [''], [''], 3, vPSArr, vCArr) = 1 then
   if PHPWeb.Search(sURL, [''], [''], 3, vPSArr, vCArr) = 1 then
   begin
   begin
+    FCheckers := vCArr;
+
+
     LockWindowUpdate(pnlWeb.Handle);
     LockWindowUpdate(pnlWeb.Handle);
     try
     try
       FPhaseNo := StrToInt(vPSArr[0]);
       FPhaseNo := StrToInt(vPSArr[0]);
@@ -1140,34 +1148,33 @@ begin
 end;
 end;
 
 
 procedure TProjectManagerFrame.ShowProjectInfoTop(AType: Integer);
 procedure TProjectManagerFrame.ShowProjectInfoTop(AType: Integer);
+    procedure ShowOwner;
+    begin
+      lblBidName.Caption := FWebBidName_Local;
+      lblBidName.Update;
+      lblProjName.Caption := FWebFolder_OnLine;
+      lblProjName.Update;
+      lblWebProjCtgyName.Caption := FWebSubFolder_OnLine;
+      lblWebProjCtgyName.Update;
+      lblOnwerName.Caption := FWebOwnerName;
+      lblOnwerName.Update;
+      lblOnwerCompany.Caption := Format('-%s)', [FWebOwnerCompany]);
+      lblOnwerCompany.Update;
+      lblOnwerCompany.Left := lblOnwerName.Left + lblOnwerName.Width;
+    end;
 
 
-  procedure ShowOwner;
-  begin
-    lblBidName.Caption := FWebBidName_Local;
-    lblBidName.Update;
-    lblProjName.Caption := FWebFolder_OnLine;
-    lblProjName.Update;
-    lblWebProjCtgyName.Caption := FWebSubFolder_OnLine;
-    lblWebProjCtgyName.Update;
-    lblOnwerName.Caption := FWebOwnerName;
-    lblOnwerName.Update;
-    lblOnwerCompany.Caption := Format('-%s)', [FWebOwnerCompany]);
-    lblOnwerCompany.Update;
-    lblOnwerCompany.Left := lblOnwerName.Left + lblOnwerName.Width;
-  end;
-
-  procedure ShowStatus(ANo: Integer; AState: TCheckStatus);
-  begin
-    lblPeriod.Caption := Format('第%d期', [ANo]);
-    lblPeriod.Update;
-    lblPeriodState.Caption := CheckStatusNames[AState];
-    lblPeriodState.Font.Color := CheckStatusColors[AState];
-    lblPeriodState.Update;
-    lblPeriodState.Left := lblPeriod.Left + lblPeriod.Width + 5;
-    lblPeriodTotal.Caption := Format('(共%d期)', [ANo]);
-    lblPeriodTotal.Update;
-    lblPeriodTotal.Left := lblPeriodState.Left + lblPeriodState.Width + 3;
-  end;
+    procedure ShowStatus(ANo: Integer; AState: TCheckStatus);
+    begin
+      lblPeriod.Caption := Format('第%d期', [ANo]);
+      lblPeriod.Update;
+      lblPeriodState.Caption := CheckStatusNames[AState];
+      lblPeriodState.Font.Color := CheckStatusColors[AState];
+      lblPeriodState.Update;
+      lblPeriodState.Left := lblPeriod.Left + lblPeriod.Width + 5;
+      lblPeriodTotal.Caption := Format('(共%d期)', [ANo]);
+      lblPeriodTotal.Update;
+      lblPeriodTotal.Left := lblPeriodState.Left + lblPeriodState.Width + 3;
+    end;
 begin
 begin
   GetLocalValues(CurRec);
   GetLocalValues(CurRec);
   case AType of
   case AType of
@@ -1296,7 +1303,7 @@ end;
 
 
 destructor TProjectManagerFrame.Destroy;
 destructor TProjectManagerFrame.Destroy;
 begin
 begin
-  FCheckerList.Free;
+  FCheckerFrames.Free;
   inherited;
   inherited;
 end;
 end;
 
 
@@ -1893,7 +1900,7 @@ procedure TProjectManagerFrame.actnSignOnlineUpdate(Sender: TObject);
   end;
   end;
 
 
 begin
 begin
-  TAction(Sender).Visible := _IsCloud;
+  TAction(Sender).Visible := G_IsCloud and (not IsGuest);
   TAction(Sender).Enabled := (FSignOnlineSwitch = 1) and
   TAction(Sender).Enabled := (FSignOnlineSwitch = 1) and
        Assigned(stdProjects.IDTree.Selected) and
        Assigned(stdProjects.IDTree.Selected) and
       (stdProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = 1) and
       (stdProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = 1) and
@@ -1914,4 +1921,55 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TProjectManagerFrame.actnGuestExecute(Sender: TObject);
+var
+  SetGuestForm: TSetGuestForm;
+begin
+  CreateProgress('云端取最新审核人列表');
+  try
+    ShowProjectInfoTopAndCheckers;
+  finally
+    CloseProgress;
+  end;
+  SetGuestForm := TSetGuestForm.Create(CurRec.ValueByName('WebID').AsInteger);
+  SetGuestForm.Owner := Self;
+  try
+    SetGuestForm.ShowModal;
+  finally
+    SetGuestForm.Free;
+  end;
+end;
+
+procedure TProjectManagerFrame.actnGuestUpdate(Sender: TObject);
+begin
+  TAction(Sender).Visible := G_IsCloud and (not IsGuest);
+  TAction(Sender).Enabled := Assigned(stdProjects.IDTree.Selected) and
+    (stdProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = 1);
+end;
+
+function TProjectManagerFrame.UserIsChecker(UserID: Integer): Boolean;
+var i: Integer;
+begin
+  Result := False;
+  if FWebAuthorID = UserID then
+  begin
+    Result := True;
+    Exit;
+  end;
+
+  for i := Low(FCheckers) to High(FCheckers) do
+  begin
+    if StrToInt(FCheckers[i, 0]) = UserID then
+    begin
+       Result := True;
+       Break;
+    end;
+  end;
+end;
+
+function TProjectManagerFrame.IsGuest: Boolean;
+begin
+  Result := not UserIsChecker(PHPWeb.UserID);
+end;
+
 end.
 end.

+ 3 - 2
Frames/ZJJLFme.pas

@@ -92,9 +92,10 @@ constructor TZJJLFrame.Create(AParent: TFrame; AZJJLData: TZJJLData);
 begin
 begin
   inherited Create(AParent);
   inherited Create(AParent);
   ResetFrameLink(AZJJLData);
   ResetFrameLink(AZJJLData);
-  with TPhaseData(FZJJLData.PhaseData).PhaseProperty do
+  if TPhaseData(FZJJLData.PhaseData).Active then
   begin
   begin
-    lePreText.Text := ZJJLPreText;
+    with TPhaseData(FZJJLData.PhaseData).PhaseProperty do
+      lePreText.Text := ZJJLPreText;
   end;
   end;
   RefreshTitle;
   RefreshTitle;
 end;
 end;

+ 8 - 0
Units/ProjectData.pas

@@ -58,6 +58,7 @@ type
     FProjectReadOnly: Boolean;
     FProjectReadOnly: Boolean;
     FAttachmentData: TUpFiles;
     FAttachmentData: TUpFiles;
     FCheckers: TCheckers;
     FCheckers: TCheckers;
+    FIsGuest: Boolean;
 
 
     {For Open}
     {For Open}
     procedure UpdateProjectDataBase;
     procedure UpdateProjectDataBase;
@@ -104,6 +105,7 @@ type
     function GetCanInsertNormalBills: Boolean;
     function GetCanInsertNormalBills: Boolean;
     function GetValidStageIsRefer: Boolean;
     function GetValidStageIsRefer: Boolean;
     function GetStartMeasure: Boolean;
     function GetStartMeasure: Boolean;
+    procedure SetIsGuest(const Value: Boolean);
   public
   public
     constructor Create;
     constructor Create;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -256,6 +258,7 @@ type
 
 
     property ProjectReadOnly: Boolean read FProjectReadOnly;
     property ProjectReadOnly: Boolean read FProjectReadOnly;
     property Checkers: TCheckers read FCheckers write SetCheckers;
     property Checkers: TCheckers read FCheckers write SetCheckers;
+    property IsGuest: Boolean read FIsGuest write SetIsGuest;
   end;
   end;
 
 
 implementation
 implementation
@@ -2167,4 +2170,9 @@ begin
     MeasureLog.AppendLogTo(Format('%s: %s', [FProjectName, ALog]));
     MeasureLog.AppendLogTo(Format('%s: %s', [FProjectName, ALog]));
 end;
 end;
 
 
+procedure TProjectData.SetIsGuest(const Value: Boolean);
+begin
+  FIsGuest := Value;
+end;
+
 end.
 end.

+ 2 - 2
Units/UtilMethods.pas

@@ -163,8 +163,8 @@ end;
 
 
 function GetCompareDigitValue(ADigit: Integer): Double;
 function GetCompareDigitValue(ADigit: Integer): Double;
 begin
 begin
-  if ADigit < 0 then
-    Result := IntPower(10, ADigit - 1)
+  if ADigit > 0 then
+    Result := IntPower(10, - ADigit - 1)
   else
   else
     Result := 0.1;
     Result := 0.1;
 end;
 end;