Просмотр исходного кода

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

builder 8 лет назад
Родитель
Сommit
9a82b83c94

+ 1 - 1
DataModules/PHPWebDm.pas

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

+ 7 - 0
DataModules/ReportMemoryDm/rmWeiWuZjjlGatherDm.pas

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

+ 2 - 2
Dprs/CSL/Measure_Cloud.dof

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

+ 11 - 1
Dprs/CSL/Measure_Cloud.dpr

@@ -216,7 +216,16 @@ uses
   OtherMeasureFme in '..\..\Frames\OtherMeasureFme.pas' {OtherMeasureFrame: TFrame},
   ProjGatherSelectFme in '..\..\ProjGather\ProjGatherSelectFme.pas' {ProjGatherSelectFrame: TFrame},
   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}
 
@@ -313,6 +322,7 @@ begin
     if CheckDogExists then
     begin
       Application.CreateForm(TMainForm, MainForm);
+  Application.CreateForm(TSetGuestForm, SetGuestForm);
   end;
     Application.Run;
   end;

BIN
Dprs/CSL/Measure_Cloud.res


+ 15 - 15
Forms/FindUserFrm.dfm

@@ -1,10 +1,10 @@
 object FindUserForm: TFindUserForm
-  Left = 934
-  Top = 272
+  Left = 244
+  Top = 376
   ActiveControl = edtMail
   BorderStyle = bsDialog
   Caption = #28155#21152#23457#25209#20154
-  ClientHeight = 387
+  ClientHeight = 327
   ClientWidth = 567
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
@@ -14,14 +14,14 @@ object FindUserForm: TFindUserForm
   Font.Style = []
   OldCreateOrder = False
   Position = poScreenCenter
-  OnCreate = FormCreate
+  OnActivate = FormActivate
   PixelsPerInch = 96
   TextHeight = 17
   object JimPageControl1: TJimPageControl
     Left = 0
     Top = 0
     Width = 567
-    Height = 387
+    Height = 327
     ActivePage = JimPageControl1Page1
     ActivePageIndex = 0
     Align = alClient
@@ -35,15 +35,15 @@ object FindUserForm: TFindUserForm
       Left = 0
       Top = 24
       Width = 567
-      Height = 363
+      Height = 303
       TabName = 'Page1'
-      Caption = #26597#35810#26032#23457#25209#20154
-      object lbl1: TLabel
-        Left = 32
+      Caption = 'sssssssss'
+      object lblHint1: TLabel
+        Left = 37
         Top = 24
-        Width = 508
+        Width = 482
         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.Color = clGray
         Font.Height = -13
@@ -51,7 +51,7 @@ object FindUserForm: TFindUserForm
         Font.Style = []
         ParentFont = False
       end
-      object lbl2: TLabel
+      object lblHint2: TLabel
         Left = 69
         Top = 64
         Width = 90
@@ -108,9 +108,9 @@ object FindUserForm: TFindUserForm
       end
       object pnlUser: TPanel
         Left = 0
-        Top = 113
+        Top = 120
         Width = 567
-        Height = 250
+        Height = 183
         Align = alBottom
         BevelOuter = bvNone
         TabOrder = 2
@@ -200,7 +200,7 @@ object FindUserForm: TFindUserForm
       Left = 0
       Top = 24
       Width = 567
-      Height = 363
+      Height = 303
       TabName = 'Page2'
       TabVisible = False
       Caption = #24120#29992#23457#25209#20154

+ 131 - 62
Forms/FindUserFrm.pas

@@ -4,6 +4,8 @@
   单元说明:  查找审核人。
 
   作者时间:  Chenshilong, 2014-07-11
+  
+              2017.06.19 该窗口定制太深,不通用,改成通用查询窗口。
 *******************************************************************************}
 
 unit FindUserFrm;
@@ -20,8 +22,8 @@ type
     JimPageControl1: TJimPageControl;
     JimPageControl1Page1: TJimPage;
     JimPageControl1Page2: TJimPage;
-    lbl1: TLabel;
-    lbl2: TLabel;
+    lblHint1: TLabel;
+    lblHint2: TLabel;
     edtMail: TcxTextEdit;
     btnSearch: TcxButton;
     pnlUser: TPanel;
@@ -35,27 +37,28 @@ type
     btnAdd: TcxButton;
     lblHint: TLabel;
     procedure btnSearchClick(Sender: TObject);
-    procedure FormCreate(Sender: TObject);
     procedure edtMailKeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
     procedure btnAddClick(Sender: TObject);
     procedure edtMailClick(Sender: TObject);
+    procedure FormActivate(Sender: TObject);
   private
-    FProjectData: 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 }
   public
     { 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;
 
 implementation
 
-uses PHPWebDm, ConstUnit, ProjectData, CheckerFme, ProjectFme,
-  OrderCheckerFme;
+uses PHPWebDm, ConstUnit, CheckerFme, ProjectFme, ProjectManagerFme,
+  OrderCheckerFme, SetGuestFrm;
 
 {$R *.dfm}
 
@@ -64,41 +67,63 @@ var
   PicPath: string;
 
 procedure TFindUserForm.btnSearchClick(Sender: TObject);
-var bUsed, bSelf, bFull: Boolean;
+var bChecker, bSelf, bFull, bGuest: Boolean;
 begin
   Screen.Cursor := crHourGlass;
   try
+    FAccount := Trim(edtMail.Text);
     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:
       begin
         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];
         lblUserCompany.Caption := UserArr[3];
         PicPath := PHPWeb.UserPath + '1_' + UserArr[4] + '.jpg';
         if PHPWeb.DownFile(UserArr[0], PicPath) then
           imgUserPic.Picture.LoadFromFile(PicPath);
         pnlUser.Visible := True;
-        bUsed := TCheckerFrame(TOrderCheckerFrame(Owner).Owner).InCheckerList(StrToInt(UserArr[4]));
         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;
       -1:
       begin
-        Application.MessageBox(PChar(PHPWeb.NetError('无法查询用户')),
-            '警告', MB_OK + MB_ICONWARNING);
+//        Application.MessageBox(PChar(PHPWeb.NetError('无法查询用户')),
+//            '警告', MB_OK + MB_ICONWARNING);
         lblHint.Caption := '没有找到该用户的相关信息!';
         pnlUser.Visible := False;
         btnAdd.Enabled := False;
@@ -106,8 +131,8 @@ begin
       end;
       0:
       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 := '没有找到该用户的相关信息!';
         pnlUser.Visible := False;
         btnAdd.Enabled := False;
@@ -119,15 +144,6 @@ begin
   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;
   Shift: TShiftState);
 begin
@@ -138,36 +154,60 @@ end;
 procedure TFindUserForm.btnAddClick(Sender: TObject);
 var sURL: string;
   vArr: array of string;
-  vProj: TProjectData;
   vOwner: TCheckerFrame;
 begin
-  sURL := PHPWeb.MeasureURL + 'user/add/audit/measure';
   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);
 begin
@@ -216,4 +256,33 @@ begin
   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.

+ 6 - 0
Forms/MainFrm.dfm

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

+ 1 - 0
Forms/MainFrm.pas

@@ -164,6 +164,7 @@ type
     dxbtnExportTpExcel: TdxBarButton;
     dxbtnHelpCenter: TdxBarButton;
     dxbtnLocateMeasureBills: TdxBarButton;
+    dxbtnGuest: TdxBarButton;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     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);
 var
   FindUserForm: TFindUserForm;
+  vPD: TProjectData;
 begin
   if Button = mbLeft then
   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
       FindUserForm.ShowModal;
     finally

+ 12 - 3
Frames/ProjectFme.pas

@@ -261,6 +261,9 @@ begin
     ButtonControl_NewPhase;
     ButtonControl_UpToWeb;
     RepairAudits;
+
+    if FProjectData.IsGuest then
+      tobtnUpFile.Visible := False;
   end;
 end;
 
@@ -537,7 +540,7 @@ procedure TProjectFrame.dxsbViewControlItemClick(Sender: TObject;
       if (Item.Tag = xbiBillsCompile.Tag) or (Item.Tag = xbiBillsMeasure.Tag) then
         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
         jpsAssistant.ActivePage := jpsAssistantStandardBills;
     end;
@@ -816,7 +819,12 @@ begin
     if ProjectData.PhaseIndex < ProjectData.ProjProperties.PhaseCount then
       btnPass.Enabled := False
     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;
     btnPass.Left := jcbAudit.Left + jcbAudit.Width + 5;
@@ -1279,7 +1287,8 @@ begin
     begin
       if ProjectData.CurUserIsAuthor then
         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);
     end
     else

+ 13 - 1
Frames/ProjectManagerFme.dfm

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

+ 143 - 85
Frames/ProjectManagerFme.pas

@@ -64,6 +64,7 @@ type
     actnOpenBackupFolder: TAction;
     sbChecker: TScrollBox;
     actnSignOnline: TAction;
+    actnGuest: TAction;
     procedure actnOpenExecute(Sender: TObject);
     procedure actnDeleteExecute(Sender: TObject);
     procedure zgProjectsMouseDown(Sender: TObject; Button: TMouseButton;
@@ -94,6 +95,8 @@ type
     procedure pnlProgressClick(Sender: TObject);
     procedure actnSignOnlineExecute(Sender: TObject);
     procedure actnSignOnlineUpdate(Sender: TObject);
+    procedure actnGuestExecute(Sender: TObject);
+    procedure actnGuestUpdate(Sender: TObject);
   private
     FProjectManagerData: TProjectManagerData;
 
@@ -128,7 +131,8 @@ type
     FPhaseNo: Integer;
 
     FCurPos: Integer;                         // 用来控制审核人的添加位置
-    FCheckerList: TObjectList;
+    FCheckers: TOVArr;
+    FCheckerFrames: TObjectList;
 
     FSignOnlineSwitch: Integer;
 
@@ -172,6 +176,8 @@ type
     function CurRec: TsdDataRecord;
     function CurRecAttachmentPath: string;
     function AttachmentFileCountsWithoutManageFile(ANode: TsdIDTreeNode): Integer;
+    function UserIsChecker(UserID: Integer): Boolean; // 判断指定ID的用户是否是参与人
+    function IsGuest: Boolean;
     property ProjectCheckStatus: TCheckStatus read FWebCheckStatusProject;
   end;
 
@@ -181,7 +187,8 @@ uses
   MainFrm, UtilMethods, ProjectCommands, Globals, ConfigDoc, ConstUnit,
   WebNewTenderFrm, PHPWebDm, Math, mProgressFrm, ProgressHintFrm,
   ShellAPI, ProjectFme, SelectOnlineSignPhaseFrm, SignOnlineReportsFrm,
-  ConditionalDefines;
+  ConditionalDefines, SetGuestFrm;
+
 
 {$R *.dfm}
 
@@ -196,12 +203,13 @@ begin
   SetDxBtnAction(actnOpenBackupFolder, MainForm.dxbtnOpenBackupFolder);
   SetDxBtnAction(actnRename, MainForm.dxbtnRename);
   SetDxBtnAction(actnSignOnline, MainForm.dxbtnSignOnline);
+  SetDxBtnAction(actnGuest, MainForm.dxbtnGuest);
 end;
 
 constructor TProjectManagerFrame.Create(AOwner: TComponent);
 begin
   inherited;
-  FCheckerList := TObjectList.Create;
+  FCheckerFrames := TObjectList.Create;
   FProjectManagerData := ProjectManager;
   FProjectManagerData.Open;
   stdProjects.IDTree := FProjectManagerData.ProjectsTree;
@@ -394,9 +402,10 @@ begin
 
       if not MainForm.CurProjectFrame.CheckFileAndCloudChekerList then
       begin
-        sHint := '项目校验:“' + FWebBidName_OnLine + '”文件中的审批人和云端的审批人不一致,' +
-          '禁止继续操作,项目即将关闭!请删除本地项目重新从云端获取,' +
-          '重新获取后如果仍然存在同样的问题,请联系纵横服务人员以寻求帮助。';
+        sHint := '“'+ FWebBidName_OnLine +'”无法打开,本地与云端审批人不一致。' + #10#13 +
+          '1、如当前项目审批不通过并已重新开始计量:请回到原电脑操作;' + #10#13 +
+          '2、审批中/审批完成项目:请删除本地项目重新从云端获取。' + #10#13 +
+          '如仍然存在同样问题,请联系纵横服务人员。';
         Application.MessageBox(PChar(sHint), '文件错误', MB_OK +MB_ICONWARNING);
         MainForm.actnCloseProject.Execute;
         Exit;
@@ -1036,75 +1045,74 @@ procedure TProjectManagerFrame.ShowProjectInfoTopAndCheckers;
 var
   vPSArr: TStrArr;
   vCArr: TOVArr;    // Checkers
-  vChecker: TOrderCheckerFrame;
   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;  // 业主信息
-  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
-      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
-        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;
+      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
+  FCheckerFrames.Clear;
   GetLocalValues(CurRec);
   if FWebID = 0 then Exit;
   SetLength(vPSArr, 8);
   sURL := Format('%smeasure/status/%d/get', [PHPWeb.MeasureURL, FWebID]);
+  SetLength(FCheckers, 0);
   if PHPWeb.Search(sURL, [''], [''], 3, vPSArr, vCArr) = 1 then
   begin
+    FCheckers := vCArr;
+
+
     LockWindowUpdate(pnlWeb.Handle);
     try
       FPhaseNo := StrToInt(vPSArr[0]);
@@ -1140,34 +1148,33 @@ begin
 end;
 
 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
   GetLocalValues(CurRec);
   case AType of
@@ -1296,7 +1303,7 @@ end;
 
 destructor TProjectManagerFrame.Destroy;
 begin
-  FCheckerList.Free;
+  FCheckerFrames.Free;
   inherited;
 end;
 
@@ -1893,7 +1900,7 @@ procedure TProjectManagerFrame.actnSignOnlineUpdate(Sender: TObject);
   end;
 
 begin
-  TAction(Sender).Visible := _IsCloud;
+  TAction(Sender).Visible := G_IsCloud and (not IsGuest);
   TAction(Sender).Enabled := (FSignOnlineSwitch = 1) and
        Assigned(stdProjects.IDTree.Selected) and
       (stdProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = 1) and
@@ -1914,4 +1921,55 @@ begin
   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.

+ 3 - 2
Frames/ZJJLFme.pas

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

+ 8 - 0
Units/ProjectData.pas

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

+ 2 - 2
Units/UtilMethods.pas

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