Prechádzať zdrojové kódy

Merge branch '3.1.5'

Conflicts:
	DataModules/BillsCompileDm.pas
	DataModules/BillsMeasureDm.pas
	Dprs/CSL/Measure_Cloud.dof
	Dprs/CSL/Measure_Cloud.dpr
	Dprs/CSL/Measure_Cloud.res
	Dprs/Pro/Measure.dof
	Dprs/Pro/Measure.res
	Dprs/Pro/Measure_Cloud.dof
	Dprs/Pro/Measure_Cloud.dpr
	Dprs/Pro/Measure_Cloud.res
	Dprs/Pro/Measure_GuangDong.dof
	Dprs/Pro/Measure_GuangDong.res
	Dprs/Pro/Measure_GuangDong_Cloud.dof
	Dprs/Pro/Measure_GuangDong_Cloud.res
	Dprs/Pro/Measure_GuangDong_TZ.dof
	Dprs/Pro/Measure_GuangDong_TZ.res
	Dprs/Pro/Measure_TZ.dof
	Dprs/Pro/Measure_TZ.res
	Dprs/Trail/Measure.dof
	Dprs/Trail/Measure_GuangDong.dof
	Frames/BillsCompileFme.pas
	Frames/OrderCheckerFme.pas
	Frames/ProjectFme.pas
	Frames/ProjectManagerFme.pas
MaiXinRong 9 rokov pred
rodič
commit
62bf403312
82 zmenil súbory, kde vykonal 1721 pridanie a 526 odobranie
  1. 5 1
      DataModules/BGLDm.pas
  2. 2 2
      DataModules/BillsBookmarkDm.pas
  3. 3 0
      DataModules/BillsCompileDm.dfm
  4. 36 19
      DataModules/BillsCompileDm.pas
  5. 4 1
      DataModules/BillsDm.dfm
  6. 3 1
      DataModules/BillsDm.pas
  7. 78 69
      DataModules/BillsGatherDm.dfm
  8. 3 0
      DataModules/BillsGatherDm.pas
  9. 79 50
      DataModules/BillsMeasureDm.pas
  10. 17 0
      DataModules/DealBillsDm.pas
  11. 6 3
      DataModules/DealPaymentDm.pas
  12. 16 2
      DataModules/PHPWebDm.pas
  13. 0 1
      DataModules/ProjectGLDm.dfm
  14. 31 41
      DataModules/ProjectGLDm.pas
  15. 7 2
      DataModules/ProjectManagerDm.pas
  16. 73 2
      DataModules/ReportMemoryDm/rmHaBaiCustomizedDm.dfm
  17. 152 18
      DataModules/ReportMemoryDm/rmHaBaiCustomizedDm.pas
  18. 19 11
      DataModules/SearchDm.pas
  19. 11 11
      DataModules/StageDm.pas
  20. 8 0
      Dprs/CSL/Measure_Cloud.dof
  21. 7 0
      Dprs/CSL/Measure_Cloud.dpr
  22. 12 0
      Dprs/Pro/Measure.dof
  23. 3 2
      Dprs/Pro/Measure.dpr
  24. 1 1
      Dprs/Pro/Measure_Cloud.cfg
  25. 25 1
      Dprs/Pro/Measure_Cloud.dof
  26. 16 2
      Dprs/Pro/Measure_Cloud.dpr
  27. 24 0
      Dprs/Pro/Measure_GuangDong.dof
  28. 3 2
      Dprs/Pro/Measure_GuangDong.dpr
  29. 1 1
      Dprs/Pro/Measure_GuangDong_Cloud.cfg
  30. 25 1
      Dprs/Pro/Measure_GuangDong_Cloud.dof
  31. 3 2
      Dprs/Pro/Measure_GuangDong_Cloud.dpr
  32. 1 0
      Dprs/Pro/Measure_GuangDong_TZ.cfg
  33. 17 1
      Dprs/Pro/Measure_GuangDong_TZ.dof
  34. 6 3
      Dprs/Pro/Measure_GuangDong_TZ.dpr
  35. 24 0
      Dprs/Pro/Measure_TZ.dof
  36. 6 3
      Dprs/Pro/Measure_TZ.dpr
  37. 10 6
      Dprs/Trail/Measure.dof
  38. 27 3
      Dprs/Trail/Measure.dpr
  39. BIN
      Dprs/Trail/Measure.res
  40. 13 3
      Dprs/Trail/Measure_GuangDong.dof
  41. 27 3
      Dprs/Trail/Measure_GuangDong.dpr
  42. BIN
      Dprs/Trail/Measure_GuangDong.res
  43. 1 1
      Forms/FindUserFrm.pas
  44. 2 0
      Forms/IPFrm.pas
  45. 1 1
      Forms/LoginFrm.dfm
  46. 3 0
      Forms/LoginFrm.pas
  47. 19 18
      Forms/MainFrm.dfm
  48. 13 9
      Forms/MainFrm.pas
  49. 4 5
      Forms/ReportsFrm.dfm
  50. 18 12
      Forms/ReportsFrm.pas
  51. 25 20
      Forms/mProgressProFrm.dfm
  52. 64 14
      Forms/mProgressProFrm.pas
  53. 1 3
      Frames/BGLFme.dfm
  54. 11 0
      Frames/BGLFme.pas
  55. 23 0
      Frames/BillsCompileFme.dfm
  56. 46 19
      Frames/BillsCompileFme.pas
  57. 1 1
      Frames/BillsGatherFme.dfm
  58. 6 6
      Frames/BillsMeasureFme.pas
  59. 6 8
      Frames/CheckerFme.pas
  60. 1 8
      Frames/OrderCheckerFme.dfm
  61. 11 9
      Frames/OrderCheckerFme.pas
  62. 3 2
      Frames/ProjectFme.dfm
  63. 123 23
      Frames/ProjectFme.pas
  64. 2 0
      Frames/ProjectManagerFme.dfm
  65. 106 18
      Frames/ProjectManagerFme.pas
  66. 4 5
      TenderPartition/tpSelectTendersFrm.dfm
  67. 7 7
      TenderPartition/tpTrialPegInputFrm.dfm
  68. 25 0
      Units/BillsClipboard.pas
  69. 198 23
      Units/BillsTree.pas
  70. 1 1
      Units/ConstUnit.pas
  71. 3 1
      Units/DataBaseTables.pas
  72. 23 12
      Units/DetailExcelImport.pas
  73. 5 0
      Units/ExcelImport.pas
  74. 4 4
      Units/GclBillsGatherModel.pas
  75. 1 1
      Units/MCacheTree.pas
  76. 83 4
      Units/ProjectData.pas
  77. 11 0
      Units/ProjectProperty.pas
  78. 19 8
      Units/ReportManager.pas
  79. 29 15
      Units/UtilMethods.pas
  80. 3 0
      Units/mDataRecord.pas
  81. 10 0
      res/UAC.manifest
  82. 1 0
      res/uac.rc

+ 5 - 1
DataModules/BGLDm.pas

@@ -467,7 +467,11 @@ begin
       sNewCode := Format('%s[%d]', [cdsBGLViewCode.AsString, iIncrement]);
       Inc(iIncrement);
     end;
-    cdsBGLViewCode.AsString := sNewCode;
+    if cdsBGLViewCode.AsString <> sNewCode then
+    begin
+      cdsBGLViewCode.AsString := sNewCode;
+      cdsBGLViewCode.Tag := 0;
+    end;
   end;
 end;
 

+ 2 - 2
DataModules/BillsBookmarkDm.pas

@@ -92,14 +92,14 @@ end;
 procedure TBillsBookmarkData.sdvStageBookmarkFilterRecord(
   ARecord: TsdDataRecord; var Allow: Boolean);
 var
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
   StageRec: TsdDataRecord;
 begin
   if (TProjectData(FProjectData).ProjProperties.PhaseCount > 0) and
      (TProjectData(FProjectData).PhaseData.Active) then
   begin
     with TProjectData(FProjectData).BillsMeasureData do
-      vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
+      vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
     if Assigned(vNode) then
     begin
       StageRec := vNode.StageRec;

+ 3 - 0
DataModules/BillsCompileDm.dfm

@@ -91,6 +91,9 @@ object BillsCompileData: TBillsCompileData
       end
       item
         FieldName = 'DgnPrice'
+      end
+      item
+        FieldName = 'ChapterParentID'
       end>
     AfterAddRecord = sdvBillsCompileAfterAddRecord
     BeforeValueChange = sdvBillsCompileBeforeValueChange

+ 36 - 19
DataModules/BillsCompileDm.pas

@@ -25,7 +25,7 @@ type
   private
     FProjectData: TObject;
     FBillsData: TBillsData;
-    FBillsCompileTree: TBillsIDTree;
+    FBillsCompileTree: TCompileBillsIDTree;
 
     FOnRecChange: TRecChangeEvent;
 
@@ -92,7 +92,7 @@ type
 
     property ProjectData: TObject read FProjectData;
     property BillsData: TBillsData read FBillsData;
-    property BillsCompileTree: TBillsIDTree read FBillsCompileTree;
+    property BillsCompileTree: TCompileBillsIDTree read FBillsCompileTree;
     property Active: Boolean read GetActive;
 
     property OnRecChange: TRecChangeEvent read FOnRecChange write SetOnRecChange;
@@ -101,7 +101,7 @@ type
 implementation
 
 uses
-  ProjectData, Math, ZhAPI, UtilMethods, ConstUnit, mDataRecord;
+  ProjectData, Math, ZhAPI, UtilMethods, ConstUnit, mDataRecord, Variants;
 
 {$R *.dfm}
 
@@ -112,7 +112,7 @@ begin
   inherited Create(nil);
   FProjectData := AProjectData;
   FBillsData := TProjectData(FProjectData).BillsData;
-  FBillsCompileTree := TBillsIDTree.Create;
+  FBillsCompileTree := TCompileBillsIDTree.Create;
   FBillsCompileTree.KeyFieldName := 'ID';
   FBillsCompileTree.ParentFieldName := 'ParentID';
   FBillsCompileTree.NextSiblingFieldName := 'NextSiblingID';
@@ -120,8 +120,7 @@ begin
   FBillsCompileTree.AutoExpand := True;
   FBillsCompileTree.DataView := sdvBillsCompile;
   FBillsCompileTree.SeedID := Max(FBillsCompileTree.SeedID, 100);
-  FBillsCompileTree.DoOnAfterDeleteNode := DoOnAfterDeleteNode;
-  FBillsCompileTree.OnReCalcParent := Calculate;
+  FBillsCompileTree.OnReCalcNode := Calculate;
 end;
 
 destructor TBillsCompileData.Destroy;
@@ -597,7 +596,7 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
     ARecord.ValueByName('CalcType').AsInteger := 0;
   end;
 
-  procedure DoCurChanged;
+  procedure DoCurChanged(ANode: TBillsIDTreeNode);
   begin
     if SameText(AColumn.FieldName, 'OrgQuantity') or
         SameText(AColumn.FieldName, 'MisQuantity') or
@@ -610,7 +609,11 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
     else if Pos('DgnQuantity', AColumn.FieldName) = 1 then
       SetDgnQuantity
     else if SameText(AColumn.FieldName, 'Price') then
-      SetPrice;
+      SetPrice
+    else if SameText(AColumn.FieldName, 'Code') then
+      BillsCompileTree.RecodeChildrenCode(ANode, AValue.AsString, Text)
+    else if SameText(AColumn.FieldName, 'B_Code') then
+      BillsCompileTree.RecodeChildrenB_Code(ANode, AValue.AsString, Text);
   end;
 
   procedure CheckLockedData;
@@ -631,19 +634,17 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
          SetTextErrorHint('清单信息已被锁定,不允许修改编号、名称、单位、清单单价、0号台账数量与金额、图号!');
   end;
 
-  procedure CheckNodeWritable;
+  procedure CheckNodeWritable(ANode: TBillsIDTreeNode);
   var
-    vNode: TBillsIDTreeNode;
     iCreatePhase: Integer;
   begin
     if not Allow then Exit;
-    vNode := TBillsIDTreeNode(BillsCompileTree.FindNode(ARecord.ValueByName('ID').AsInteger));
-    iCreatePhase := vNode.Rec.ValueByName('CreatePhaseID').AsInteger;
+    iCreatePhase := ANode.Rec.ValueByName('CreatePhaseID').AsInteger;
 
-    if vNode.ID = iPriceMarginID then
+    if ANode.ID = iPriceMarginID then
       SetTextErrorHint(sBills_PMHint);
 
-    if vNode.HasChildren then
+    if ANode.HasChildren then
     begin
       if Text = '' then
         Exit
@@ -660,7 +661,7 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
           SameText('MisTotalPrice', AColumn.FieldName) or
           SameText('OthTotalPrice', AColumn.FieldName) then
       begin
-        if not vNode.TotalPriceEnable then
+        if not ANode.TotalPriceEnable then
           SetTextErrorHint('该清单不可直接输入金额,如需直接输入金额,请先清空所有数量、单价!');
       end;
       if not Allow then Exit;
@@ -670,7 +671,7 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
           SameText('MisQuantity', AColumn.FieldName) or
           SameText('OthQuantity', AColumn.FieldName) then
       begin
-        if not vNode.CountPriceEnable then
+        if not ANode.CountPriceEnable then
           SetTextErrorHint('该清单不可输入数量单价,如需使用数量×单价计算,请先清空所有直接输入的金额!');
       end;
       if not Allow then Exit;
@@ -711,7 +712,7 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
        SameText('Name', AColumn.FieldName) or
        SameText('Units', AColumn.FieldName) or
        SameText('Price', AColumn.FieldName) then
-      if TBillsIDTreeNode(vNode).HasMeasure then
+      if TBillsIDTreeNode(ANode).HasMeasure then
         SetTextErrorHint('该清单已经计量,不可修改清单编号');
   end;
 
@@ -731,6 +732,8 @@ procedure TBillsCompileData.sdvBillsCompileSetText(var Text: String;
     end;
   end;
 
+var
+  vNode: TBillsIDTreeNode;
 begin
   if not Assigned(AValue) then Exit;
   // 修改后数据与原数据相同则不提交
@@ -738,17 +741,19 @@ begin
     Allow := False;
   if not Allow then Exit;
 
+  vNode := TBillsIDTreeNode(BillsCompileTree.FindNode(ARecord.ValueByName('ID').AsInteger));
+
   CheckLockedData;
   if not Allow then Exit;
 
-  CheckNodeWritable;
+  CheckNodeWritable(vNode);
   if not Allow then Exit;
 
   Text := Trim(Text);
   if Pos('=', Text) = 1 then
     Text := Copy(Text, 2, Length(Text) - 1);
 
-  DoCurChanged;
+  DoCurChanged(vNode);
 end;
 
 function TBillsCompileData.GetActive: Boolean;
@@ -884,7 +889,11 @@ begin
         MisTotalPrice.AsFloat := TotalPriceRoundTo(MisQuantity.AsFloat * Price.AsFloat);
 
       SetFloatValue(Quantity, QuantityRoundTo(
+<<<<<<< HEAD
           OrgQuantity.AsFloat + MisQuantity.AsFloat + OthQuantity.AsFloat));
+=======
+          OrgQuantity.AsFloat + MisQuantity.AsFloat + OthQuantity.AsFloat));        
+>>>>>>> 3.1.5
 
       // 金额与修改前不一样,则向父项增量
       if MisTotalPrice.AsFloat <> CacheMisTP then
@@ -922,7 +931,11 @@ begin
         OrgTotalPrice.AsFloat := TotalPriceRoundTo(OrgQuantity.AsFloat * Price.AsFloat);
 
       SetFloatValue(Quantity, QuantityRoundTo(
+<<<<<<< HEAD
           OrgQuantity.AsFloat + MisQuantity.AsFloat + OthQuantity.AsFloat));
+=======
+          OrgQuantity.AsFloat + MisQuantity.AsFloat + OthQuantity.AsFloat));        
+>>>>>>> 3.1.5
 
       // 金额与修改前不一样,则向父项增量
       if CacheOrgTP <> OrgTotalPrice.AsFloat then
@@ -960,7 +973,11 @@ begin
         OthTotalPrice.AsFloat := TotalPriceRoundTo(OthQuantity.AsFloat * Price.AsFloat);
 
       SetFloatValue(Quantity, QuantityRoundTo(
+<<<<<<< HEAD
           OrgQuantity.AsFloat + MisQuantity.AsFloat + OthQuantity.AsFloat));
+=======
+          OrgQuantity.AsFloat + MisQuantity.AsFloat + OthQuantity.AsFloat));        
+>>>>>>> 3.1.5
 
       // 金额与修改前不一样,则向父项增量
       if OthTotalPrice.AsFloat <> CacheOthTP then

+ 4 - 1
DataModules/BillsDm.dfm

@@ -212,6 +212,9 @@ object BillsData: TBillsData
       080F4E65656450726F636573734E616D65090001044E616D650610504D5F4164
       64546F74616C5072696365094669656C644E616D650610504D5F416464546F74
       616C50726963650844617461547970650206084461746153697A650208054973
-      4B6579080F4E65656450726F636573734E616D65090000}
+      4B6579080F4E65656450726F636573734E616D65090001044E616D65060F4368
+      6170746572506172656E744944094669656C644E616D65060F43686170746572
+      506172656E7449440844617461547970650203084461746153697A6502040549
+      734B6579080F4E65656450726F636573734E616D65090000}
   end
 end

+ 3 - 1
DataModules/BillsDm.pas

@@ -178,7 +178,7 @@ procedure TBillsData.Save;
   var
     iIndex: Integer;
     stnNode: TBillsIDTreeNode;
-    iLeafXmjParentID: Integer;
+    iLeafXmjParentID, iChapterParentID: Integer;
     sIndexCode: string;
   begin
     sddBills.BeginUpdate;
@@ -202,6 +202,8 @@ procedure TBillsData.Save;
             iLeafXmjParentID := -1;
           stnNode.Rec.SetIntValue(stnNode.Rec.LeafXmjParentID, iLeafXmjParentID);
 
+          stnNode.Rec.SetIntValue(stnNode.Rec.ChapterParentID, stnNode.ChapterParentID);
+
           // 分解项目节编号为项、目、节、细目
           if stnNode.Rec.Code.AsString <> '' then
             ResolveCode(stnNode.Rec);

+ 78 - 69
DataModules/BillsGatherDm.dfm

@@ -251,6 +251,7 @@ object BillsGatherData: TBillsGatherData
       end
       item
         FieldName = 'Deal_BGLPercent'
+        DisplayFormat = '0.##'
       end>
     OnCurrentChanged = sdvGclBillsCurrentChanged
     Left = 40
@@ -305,81 +306,86 @@ object BillsGatherData: TBillsGatherData
       79080F4E65656450726F636573734E616D65090001044E616D65060B44726177
       696E67436F6465094669656C644E616D65060B44726177696E67436F64650844
       617461547970650218084461746153697A6502320549734B6579080F4E656564
-      50726F636573734E616D65090001044E616D65060F4375724465616C5175616E
-      74697479094669656C644E616D65060F4375724465616C5175616E7469747908
+      50726F636573734E616D65090001044E616D6506085175616E74697479094669
+      656C644E616D6506085175616E74697479084461746154797065020608446174
+      6153697A6502080549734B6579080F4E65656450726F636573734E616D650900
+      01044E616D65060A546F74616C5072696365094669656C644E616D65060A546F
+      74616C50726963650844617461547970650206084461746153697A6502080549
+      734B6579080F4E65656450726F636573734E616D65090001044E616D65060F43
+      75724465616C5175616E74697479094669656C644E616D65060F437572446561
+      6C5175616E746974790844617461547970650206084461746153697A65020805
+      49734B6579080F4E65656450726F636573734E616D65090001044E616D650611
+      4375724465616C546F74616C5072696365094669656C644E616D650611437572
+      4465616C546F74616C5072696365084461746154797065020608446174615369
+      7A6502080549734B6579080F4E65656450726F636573734E616D65090001044E
+      616D65060D43757251635175616E74697479094669656C644E616D65060D4375
+      7251635175616E746974790844617461547970650206084461746153697A6502
+      080549734B6579080F4E65656450726F636573734E616D65090001044E616D65
+      060F4375725163546F74616C5072696365094669656C644E616D65060F437572
+      5163546F74616C50726963650844617461547970650206084461746153697A65
+      02080549734B6579080F4E65656450726F636573734E616D65090001044E616D
+      6506114375724761746865725175616E74697479094669656C644E616D650611
+      4375724761746865725175616E74697479084461746154797065020608446174
+      6153697A6502080549734B6579080F4E65656450726F636573734E616D650900
+      01044E616D650613437572476174686572546F74616C5072696365094669656C
+      644E616D650613437572476174686572546F74616C5072696365084461746154
+      7970650206084461746153697A6502080549734B6579080F4E65656450726F63
+      6573734E616D65090001044E616D65060F5072654465616C5175616E74697479
+      094669656C644E616D65060F5072654465616C5175616E746974790844617461
+      547970650206084461746153697A6502080549734B6579080F4E65656450726F
+      636573734E616D65090001044E616D6506115072654465616C546F74616C5072
+      696365094669656C644E616D6506115072654465616C546F74616C5072696365
+      0844617461547970650206084461746153697A6502080549734B6579080F4E65
+      656450726F636573734E616D65090001044E616D65060D50726551635175616E
+      74697479094669656C644E616D65060D50726551635175616E74697479084461
+      7461547970650206084461746153697A6502080549734B6579080F4E65656450
+      726F636573734E616D65090001044E616D65060F5072655163546F74616C5072
+      696365094669656C644E616D65060F5072655163546F74616C50726963650844
+      617461547970650206084461746153697A6502080549734B6579080F4E656564
+      50726F636573734E616D65090001044E616D6506115072654761746865725175
+      616E74697479094669656C644E616D6506115072654761746865725175616E74
+      6974790844617461547970650206084461746153697A6502080549734B657908
+      0F4E65656450726F636573734E616D65090001044E616D650613507265476174
+      686572546F74616C5072696365094669656C644E616D65061350726547617468
+      6572546F74616C50726963650844617461547970650206084461746153697A65
+      02080549734B6579080F4E65656450726F636573734E616D65090001044E616D
+      65060F4164644465616C5175616E74697479094669656C644E616D65060F4164
+      644465616C5175616E746974790844617461547970650206084461746153697A
+      6502080549734B6579080F4E65656450726F636573734E616D65090001044E61
+      6D6506114164644465616C546F74616C5072696365094669656C644E616D6506
+      114164644465616C546F74616C50726963650844617461547970650206084461
+      746153697A6502080549734B6579080F4E65656450726F636573734E616D6509
+      0001044E616D65060D41646451635175616E74697479094669656C644E616D65
+      060D41646451635175616E746974790844617461547970650206084461746153
+      697A6502080549734B6579080F4E65656450726F636573734E616D6509000104
+      4E616D65060F4164645163546F74616C5072696365094669656C644E616D6506
+      0F4164645163546F74616C507269636508446174615479706502060844617461
+      53697A6502080549734B6579080F4E65656450726F636573734E616D65090001
+      044E616D6506114164644761746865725175616E74697479094669656C644E61
+      6D6506114164644761746865725175616E746974790844617461547970650206
+      084461746153697A6502080549734B6579080F4E65656450726F636573734E61
+      6D65090001044E616D650613416464476174686572546F74616C507269636509
+      4669656C644E616D650613416464476174686572546F74616C50726963650844
+      617461547970650206084461746153697A6502080549734B6579080F4E656564
+      50726F636573734E616D65090001044E616D65060F456E644465616C5175616E
+      74697479094669656C644E616D65060F456E644465616C5175616E7469747908
       44617461547970650206084461746153697A6502080549734B6579080F4E6565
-      6450726F636573734E616D65090001044E616D6506114375724465616C546F74
-      616C5072696365094669656C644E616D6506114375724465616C546F74616C50
+      6450726F636573734E616D65090001044E616D650611456E644465616C546F74
+      616C5072696365094669656C644E616D650611456E644465616C546F74616C50
       726963650844617461547970650206084461746153697A6502080549734B6579
-      080F4E65656450726F636573734E616D65090001044E616D65060D4375725163
-      5175616E74697479094669656C644E616D65060D43757251635175616E746974
+      080F4E65656450726F636573734E616D65090001044E616D65060D456E645163
+      5175616E74697479094669656C644E616D65060D456E6451635175616E746974
       790844617461547970650206084461746153697A6502080549734B6579080F4E
-      65656450726F636573734E616D65090001044E616D65060F4375725163546F74
-      616C5072696365094669656C644E616D65060F4375725163546F74616C507269
+      65656450726F636573734E616D65090001044E616D65060F456E645163546F74
+      616C5072696365094669656C644E616D65060F456E645163546F74616C507269
       63650844617461547970650206084461746153697A6502080549734B6579080F
-      4E65656450726F636573734E616D65090001044E616D65061143757247617468
-      65725175616E74697479094669656C644E616D65061143757247617468657251
+      4E65656450726F636573734E616D65090001044E616D650611456E6447617468
+      65725175616E74697479094669656C644E616D650611456E6447617468657251
       75616E746974790844617461547970650206084461746153697A650208054973
-      4B6579080F4E65656450726F636573734E616D65090001044E616D6506134375
-      72476174686572546F74616C5072696365094669656C644E616D650613437572
+      4B6579080F4E65656450726F636573734E616D65090001044E616D650613456E
+      64476174686572546F74616C5072696365094669656C644E616D650613456E64
       476174686572546F74616C507269636508446174615479706502060844617461
-      53697A6502080549734B6579080F4E65656450726F636573734E616D65090001
-      044E616D65060F5072654465616C5175616E74697479094669656C644E616D65
-      060F5072654465616C5175616E74697479084461746154797065020608446174
-      6153697A6502080549734B6579080F4E65656450726F636573734E616D650900
-      01044E616D6506115072654465616C546F74616C5072696365094669656C644E
-      616D6506115072654465616C546F74616C507269636508446174615479706502
-      06084461746153697A6502080549734B6579080F4E65656450726F636573734E
-      616D65090001044E616D65060D50726551635175616E74697479094669656C64
-      4E616D65060D50726551635175616E7469747908446174615479706502060844
-      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
-      090001044E616D65060F5072655163546F74616C5072696365094669656C644E
-      616D65060F5072655163546F74616C5072696365084461746154797065020608
-      4461746153697A6502080549734B6579080F4E65656450726F636573734E616D
-      65090001044E616D6506115072654761746865725175616E7469747909466965
-      6C644E616D6506115072654761746865725175616E7469747908446174615479
-      70650206084461746153697A6502080549734B6579080F4E65656450726F6365
-      73734E616D65090001044E616D650613507265476174686572546F74616C5072
-      696365094669656C644E616D650613507265476174686572546F74616C507269
-      63650844617461547970650206084461746153697A6502080549734B6579080F
-      4E65656450726F636573734E616D65090001044E616D65060F4164644465616C
-      5175616E74697479094669656C644E616D65060F4164644465616C5175616E74
-      6974790844617461547970650206084461746153697A6502080549734B657908
-      0F4E65656450726F636573734E616D65090001044E616D650611416464446561
-      6C546F74616C5072696365094669656C644E616D6506114164644465616C546F
-      74616C50726963650844617461547970650206084461746153697A6502080549
-      734B6579080F4E65656450726F636573734E616D65090001044E616D65060D41
-      646451635175616E74697479094669656C644E616D65060D4164645163517561
-      6E746974790844617461547970650206084461746153697A6502080549734B65
-      79080F4E65656450726F636573734E616D65090001044E616D65060F41646451
-      63546F74616C5072696365094669656C644E616D65060F4164645163546F7461
-      6C50726963650844617461547970650206084461746153697A6502080549734B
-      6579080F4E65656450726F636573734E616D65090001044E616D650611416464
-      4761746865725175616E74697479094669656C644E616D650611416464476174
-      6865725175616E746974790844617461547970650206084461746153697A6502
-      080549734B6579080F4E65656450726F636573734E616D65090001044E616D65
-      0613416464476174686572546F74616C5072696365094669656C644E616D6506
-      13416464476174686572546F74616C5072696365084461746154797065020608
-      4461746153697A6502080549734B6579080F4E65656450726F636573734E616D
-      65090001044E616D65060F456E644465616C5175616E74697479094669656C64
-      4E616D65060F456E644465616C5175616E746974790844617461547970650206
-      084461746153697A6502080549734B6579080F4E65656450726F636573734E61
-      6D65090001044E616D650611456E644465616C546F74616C5072696365094669
-      656C644E616D650611456E644465616C546F74616C5072696365084461746154
-      7970650206084461746153697A6502080549734B6579080F4E65656450726F63
-      6573734E616D65090001044E616D65060D456E6451635175616E746974790946
-      69656C644E616D65060D456E6451635175616E74697479084461746154797065
-      0206084461746153697A6502080549734B6579080F4E65656450726F63657373
-      4E616D65090001044E616D65060F456E645163546F74616C5072696365094669
-      656C644E616D65060F456E645163546F74616C50726963650844617461547970
-      650206084461746153697A6502080549734B6579080F4E65656450726F636573
-      734E616D65090001044E616D650611456E644761746865725175616E74697479
-      094669656C644E616D650611456E644761746865725175616E74697479084461
-      7461547970650206084461746153697A6502080549734B6579080F4E65656450
-      726F636573734E616D65090001044E616D650613456E64476174686572546F74
-      616C5072696365094669656C644E616D650613456E64476174686572546F7461
-      6C50726963650844617461547970650206084461746153697A6502080549734B
-      6579080F4E65656450726F636573734E616D65090000}
+      53697A6502080549734B6579080F4E65656450726F636573734E616D65090000}
   end
   object sdvDetailGclBills: TsdDataView
     Active = False
@@ -415,6 +421,9 @@ object BillsGatherData: TBillsGatherData
       end
       item
         FieldName = 'DrawingCode'
+      end
+      item
+        FieldName = 'Quantity'
       end>
     OnFilterRecord = sdvDetailGclBillsFilterRecord
     Left = 40

+ 3 - 0
DataModules/BillsGatherDm.pas

@@ -224,6 +224,9 @@ procedure TBillsGatherData.WriteGatherRecord(AGcls: TList);
         Rec.ValueByName('DrawingCode').AsString := vDetailGcl.LeafXmj.DrawingCode;
       end;
 
+      Rec.ValueByName('Quantity').AsFloat := vDetailGcl.Quantity;
+      Rec.ValueByName('TotalPrice').AsFloat := vDetailGcl.TotalPrice;
+
       Rec.ValueByName('CurDealQuantity').AsFloat := vDetailGcl.CurDealQuantity;
       Rec.ValueByName('CurDealTotalPrice').AsFloat := vDetailGcl.CurDealTotalPrice;
       Rec.ValueByName('CurQcQuantity').AsFloat := vDetailGcl.CurQcQuantity;

+ 79 - 50
DataModules/BillsMeasureDm.pas

@@ -25,7 +25,7 @@ type
   private
     FProjectData: TObject;
     FBillsData: TBillsData;
-    FBillsMeasureTree: TBillsIDTree;
+    FBillsMeasureTree: TMeasureBillsIDTree;
 
     FFormulaCalc: TFormulaCalc;
     FShowParentData: Boolean;
@@ -39,7 +39,7 @@ type
     function SelectAndUpdateBGL(ABillsID: Integer; ARec: TsdDataRecord;
       ANewValue: Double; const AType: string): Boolean;
 
-    procedure CalculateNode(ANode: TBillsIDTreeNode);
+    procedure CalculateNode(ANode: TMeasureBillsIDTreeNode);
     procedure UpdateRecordGather(ANode: TsdIDTreeNode; AQuantity, ATotalPrice: Double);
 
     function GetStageData: TStageData;
@@ -73,7 +73,7 @@ type
 
     property ProjectData: TObject read FProjectData;
     property BillsData: TBillsData read FBillsData;
-    property BillsMeasureTree: TBillsIDTree read FBillsMeasureTree;
+    property BillsMeasureTree: TMeasureBillsIDTree read FBillsMeasureTree;
 
     property StageData: TStageData read GetStageData;
     property ShowParentData: Boolean read FShowParentData write FShowParentData;
@@ -84,7 +84,7 @@ implementation
 
 uses
   ProjectData, PhaseData, Math, ZhAPI, BillsCommand, BGLSelectFrm,
-  BGLDm, UtilMethods, mDataRecord, ConstUnit;
+  BGLDm, UtilMethods, mDataRecord, ConstUnit, Variants;
 
 {$R *.dfm}
 
@@ -95,7 +95,7 @@ begin
   inherited Create(nil);
   FProjectData := AProjectData;
   FBillsData := TProjectData(FProjectData).BillsData;
-  FBillsMeasureTree := TBillsIDTree.Create;
+  FBillsMeasureTree := TMeasureBillsIDTree.Create;
   FBillsMeasureTree.KeyFieldName := 'ID';
   FBillsMeasureTree.ParentFieldName := 'ParentID';
   FBillsMeasureTree.NextSiblingFieldName := 'NextSiblingID';
@@ -104,6 +104,7 @@ begin
   FBillsMeasureTree.DataView := sdvBillsMeasure;
   FBillsMeasureTree.SeedID := Max(FBillsMeasureTree.SeedID, 100);
   FBillsMeasureTree.Link(TProjectData(FProjectData).BillsCompileData.BillsCompileTree, True);
+  FBillsMeasureTree.CompileTree := TProjectData(FProjectData).BillsCompileData.BillsCompileTree;
 
   FFormulaCalc := TFormulaCalc.Create(FBillsMeasureTree);
   FFormulaCalc.OnGetValue := OnGetCardinalNum;
@@ -165,7 +166,8 @@ end;
 procedure TBillsMeasureData.sdvBillsMeasureAfterAddRecord(
   ARecord: TsdDataRecord);
 begin
-  ARecord.ValueByName('IsMeasureAdd').AsBoolean := True;
+  if TProjectData(FProjectData).PhaseData.Active then
+    ARecord.ValueByName('IsMeasureAdd').AsBoolean := True;
 end;
 
 procedure TBillsMeasureData.sdvBillsMeasureGetText(var Text: String;
@@ -273,35 +275,33 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
         DataSetErrorMessage(Allow, '变更单价已被锁定,不允许修改!');
   end;
 
-  procedure CheckNodeWritable;
+  procedure CheckNodeWritable(ANode: TBillsIDTreeNode);
   var
-    vNode: TBillsIDTreeNode;
     iCreatePhase: Integer;
   begin
-    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GetBillsID));
-    iCreatePhase := vNode.Rec.ValueByName('CreatePhaseID').AsInteger;
+    iCreatePhase := ANode.Rec.ValueByName('CreatePhaseID').AsInteger;
 
-    if vNode.ID = iPriceMarginID then
+    if ANode.ID = iPriceMarginID then
       DataSetErrorMessage(Allow, sBills_PMHint);
 
     if SameText('B_Code', AColumn.FieldName) or
         SameText('Name', AColumn.FieldName) or
         SameText('Units', AColumn.FieldName) then
-      if vNode.Rec.ValueByName('AddQcQuantity').AsFloat <> 0 then
+      if ANode.Rec.ValueByName('AddQcQuantity').AsFloat <> 0 then
         DataSetErrorMessage(Allow, '该清单已进行过变更,不可修改清单编号、名称、单位!');
     if not Allow then Exit;
 
     if SameText('Price', AColumn.FieldName) then
-      if vNode.Rec.ValueByName('AddGatherTotalPrice').AsFloat <> 0 then
+      if ANode.Rec.ValueByName('AddGatherTotalPrice').AsFloat <> 0 then
         DataSetErrorMessage(Allow, '该清单已经计量,不可修改清单单价!');
     if not Allow then Exit;
 
     if SameText('NewPrice', AColumn.FieldName) then
-      if vNode.Rec.ValueByName('AddPcTotalPrice').AsFloat <> 0 then
+      if ANode.Rec.ValueByName('AddPcTotalPrice').AsFloat <> 0 then
         DataSetErrorMessage(Allow, '该清单已经计量,不可修改清单变更单价!');
     if not Allow then Exit;
 
-    if vNode.HasChildren then
+    if ANode.HasChildren then
     begin
       if Text = '' then
         Exit
@@ -316,7 +316,7 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
       // 目前仅允许本期合同计量,可直接输入金额
       if SameText('CurDealTotalPrice', AColumn.FieldName) then
       begin
-        if not vNode.TotalPriceEnable then
+        if not ANode.TotalPriceEnable then
           DataSetErrorMessage(Allow, '该清单不可直接输入金额,如需直接输入金额,请先清空所有数量、单价!');
       end
       else if SameText('CurDealQuantity', AColumn.FieldName) or
@@ -324,7 +324,7 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
           SameText('CurPcQuantity', AColumn.FieldName) or
           SameText('Price', AColumn.FieldName) then
       begin
-        if not vNode.CountPriceEnable then
+        if not ANode.CountPriceEnable then
           DataSetErrorMessage(Allow, '该清单不可输入数量单价,如需使用数量×单价计算,请先清空所有直接输入的金额!');
       end;
     end;
@@ -336,7 +336,7 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
       DataSetErrorMessage(Allow, Format('该清单为第%d期新增清单,不可填写本期合同计量数据!', [iCreatePhase]));}
   end;
 
-  procedure SetQuantity(const AField: string);
+  procedure SetQuantity(ANode: TBillsIDTreeNode; const AField: string);
   var
     vNode: TBillsIDTreeNode;
   begin
@@ -357,15 +357,11 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
       AValue.Owner.ValueByName(AField + 'Formula').AsString := Text;
       Text := FloatToStr(QuantityRoundTo(EvaluateExprs(Text)));
     end;
-    
-    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GetBillsID));
-    if vNode.Rec.CalcType.AsInteger <> 0 then
-      vNode.Rec.CalcType.AsInteger := 0;
+
+    ANode.Rec.SetIntValue(ANode.Rec.CalcType, 0);
   end;
 
-  procedure SetTotalPrice(const AField: string);
-  var
-    vNode: TBillsIDTreeNode;
+  procedure SetTotalPrice(ANode: TBillsIDTreeNode; const AField: string);
   begin
     // 变更应选择变更令
     if SameText(AField , 'Qc') or SameText(AField , 'Pc') then
@@ -385,31 +381,33 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
       Text := FloatToStr(TotalPriceRoundTo(EvaluateExprs(Text)));
     end;
 
-    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GetBillsID));
-    if vNode.Rec.CalcType.AsInteger <> 1 then
-      vNode.Rec.CalcType.AsInteger := 1;
+    ANode.Rec.SetIntValue(ANode.Rec.CalcType, 1);
   end;
 
-  procedure DoCurChanged;
+  procedure DoCurChanged(ANode: TBillsIDTreeNode);
   begin
     if SameText(AColumn.FieldName, 'CurDealQuantity') then
-      SetQuantity('Deal')
+      SetQuantity(ANode, 'Deal')
     else if SameText(AColumn.FieldName, 'CurQcQuantity') then
-      SetQuantity('Qc')
+      SetQuantity(ANode, 'Qc')
     else if SameText(AColumn.FieldName, 'CurPcQuantity') then
-      SetQuantity('Pc')
+      SetQuantity(ANode, 'Pc')
     else if SameText(AColumn.FieldName, 'CurDealTotalPrice') then
-      SetTotalPrice('Deal')
+      SetTotalPrice(ANode, 'Deal')
     else if SameText(AColumn.FieldName, 'CurQcTotalPrice') then
-      SetTotalPrice('Qc')
+      SetTotalPrice(ANode, 'Qc')
     else if SameText(AColumn.FieldName, 'CurPcTotalPrice') then
-      SetTotalPrice('Pc')
+      SetTotalPrice(ANode, 'Pc')
     else if (Pos('DgnQuantity', AColumn.FieldName) > 0) or
         SameText(AColumn.FieldName, 'Quantity') then
       Text := FloatToStr(QuantityRoundTo(StrToFloatDef(Text, 0)))
     else if SameText(AColumn.FieldName, 'NewPrice') or
         SameText(AColumn.FieldName, 'Price') then
-      Text := FloatToStr(PriceRoundTo(StrToFloatDef(Text, 0)));
+      Text := FloatToStr(PriceRoundTo(StrToFloatDef(Text, 0)))
+    else if SameText(AColumn.FieldName, 'Code') then
+      BillsMeasureTree.RecodeChildrenCode(ANode, AValue.AsString, Text)
+    else if SameText(AColumn.FieldName, 'B_Code') then
+      BillsMeasureTree.RecodeChildrenB_Code(ANode, AValue.AsString, Text);
   end;
 
   function CheckValidData: Boolean;
@@ -423,29 +421,34 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
     end;
   end;
 
+var
+  vNode: TBillsIDTreeNode;
 begin
   if not Assigned(AValue) then Exit;
   // 修改后数据与原数据相同则不提交
   if not CheckValidData then
     Allow := False;
   if not Allow then Exit;
+  
+  vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GetBillsID));
 
   CheckLockedData;
   if not Allow then Exit;
 
-  CheckNodeWritable;
+  CheckNodeWritable(vNode);
   if not Allow then Exit;
 
   Text := Trim(Text);
   if Pos('=', Text) = 1 then
     Text := Copy(Text, 2, Length(Text) - 1);
-  DoCurChanged;
+
+  DoCurChanged(vNode);
 end;
 
 procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
   ARecord: TsdDataRecord; AColumn: TsdViewColumn; ANewText: String);
 
-  function CheckNeedAddPhaseRecord(ANode: TBillsIDTreeNode): Boolean;
+  function CheckNeedAddPhaseRecord(ANode: TMeasureBillsIDTreeNode): Boolean;
   begin
     Result := SameText(AColumn.FieldName, 'CurDealQuantity') or
               SameText(AColumn.FieldName, 'CurQcQuantity') or
@@ -485,7 +488,11 @@ procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
     begin 
       if ANode.Rec.CalcType.AsInteger <> 0 then
         ANode.Rec.CalcType.AsInteger := 0;
+<<<<<<< HEAD
         
+=======
+
+>>>>>>> 3.1.5
       if CheckNumeric(ANewText) then
         APhaseRec.ValueByName(AType + 'Quantity').AsFloat := QuantityRoundTo(StrToFloatDef(ANewText, 0))
       else
@@ -498,7 +505,11 @@ procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
   end;
 
   procedure SetTotalPriceRec(ANode: TBillsIDTreeNode; APhaseRec: TsdDataRecord; const AType: string);
+<<<<<<< HEAD
   begin 
+=======
+  begin  
+>>>>>>> 3.1.5
     if ANode.Rec.CalcType.AsInteger <> 1 then
       ANode.Rec.CalcType.AsInteger := 1;
     APhaseRec.ValueByName(AType + 'Flag').AsInteger := 2;
@@ -574,15 +585,19 @@ procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
 
 var
   NewRec: TStageRecord;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
-  vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
+  vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
   if not CheckNodeWritable(vNode) then
     Exit;
 
   if CheckNeedAddPhaseRecord(vNode) then
   begin
+<<<<<<< HEAD
     if (Pos('Quantity', AColumn.FieldName) > 0) or (Pos('TotalPrice', AColumn.FieldName) > 0) then
+=======
+    if(Pos('Quantity', AColumn.FieldName) > 0) or (Pos('TotalPrice', AColumn.FieldName) > 0) then
+>>>>>>> 3.1.5
       if HasCardinalNum(ANewText) then
         raise Exception.Create('公式不可输入参数');
     NewRec := StageData.AddStageRecord(ARecord.ValueByName('ID').AsInteger);
@@ -697,7 +712,7 @@ begin
   if not TProjectData(FProjectData).StageDataReadOnly then
 
   for i := 0 to BillsMeasureTree.Count - 1 do
-    CalculateNode(TBillsIDTreeNode(BillsMeasureTree.Items[i]));
+    CalculateNode(TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]));
 
   {Cacl := TBillsCalculate.Create(Self);
   try
@@ -803,8 +818,9 @@ end;
 procedure TBillsMeasureData.sdvBillsMeasureAfterValueChanged(
   AValue: TsdValue);
 var
-  stnNode: TsdIDTreeNode;
+  vNode: TBillsIDTreeNode;
 begin
+
   if TProjectData(FProjectData).PhaseData.Active then
   begin
     if AValue.FieldName = 'Price' then
@@ -814,8 +830,19 @@ begin
   end;
   if Pos('DgnQuantity1', AValue.FieldName) > 0 then
   begin
-    stnNode := BillsMeasureTree.FindNode(AValue.Owner.ValueByName('ID').AsInteger);
-    CalcAddDgnPrice(stnNode);
+    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(AValue.Owner.ValueByName('ID').AsInteger));
+    CalcAddDgnPrice(vNode);
+  end;
+
+  if (AValue.FieldName = 'Code') then
+  begin                                                                                           
+    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(AValue.Owner.ValueByName('ID').AsInteger));
+    BillsMeasureTree.RecodeChildrenCode(vNode, VarToStrDef(AValue.OldValue, ''), AValue.AsString);
+  end
+  else if (AValue.FieldName = 'B_Code') then
+  begin
+    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(AValue.Owner.ValueByName('ID').AsInteger));
+    BillsMeasureTree.RecodeChildrenB_Code(vNode, VarToStrDef(AValue.OldValue, ''), AValue.AsString);
   end;
 end;
 
@@ -828,7 +855,7 @@ begin
   for iIndex := 0 to BillsMeasureTree.Count - 1 do
   begin
     stnNode := BillsMeasureTree.Items[iIndex];
-    StageRec := TBillsIDTreeNode(stnNode).StageRec;
+    StageRec := TMeasureBillsIDTreeNode(stnNode).StageRec;
     if (stnNode.ParentID <> -1) then
       if Assigned(StageRec) then
         stnNode.Expanded := StageRec.GatherTotalPrice.AsFloat <> 0
@@ -905,7 +932,9 @@ begin
     fDivisor := ValueByName('TotalPrice').AsFloat + ValueByName('AddQcTotalPrice').AsFloat
         + ValueByName('AddPcTotalPrice').AsFloat;
     if fDivisor <> 0 then
-      ValueByName('AddCompleteRate').AsFloat := AdvRoundTo(fDividend/fDivisor*100);
+      ValueByName('AddCompleteRate').AsFloat := AdvRoundTo(fDividend/fDivisor*100)
+    else
+      ValueByName('AddCompleteRate').Clear;
   end;
 end;
 
@@ -937,12 +966,12 @@ end;
 procedure TBillsMeasureData.ResetTreeNodeStageRec;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   if not StageData.Active then Exit;
   for i := 0 to BillsMeasureTree.Count - 1 do
   begin
-    vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+    vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
     vNode.StageRec := StageData.StageRecord(vNode.ID);
   end;
 end;
@@ -959,7 +988,7 @@ begin
   UpdateRecordPM(stnNode.ParentID, ADiffer);
 end;
 
-procedure TBillsMeasureData.CalculateNode(ANode: TBillsIDTreeNode);
+procedure TBillsMeasureData.CalculateNode(ANode: TMeasureBillsIDTreeNode);
 begin
   if Assigned(ANode.StageRec) then
   begin

+ 17 - 0
DataModules/DealBillsDm.pas

@@ -101,7 +101,24 @@ begin
 end;
 
 procedure TDealBillsData.Save;
+
+  procedure CheckIndexCode;
+  var
+    i: Integer;
+    Rec: TsdDataRecord;
+    sIndexCode: string;
+  begin
+    for i := 0 to sddDealBills.RecordCount - 1 do
+    begin
+      Rec := sddDealBills.Records[i];
+      sIndexCode := B_CodeToIndexCode(Rec.ValueByName('B_Code').AsString);
+      if sIndexCode <> Rec.ValueByName('IndexCode').AsString then
+        Rec.ValueByName('IndexCode').AsString := sIndexCode;
+    end;
+  end;
+
 begin
+  CheckIndexCode;
   sddDealBills.Save;
 end;
 

+ 6 - 3
DataModules/DealPaymentDm.pas

@@ -332,7 +332,7 @@ procedure TDealPaymentData.sdvDealPaymentNeedLookupRecord(
       AID := ARecord.ValueByName('ID').AsInteger;
       APayRec.ValueByName(sFField).AsString := ANewText;
       ARecord.ValueByName('Formula').AsString := ANewText;
-      fTotalPrice := FPayFormula.Calculate(ANewText);
+      fTotalPrice := FPayFormula.Calculate(ANewText, ARecord.ValueByName('StartedPrice').AsFloat);
       if CheckStartedPrice(AID) then
         APayRec.ValueByName(sTPField).AsFloat := GetAllowTotalPrice(AID, fTotalPrice);
     end;
@@ -454,7 +454,10 @@ procedure TDealPaymentData.sdvDealPaymentSetText(var Text: string;
       Rec.ValueByName('Formula').AsString := Text;
       AValue.Owner.ValueByName(sFField).AsString := Text;
       AID := ARecord.ValueByName('ID').AsInteger;
-      fTotalPrice := FPayFormula.Calculate(Text) - AValue.AsFloat;
+      if ARecord.ValueByName('Pre' + AValue.FieldName).AsFloat = 0 then
+        fTotalPrice := FPayFormula.Calculate(Text, Rec.ValueByName('StartedPrice').AsFloat) - AValue.AsFloat
+      else
+        fTotalPrice := FPayFormula.Calculate(Text) - AValue.AsFloat;
       if CheckStartedPrice(AID) then
         Text := FloatToStr(AValue.AsFloat + GetAllowTotalPrice(AID, fTotalPrice))
       else
@@ -685,7 +688,7 @@ begin
   else if ARec.ValueByName('PlanSubType').AsInteger = 1 then
     Result := Format('ÀۼƺÏͬ¼ÆÁ¿½ð¶î >= %f', [ARec.ValueByName('PlanDeadline').AsFloat])
   else if ARec.ValueByName('PlanSubType').AsInteger = 2 then
-    Result := Format('ÀۼƱä¸ü¼ÆÁ¿½ð¶î >= %f', [ARec.ValueByName('PlanDeadline').AsFloat])
+    Result := Format('ÀۼƱä¸ü¼ÆÁ¿½ð¶î >= %f', [ARec.ValueByName('PlanDeadline').AsFloat]);
 end;
 
 procedure TDealPaymentData.UpdateLinkSerialNo;

+ 16 - 2
DataModules/PHPWebDm.pas

@@ -104,7 +104,7 @@ type
     procedure Debug(AFileName: string; AInFields, AInValues: array of string); overload;
     function NetError(AMid: string): string;
     function PageError(AMid: string): string;
-
+    function ExistInServer(AWebID: Integer): Boolean;
 
 
     property Account: string read FAccount write SetAccount;
@@ -127,7 +127,6 @@ type
     property ServerDateTimeURL: string read FServerDateTimeURL;
     property UserImageURL: string read FUserImageURL write FUserImageURL;
     property LoginCloudURL: string read FLoginCloudURL write FLoginCloudURL;
-
   end;
 
 
@@ -662,6 +661,21 @@ begin
   Result := Search(sURL, [], [], vArr) = 1;
 end;
 
+function TPHPWeb.ExistInServer(AWebID: Integer): Boolean;
+var vArr: array of string;
+  iResult: Integer;
+  sSearchURL: string;
+begin
+  sSearchURL := Format('%stender/get/%d/exist', [PHPWeb.MeasureURL, AWebID]);
+  vArr := VarArrayOf(['id', 'name']);
+  iResult := PHPWeb.Search(sSearchURL, [''], [''], vArr);
+
+  if (iResult = 1) and (High(vArr) >= 0) then
+    Result := True
+  else
+    Result := False;
+end;
+
 initialization
 
 finalization

+ 0 - 1
DataModules/ProjectGLDm.dfm

@@ -14,7 +14,6 @@ object ProjectGLData: TProjectGLData
     Provider = sdpProjectGL
     AfterAddRecord = sddProjectGLAfterAddRecord
     BeforeDeleteRecord = sddProjectGLBeforeDeleteRecord
-    BeforeValueChange = sddProjectGLBeforeValueChange
     AfterValueChanged = sddProjectGLAfterValueChanged
     OnGetRecordClass = sddProjectGLGetRecordClass
     Left = 57

+ 31 - 41
DataModules/ProjectGLDm.pas

@@ -11,8 +11,6 @@ type
     sddProjectGL: TsdDataSet;
     sdvProjectGL: TsdDataView;
     procedure sddProjectGLAfterAddRecord(ARecord: TsdDataRecord);
-    procedure sddProjectGLBeforeValueChange(AValue: TsdValue;
-      const NewValue: Variant; var Allow: Boolean);
     procedure sddProjectGLAfterValueChanged(AValue: TsdValue);
     procedure sdvProjectGLGetText(var Text: String; ARecord: TsdDataRecord;
       AValue: TsdValue; AColumn: TsdViewColumn; DisplayText: Boolean);
@@ -205,40 +203,6 @@ begin
   ARecord.ValueByName('CreatePhaseID').AsInteger := TProjectData(FProjectData).ProjProperties.PhaseCount;
 end;
 
-procedure TProjectGLData.sddProjectGLBeforeValueChange(AValue: TsdValue;
-  const NewValue: Variant; var Allow: Boolean);
-var
-  Rec: TProjectGLRecord;
-begin
-  Rec := TProjectGLRecord(AValue.Owner);
-  if SameText(AValue.FieldName, 'Code') then
-  begin
-    if VarIsNull(NewValue) then
-    begin
-      DataSetErrorMessage(Allow, '编号不可为空。');
-      if Rec.Code.AsString = '' then
-        sddProjectGL.Remove(AValue.Owner);
-    end
-    else if CheckSameCode(NewValue) then
-    begin
-      DataSetErrorMessage(Allow, '编号不可重复。');
-      if Rec.Code.AsString = '' then
-        sddProjectGL.Remove(AValue.Owner);
-    end
-    else if CheckApplied(Rec.ID.AsInteger) then
-      DataSetErrorMessage(Allow, '工料已被应用,不可修改编号。');
-  end
-  else if not(SameText(AValue.FieldName, 'ID') or
-      SameText(AValue.FieldName, 'CreatePhaseID')) then
-  begin
-    if (Rec.Code.AsString = '') then
-    begin
-      DataSetErrorMessage(Allow, '编号不可为空,请先填写编号,再填写其他信息。');
-      sddProjectGL.Remove(AValue.Owner);
-    end;
-  end;
-end;
-
 procedure TProjectGLData.sddProjectGLAfterValueChanged(AValue: TsdValue);
 begin
   if SameText(AValue.FieldName, 'BasePrice') or
@@ -360,7 +324,7 @@ var
   fQuantity: Double;
   i: Integer;
   GLRec: TsdDataRecord;
-  BillsNode: TBillsIDTreeNode;
+  BillsNode: TMeasureBillsIDTreeNode;
 begin
   vGLs := TList.Create;
   try
@@ -372,7 +336,7 @@ begin
     begin
       GLRec := TsdDataRecord(vGLs.Items[i]);
       with TProjectData(FProjectData).BillsMeasureData do
-        BillsNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GLRec.ValueByName('BillsID').AsInteger));
+        BillsNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(GLRec.ValueByName('BillsID').AsInteger));
       if Assigned(BillsNode.StageRec) then
         fQuantity := fQuantity + BillsNode.StageRec.GatherQuantity.AsFloat * GLRec.ValueByName('Quantity').AsFloat;
     end;
@@ -485,7 +449,9 @@ procedure TProjectGLData.sdvProjectGLSetText(var Text: String;
   var Allow: Boolean);
 var
   iPhaseID: Integer;
+  Rec: TProjectGLRecord;
 begin
+  Rec := TProjectGLRecord(ARecord);
   if SameText(AColumn.FieldName, 'Code') or
      SameText(AColumn.FieldName, 'Name') or
      SameText(AColumn.FieldName, 'Units') or
@@ -493,7 +459,7 @@ begin
      SameText(AColumn.FieldName, 'BasePrice') or
      SameText(AColumn.FieldName, 'RiskRange') then
   begin
-    iPhaseID := TProjectGLRecord(ARecord).LockedPhaseID.AsInteger;
+    iPhaseID := Rec.LockedPhaseID.AsInteger;
     if iPhaseID > 0 then
       DataSetErrorMessage(Allow, Format('该工料在第%d期已进行调差计算,不可修改基础数据。', [iPhaseID]));
   end;
@@ -501,6 +467,32 @@ begin
   if AValue.DataType in [ftInteger, ftFloat] then
     if not CheckNumeric(Text) then
       Text := '';
+
+  if SameText(AColumn.FieldName, 'Code') then
+  begin
+    if StrToIntDef(Text, 0) = 0 then
+    begin
+      DataSetErrorMessage(Allow, '编号不可为0或空。');
+      if Rec.Code.AsString = '' then
+        sddProjectGL.Remove(ARecord);
+    end
+    else if CheckSameCode(StrToInt(Text)) then
+    begin
+      DataSetErrorMessage(Allow, '编号不可重复。');
+      if Rec.Code.AsString = '' then
+        sddProjectGL.Remove(AValue.Owner);
+    end
+    else if CheckApplied(Rec.ID.AsInteger) then
+      DataSetErrorMessage(Allow, '工料已被应用,不可修改编号。');
+  end
+  else
+  begin
+    if (Rec.Code.AsString = '') then
+    begin
+      DataSetErrorMessage(Allow, '编号不可为空,请先填写编号,再填写其他信息。');
+      sddProjectGL.Remove(AValue.Owner);
+    end;
+  end;
 end;
 
 procedure TProjectGLData.LoadStagePM_CalcData;
@@ -554,14 +546,12 @@ procedure TProjectGLData.AfterBatchOperation;
 begin                         
   sddProjectGL.EndUpdate;
   sddProjectGL.EnableControls;
-  sddProjectGL.BeforeValueChange := sddProjectGLBeforeValueChange;
   sddProjectGL.AfterValueChanged := sddProjectGLAfterValueChanged;
 end;
 
 procedure TProjectGLData.BeforeBatchOperation;
 begin
   sddProjectGL.AfterValueChanged := nil;
-  sddProjectGL.BeforeValueChange := nil;
   sddProjectGL.DisableControls;         
   sddProjectGL.BeginUpdate;
 end;

+ 7 - 2
DataModules/ProjectManagerDm.pas

@@ -408,8 +408,13 @@ function TProjectManagerData.NewID: Integer;
 var
   idxID: TsdIndex;
 begin
-  idxID := sddProjectsInfo.FindIndex('idxID');
-  Result := idxID.Records[idxID.RecordCount - 1].ValueByName('ID').AsInteger + 1;
+  if sddProjectsInfo.RecordCount > 0 then
+  begin
+    idxID := sddProjectsInfo.FindIndex('idxID');
+    Result := idxID.Records[idxID.RecordCount - 1].ValueByName('ID').AsInteger + 1;
+  end
+  else
+    Result := 1;
 end;
 
 procedure TProjectManagerData.RefreshSeedID;

+ 73 - 2
DataModules/ReportMemoryDm/rmHaBaiCustomizedDm.dfm

@@ -2,8 +2,8 @@ object rmHaBaiCustomizedData: TrmHaBaiCustomizedData
   OldCreateOrder = False
   Left = 723
   Top = 455
-  Height = 154
-  Width = 339
+  Height = 222
+  Width = 337
   object cdsCustom2: TClientDataSet
     Active = True
     Aggregates = <>
@@ -358,4 +358,75 @@ object rmHaBaiCustomizedData: TrmHaBaiCustomizedData
       FieldName = 'SerialNo'
     end
   end
+  object cdsCustomCS_1: TClientDataSet
+    Active = True
+    Aggregates = <>
+    Params = <>
+    Left = 32
+    Top = 120
+    Data = {
+      900000009619E0BD01000000180000000400000000000300000090000B50756C
+      735061794E616D6502004A00000001000557494454480200020090011150756C
+      73506179546F74616C507269636508000400000000000C4D696E75735061794E
+      616D6502004A0000000100055749445448020002009001124D696E7573506179
+      546F74616C507269636508000400000000000000}
+    object cdsCustomCS_1PulsPayName: TWideStringField
+      FieldName = 'PulsPayName'
+      Size = 200
+    end
+    object cdsCustomCS_1PulsPayTotalPrice: TFloatField
+      FieldName = 'PulsPayTotalPrice'
+    end
+    object cdsCustomCS_1MinusPayName: TWideStringField
+      FieldName = 'MinusPayName'
+      Size = 200
+    end
+    object cdsCustomCS_1MinusPayTotalPrice: TFloatField
+      FieldName = 'MinusPayTotalPrice'
+    end
+  end
+  object cdsCustomCS_2: TClientDataSet
+    Active = True
+    Aggregates = <>
+    FieldDefs = <
+      item
+        Name = 'DealTotalPrice'
+        DataType = ftFloat
+      end
+      item
+        Name = 'EndCompleteTotalPrice'
+        DataType = ftFloat
+      end
+      item
+        Name = 'PreCompleteTotalPrice'
+        DataType = ftFloat
+      end
+      item
+        Name = 'CurPayTotalPrice'
+        DataType = ftFloat
+      end>
+    IndexDefs = <>
+    Params = <>
+    StoreDefs = True
+    Left = 120
+    Top = 120
+    Data = {
+      860000009619E0BD01000000180000000400000000000300000086000E446561
+      6C546F74616C5072696365080004000000000015456E64436F6D706C65746554
+      6F74616C5072696365080004000000000015507265436F6D706C657465546F74
+      616C5072696365080004000000000010437572506179546F74616C5072696365
+      08000400000000000000}
+    object cdsCustomCS_2DealTotalPrice: TFloatField
+      FieldName = 'DealTotalPrice'
+    end
+    object cdsCustomCS_2EndCompleteTotalPrice: TFloatField
+      FieldName = 'EndCompleteTotalPrice'
+    end
+    object cdsCustomCS_2PreCompleteTotalPrice: TFloatField
+      FieldName = 'PreCompleteTotalPrice'
+    end
+    object cdsCustomCS_2CurPayTotalPrice: TFloatField
+      FieldName = 'CurPayTotalPrice'
+    end
+  end
 end

+ 152 - 18
DataModules/ReportMemoryDm/rmHaBaiCustomizedDm.pas

@@ -1,6 +1,6 @@
 unit rmHaBaiCustomizedDm;
 
-// 内蒙古 哈白项目定制汇总表 严禁任何其他项目或标表调用该单元
+// 内蒙古 哈白项目/国道306定制汇总表 严禁任何其他项目或标表调用该单元
 // 包括支表2/3/14/3-1/4-1
 
 interface
@@ -22,6 +22,7 @@ type
     FName: string;
     FUnits: string;
     FPrice: Double;
+    FCalcType: Integer;
 
     FQuantity: Double;
     FTotalPrice: Double;
@@ -55,6 +56,7 @@ type
     property Name: string read FName write FName;
     property Units: string read FUnits write FUnits;
     property Price: Double read FPrice write FPrice;
+    property CalcType: Integer read FCalcType write FCalcType;
 
     property Quantity: Double read FQuantity write FQuantity;
     property TotalPrice: Double read FTotalPrice write FTotalPrice;
@@ -156,7 +158,7 @@ type
     constructor Create(AProjectCount: Integer);
     destructor Destroy;
 
-    function AddGclNode(ANode: TBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
+    function AddGclNode(ANode: TMeasureBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
 
     procedure ReCalculateTotalPrice;
     procedure Calculate;
@@ -195,6 +197,7 @@ type
     FPlusGather: TPayNode;
     FMinusGather: TPayNode;
     FGatherPayNode: TPayNode;
+    FCompletePayNode: TPayNode;
 
     function FindPlusPayNode(const AName: string): TPayNode;
     function NewPlusPayNode(const AName: string): TPayNode;
@@ -227,10 +230,12 @@ type
     property MinusGather: TPayNode read FMinusGather;
 
     property GatherPayNode: TPayNode read FGatherPayNode;
+    property CompletePayNode: TPayNode read FCompletePayNode;
   end;
 
   // 分别对应5张定制汇总表的编号,详见文档
-  THaBaiGatherType = (hbgt2, hbgt3, hbgt14, hbgt3_1, hbgt4_1);
+  THaBaiGatherType = (hbgt2, hbgt3, hbgt14, hbgt3_1, hbgt4_1, hbgt_CS);
+  // CS: Counter Sign 会签
 
   TrmHaBaiCustomizedData = class(TDataModule)
     cdsCustom2: TClientDataSet;
@@ -295,12 +300,27 @@ type
     cdsCustomProjCurPercent: TFloatField;
     cdsCustomProjEndPercent: TFloatField;
     cdsCustomProjSerialNo: TIntegerField;
+
+    // 会签表
+    // 流水
+    cdsCustomCS_1: TClientDataSet;
+    cdsCustomCS_1PulsPayName: TWideStringField;
+    cdsCustomCS_1PulsPayTotalPrice: TFloatField;
+    cdsCustomCS_1MinusPayName: TWideStringField;
+    cdsCustomCS_1MinusPayTotalPrice: TFloatField;
+    // 账单
+    cdsCustomCS_2: TClientDataSet;
+    cdsCustomCS_2DealTotalPrice: TFloatField;
+    cdsCustomCS_2EndCompleteTotalPrice: TFloatField;
+    cdsCustomCS_2PreCompleteTotalPrice: TFloatField;
+    cdsCustomCS_2CurPayTotalPrice: TFloatField;
   private
     FhbGatherType: THaBaiGatherType;
     FProjectData: TProjectData;
     FProjectName: string;
     FGclControl: TGclControl;
     FDealPayControl: TDealPayControl;
+    FDealTotalPrice: Double;
 
     procedure BeforeGather(AProjectCount: Integer);
     procedure AfterGather;
@@ -318,24 +338,28 @@ type
     procedure WriteReport3;
     procedure WriteReport3_1;
     procedure WriteReport4_1;
+    procedure WriteReportCounterSign;
 
     procedure WriteData;
   public
-    function AssignData(AProjects: TList; AhbGatherType: THaBaiGatherType): TDataSet;
+    function AssignData(AProjects: TList; AhbGatherType: THaBaiGatherType; AReCalc: Boolean): TDataSet;
+    function AssignAssistantData(AhbGatherType: THaBaiGatherType): TDataSet;
+
+    property hbGatherType: THaBaiGatherType read FhbGatherType;
   end;
 
 implementation
 
 uses
   UtilMethods, ZhAPI, BillsCompileDm, sdDB, Globals, Math, BillsMeasureDm,
-  ZJJLDm;
+  ZJJLDm, BillsDm;
 
 {$R *.dfm}
 
 { TrmHaBaiCustomizedData }
 
 function TrmHaBaiCustomizedData.AssignData(AProjects: TList;
-  AhbGatherType: THaBaiGatherType): TDataSet;
+  AhbGatherType: THaBaiGatherType; AReCalc: Boolean): TDataSet;
 var
   iProject: Integer;
 begin
@@ -344,7 +368,8 @@ begin
   try
     for iProject := 0 to AProjects.Count - 1 do
       GatherProject(TSelectProject(AProjects.Items[iProject]), iProject);
-    FGclControl.ReCalculateTotalPrice;
+    if AReCalc then
+      FGclControl.ReCalculateTotalPrice;
     FGclControl.Calculate;
     WriteData;
   finally
@@ -354,6 +379,7 @@ begin
       hbgt3: Result := cdsCustom3;
       hbgt14: Result := cdsCustom14;
       hbgt3_1, hbgt4_1: Result := cdsCustomProj;
+      hbgt_CS: Result := cdsCustomCS_1;
     end;
   end;
 end;
@@ -376,8 +402,17 @@ begin
   cdsCustomProj.Active := True;
   cdsCustomProj.EmptyDataSet;
 
+  cdsCustomCS_1.DisableControls;
+  cdsCustomCS_1.Active := True;
+  cdsCustomCS_1.EmptyDataSet;
+
+  cdsCustomCS_2.DisableControls;
+  cdsCustomCS_2.Active := True;
+  cdsCustomCS_2.EmptyDataSet;
+
   FGclControl := TGclControl.Create(AProjectCount);
   FDealPayControl := TDealPayControl.Create;
+  FDealTotalPrice := 0;
 end;
 
 procedure TrmHaBaiCustomizedData.AfterGather;
@@ -385,6 +420,8 @@ begin
   FDealPayControl.Free;
   FGclControl.Free;
 
+  cdsCustomCS_2.EnableControls;
+  cdsCustomCS_1.EnableControls;
   cdsCustomProj.EnableControls;
   cdsCustom14.EnableControls;
   cdsCustom3.EnableControls;
@@ -419,10 +456,12 @@ begin
     FGclControl.ProjectName[AProjectIndex] := FProjectName;
     if FhbGatherType in [hbgt2, hbgt3, hbgt3_1, hbgt4_1] then
       FilterGcl(AProjectIndex);
-    if FhbGatherType = hbgt2 then
+    if FhbGatherType in [hbgt2, hbgt_CS] then
       FilterDealPay;
     if FhbGatherType = hbgt14 then
       WriteFlowData;
+    if FhbGatherType = hbgt_CS then
+      FDealTotalPrice := FDealTotalPrice + FProjectData.BillsData.Settlement[0];
   finally
     FreeProjectData;
   end;
@@ -431,14 +470,14 @@ end;
 procedure TrmHaBaiCustomizedData.FilterGcl(AProjectIndex: Integer);
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
   GclNode: TGclNode;
 begin
   with FProjectData.BillsMeasureData do
   begin
     for i := 0 to BillsMeasureTree.Count - 1 do
     begin
-      vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+      vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
       if not vNode.HasChildren and (vNode.Rec.B_Code.AsString <> '') then
         GclNode := FGclControl.AddGclNode(vNode, AProjectIndex);
     end;
@@ -466,19 +505,40 @@ var
           Continue;
         StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
         DealPay := FDealPayControl.AddPayNode(Rec.ValueByName('Name').AsString, Rec.ValueByName('IsMinus').AsBoolean);
-        DealPay.CurTotalPrice := DealPay.CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
-        DealPay.PreTotalPrice := DealPay.PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
-        DealPay.EndTotalPrice := DealPay.EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
+        if Assigned(StageRec) then
+        begin
+          DealPay.CurTotalPrice := DealPay.CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
+          DealPay.PreTotalPrice := DealPay.PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
+          DealPay.EndTotalPrice := DealPay.EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
+        end;
       end;
     end;
   end;
 
+  procedure GatherCompletePayData;
+  var
+    Rec, StageRec: TsdDataRecord;
+  begin
+    Rec := FProjectData.DealPaymentData.DealPayRecord('本期完成计量');
+    StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
+    if not Assigned(StageRec) then Exit;
+
+    with FDealPayControl.CompletePayNode do
+    begin
+      CurTotalPrice := CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
+      PreTotalPrice := PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
+      EndTotalPrice := EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
+    end;
+  end;
+
   procedure GatherPayData;
   var
     Rec, StageRec: TsdDataRecord;
   begin
     Rec := FProjectData.DealPaymentData.DealPayRecord('本期应付');
     StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
+    if not Assigned(StageRec) then Exit;
+
     with FDealPayControl.GatherPayNode do
     begin
       CurTotalPrice := CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
@@ -492,6 +552,7 @@ begin
   sPreField := 'PreTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
   sEndField := 'EndTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
   GatherCommonDealPayData;
+  GatherCompletePayData;
   GatherPayData;
   FDealPayControl.CalculateAll;
 end;
@@ -503,6 +564,7 @@ begin
     hbgt3: WriteReport3;
     hbgt3_1: WriteReport3_1;
     hbgt4_1: WriteReport4_1;
+    hbgt_CS: WriteReportCounterSign;
   end;
 end;
 
@@ -830,7 +892,7 @@ end;
 
 procedure TrmHaBaiCustomizedData.WriteFlowData;
 
-  procedure AddNodeData(ANode: TBillsIDTreeNode);
+  procedure AddNodeData(ANode: TMeasureBillsIDTreeNode);
   begin
     cdsCustom14.Append;
     cdsCustom14IndexCode.AsString := ANode.Rec.IndexCode.AsString;
@@ -848,23 +910,89 @@ procedure TrmHaBaiCustomizedData.WriteFlowData;
 
 var
   iIndex: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   for iIndex := 0 to FProjectData.BillsMeasureData.BillsMeasureTree.Count - 1 do
   begin
-    vNode := TBillsIDTreeNode(FProjectData.BillsMeasureData.BillsMeasureTree.Items[iIndex]);
+    vNode := TMeasureBillsIDTreeNode(FProjectData.BillsMeasureData.BillsMeasureTree.Items[iIndex]);
     if (not vNode.HasChildren) and (vNode.Rec.B_Code.AsString <> '') and
         Assigned(vNode.StageRec) and (vNode.StageRec.GatherTotalPrice.AsFloat <> 0) then
       AddNodeData(vNode);
   end;
 end;
 
+function TrmHaBaiCustomizedData.AssignAssistantData(
+  AhbGatherType: THaBaiGatherType): TDataSet;
+begin
+  Result := nil;
+  if (AhbGatherType = hbgt_CS) and (FhbGatherType = hbgt_CS) then
+    Result := cdsCustomCS_2;
+end;
+
+procedure TrmHaBaiCustomizedData.WriteReportCounterSign;
+
+  procedure WriteCounterSign1;
+  var
+    i: Integer;
+    PayNode: TPayNode;
+  begin
+    cdsCustomCS_1.Append;
+    cdsCustomCS_1PulsPayName.AsString := '本期完成金额';
+    cdsCustomCS_1PulsPayTotalPrice.AsFloat := FDealPayControl.CompletePayNode.CurTotalPrice;
+    cdsCustomCS_1.Post;
+
+    for i := 0 to FDealPayControl.PlusPayCount - 1 do
+    begin
+      PayNode := FDealPayControl.PlusPayNode[i];
+      cdsCustomCS_1.Append;
+      cdsCustomCS_1PulsPayName.AsString := PayNode.Name;
+      cdsCustomCS_1PulsPayTotalPrice.AsFloat := PayNode.CurTotalPrice;
+      cdsCustomCS_1.Post;
+    end;
+
+    cdsCustomCS_1.Append;
+    cdsCustomCS_1PulsPayName.AsString := '迟付款利息';
+    cdsCustomCS_1.Post;
+
+    cdsCustomCS_1.First;
+    for i := 0 to FDealPayControl.MinusPayCount - 1 do
+    begin
+      PayNode := FDealPayControl.MinusPayNode[i];
+      if cdsCustomCS_1.Eof then
+        cdsCustomCS_1.Append
+      else
+        cdsCustomCS_1.Edit;
+      cdsCustomCS_1MinusPayName.AsString := PayNode.Name;
+      cdsCustomCS_1MinusPayTotalPrice.AsFloat := PayNode.CurTotalPrice;
+      cdsCustomCS_1.Post;
+      cdsCustomCS_1.Next;
+    end;
+  end;
+
+  procedure WriteCounterSign2;
+  begin
+    cdsCustomCS_2.Append;
+    cdsCustomCS_2DealTotalPrice.AsFloat := FDealTotalPrice;
+    cdsCustomCS_2EndCompleteTotalPrice.AsFloat := FDealPayControl.CompletePayNode.EndTotalPrice;
+    cdsCustomCS_2PreCompleteTotalPrice.AsFloat := FDealPayControl.CompletePayNode.PreTotalPrice;
+    cdsCustomCS_2CurPayTotalPrice.AsFloat := FDealPayControl.GatherPayNode.CurTotalPrice;
+    cdsCustomCS_2.Post;
+  end;
+
+begin
+  WriteCounterSign1;
+  WriteCounterSign2;
+end;
+
 { TGclNode }
 
 procedure TGclNode.Calculate;
 var
   i: Integer;
 begin
+  // 金额模式下不重算
+  if CalcType <> 0 then Exit;
+
   FTotalPrice := FPrice * FQuantity;
   FCurGatherTotalPrice := FPrice * FCurGatherQuantity;
   FEndGatherTotalPrice := FPrice * FEndGatherQuantity;
@@ -912,7 +1040,7 @@ end;
 
 { TGclControl }
 
-function TGclControl.AddGclNode(ANode: TBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
+function TGclControl.AddGclNode(ANode: TMeasureBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
 begin
   Result := FindGclNode(ANode.Rec);
   if not Assigned(Result) then
@@ -1048,7 +1176,8 @@ begin
     if (vGclNode.B_Code = ARec.B_Code.AsString) and
         (vGclNode.Name = ARec.Name.AsString) and
         (vGclNode.Units = ARec.Units.AsString) and
-        (vGclNode.Price = ARec.Price.AsFloat) then
+        (vGclNode.Price = ARec.Price.AsFloat) and
+        (vGclNode.CalcType = ARec.CalcType.AsInteger)then
       begin
         Result := vGclNode;
         Break;
@@ -1104,6 +1233,7 @@ begin
   Result.Name := ARec.Name.AsString;
   Result.Units := ARec.Units.AsString;
   Result.Price := ARec.Price.AsFloat;
+  Result.CalcType := ARec.CalcType.AsInteger;
   LinkGclChapter(Result);
 end;
 
@@ -1268,10 +1398,14 @@ begin
   FPlusGather := TPayNode.Create;
   FMinusGather := TPayNode.Create;
   FGatherPayNode := TPayNode.Create;
+  FGatherPayNode.Name := '本期应付';
+  FCompletePayNode :=TPayNode.Create;
+  FCompletePayNode.Name := '本期完成计量';
 end;
 
 destructor TDealPayControl.Destroy;
 begin
+  FCompletePayNode.Free;
   FGatherPayNode.Free;
   FMinusGather.Free;
   FPlusGather.Free;

+ 19 - 11
DataModules/SearchDm.pas

@@ -25,7 +25,7 @@ type
   private
     FProjectData: TObject;
 
-    procedure AddSearchResult(ANode: TBillsIDTreeNode);
+    procedure AddSearchResult(ANode: TMeasureBillsIDTreeNode);
   public
     constructor Create(AProjectData: TObject);
     destructor Destroy; override;
@@ -49,7 +49,7 @@ uses
 
 { TSearchData }
 
-procedure TSearchData.AddSearchResult(ANode: TBillsIDTreeNode);
+procedure TSearchData.AddSearchResult(ANode: TMeasureBillsIDTreeNode);
 begin
   if not Assigned(ANode) then Exit;
 
@@ -127,7 +127,7 @@ end;
 procedure TSearchData.SearchKeyword(const AKeyword: string);
 var
   iNode: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   if AKeyword = '' then Exit;
 
@@ -138,7 +138,7 @@ begin
     begin
       for iNode := 0 to BillsMeasureTree.Count - 1 do
       begin
-        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[iNode]);
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[iNode]);
         if (Pos(AKeyword, vNode.Rec.B_Code.AsString) > 0) or
             (Pos(AKeyword, vNode.Rec.Name.AsString) > 0) then
           AddSearchResult(vNode);
@@ -150,9 +150,18 @@ begin
 end;
 
 procedure TSearchData.SearchOverRange;
+
+  function CheckOverRange(ANode: TMeasureBillsIDTreeNode): Boolean;
+  begin
+    if ANode.Rec.CalcType.AsInteger = 0 then
+      Result := ANode.Rec.Quantity.AsFloat < ANode.Rec.AddDealQuantity.AsFloat
+    else
+      Result := ANode.Rec.TotalPrice.AsFloat < ANode.Rec.AddDealTotalPrice.AsFloat;
+  end;
+
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   cdsSearch.DisableControls;
   try
@@ -161,10 +170,9 @@ begin
     begin
       for i := 0 to BillsMeasureTree.Count - 1 do
       begin
-        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
-        if not vNode.HasChildren then
-          if vNode.Rec.Quantity.AsFloat < vNode.Rec.AddDealQuantity.AsFloat then
-            AddSearchResult(vNode);
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
+        if not vNode.HasChildren and CheckOverRange(vNode) then
+          AddSearchResult(vNode);
       end;
     end;
   finally
@@ -184,7 +192,7 @@ end;
 procedure TSearchData.SearchBelowRange;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   cdsSearch.DisableControls;
   try
@@ -193,7 +201,7 @@ begin
     begin
       for i := 0 to BillsMeasureTree.Count - 1 do
       begin
-        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
         if not vNode.HasChildren then
           if vNode.Rec.Quantity.AsFloat > vNode.Rec.AddDealQuantity.AsFloat then
             AddSearchResult(vNode);

+ 11 - 11
DataModules/StageDm.pas

@@ -44,9 +44,9 @@ type
     procedure CalculateQuantityChange(ABillsID: Integer);
     procedure CalculatePriceChange(ABillsID: Integer);
 
-    procedure CalculateParent(ANode: TBillsIDTreeNode);
-    procedure CalculateLeaf(ANode: TBillsIDTreeNode);
-    procedure CalculateSpecialLeaf(ANode: TBillsIDTreeNode);
+    procedure CalculateParent(ANode: TMeasureBillsIDTreeNode);
+    procedure CalculateLeaf(ANode: TMeasureBillsIDTreeNode);
+    procedure CalculateSpecialLeaf(ANode: TMeasureBillsIDTreeNode);
 
     function GetTotalPrice(ABillsID, AType, AStageIndex: Integer): Double;
 
@@ -650,22 +650,22 @@ begin
   if ANode.HasChildren then
   begin
     CalculateNode(ANode.FirstChild);
-    CalculateParent(TBillsIDTreeNode(ANode));
+    CalculateParent(TMeasureBillsIDTreeNode(ANode));
   end
   else
   begin
     if IsSpecialNode then
-      CalculateSpecialLeaf(TBillsIDTreeNode(ANode))
+      CalculateSpecialLeaf(TMeasureBillsIDTreeNode(ANode))
     else
-      CalculateLeaf(TBillsIDTreeNode(ANode));
+      CalculateLeaf(TMeasureBillsIDTreeNode(ANode));
   end;
   CalculateNode(ANode.NextSibling);
 end;
 
-procedure TStageData.CalculateParent(ANode: TBillsIDTreeNode);
+procedure TStageData.CalculateParent(ANode: TMeasureBillsIDTreeNode);
 var
   iChild: Integer;
-  ChildNode: TBillsIDTreeNode;
+  ChildNode: TMeasureBillsIDTreeNode;
   fDeal, fQc, fPc, fPM: Double;
 begin
   if not Assigned(ANode.StageRec) then Exit;
@@ -676,7 +676,7 @@ begin
   fPM := 0;
   for iChild := 0 to ANode.ChildCount - 1 do
   begin
-    ChildNode := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
+    ChildNode := TMeasureBillsIDTreeNode(ANode.ChildNodes[iChild]);
     if not Assigned(ChildNode.StageRec) then Continue;
     fDeal := TotalPriceRoundTo(fDeal + ChildNode.StageRec.DealTotalPrice.AsFloat);
     fQc := TotalPriceRoundTo(fQc + ChildNode.StageRec.QcTotalPrice.AsFloat);
@@ -706,7 +706,7 @@ begin
   end;
 end;
 
-procedure TStageData.CalculateLeaf(ANode: TBillsIDTreeNode);
+procedure TStageData.CalculateLeaf(ANode: TMeasureBillsIDTreeNode);
 
   procedure CalculateMeasure(ARec: TsdDataRecord; const AType: string);
   begin
@@ -927,7 +927,7 @@ begin
   end;
 end;
 
-procedure TStageData.CalculateSpecialLeaf(ANode: TBillsIDTreeNode);
+procedure TStageData.CalculateSpecialLeaf(ANode: TMeasureBillsIDTreeNode);
 
   procedure GatherPriceMargin(ARec: TStageRecord);
   begin

+ 8 - 0
Dprs/CSL/Measure_Cloud.dof

@@ -115,7 +115,11 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=3
+<<<<<<< HEAD
 Build=1077
+=======
+Build=1068
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,6 +130,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化云版
+<<<<<<< HEAD
 FileVersion=3.1.3.1077
 InternalName=Measure
 LegalCopyright=版权所有(C) 珠海纵横创新软件有限公司 2003-2014。保留所有权利。
@@ -154,3 +159,6 @@ Item0=..\Bin
 [HistoryLists\hlDCPOutput]
 Count=1
 Item0=D:\Dcu
+=======
+FileVersion=3.1.3.1068
+>>>>>>> 3.1.5

+ 7 - 0
Dprs/CSL/Measure_Cloud.dpr

@@ -154,11 +154,18 @@ uses
   SelectDetailGLsFrm in '..\..\Forms\SelectDetailGLsFrm.pas' {SelectDetailGLsForm},
   DealPayPlanFrm in '..\..\Forms\DealPayPlanFrm.pas' {DealPayPlanForm},
   mProgressProFrm in '..\..\Forms\mProgressProFrm.pas' {ProgressProForm},
+<<<<<<< HEAD
+=======
+  tpMainFrm in '..\..\TenderPartition\tpMainFrm.pas' {tpMainForm},
+>>>>>>> 3.1.5
   tpBaseGatherData in '..\..\TenderPartition\tpBaseGatherData.pas',
   tpGatherGcl in '..\..\TenderPartition\tpGatherGcl.pas',
   tpGatherTree in '..\..\TenderPartition\tpGatherTree.pas',
   tpMainData in '..\..\TenderPartition\tpMainData.pas',
+<<<<<<< HEAD
   tpMainFrm in '..\..\TenderPartition\tpMainFrm.pas' {tpMainForm},
+=======
+>>>>>>> 3.1.5
   tpNoPegDm in '..\..\TenderPartition\tpNoPegDm.pas' {tpNoPegData: TDataModule},
   tpPartTender in '..\..\TenderPartition\tpPartTender.pas',
   tpPartTenderFme in '..\..\TenderPartition\tpPartTenderFme.pas' {tpPartTenderFrame: TFrame},

+ 12 - 0
Dprs/Pro/Measure.dof

@@ -115,7 +115,11 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=5
+<<<<<<< HEAD
 Build=214
+=======
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,13 +130,21 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化专业版
+<<<<<<< HEAD
 FileVersion=3.1.5.214
+=======
+FileVersion=3.1.5.3002
+>>>>>>> 3.1.5
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure
 OriginalFilename=
 ProductName=纵横公路工程结算决算一体化软件
+<<<<<<< HEAD
 ProductVersion=3.1.5.2
+=======
+ProductVersion=3.1.5.3
+>>>>>>> 3.1.5
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.

+ 3 - 2
Dprs/Pro/Measure.dpr

@@ -1,5 +1,7 @@
 program Measure;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -193,8 +195,7 @@ begin
     begin
       HideWelcome;
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end
+    end
     else  HideWelcome;
     Application.Run;
   end;

+ 1 - 1
Dprs/Pro/Measure_Cloud.cfg

@@ -35,7 +35,7 @@
 -N"..\..\Dcus"
 -LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
 -LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
--D_mCloud;_mEncrypt;
+-D_mCloud;
 -w-UNSAFE_TYPE
 -w-UNSAFE_CODE
 -w-UNSAFE_CAST

+ 25 - 1
Dprs/Pro/Measure_Cloud.dof

@@ -96,7 +96,7 @@ PackageDLLOutputDir=
 PackageDCPOutputDir=
 SearchPath=
 Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;ZjGridD7;DPanel;ExTree;JimComboBoxs;JimTab;PrintComRep;XPMenu_tom;ZjGridFereD7;ZjCommon;SmartDataSet;ZjGridActns
-Conditionals=_mCloud;_mEncrypt;
+Conditionals=_mCloud;
 DebugSourceDirs=
 UsePackages=0
 [Parameters]
@@ -115,7 +115,11 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=5
+<<<<<<< HEAD
 Build=212
+=======
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,13 +130,33 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化云版
+<<<<<<< HEAD
 FileVersion=3.1.5.212
+=======
+FileVersion=3.1.5.3002
+>>>>>>> 3.1.5
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure
 OriginalFilename=
 ProductName=纵横公路工程结算决算一体化软件
+<<<<<<< HEAD
 ProductVersion=3.1.5.2
+=======
+ProductVersion=3.1.5.3
+>>>>>>> 3.1.5
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_mCloud;
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlUnitOutputDirectory]
+Count=1
+Item0=..\..\Dcus
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=D:\SmartCostExe\Measure

+ 16 - 2
Dprs/Pro/Measure_Cloud.dpr

@@ -1,5 +1,7 @@
 program Measure_Cloud;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -144,11 +146,19 @@ uses
   DetailExcelImport in '..\..\Units\DetailExcelImport.pas',
   mProgressProFrm in '..\..\Forms\mProgressProFrm.pas' {ProgressProForm},
   rmHaBaiCustomizedDm in '..\..\DataModules\ReportMemoryDm\rmHaBaiCustomizedDm.pas' {rmHaBaiCustomizedData: TDataModule},
+<<<<<<< HEAD
+=======
+  BillsPasteSelectFrm in '..\..\Forms\BillsPasteSelectFrm.pas' {BillsPasteSelectForm},
+  GclBillsGatherModel in '..\..\Units\GclBillsGatherModel.pas',
+>>>>>>> 3.1.5
   ProjectGLDm in '..\..\DataModules\ProjectGLDm.pas' {ProjectGLData: TDataModule},
   PriceMarginBillsDm in '..\..\DataModules\PriceMarginBillsDm.pas' {PriceMarginBillsData: TDataModule},
   GclBillsGatherModel in '..\..\Units\GclBillsGatherModel.pas',
   DetailGLDm in '..\..\DataModules\DetailGLDm.pas' {DetailGLData: TDataModule},
+<<<<<<< HEAD
   PriceMarginBillsFme in '..\..\Frames\PriceMarginBillsFme.pas' {PriceMarginBillsFrame: TFrame},
+=======
+>>>>>>> 3.1.5
   PriceMarginFme in '..\..\Frames\PriceMarginFme.pas' {PriceMarginFrame: TFrame},
   ProjectGLFme in '..\..\Frames\ProjectGLFme.pas' {ProjectGLFrame: TFrame},
   SelectDetailGLsFrm in '..\..\Forms\SelectDetailGLsFrm.pas' {SelectDetailGLsForm},
@@ -176,7 +186,12 @@ uses
   tpSelectTenderDm in '..\..\TenderPartition\tpSelectTenderDm.pas' {tpSelectTenderData: TDataModule},
   tpSelectTenderNode in '..\..\TenderPartition\tpSelectTenderNode.pas',
   tpSelectTendersFrm in '..\..\TenderPartition\tpSelectTendersFrm.pas' {SelectTendersForm},
+<<<<<<< HEAD
   tpTrialPegInputFrm in '..\..\TenderPartition\tpTrialPegInputFrm.pas' {TrialPegInputForm};
+=======
+  tpTrialPegInputFrm in '..\..\TenderPartition\tpTrialPegInputFrm.pas' {TrialPegInputForm},
+  PriceMarginBillsFme in '..\..\Frames\PriceMarginBillsFme.pas' {PriceMarginBillsFrame: TFrame};
+>>>>>>> 3.1.5
 
 {$R *.res}
 
@@ -220,8 +235,7 @@ begin
     if CheckDogExists then
     begin
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end;
+    end;
     Application.Run;
   end;
 

+ 24 - 0
Dprs/Pro/Measure_GuangDong.dof

@@ -115,7 +115,11 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=5
+<<<<<<< HEAD
 Build=213
+=======
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,13 +130,33 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化广东专业版
+<<<<<<< HEAD
 FileVersion=3.1.5.213
+=======
+FileVersion=3.1.5.3002
+>>>>>>> 3.1.5
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure
 OriginalFilename=
 ProductName=纵横公路工程结算决算一体化软件
+<<<<<<< HEAD
 ProductVersion=3.1.5.2
+=======
+ProductVersion=3.1.5.3
+>>>>>>> 3.1.5
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_mEncrypt;_mGuangDong
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlUnitOutputDirectory]
+Count=1
+Item0=..\..\Dcus
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=D:\SmartCostExe\Measure

+ 3 - 2
Dprs/Pro/Measure_GuangDong.dpr

@@ -1,5 +1,7 @@
 program Measure_GuangDong;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -192,8 +194,7 @@ begin
     begin
       HideWelcome;
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end
+    end
     else  HideWelcome;
     Application.Run;
   end;

+ 1 - 1
Dprs/Pro/Measure_GuangDong_Cloud.cfg

@@ -35,7 +35,7 @@
 -N"..\..\Dcus"
 -LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
 -LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
--D_mCloud;_mEncrypt;_mGuangDong
+-D_mCloud;_mGuangDong
 -w-UNSAFE_TYPE
 -w-UNSAFE_CODE
 -w-UNSAFE_CAST

+ 25 - 1
Dprs/Pro/Measure_GuangDong_Cloud.dof

@@ -96,7 +96,7 @@ PackageDLLOutputDir=
 PackageDCPOutputDir=
 SearchPath=
 Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;ZjGridD7;DPanel;ExTree;JimComboBoxs;JimTab;PrintComRep;XPMenu_tom;ZjGridFereD7;ZjCommon;SmartDataSet;ZjGridActns
-Conditionals=_mCloud;_mEncrypt;_mGuangDong
+Conditionals=_mCloud;_mGuangDong
 DebugSourceDirs=
 UsePackages=0
 [Parameters]
@@ -115,7 +115,11 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=5
+<<<<<<< HEAD
 Build=212
+=======
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,13 +130,33 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化广东云版
+<<<<<<< HEAD
 FileVersion=3.1.5.212
+=======
+FileVersion=3.1.5.3002
+>>>>>>> 3.1.5
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure
 OriginalFilename=
 ProductName=纵横公路工程结算决算一体化软件
+<<<<<<< HEAD
 ProductVersion=3.1.5.2
+=======
+ProductVersion=3.1.5.3
+>>>>>>> 3.1.5
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_mCloud;_mGuangDong
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlUnitOutputDirectory]
+Count=1
+Item0=..\..\Dcus
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=D:\SmartCostExe\Measure

+ 3 - 2
Dprs/Pro/Measure_GuangDong_Cloud.dpr

@@ -1,5 +1,7 @@
 program Measure_GuangDong_Cloud;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -222,8 +224,7 @@ begin
     if CheckDogExists then
     begin
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end;
+    end;
     Application.Run;
   end;
 

+ 1 - 0
Dprs/Pro/Measure_GuangDong_TZ.cfg

@@ -35,6 +35,7 @@
 -N"..\..\Dcus"
 -LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
 -LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-D_mEncrypt;_mcompile;_mGuangDong
 -w-UNSAFE_TYPE
 -w-UNSAFE_CODE
 -w-UNSAFE_CAST

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 17 - 1
Dprs/Pro/Measure_GuangDong_TZ.dof


+ 6 - 3
Dprs/Pro/Measure_GuangDong_TZ.dpr

@@ -1,5 +1,7 @@
 program Measure_GuangDong_TZ;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -188,12 +190,13 @@ begin
     Application.Initialize;
     Application.Title := '纵横公路工程0号台账软件广东版';
     
-
+    ShowWelcome;
     if CheckDogExists then
     begin
+	    HideWelcome;
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end;
+    end
+    else  HideWelcome;
     Application.Run;
   end;
 

+ 24 - 0
Dprs/Pro/Measure_TZ.dof

@@ -115,7 +115,11 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=5
+<<<<<<< HEAD
 Build=211
+=======
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,13 +130,33 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横0号台账专业版
+<<<<<<< HEAD
 FileVersion=3.1.5.211
+=======
+FileVersion=3.1.5.3002
+>>>>>>> 3.1.5
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure
 OriginalFilename=
 ProductName=纵横公路工程结算决算一体化软件
+<<<<<<< HEAD
 ProductVersion=3.1.5.2
+=======
+ProductVersion=3.1.5.3
+>>>>>>> 3.1.5
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_mEncrypt;_mcompile;
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlUnitOutputDirectory]
+Count=1
+Item0=..\..\Dcus
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=D:\SmartCostExe\Measure

+ 6 - 3
Dprs/Pro/Measure_TZ.dpr

@@ -1,5 +1,7 @@
 program Measure_TZ;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -188,13 +190,14 @@ begin
     Application.Initialize;
     Application.Title := '纵横公路工程0号台账软件';
 
-    
 
+    ShowWelcome;
     if CheckDogExists then
     begin
+	    HideWelcome;
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end;
+    end
+    else  HideWelcome;
     Application.Run;
   end;
 

+ 10 - 6
Dprs/Trail/Measure.dof

@@ -114,8 +114,13 @@ IncludeVerInfo=1
 AutoIncBuild=1
 MajorVer=3
 MinorVer=1
+<<<<<<< HEAD
 Release=3
 Build=3027
+=======
+Release=5
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,14 +131,13 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化学习版
-FileVersion=3.1.3.3027
-InternalName=Measure
-LegalCopyright=版权所有(C) 珠海纵横创新软件有限公司 2003-2014。保留所有权利。
+FileVersion=3.1.5.3002
+InternalName=
+LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure
 OriginalFilename=
-ProductName=纵横公路工程计量决算一体化软件
-ProductVersion=3
-Comments=
+ProductName=纵横公路工程结算决算一体化软件
+ProductVersion=3.1.5.3
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.

+ 27 - 3
Dprs/Trail/Measure.dpr

@@ -1,5 +1,7 @@
 program Measure;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -149,7 +151,30 @@ uses
   PriceMarginFme in '..\..\Frames\PriceMarginFme.pas' {PriceMarginFrame: TFrame},
   ProjectGLFme in '..\..\Frames\ProjectGLFme.pas' {ProjectGLFrame: TFrame},
   SelectDetailGLsFrm in '..\..\Forms\SelectDetailGLsFrm.pas' {SelectDetailGLsForm},
-  DealPayPlanFrm in '..\..\Forms\DealPayPlanFrm.pas' {DealPayPlanForm};
+  DealPayPlanFrm in '..\..\Forms\DealPayPlanFrm.pas' {DealPayPlanForm},
+  tpMainFrm in '..\..\TenderPartition\tpMainFrm.pas' {tpMainForm},
+  tpBaseGatherData in '..\..\TenderPartition\tpBaseGatherData.pas',
+  tpGatherGcl in '..\..\TenderPartition\tpGatherGcl.pas',
+  tpGatherTree in '..\..\TenderPartition\tpGatherTree.pas',
+  tpMainData in '..\..\TenderPartition\tpMainData.pas',
+  tpNoPegDm in '..\..\TenderPartition\tpNoPegDm.pas' {tpNoPegData: TDataModule},
+  tpPartTender in '..\..\TenderPartition\tpPartTender.pas',
+  tpPartTenderFme in '..\..\TenderPartition\tpPartTenderFme.pas' {tpPartTenderFrame: TFrame},
+  tpPartTenderSet in '..\..\TenderPartition\tpPartTenderSet.pas',
+  tpPartTenderSetFme in '..\..\TenderPartition\tpPartTenderSetFme.pas' {tpPartTenderSetFrame: TFrame},
+  tpPeg in '..\..\TenderPartition\tpPeg.pas',
+  tpPeg_GclDm in '..\..\TenderPartition\tpPeg_GclDm.pas' {tpPeg_GclData: TDataModule},
+  tpPeg_GclFme in '..\..\TenderPartition\tpPeg_GclFme.pas' {tpPeg_GclFrame: TFrame},
+  tpPegBlock in '..\..\TenderPartition\tpPegBlock.pas',
+  tpPegGclGatherDm in '..\..\TenderPartition\tpPegGclGatherDm.pas' {tpPegGclGatherData: TDataModule},
+  tpPegGclGatherFme in '..\..\TenderPartition\tpPegGclGatherFme.pas' {tpPegGclGatherFrame: TFrame},
+  tpPegPartSettingFrm in '..\..\TenderPartition\tpPegPartSettingFrm.pas' {tpPegPartSettingForm},
+  tpPricePartSettingFrm in '..\..\TenderPartition\tpPricePartSettingFrm.pas' {tpPricePartSettingForm},
+  tpSelectTenderDm in '..\..\TenderPartition\tpSelectTenderDm.pas' {tpSelectTenderData: TDataModule},
+  tpSelectTenderNode in '..\..\TenderPartition\tpSelectTenderNode.pas',
+  tpSelectTendersFrm in '..\..\TenderPartition\tpSelectTendersFrm.pas' {SelectTendersForm},
+  tpTrialPegInputFrm in '..\..\TenderPartition\tpTrialPegInputFrm.pas' {TrialPegInputForm},
+  mPegFilter in '..\..\Units\mPegFilter.pas';
 
 {$R *.res}
 
@@ -169,8 +194,7 @@ begin
     begin
       HideWelcome;
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end
+    end
     else  HideWelcome;
     Application.Run;
   end;

BIN
Dprs/Trail/Measure.res


+ 13 - 3
Dprs/Trail/Measure_GuangDong.dof

@@ -114,8 +114,13 @@ IncludeVerInfo=1
 AutoIncBuild=1
 MajorVer=3
 MinorVer=1
+<<<<<<< HEAD
 Release=3
 Build=3027
+=======
+Release=5
+Build=3002
+>>>>>>> 3.1.5
 Debug=0
 PreRelease=0
 Special=0
@@ -126,14 +131,19 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化广东学习版
+<<<<<<< HEAD
 FileVersion=3.1.3.3027
 InternalName=Measure
 LegalCopyright=版权所有(C) 珠海纵横创新软件有限公司 2003-2014。保留所有权利。
+=======
+FileVersion=3.1.5.3002
+InternalName=
+LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
+>>>>>>> 3.1.5
 LegalTrademarks=Measure
 OriginalFilename=
-ProductName=纵横公路工程计量决算一体化软件
-ProductVersion=3
-Comments=
+ProductName=纵横结算决算计量一体化软件
+ProductVersion=3.1.5.3
 [Excluded Packages]
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc.
 C:\Program Files (x86)\Borland\Delphi7\Lib\3F\Developer Express Inc\ExpressEditors Library 5\Delphi 7\Bin\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc.

+ 27 - 3
Dprs/Trail/Measure_GuangDong.dpr

@@ -1,5 +1,7 @@
 program Measure_GuangDong;
 
+{$R '..\..\res\uac.res' '..\..\res\uac.rc'}
+
 uses
   Windows,
   ShareMem,
@@ -149,7 +151,30 @@ uses
   PriceMarginFme in '..\..\Frames\PriceMarginFme.pas' {PriceMarginFrame: TFrame},
   ProjectGLFme in '..\..\Frames\ProjectGLFme.pas' {ProjectGLFrame: TFrame},
   SelectDetailGLsFrm in '..\..\Forms\SelectDetailGLsFrm.pas' {SelectDetailGLsForm},
-  DealPayPlanFrm in '..\..\Forms\DealPayPlanFrm.pas' {DealPayPlanForm};
+  DealPayPlanFrm in '..\..\Forms\DealPayPlanFrm.pas' {DealPayPlanForm},
+  tpBaseGatherData in '..\..\TenderPartition\tpBaseGatherData.pas',
+  tpGatherGcl in '..\..\TenderPartition\tpGatherGcl.pas',
+  tpGatherTree in '..\..\TenderPartition\tpGatherTree.pas',
+  tpMainData in '..\..\TenderPartition\tpMainData.pas',
+  tpMainFrm in '..\..\TenderPartition\tpMainFrm.pas' {tpMainForm},
+  tpNoPegDm in '..\..\TenderPartition\tpNoPegDm.pas' {tpNoPegData: TDataModule},
+  tpPartTender in '..\..\TenderPartition\tpPartTender.pas',
+  tpPartTenderFme in '..\..\TenderPartition\tpPartTenderFme.pas' {tpPartTenderFrame: TFrame},
+  tpPartTenderSet in '..\..\TenderPartition\tpPartTenderSet.pas',
+  tpPartTenderSetFme in '..\..\TenderPartition\tpPartTenderSetFme.pas' {tpPartTenderSetFrame: TFrame},
+  tpPeg in '..\..\TenderPartition\tpPeg.pas',
+  tpPeg_GclDm in '..\..\TenderPartition\tpPeg_GclDm.pas' {tpPeg_GclData: TDataModule},
+  tpPeg_GclFme in '..\..\TenderPartition\tpPeg_GclFme.pas' {tpPeg_GclFrame: TFrame},
+  tpPegBlock in '..\..\TenderPartition\tpPegBlock.pas',
+  tpPegGclGatherDm in '..\..\TenderPartition\tpPegGclGatherDm.pas' {tpPegGclGatherData: TDataModule},
+  tpPegGclGatherFme in '..\..\TenderPartition\tpPegGclGatherFme.pas' {tpPegGclGatherFrame: TFrame},
+  tpPegPartSettingFrm in '..\..\TenderPartition\tpPegPartSettingFrm.pas' {tpPegPartSettingForm},
+  tpPricePartSettingFrm in '..\..\TenderPartition\tpPricePartSettingFrm.pas' {tpPricePartSettingForm},
+  tpSelectTenderDm in '..\..\TenderPartition\tpSelectTenderDm.pas' {tpSelectTenderData: TDataModule},
+  tpSelectTenderNode in '..\..\TenderPartition\tpSelectTenderNode.pas',
+  tpSelectTendersFrm in '..\..\TenderPartition\tpSelectTendersFrm.pas' {SelectTendersForm},
+  tpTrialPegInputFrm in '..\..\TenderPartition\tpTrialPegInputFrm.pas' {TrialPegInputForm},
+  mPegFilter in '..\..\Units\mPegFilter.pas';
 
 {$R *.res}
 
@@ -169,8 +194,7 @@ begin
     begin
       HideWelcome;
       Application.CreateForm(TMainForm, MainForm);
-  Application.CreateForm(TProgressProForm, ProgressProForm);
-  end
+    end
     else  HideWelcome;
     Application.Run;
   end;

BIN
Dprs/Trail/Measure_GuangDong.res


+ 1 - 1
Forms/FindUserFrm.pas

@@ -152,7 +152,7 @@ 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.AddNewChecker(cftChecker, StrToInt(UserArr[4]), UserArr[1], UserArr[2], UserArr[3], PicPath, '', csNotBegin);
     vOwner.RepairOrder;
     vOwner.RepairDelete(True);
   end;

+ 2 - 0
Forms/IPFrm.pas

@@ -75,11 +75,13 @@ begin
 
     G_Server := sIP;
     G_CompanyName := sN;
+
     ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Cloud.ini');
     try
       ini.WriteString('URL', 'Server', sIP);
       ini.WriteString('URL', 'CompanyName', sN);
       ini.WriteString('URL', 'LoginCloudURL', 'http://' + sIP);
+      PHPWeb.LoginCloudURL := 'http://' + sIP;
     finally
       ini.Free;
     end;

+ 1 - 1
Forms/LoginFrm.dfm

@@ -35767,7 +35767,7 @@ object LoginFrm: TLoginFrm
       Width = 52
       Height = 19
       Cursor = crHandPoint
-      Caption = #20351#29992#24110#21161
+      Caption = #21160#30011#25945#31243
       Font.Charset = DEFAULT_CHARSET
       Font.Color = 12615680
       Font.Height = -13

+ 3 - 0
Forms/LoginFrm.pas

@@ -119,6 +119,7 @@ begin
     G_Server := ini.ReadString('URL', 'Server', '');
     G_ServerType := ini.ReadString('URL', 'ServerType', '');
     G_CompanyName := ini.ReadString('URL', 'CompanyName', '');
+    G_GuideURL := ini.ReadString('URL', 'GuideURL', '');
     G_MeasureURL := 'http://' + G_Server + ini.ReadString('URL', 'MeasureURL', '');
   finally
     ini.Free;
@@ -135,6 +136,8 @@ begin
     pnlLocalServer.Visible := True;
     lblLocalServer.URL := G_Server;
     lblLocalServer.Hint := G_Server;
+    lblLocalHelp.URL := G_GuideURL;
+    lblLocalHelp.Hint := G_GuideURL;
   end
   else if G_ServerType = '1' then
   begin

+ 19 - 18
Forms/MainFrm.dfm

@@ -1,6 +1,6 @@
 object MainForm: TMainForm
-  Left = 544
-  Top = 226
+  Left = 226
+  Top = 190
   Width = 750
   Height = 538
   ActiveControl = jpsMainProjectsManager
@@ -20,8 +20,8 @@ object MainForm: TMainForm
   TextHeight = 12
   object jtsProjects: TJimTabSet
     Left = 0
-    Top = 48
-    Width = 742
+    Top = 49
+    Width = 734
     Height = 21
     Align = alTop
     BackgroundColor = clGradientInactiveCaption
@@ -45,8 +45,8 @@ object MainForm: TMainForm
   end
   object dxStatusBar: TdxStatusBar
     Left = 0
-    Top = 484
-    Width = 742
+    Top = 480
+    Width = 734
     Height = 20
     Panels = <
       item
@@ -78,12 +78,12 @@ object MainForm: TMainForm
     object dxStatusBarContainer2: TdxStatusBarContainerControl
       Left = 604
       Top = 2
-      Width = 136
+      Width = 128
       Height = 16
       object ProgressBar: TProgressBar
         Left = 0
         Top = 0
-        Width = 136
+        Width = 128
         Height = 16
         Align = alClient
         Max = 200
@@ -93,9 +93,9 @@ object MainForm: TMainForm
   end
   object jpsMain: TJimPages
     Left = 0
-    Top = 69
-    Width = 742
-    Height = 415
+    Top = 70
+    Width = 734
+    Height = 410
     ActivePage = jpsMainProjectsManager
     ActivePageIndex = 0
     Align = alClient
@@ -103,8 +103,8 @@ object MainForm: TMainForm
     object jpsMainProjectsManager: TJimPage
       Left = 0
       Top = 0
-      Width = 742
-      Height = 415
+      Width = 734
+      Height = 410
       TabName = 'ProjectsManager'
       Caption = 'ProjsMgr'
       object pnlUser: TPanel
@@ -201,8 +201,8 @@ object MainForm: TMainForm
     object jpsMainProjects: TJimPage
       Left = 0
       Top = 0
-      Width = 742
-      Height = 415
+      Width = 734
+      Height = 410
       TabName = 'Projects'
       Caption = 'Projects'
       object jpsProjects: TJimPages
@@ -220,7 +220,7 @@ object MainForm: TMainForm
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -12
-    Font.Name = #23435#20307
+    Font.Name = #24494#36719#38597#40657
     Font.Style = []
     Bars = <
       item
@@ -270,7 +270,7 @@ object MainForm: TMainForm
         Caption = #24037#20855#26639
         DockedDockingStyle = dsTop
         DockedLeft = 0
-        DockedTop = 26
+        DockedTop = 27
         DockingStyle = dsTop
         FloatLeft = 484
         FloatTop = 279
@@ -379,7 +379,7 @@ object MainForm: TMainForm
     DockControlHeights = (
       0
       0
-      48
+      49
       0)
     object dxsiFile: TdxBarSubItem
       Caption = #25991#20214'(&F)'
@@ -1031,6 +1031,7 @@ object MainForm: TMainForm
       Caption = #24635#37327#25511#21046#26684#24335
       Category = 0
       Hint = #24635#37327#25511#21046#26684#24335
+      Visible = ivAlways
     end
     object dxbtnInsertCol: TdxBarButton
       Caption = #26032#22686#19968#21015

+ 13 - 9
Forms/MainFrm.pas

@@ -204,7 +204,7 @@ type
     procedure UpdateProgressBar(APosition: Integer);
     procedure UpdateProgressHint(const AHint: string);
 
-    procedure CreateProjectView(ARec: TsdDataRecord);
+    function CreateProjectView(ARec: TsdDataRecord): TProjectFrame;
 
     procedure LocateProjectView(AIndex: Integer);
     procedure DeleteProjectView(AIndex: Integer);
@@ -217,7 +217,7 @@ type
     procedure UpdateProgress(APos: Integer; const AHint: string);
     procedure LocateProject(AProjectID: Integer);
     function HasOpened(AProjectID: Integer): Boolean;
-    procedure OpenProject(ARec: TsdDataRecord);
+    function OpenProject(ARec: TsdDataRecord): TProjectFrame;
 
     property CurProjectFrame: TProjectFrame read GetCurProjectFrame;
     property ProjectManagerFrame: TProjectManagerFrame read FProjectManagerFrame;
@@ -361,12 +361,15 @@ begin
   FProjectManagerFrame.Free;
 end;
 
-procedure TMainForm.OpenProject(ARec: TsdDataRecord);
+function TMainForm.OpenProject(ARec: TsdDataRecord): TProjectFrame;
 begin
   if not HasOpened(ARec.ValueByName('ID').AsInteger) then
-    CreateProjectView(ARec)
+    Result := CreateProjectView(ARec)
   else
+  begin
     LocateProject(ARec.ValueByName('ID').AsInteger);
+    Result := CurProjectFrame;
+  end;
 end;
 
 function TMainForm.HasOpened(AProjectID: Integer): Boolean;
@@ -381,7 +384,7 @@ begin
     jpsMain.ActivePage := jpsMainProjects;
 end;
 
-procedure TMainForm.CreateProjectView(ARec: TsdDataRecord);
+function TMainForm.CreateProjectView(ARec: TsdDataRecord): TProjectFrame;
 
   function CreateNewProjectPage: TJimPage;
   begin
@@ -396,7 +399,7 @@ procedure TMainForm.CreateProjectView(ARec: TsdDataRecord);
     jtsProjects.TabIndex := Result;
   end;
 
-  procedure CreateProjectFrame(AProjectData: TProjectData; APage: TJimPage);
+  function CreateProjectFrame(AProjectData: TProjectData; APage: TJimPage): TProjectFrame;
   var
     ProjectFrame: TProjectFrame;
   begin
@@ -404,6 +407,7 @@ procedure TMainForm.CreateProjectView(ARec: TsdDataRecord);
     FProjectFrames.Add(ProjectFrame);
     ProjectFrame.Parent := APage;
     ProjectFrame.Align := alClient;
+    Result := ProjectFrame;
   end;
 
 var
@@ -412,7 +416,7 @@ begin
   jpsMain.ActivePage := jpsMainProjects;
   jimPage := CreateNewProjectPage;
   CreateNewProjectTab(ARec.ValueByName('Name').AsString, jimPage);
-  CreateProjectFrame(OpenProjectManager.Open(ARec), jimPage);
+  Result := CreateProjectFrame(OpenProjectManager.Open(ARec), jimPage);
   ProjectManager.AddOpenTenderBackup(ARec.ValueByName('ID').AsInteger);
 end;
 
@@ -453,7 +457,7 @@ end;
 procedure TMainForm.jtsProjectsMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
-  if Button = mbRight then
+  if (Button = mbRight) and (jtsProjects.TabIndex > 0) then
     dxpmTabSet.PopupFromCursorPos;
 end;
 
@@ -735,7 +739,7 @@ begin
   // 导出前先保存
   CurProjectFrame.ProjectData.Save;
   // 导出云版专用
-  sFileName := SupportManager.ConfigInfo.OutputPath + CurProjectFrame.ProjectData.ProjectName;
+  sFileName := SupportManager.ConfigInfo.OutputPath + CurProjectFrame.ProjectData.ProjectName + '.ctf';
   if SaveFile(sFileName, '.ctf') then
   begin
     if FileExists(sFileName) and not QuestMessage(Format('存在同名文件“%s”,是否替换?', [ExtractFileName(sFileName)])) then

+ 4 - 5
Forms/ReportsFrm.dfm

@@ -1,6 +1,6 @@
 object ReportsForm: TReportsForm
-  Left = 239
-  Top = 237
+  Left = 180
+  Top = 198
   Align = alClient
   BorderIcons = [biSystemMenu]
   BorderStyle = bsSingle
@@ -14,8 +14,7 @@ object ReportsForm: TReportsForm
   Font.Name = #23435#20307
   Font.Style = []
   OldCreateOrder = False
-  Position = poDefault
-  WindowState = wsMaximized
+  Position = poMainFormCenter
   PixelsPerInch = 96
   TextHeight = 12
   object pnlPaperSize: TPanel
@@ -61,7 +60,7 @@ object ReportsForm: TReportsForm
     Width = 223
     Height = 25
     BevelInner = bvLowered
-    TabOrder = 3
+    TabOrder = 1
     object chkExcelMode: TCheckBox
       Left = 6
       Top = 4

+ 18 - 12
Forms/ReportsFrm.pas

@@ -98,6 +98,8 @@ type
     FbNormal : Boolean;
     FDisplayCount: Integer;
 
+    FLockForm: Boolean;
+
     procedure InitPageSettings;
     procedure InitFont;
     procedure InitPaperSettings;
@@ -156,6 +158,8 @@ type
     property PageCount: Integer read GetPageCount;
     property ExcelMode: TOutputExcelMode read GetExcelMode;
     property IsExcel2010: Boolean read GetIsExcel2010;
+
+    property LockForm: Boolean read FLockForm write FLockForm;
   end;
 
   procedure DisplayReportsForm(AProjectData: TProjectData);
@@ -164,7 +168,7 @@ implementation
 
 uses
   UtilMethods, Math, DirectPrintUnit, Globals, ZhAPI, ReportAdjustFrm,
-  Contnrs, mEncryptUnit, Printers, WinSpool;
+  Contnrs, mEncryptUnit, Printers, WinSpool, MainFrm, ConstUnit;
 
 {$R *.dfm}
 
@@ -173,6 +177,8 @@ var
   ReportsForm: TReportsForm;
 begin
   ReportsForm := TReportsForm.Create(nil);
+  {ReportsForm.BorderIcons := ReportsForm.BorderIcons - [biMaximize];
+  ReportsForm.WindowState := wsMaximized;}
   ReportsForm.ProjectData := AProjectData;
   ReportsForm.InitReportSettings;
   ReportsForm.InitFormView;
@@ -235,7 +241,7 @@ procedure TReportsForm.LoadTempletAndDisplay;
   var
     OldBrushColor, OldPenColor: TColor;
   begin
-    Application.MessageBox(PChar(AStr), '注意', MB_OK or MB_ICONINFORMATION);
+    TipMessage(AStr, Handle);
     OldBrushColor := PreviewBox.Canvas.Brush.Color;
     OldPenColor := PreviewBox.Canvas.Pen.Color;
     try
@@ -450,10 +456,10 @@ end;
 
 procedure TReportsForm.xlbPrintCurPageClick(Sender: TObject);
 begin
-  if _IsEncrypt then
+  if _IsEncrypt or G_IsCloud then
     PreviewComXML.Print(CurPage, 1)
   else
-    TipMessage(GetHintStr);
+    TipMessage(GetHintStr, Handle);
 end;
 
 procedure TReportsForm.xcbStartPageChange(Sender: TObject);
@@ -467,7 +473,7 @@ end;
 
 procedure TReportsForm.xlbPrintClick(Sender: TObject);
 begin
-  if _IsEncrypt then
+  if _IsEncrypt or G_IsCloud then
   begin
     if extvReport.LeafCheckedCount > 0 then
       PrintAllSelectedReports
@@ -475,7 +481,7 @@ begin
       PreviewComXML.PrintMultiPages(PrintStartPage, PrintEndPage);
   end
   else
-    TipMessage(GetHintStr);
+    TipMessage(GetHintStr, Handle);
 end;
 
 procedure TReportsForm.PrintAllSelectedReports;
@@ -498,7 +504,7 @@ end;
 
 procedure TReportsForm.xlbToPDFClick(Sender: TObject);
 begin
-  if _IsEncrypt then
+  if _IsEncrypt or G_IsCloud then
   begin
     if extvReport.LeafCheckedCount > 0 then
       ExportAllSelectedPDFReports
@@ -506,7 +512,7 @@ begin
       PreviewComXML.PrintPDF(PrintStartPage, PrintEndPage);
   end
   else
-    TipMessage(GetHintStr);
+    TipMessage(GetHintStr, Handle);
 end;
 
 procedure TReportsForm.ExportAllSelectedPDFReports;
@@ -528,7 +534,7 @@ end;
 
 procedure TReportsForm.xlbToExcelClick(Sender: TObject);
 begin
-  if _IsEncrypt then
+  if _IsEncrypt or G_IsCloud then
   begin
     if extvReport.LeafCheckedCount > 0 then
       ExportAllSelectedXlsReports
@@ -536,7 +542,7 @@ begin
       ExportCurXlsReport;
   end
   else
-    TipMessage(GetHintStr);
+    TipMessage(GetHintStr, Handle);
 end;
 
 procedure TReportsForm.ExportAllSelectedXlsReports;
@@ -659,7 +665,7 @@ begin
       AddReportTemplate(vTemplateNode);
     end
     else
-      if QuestMessage('已存在报表模板' + ExtractFileName(sFileName) + ',是否覆盖原模板?') then
+      if QuestMessage('已存在报表模板' + ExtractFileName(sFileName) + ',是否覆盖原模板?', Handle) then
         CopyFile(PChar(sFileName), PChar(sNewFileName), False)
       else
         Exit;
@@ -690,7 +696,7 @@ begin
   sFileName := vTemplateNode.TemplateName;
   if SaveFile(sFileName, '.srt') then
   begin
-    if not FileExists(sFileName) or QuestMessage('存在同名文件,是否覆盖?') then
+    if not FileExists(sFileName) or QuestMessage('存在同名文件,是否覆盖?', Handle) then
       CopyFile(PChar(vTemplateNode.FileName), PChar(sFileName), False);
   end;
 end;

+ 25 - 20
Forms/mProgressProFrm.dfm

@@ -1,10 +1,10 @@
 object ProgressProForm: TProgressProForm
-  Left = 1179
-  Top = 324
+  Left = 853
+  Top = 419
   BorderIcons = []
   BorderStyle = bsNone
   Caption = #25552#31034
-  ClientHeight = 236
+  ClientHeight = 181
   ClientWidth = 428
   Color = clWindow
   Font.Charset = DEFAULT_CHARSET
@@ -21,7 +21,7 @@ object ProgressProForm: TProgressProForm
     Left = 0
     Top = 0
     Width = 428
-    Height = 236
+    Height = 181
     Align = alClient
     Brush.Style = bsClear
     OnMouseDown = Shape1MouseDown
@@ -54,6 +54,27 @@ object ProgressProForm: TProgressProForm
     Font.Style = []
     ParentFont = False
   end
+  object lblHint1: TLabel
+    Left = 16
+    Top = 120
+    Width = 395
+    Height = 17
+    AutoSize = False
+  end
+  object lblHint2: TLabel
+    Left = 16
+    Top = 136
+    Width = 395
+    Height = 17
+    AutoSize = False
+  end
+  object lblHint3: TLabel
+    Left = 16
+    Top = 152
+    Width = 395
+    Height = 17
+    AutoSize = False
+  end
   object lblPercent: TLabel
     Left = 336
     Top = 84
@@ -69,20 +90,4 @@ object ProgressProForm: TProgressProForm
     Font.Style = [fsBold]
     ParentFont = False
   end
-  object mmTask: TMemo
-    Left = 16
-    Top = 125
-    Width = 393
-    Height = 104
-    TabStop = False
-    BorderStyle = bsNone
-    Font.Charset = DEFAULT_CHARSET
-    Font.Color = clGray
-    Font.Height = -12
-    Font.Name = #24494#36719#38597#40657
-    Font.Style = []
-    ParentFont = False
-    ReadOnly = True
-    TabOrder = 0
-  end
 end

+ 64 - 14
Forms/mProgressProFrm.pas

@@ -21,7 +21,9 @@ type
     Gauge1: TGauge;
     lblTitle: TLabel;
     lblPercent: TLabel;
-    mmTask: TMemo;
+    lblHint1: TLabel;
+    lblHint2: TLabel;
+    lblHint3: TLabel;
     procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
   private
@@ -35,9 +37,10 @@ type
 
 procedure ProgressProCreate(AMaxValue: Integer = 100; ATitle: string = '正在处理请稍候>>>');
 procedure ProgressProFree;
-procedure ProgressProRun(AMemoValue: string; APosValue: Integer = 10;
-                         AMemoType: TProgressMemoType = pmtAdd; APosType: TProgressPosType = pptAdd);
+procedure ProgressProRun(AText: string; APos: Integer = 10;
+                         ATextType: TProgressMemoType = pmtAdd; APosType: TProgressPosType = pptAdd);
 procedure ProgressProTitle(ATitle: string);
+function ProgressProHandle: THandle;
 
 var
   ProgressProForm: TProgressProForm = nil;
@@ -79,33 +82,73 @@ begin
   end;
 end;
 
-procedure ProgressProRun(AMemoValue: string; APosValue: Integer;
-                         AMemoType: TProgressMemoType; APosType: TProgressPosType);
+procedure ProgressProRun(AText: string; APos: Integer;
+                         ATextType: TProgressMemoType; APosType: TProgressPosType);
 begin
   if ProgressProForm = nil then Exit;
   with ProgressProForm do
   begin
     if APosType = pptAdd then
-      Gauge1.Progress := Gauge1.Progress + APosValue
+      Gauge1.Progress := Gauge1.Progress + APos
     else if APosType = pptSet then
-      Gauge1.Progress := APosValue;
+      Gauge1.Progress := APos;
 
     if Gauge1.Progress > Gauge1.MaxValue then     // 如果算得不对,缩回5格
       Gauge1.Progress := Gauge1.MaxValue - 2;
 
     lblPercent.Caption := IntToStr(Gauge1.PercentDone) + '%';
 
-    if (AMemoType <> pmtNo) or (AMemoValue <> '') then
+    if (ATextType <> pmtNo) or (AText <> '') then
     begin
-      with mmTask.Lines do
+      if ATextType = pmtAdd then
       begin
-        if (AMemoType = pmtEdit) and (Count > 0) then
-          Delete(Count - 1);
-        Add(AMemoValue);
+        if lblHint1.Caption = '' then
+        begin
+          lblHint1.Caption := AText;
+          lblHint1.Update;
+        end
+        else if lblHint2.Caption = '' then
+        begin
+          lblHint2.Caption := AText;
+          lblHint2.Update;
+        end
+        else if lblHint3.Caption = '' then
+        begin
+          lblHint3.Caption := AText;
+          lblHint3.Update;
+        end
+        else
+        begin
+          lblHint1.Caption := lblHint2.Caption;
+          lblHint2.Caption := lblHint3.Caption;
+          lblHint3.Caption := AText;
+          lblHint1.Update;
+          lblHint2.Update;
+          lblHint3.Update;
+        end;
+      end
+      else if ATextType = pmtEdit then
+      begin
+        if (lblHint1.Caption = '') or (lblHint2.Caption = '') then
+        begin
+          lblHint1.Caption := AText;
+          lblHint1.Update;
+        end
+        else if lblHint3.Caption = '' then
+        begin
+          lblHint2.Caption := AText;
+          lblHint2.Update;
+        end
+        else
+        begin
+          lblHint3.Caption := AText;
+          lblHint3.Update;
+        end;
       end;
+
     end;
 
-    Update;
+//    Update;
   end;
 end;
 
@@ -115,10 +158,17 @@ begin
   with ProgressProForm do
   begin
     lblTitle.Caption := ATitle;
-    Update;
+    lblTitle.Update;
   end;
 end;
 
+function ProgressProHandle: THandle;
+begin
+  Result := 0;
+  if ProgressProForm <> nil then
+    Result := ProgressProForm.Handle;
+end;
+
 procedure TProgressProForm.Shape1MouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin

+ 1 - 3
Frames/BGLFme.dfm

@@ -127,11 +127,9 @@ object BGLFrame: TBGLFrame
         Selection.TransparentColor = False
         FrozenCol = 0
         FrozenRow = 0
+        OnCellTextChanged = zgBGLCellTextChanged
         OnCopy = zgBGLCopy
         OnPaste = zgBGLPaste
-        OnGetCellEditor = zgBGLGetCellEditor
-        OnEditorLoadCell = zgBGLEditorLoadCell
-        OnEditorSaveCell = zgBGLEditorSaveCell
         OnMouseDown = zgBGLMouseDown
         Align = alClient
       end

+ 11 - 0
Frames/BGLFme.pas

@@ -56,6 +56,7 @@ type
       AControl: TWinControl);
     procedure zgBGLEditorLoadCell(Sender: TObject; ACoord: TPoint;
       AControl: TWinControl);
+    procedure zgBGLCellTextChanged(Sender: TObject; Col, Row: Integer);
   private
     FBGLData: TBGLData;
 
@@ -237,4 +238,14 @@ begin
       cbbBGLType.Text := zaBGL.DataSet.FieldByName('BGLType').AsString;
 end;
 
+procedure TBGLFrame.zgBGLCellTextChanged(Sender: TObject; Col,
+  Row: Integer);
+begin
+  if Col = 6 then
+  begin
+    if (zgBGL.Cells[Col, Row].Text <> '') and (cbbBGLType.Items.IndexOf(zgBGL.Cells[Col, Row].Text) = -1) then
+      zgBGL.Cells[Col, Row].Text := '';
+  end;
+end;
+
 end.

+ 23 - 0
Frames/BillsCompileFme.dfm

@@ -642,6 +642,7 @@ object BillsCompileFrame: TBillsCompileFrame
       item
         Title.Caption = 'ID'
         Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 3
         Title.Font.Charset = GB2312_CHARSET
         Title.Font.Color = clWindowText
         Title.Font.Height = -12
@@ -661,6 +662,7 @@ object BillsCompileFrame: TBillsCompileFrame
       item
         Title.Caption = 'ParentID'
         Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 3
         Title.Font.Charset = GB2312_CHARSET
         Title.Font.Color = clWindowText
         Title.Font.Height = -12
@@ -680,6 +682,7 @@ object BillsCompileFrame: TBillsCompileFrame
       item
         Title.Caption = 'NextSiblingID'
         Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 3
         Title.Font.Charset = GB2312_CHARSET
         Title.Font.Color = clWindowText
         Title.Font.Height = -12
@@ -695,6 +698,26 @@ object BillsCompileFrame: TBillsCompileFrame
         Width = 50
         Visible = False
         ReadOnly = True
+      end
+      item
+        Title.Caption = 'ChapterParentID'
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 3
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'ChapterParentID'
+        Width = 50
+        Visible = False
+        ReadOnly = False
       end>
     Grid = zgBillsCompile
     ExtendRowCount = 3

+ 46 - 19
Frames/BillsCompileFme.pas

@@ -68,7 +68,11 @@ type
     procedure actnImportGclBillsToXmjExecute(Sender: TObject);
     procedure actnImportPlaneFxBillsToXmjExecute(Sender: TObject);
     procedure zgBillsCompileCellTextChanged(Sender: TObject; Col,
+<<<<<<< HEAD
       Row: Integer);    
+=======
+      Row: Integer);
+>>>>>>> 3.1.5
   private
     FBillsCompileData: TBillsCompileData;
     FShowIDField: Boolean;
@@ -173,7 +177,10 @@ begin
   if HasBillsBlockFormat then
   begin
     Allow := False;
-    PasteBillsBlock(stdBillsCompile.IDTree.Selected, ABounds);
+    if TProjectData(FBillsCompileData.ProjectData).CanInsertNormalBills then
+      PasteBillsBlock(stdBillsCompile.IDTree.Selected, ABounds)
+    else
+      TipMessage('当前标段未解锁,如需使用此功能,请先解锁标段');
   end;
 end;
 
@@ -310,13 +317,23 @@ end;
 procedure TBillsCompileFrame.actnBatchAddChildExecute(Sender: TObject);
 begin
   if CheckCompileEdition then
-    AddLeafBills(FBillsCompileData, itChild);
+  begin
+    if TProjectData(FBillsCompileData.ProjectData).CanInsertNormalBills then
+      AddLeafBills(FBillsCompileData, itChild)
+    else
+      TipMessage('当前标段未解锁,如需使用此功能,请先解锁标段');
+  end;
 end;
 
 procedure TBillsCompileFrame.actnBatchAddNextExecute(Sender: TObject);
 begin
   if CheckCompileEdition then
-    AddLeafBills(FBillsCompileData, itNextSibling);
+  begin
+    if TProjectData(FBillsCompileData.ProjectData).CanInsertNormalBills then
+      AddLeafBills(FBillsCompileData, itNextSibling)
+    else
+      TipMessage('当前标段未解锁,如需使用此功能,请先解锁标段');
+  end;
 end;
 
 procedure TBillsCompileFrame.actnBatchAddChildUpdate(Sender: TObject);
@@ -513,16 +530,21 @@ var
   sFileName: string;
   Importor: TGclBillsExcelImport;
 begin
-  if SelectFile(sFileName, '.xls') then
+  if TProjectData(FBillsCompileData.ProjectData).CanInsertNormalBills then
   begin
-    Importor := TGclBillsExcelImport.Create(TProjectData(FBillsCompileData.ProjectData));
-    try
-      Importor.ParentID := stdBillsCompile.IDTree.Selected.ID;
-      Importor.ImportFile(sFileName);
-    finally
-      Importor.Free;
+    if SelectFile(sFileName, '.xls') then
+    begin
+      Importor := TGclBillsExcelImport.Create(TProjectData(FBillsCompileData.ProjectData));
+      try
+        Importor.ParentID := stdBillsCompile.IDTree.Selected.ID;
+        Importor.ImportFile(sFileName);
+      finally
+        Importor.Free;
+      end;
     end;
-  end;
+  end
+  else
+    TipMessage('当前标段未解锁,如需使用此功能,请先解锁标段');
 end;
 
 procedure TBillsCompileFrame.ExpandNodeTo(ALevel: Integer);
@@ -594,16 +616,21 @@ var
   sFileName: string;
   Importor: TPlaneFxBillsExcelImport;
 begin
-  if SelectFile(sFileName, '.xls') then
+  if TProjectData(FBillsCompileData.ProjectData).CanInsertNormalBills then
   begin
-    Importor := TPlaneFxBillsExcelImport.Create(TProjectData(FBillsCompileData.ProjectData));
-    try
-      Importor.ParentID := stdBillsCompile.IDTree.Selected.ID;
-      Importor.ImportFile(sFileName);
-    finally
-      Importor.Free;
+    if SelectFile(sFileName, '.xls') then
+    begin
+      Importor := TPlaneFxBillsExcelImport.Create(TProjectData(FBillsCompileData.ProjectData));
+      try
+        Importor.ParentID := stdBillsCompile.IDTree.Selected.ID;
+        Importor.ImportFile(sFileName);
+      finally
+        Importor.Free;
+      end;
     end;
-  end;
+  end
+  else
+    TipMessage('当前标段未解锁,如需使用此功能,请先解锁标段');
 end;
 
 procedure TBillsCompileFrame.ExpandPegXmjNode;

+ 1 - 1
Frames/BillsGatherFme.dfm

@@ -266,7 +266,7 @@ object BillsGatherFrame: TBillsGatherFrame
         Font.Height = -12
         Font.Name = #23435#20307
         Font.Style = []
-        FieldName = 'Pos'
+        FieldName = 'Peg'
         Width = 180
         ReadOnly = True
       end

+ 6 - 6
Frames/BillsMeasureFme.pas

@@ -190,14 +190,14 @@ end;
 procedure TBillsMeasureFrame.zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
   var AColor: TColor);
 var
-  stnNode: TBillsIDTreeNode;
+  stnNode: TMeasureBillsIDTreeNode;
   iCreatePhaseID: Integer;
   StageRec: TStageRecord;
   fDiffer: Double;
 begin
   AColor := clWindow;
   if ACoord.Y > stdBillsMeasure.IDTree.Count + 1 then Exit;
-  stnNode := TBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
+  stnNode := TMeasureBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
   if not Assigned(stnNode) then Exit;
   iCreatePhaseID := stnNode.Rec.CreatePhaseID.AsInteger;
   // ¸ù¾Ý²ã´Îµ×É«²»Í¬
@@ -299,7 +299,7 @@ procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
     StageRec: TStageRecord;
   begin
     if not Assigned(ANode) then Exit;
-    StageRec := TBillsIDTreeNode(ANode).StageRec;
+    StageRec := TMeasureBillsIDTreeNode(ANode).StageRec;
     try
       if Assigned(StageRec) then
       begin
@@ -316,7 +316,7 @@ procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
         if not Assigned(StageRec) then
         begin
           StageRec := FBillsMeasureData.StageData.AddStageRecord(ANode.ID);
-          TBillsIDTreeNode(ANode).StageRec := StageRec;
+          TMeasureBillsIDTreeNode(ANode).StageRec := StageRec;
         end;
         StageRec.ValueByName(AType + AField).AsFloat := vNewBGL.TotalNum;
         StageRec.ValueByName(AType + 'BGLCode').AsString := vNewBGL.MergedCode;
@@ -433,10 +433,10 @@ end;
 
 procedure TBillsMeasureFrame.actnSetStageBookmarkExecute(Sender: TObject);
 var
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
   StageRec: TStageRecord;
 begin
-  vNode := TBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
+  vNode := TMeasureBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
   StageRec := vNode.StageRec;
   if not Assigned(StageRec) then
   begin

+ 6 - 8
Frames/CheckerFme.pas

@@ -47,8 +47,7 @@ type
     procedure Init;
     // 审核人的名字、职位、公司、图像
     procedure AddNewChecker(AType: TCheckerFrameType; AID: Integer; AName,
-      ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus;
-      ACheckeTime: string; ACheckeOnLine: Integer);
+      ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
     function InCheckerList(ACheckerID: Integer): Boolean;
     function HasNormalChecker: Boolean;        // 有普通审核人就返回True(光有业主不算)
     function HasChecker: Boolean;              // 列表不为空即返回True(光Add也算)
@@ -71,13 +70,12 @@ uses FindUserFrm, PHPWebDm, ProjectData, CslJson, ConstUnit, ProjectFme;
 {$R *.dfm}
 
 procedure TCheckerFrame.AddNewChecker(AType: TCheckerFrameType; AID: Integer;
-  AName, ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus;
-  ACheckeTime: string; ACheckeOnLine: Integer);
+  AName, ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
 var vChecker: TOrderCheckerFrame;
 begin
   vChecker := TOrderCheckerFrame.Create(Self);
   vChecker.Owner := Self;
-  vChecker.Init(AType, AID, AName, ARole, ACompany, AImagePath, ACheckerMemo, ACheckStatus, ACheckeTime, ACheckeOnLine);
+  vChecker.Init(AType, AID, AName, ARole, ACompany, AImagePath, ACheckerMemo, ACheckStatus);
 
   sbChecker.Height := sbChecker.Height + vChecker.Height;
   vChecker.Parent := sbChecker;
@@ -174,15 +172,15 @@ begin
          因为无法得知当前项目是数据库中已存在的最新一期还是仅存于本地尚末入库
          的最新一期。改由添加的位置给出提示}
          if (TProjectData(ProjectData).PhaseIndex > 0) and (not TProjectFrame(Owner).IsUped) then
-           AddNewChecker(cftAdd, -1, '', '', '', '', '', csNotBegin, '', -1);
+           AddNewChecker(cftAdd, -1, '', '', '', '', '', csNotBegin);
         end;
 
         AddNewChecker(cftOwner, StrToInt(sID),
-          vA[i, 0], vA[i, 2], vA[i, 1], sPicPath, vA[i, 6], vStatus, vA[i, 8], StrToInt(vA[i, 7]));
+          vA[i, 0], vA[i, 2], vA[i, 1], sPicPath, vA[i, 6], vStatus);
       end
       else
         AddNewChecker(cftChecker, StrToInt(vA[i, 4]),
-          vA[i, 0], vA[i, 2], vA[i, 1], sPicPath, vA[i, 6], vStatus, vA[i, 8], StrToInt(vA[i, 7]));
+          vA[i, 0], vA[i, 2], vA[i, 1], sPicPath, vA[i, 6], vStatus);
 
       vCM := TChecker.Create;
       vProj.Checkers.Add(StrToInt(vA[i, 4]), vA[i, 0], vA[i, 2], vA[i, 6]);

+ 1 - 8
Frames/OrderCheckerFme.dfm

@@ -327,7 +327,7 @@ object OrderCheckerFrame: TOrderCheckerFrame
       Pen.Style = psDot
     end
     object lblOrderStatus: TLabel
-      Left = 269
+      Left = 266
       Top = 23
       Width = 76
       Height = 26
@@ -384,13 +384,6 @@ object OrderCheckerFrame: TOrderCheckerFrame
       ParentShowHint = False
       ShowHint = True
     end
-    object lblOrderCheckerTime: TLabel
-      Left = 253
-      Top = 8
-      Width = 94
-      Height = 19
-      Caption = '['#26102#38388']['#32447#19979#23457#26680']'
-    end
     object btnDelete: TCslButton
       Left = 336
       Top = 30

+ 11 - 9
Frames/OrderCheckerFme.pas

@@ -43,7 +43,6 @@ type
     imgNotPass: TImage;
     btnDelete: TCslButton;
     lblOrderCheckerMemo: TLabel;
-    lblOrderCheckerTime: TLabel;
     procedure shpAddMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure btnDeleteClick(Sender: TObject);
@@ -56,8 +55,6 @@ type
     FCheckStatus: TCheckStatus;
     FUserRole: string;
     FCheckerMemo: string;
-    FCheckeOnLine: Integer;
-    FCheckeTime: string;
     procedure SetOrder(const Value: Integer);
     procedure SetCheckStatus(const Value: TCheckStatus);
     procedure SetCheckerMemo(const Value: string);
@@ -67,8 +64,7 @@ type
   public
     { Public declarations }
     procedure Init(AType: TCheckerFrameType; AID: Integer; AName, ARole,
-    ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus;
-    ACheckeTime: string; ACheckeOnLine: Integer);
+    ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
     function IsMe(AID: Integer; AName: string): string;
     function IsChecking: Boolean;
     function IsFinished: Boolean;
@@ -82,8 +78,11 @@ type
     property CheckerFrameType: TCheckerFrameType read FCheckerFrameType write FCheckerFrameType;   // 审核人类型
     property CheckStatus: TCheckStatus read FCheckStatus write SetCheckStatus;     // 审核状态
     property CheckerMemo: string read FCheckerMemo write SetCheckerMemo;           // 审核意见
+<<<<<<< HEAD
     property CheckeTime: string read FCheckeTime write SetCheckeTime;
     property CheckeOnLine: Integer read FCheckeOnLine write FCheckeOnLine;  // 0 线下审批(默认);1 线上审批。
+=======
+>>>>>>> 3.1.5
   end;
 
 implementation
@@ -96,10 +95,8 @@ uses FindUserFrm, CheckerFme, PHPWebDm, ProjectData, ProjectFme,
 { TOrderCheckerFrame }
 
 procedure TOrderCheckerFrame.Init(AType: TCheckerFrameType; AID: Integer;
-  AName, ARole, ACompany, AImagePath, ACheckerMemo: string;
-  ACheckStatus: TCheckStatus; ACheckeTime: string; ACheckeOnLine: Integer);
+  AName, ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
 var bAdd, bOwner: Boolean;
-  sOnLine: string;
 begin
   bAdd := AType = cftAdd;
   shpAdd.Visible := bAdd;
@@ -117,6 +114,7 @@ begin
   CheckerFrameType := AType;
   CheckStatus := ACheckStatus;
 
+<<<<<<< HEAD
   lblOrderStatus.Visible := not bAdd;
   if lblOrderStatus.Visible then
     RightAlign(lblOrderStatus);
@@ -125,6 +123,8 @@ begin
   if lblOrderCheckerTime.Visible then
     RightAlign(lblOrderCheckerTime);
 
+=======
+>>>>>>> 3.1.5
   case AType of
     cftChecker, cftOwner:
     begin
@@ -136,6 +136,7 @@ begin
       lblOrderCheckerRole.Caption := ARole;
       lblOrderCheckerCompany.Caption := ACompany;
 
+<<<<<<< HEAD
       if CheckStatus in [csFinished, csNotPass] then
       begin
         CheckeOnLine := ACheckeOnLine;
@@ -147,6 +148,8 @@ begin
         CheckeTime := Format('[%s][%s]', [ACheckeTime, sOnLine]);
       end;
 
+=======
+>>>>>>> 3.1.5
       CheckerMemo := RecoverCharsFromJson(ACheckerMemo);
       if FileExists(AImagePath) then
         imgOrderCheckerPic.Picture.LoadFromFile(AImagePath)
@@ -192,7 +195,6 @@ begin
   lblOrderStatus.Font.Color := vColor;
   lblLast.Font.Color := vColor;
   lblOrderCheckerMemo.Font.Color := vColor;
-  lblOrderCheckerTime.Font.Color := vColor;
 //  cxHintStyleController1.HintStyle.Color := clWindow;        气泡Hint,很帅,但是有Bug,频繁操作时会出错,废弃不用,可惜!
 //  cxHintStyleController1.HintStyle.Font.Color := vColor;
 

+ 3 - 2
Frames/ProjectFme.dfm

@@ -222,6 +222,7 @@ object ProjectFrame: TProjectFrame
           Enabled = False
           ImageIndex = 6
           Style = tbsCheck
+          Visible = False
           OnClick = tobtnUpFileClick
         end
         object tobtnBookmark: TToolButton
@@ -2704,11 +2705,11 @@ object ProjectFrame: TProjectFrame
       object pnlProjectCheckStatus: TPanel
         Left = 526
         Top = 0
-        Width = 82
+        Width = 88
         Height = 21
         Align = alLeft
         BevelOuter = bvNone
-        Caption = #26412#26399#24050#23436#25104
+        Caption = #26412#26399#24050#23436#25104#21862
         Font.Charset = ANSI_CHARSET
         Font.Color = clGreen
         Font.Height = -13

+ 123 - 23
Frames/ProjectFme.pas

@@ -149,6 +149,7 @@ type
     function CheckersHint: string;
     procedure SetUpFileManageView(const Value: TUpFileManageView);
     procedure CheckUpFile;
+    procedure ShowPhaseHint;
   public
     constructor Create(AProjectData: TProjectData);
     destructor Destroy; override;
@@ -157,7 +158,7 @@ type
     procedure GeneratePhaseChooseList;
     procedure GenerateStageChooseList;
 
-    procedure CreateNewPhase;
+    function CreateNewPhase: Boolean;
     procedure CreateNewAudit;
 
     procedure RefreshColumnDisplay;
@@ -238,6 +239,7 @@ begin
 
   if G_IsCloud then
   begin
+    pnlProjectCheckStatus.Visible := True;
     // 0号台帐无审核人,网络读取会出错。所以只有在有计量的情况下才创建审核人
     if (ProjectData.PhaseIndex > 0) then
     begin
@@ -333,11 +335,12 @@ begin
   end;
 end;
 
-procedure TProjectFrame.CreateNewPhase;
+function TProjectFrame.CreateNewPhase: Boolean;
 var
   iBef: Integer;
   vArr: array of string;
 begin
+  Result := False;
   if QuestMessage('请检查合同支付的初始值,新增一期计量将锁定当前全部的清单数据,是否继续?') then
   begin
     // 网络版创建第二期、第三期等跟第一期有所不同:
@@ -381,6 +384,8 @@ begin
       ButtonControl_NewPhase;
       ButtonControl_UpToWeb;
     end;
+
+    Result := True;
   end;
 end;
 
@@ -800,10 +805,7 @@ begin
     btnPass.Left := jcbAudit.Left + jcbAudit.Width + 5;
     btnNotPass.Left := btnPass.Left + btnPass.Width + 1;
   end;
-  if Assigned(CheckerFrame) then
-    pnlProjectCheckStatus.Visible := CheckerFrame.OwnerFrame.CheckStatus = csFinished
-  else
-    pnlProjectCheckStatus.Visible := False;
+  ShowPhaseHint;
 
   if Assigned(FCheckerFrame) then
     FCheckerFrame.RepairDelete(btnSubmit.Visible and btnSubmit.Enabled);
@@ -885,7 +887,32 @@ begin
       if Application.MessageBox(PChar(CheckersHint), '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
         Exit;
 
+<<<<<<< HEAD
       if not SaveAndExport(1) then Exit;
+=======
+      ProgressProCreate(100, '本地数据文件上传到云端');
+      ProjectData.Save;
+      ProgressProRun('保存本地数据。OK');
+
+      // 生成无锁文件
+      vRec := MainForm.ProjectManagerFrame.Rec(ProjectData.ProjectID);
+      vExportor := TTenderExport.Create(vRec, sAppFile_UnLock);
+      try
+        vExportor.Execute;
+      finally
+        vExportor.Free;
+      end;
+      ProgressProRun('生成无锁文件。OK');
+      ProgressProRun('生成检验文件...', 0);
+      if not ProjectData.SubmitProject(sAppFile) then
+        if not ProjectData.SubmitProject(sAppFile) then
+        begin
+          bNeedFreeEarlier := True;
+          WarningMessage('Sorry!待审核文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
+          Exit;
+        end;
+      ProgressProRun('生成检验文件。OK', 10, pmtEdit);
+>>>>>>> 3.1.5
     end
     else if ProjectData.CurUserIsChecker then
     begin
@@ -909,7 +936,22 @@ begin
           Exit;
       end;
 
+<<<<<<< HEAD
       if not SaveAndExport(1) then Exit;
+=======
+      ProgressProCreate(100, '本地数据文件上传到云端');
+      ProjectData.Save;
+      ProgressProRun('保存本地数据。OK');
+      ProgressProRun('生成检验文件...', 0);
+      if not ProjectData.SubmitProject(sAppFile) then
+        if not ProjectData.SubmitProject(sAppFile) then
+        begin
+          bNeedFreeEarlier := True;
+          WarningMessage('Sorry!待审核文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
+          Exit;
+        end;
+      ProgressProRun('生成检验文件。OK', 10, pmtEdit);
+>>>>>>> 3.1.5
     end
     else if ProjectData.CurUserIsOwner then
     begin
@@ -929,11 +971,28 @@ begin
         else
           sCheckerMemo := vCF.Memo;
 
-        if Application.MessageBox(PChar(sNoPassedHint2), '询问', MB_OKCANCEL + MB_ICONQUESTION) = ID_CANCEL then
+        if not QuestMessage(sNoPassedHint2) then
           Exit;
       end;
 
+<<<<<<< HEAD
       if not SaveAndExport(2) then Exit;
+=======
+      ProgressProCreate(100, '本地数据文件上传到云端');
+      ProgressProRun('保存本地数据...', 0);
+      ProjectData.Save;
+      ProgressProRun('保存本地数据。OK', 10, pmtEdit);
+
+      ProgressProRun('生成检验文件...', 0);
+      if not ProjectData.ReplyProject(sAppFile) then
+        if not ProjectData.ReplyProject(sAppFile) then
+        begin
+          bNeedFreeEarlier := True;
+          WarningMessage('Sorry!批复文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
+          Exit;
+        end;
+      ProgressProRun('生成检验文件。OK', 10, pmtEdit);
+>>>>>>> 3.1.5
     end;
   finally
     vCF.Free;
@@ -942,26 +1001,34 @@ begin
   end;
 
   try
-    ProgressProRun('导出用于Web展示的清单、汇总数据等...', 0);
+    ProgressProRun('生成汇总数据...', 0);
     sJsonFile_Bills := ExtractFilePath(sAppFile) + 'JsonFile_Bills.json';
     sJsonFile_Common := ExtractFilePath(sAppFile) + 'JsonFile_Common.json';
     sMD5_JL := MD5_File(sAppFile);
     // 上传清单,每期都传,可覆盖旧的。
     ProjectData.ExportJson_Bills(sJsonFile_Bills);
     ProjectData.ExportJson_Common(sJsonFile_Common);
-    ProgressProRun('导出用于Web展示的清单、汇总数据等。OK', 10, pmtEdit);
+    ProgressProRun('生成汇总数据。OK', 10, pmtEdit);
 
 
+<<<<<<< HEAD
     ProgressProRun('生成并检验up数据包文件...', 0);
+=======
+    ProgressProRun('校验数据包...', 0);
+    if FileExists(sAppFile_UnLock) then    // 要在压缩前判断,压缩完会删除
+      iFile := 4
+    else
+      iFile := 3;
+>>>>>>> 3.1.5
 
     sZipFile := PHPWeb.zip([sAppFile, sJsonFile_Bills, sJsonFile_Common]);
 
     if not PHPWeb.CheckZip(sZipFile, 3) then
     begin
-      Application.MessageBox('up数据包文件无法通过检验请重试!如果重试后仍不能解决该问题,请联系纵横客服。', '提示', MB_OK + MB_ICONWARNING);
+      WarningMessage('up数据包文件无法通过检验请重试!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
       Exit;
     end;
-    ProgressProRun('生成并检验up数据包文件。OK', 10, pmtEdit);
+    ProgressProRun('校验数据包。OK', 10, pmtEdit);
     
     try
       ProgressProRun('上传数据包到云端...(温馨提示:请不要乱点哦,Windows容易死机)', 0);
@@ -969,7 +1036,7 @@ begin
         sZipFile, sMD5_JL, bSubmit, sResult, ACheckPassed, sCheckerMemo) then
       begin
         DeleteFile(sAppFile);
-        ProgressProRun('上传数据包到云端。OK', 90, pmtEdit, pptSet);
+        ProgressProRun('上传数据包到云端。OK', 100, pmtEdit, pptSet);
         if ProjectData.CurUserIsChecker then
           ProjectData.Checkers.FindByID(PHPWeb.UserID).Memo := sCheckerMemo;
 
@@ -1010,15 +1077,13 @@ begin
         FCheckerFrame.RepairDelete(False);
         btnPass.Enabled := False;
         btnNotPass.Enabled := btnPass.Enabled;
-        pnlProjectCheckStatus.Visible := CheckerFrame.OwnerFrame.CheckStatus = csFinished;
-
-        Application.MessageBox('^_^ 恭喜!数据已成功上传到云端服务器。', '提示', MB_OK + MB_ICONINFORMATION);
+        ShowPhaseHint;
+        TipMessage('^_^ 恭喜!数据已成功上传到云端服务器。', ProgressProHandle);
       end
       else
-        Application.MessageBox(PChar('数据上传失败请重试!服务器故障:' + sResult), '警告', MB_OK + MB_ICONWARNING);
+        WarningMessage('数据上传失败请重试!服务器故障:' + sResult, ProgressProHandle);
     except
-      Application.MessageBox(PChar('数据上传失败请重试!网络较差,数据文件无法送达云端:' +
-        sResult), '警告', MB_OK + MB_ICONWARNING);
+      WarningMessage('数据上传失败请重试!网络较差,数据文件无法送达云端:' + sResult, ProgressProHandle);
     end;
   finally
     ProgressProFree;
@@ -1066,9 +1131,9 @@ end;
 
 procedure TProjectFrame.btnNewPhaseClick(Sender: TObject);
 begin
+  if not CreateNewPhase then Exit;
   dxsbViewControl.SelectedItem := dxsbViewControl.Groups[0].Items[1];
   dxsbViewControl.OnItemClick(Sender, dxsbViewControl.Groups[0].Items[1]);
-  CreateNewPhase;
 end;
 
 procedure TProjectFrame.ButtonControl_NewPhase;
@@ -1238,10 +1303,10 @@ begin
     else
       Result := (iC = iNo);
   end
-  else
+  else    // 三种情况:①原报阶段,一个状态都没有 ②审核完成 ③审核不通过
   begin
     iNo := FCheckerFrame.CheckNo(csNotPass);
-    if iNo <> -1 then      // 审核不通过
+    if iNo <> -1 then      // 情况③,审核不通过
     begin
       if ProjectData.CurUserIsAuthor then
         Result := ((iC = 1) or (iC = iNo + 1))
@@ -1250,10 +1315,19 @@ begin
     end
     else
     begin
+      // 情况②,审核完成
       if FCheckerFrame.LastChecker.CheckStatus = csFinished then    // 最后一个人是审核完成
         Result := (iC = FCheckerFrame.List.Count + 1)
-      else    // 第一个人是末审核
-        Result := (iC = 1);
+      else
+      // 情况①,原报阶段,一个状态都没有
+      begin
+        if ProjectData.CurUserIsAuthor then   // 如果是原报,则只有一张表
+          Result := (iC = 1)
+        else
+        // 其它人时,原报尚末上传,表的数量是上一期的。
+        // 如果是打回,上一期的数量也是不固定的(中途打回)。反正这里只看不改,不限制。
+          Result := True;
+      end;
     end;
   end;
 end;
@@ -1425,4 +1499,30 @@ begin
   AlignControl(FPriceMarginFrame, jpsMainPriceMargin, alClient);
 end;
 
+procedure TProjectFrame.ShowPhaseHint;
+begin
+  pnlProjectCheckStatus.Caption := '';
+
+  if Assigned(CheckerFrame) then
+  begin
+    if CheckerFrame.FirstChecker.CheckStatus = csNotBegin then
+    begin
+      // 对于原报,要区分新建项目和打回重新开始两种情况。前者不能显示。
+      // 为了区分需要去服务器查询,势必影响速度。简单点,原报干脆不显示。
+      if not FProjectData.CurUserIsAuthor then
+      begin
+        pnlProjectCheckStatus.Caption := '本期重新开始';
+        pnlProjectCheckStatus.Font.Color := clRed;
+      end;
+    end
+    else if CheckerFrame.OwnerFrame.CheckStatus = csFinished then
+    begin
+      pnlProjectCheckStatus.Caption := '本期已完成';
+      pnlProjectCheckStatus.Font.Color := clGreen;
+    end;
+  end;
+
+  pnlProjectCheckStatus.Update;
+end;
+
 end.

+ 2 - 0
Frames/ProjectManagerFme.dfm

@@ -476,10 +476,12 @@ object ProjectManagerFrame: TProjectManagerFrame
       Caption = #23548#20986
       ImageIndex = 17
       OnExecute = actnExportExecute
+      OnUpdate = actnExportUpdate
     end
     object actnOpenBackupFolder: TAction
       Caption = #26597#30475#22791#20221#25968#25454
       OnExecute = actnOpenBackupFolderExecute
+      OnUpdate = actnOpenBackupFolderUpdate
     end
   end
   object dxpmProjectManager: TdxBarPopupMenu

+ 106 - 18
Frames/ProjectManagerFme.pas

@@ -88,6 +88,8 @@ type
     procedure actnRenameUpdate(Sender: TObject);
     procedure zgProjectsShowHint(var HintStr: String; var CanShow: Boolean;
       var HintInfo: THintInfo; const ACoord: TPoint);
+    procedure actnExportUpdate(Sender: TObject);
+    procedure actnOpenBackupFolderUpdate(Sender: TObject);
   private
     FProjectManagerData: TProjectManagerData;
 
@@ -168,8 +170,13 @@ implementation
 
 uses
   MainFrm, UtilMethods, ProjectCommands, Globals, ConfigDoc, ConstUnit,
+<<<<<<< HEAD
   WebNewTenderFrm, PHPWebDm, Math, mProgressFrm, ProgressHintFrm,
   ShellAPI;
+=======
+  WebNewTenderFrm, PHPWebDm, Math, CslJson, mProgressFrm, ProgressHintFrm,
+  ShellAPI, ProjectFme;
+>>>>>>> 3.1.5
 
 {$R *.dfm}
 
@@ -256,6 +263,7 @@ var
     sMD5_UnLock, sError, sLocalFile: string;
     iSearch, iFolderID, iSubFolderID: Integer;
 
+<<<<<<< HEAD
     function HasWebBidInfo(AWebID: Integer): Boolean;
     var vArr: array of string;
       iResult: Integer;
@@ -269,6 +277,11 @@ var
       else
         Result := False;
     end;
+=======
+    bLock, bCanImp: Boolean;
+    vFileCheck: TTenderFileChecker;
+
+>>>>>>> 3.1.5
   begin
     Result := False;
 
@@ -301,7 +314,45 @@ var
           case SearchFileOnline(sSearchURL, sDownURL, FWebFolder_OnLine, FWebSubFolder_OnLine, FWebBidName_OnLine, sMD5_UnLock, sError, iFolderID, iSubFolderID) of
             1:
             begin
+<<<<<<< HEAD
               if not FileDownAndReceive(sDownURL, 2) then Exit;
+=======
+              // 下载
+              sLocalFile := PHPWeb.UserPath + ExtractFileName(sDownURL);
+              if not PHPWeb.DownFile(sDownURL, sLocalFile) then
+              begin
+                sHint := '云端已找到原报上传的无锁文件,但因网络出错无法下载,本次操作已取消。请重试!';
+                Application.MessageBox(PChar(sHint), '警告', MB_OK + MB_ICONWARNING);
+                Exit;
+              end;
+
+
+              // 导入更新-------------------------------------------------------
+
+              // 导入前须检测无锁文件中仅含有原报数据
+              vFileCheck := TTenderFileChecker.Create;
+              try
+                // 有一期以上数据,且最新期数据审核状态为原报
+                bCanImp := vFileCheck.CheckFileValid(sLocalFile)
+                    and (vFileCheck.PhaseCount > 0) and (vFileCheck.AuditStatus = 0);
+                if not bCanImp then
+                begin
+                  Application.MessageBox(PChar('已从云端下载原报上传的无锁文件到本地,但文件有错误,禁止导入!请致电纵横服务人员以获取帮助。'), '警告', MB_OK + MB_ICONWARNING);
+                  Exit;
+                end;
+              finally
+                vFileCheck.Free;
+              end;
+
+              if not ImportFile(sLocalFile, sMD5) then
+              begin
+                Application.MessageBox(PChar('已从云端下载原报上传的无锁文件到本地,但导入失败!请重试。'), '警告', MB_OK + MB_ICONWARNING);
+                Exit;
+              end;
+              sHint := '【重要提示】:本期计量已重新开始,在本次上报完成前,请勿删除该标段或更换电脑。';
+              Application.MessageBox(PChar(sHint), '提示', MB_OK + MB_ICONINFORMATION);
+              // 导入更新---------------------------------↑↑↑↑↑↑↑↑↑↑↑
+>>>>>>> 3.1.5
             end;
 
             0, -1:
@@ -316,7 +367,7 @@ var
     end
     else if (iSearch = 10) then
     begin
-      if not HasWebBidInfo(FWebID) then
+      if not PHPWeb.ExistInServer(FWebID) then
       begin
         sHint :='该项目[' + FWebBidName_Local + ']在云端已被删除,点击"确定"后,可手动删除该项目。';
         Application.MessageBox(PChar(sHint), '提示', MB_OK + MB_ICONINFORMATION);
@@ -333,6 +384,8 @@ var
     Result := True;
   end;
 
+var
+  CurProjectFme: TProjectFrame;
 begin
   // 打开前先下载更新
   Screen.Cursor := crHourGlass;
@@ -354,10 +407,21 @@ begin
         Exit;
     end;
 
-    MainForm.OpenProject(vRec);
+    CurProjectFme := MainForm.OpenProject(vRec);
 
     if G_IsCloud then
     begin
+      // 云版,如果用户在打开项目的过程中,切换界面回项目管理,MainFrom.CurProjectFrame值为nil,后面的调用,包括MainForm.actnCloseProject.Execute都会出错
+      // 其中由于前面调用的MainForm.LocateProject触发的一系列事件中,调用到了SetPropertyVisible,其中执行了Screen.Cursor := crDefault
+      // 导致鼠标状态还原,用户可以点击,单机版下测试,属性状态为crHourGlass时,亦可以切换会项目管理
+      // 按逻辑,CheckFileAndCloudCheckerList这种方法不应在界面,应在控制器,亦不可直接调用MainForm.actnCloseProject.Execute
+      // 怕按逻辑改动引起更多Bug,故继续错下去,检查MainForm.CurProjectFrame是否正确,并再次禁用鼠标
+      if CurProjectFme <> MainForm.CurProjectFrame then
+      begin
+        Screen.Cursor := crHourGlass;
+        MainForm.LocateProject(CurProjectFme.ProjectData.ProjectID);
+      end;
+
       if not MainForm.CurProjectFrame.CheckFileAndCloudChekerList then
       begin
         sHint := '项目校验:“' + FWebBidName_OnLine + '”文件中的审核人和云端的审核人不一致,' +
@@ -782,7 +846,7 @@ procedure TProjectManagerFrame.actnRenameExecute(Sender: TObject);
   var
     sURL: string;
     iRename: Integer;
-    vArr: array of string;
+    vArr: array [0..0] of string;
   begin
     Result := True;
     if not G_IsCloud then Exit;
@@ -809,7 +873,7 @@ begin
   begin
     if InputNewProjectName(sName, '重命名', stnNode.Parent, stnNode.ID) then
     begin
-      if CanRename(stnNode.Rec, sName) then
+      if (sName <> stnNode.Rec.ValueByName('Name').AsString) and CanRename(stnNode.Rec, sName) then
       begin
         stnNode.Rec.ValueByName('Name').AsString := sName;
         ProjectManager.Save;
@@ -977,7 +1041,9 @@ end;
 procedure TProjectManagerFrame.actnDeleteUpdate(Sender: TObject);
 begin
   if Assigned(stdProjects.IDTree.Selected) then
-    TAction(Sender).Enabled := not CheckOpened(stdProjects.IDTree.Selected);
+    TAction(Sender).Enabled := not CheckOpened(stdProjects.IDTree.Selected)
+  else
+    TAction(Sender).Enabled := False;
 end;
 
 function TProjectManagerFrame.CheckOpened(ANode: TsdIDTreeNode): Boolean;
@@ -1021,7 +1087,7 @@ var
     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]));
+      AArr[2], sPicPath, AArr[6], TCheckStatus(StrToInt(AArr[5])-1));
     vChecker.Name := 'ProjectOrderFrame' + AArr[0];
   end;
 
@@ -1032,16 +1098,20 @@ var
       TOrderCheckerFrame(sbChecker.Controls[k]).Order := k + 1;
   end;
 
+<<<<<<< HEAD
   procedure ShowProjectCheckers;
   var i, j, n: Integer;
     vOwner: array of string;  // 业主信息
+=======
+  procedure RefreshProjectCheckers;
+  var i, j: Integer;
+    vOwner: array[0..6] of string;    // 业主信息
+>>>>>>> 3.1.5
   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
     begin
@@ -1050,7 +1120,7 @@ var
 
       if StrToInt(vCArr[i, 0]) = FWebOwnerID then
       begin
-        for j := 0 to n - 1 do
+        for j := 0 to 6 do
           vOwner[j] := vCArr[i, j];
 
         Continue;
@@ -1375,17 +1445,23 @@ end;
 procedure TProjectManagerFrame.actnRenameUpdate(Sender: TObject);
 var
   Rec: TsdDataRecord;
-  bNet: Boolean;
+  bNet, bEnabled: Boolean;
 begin
-  if stdProjects.IDTree.Selected = nil then Exit;
-  Rec := stdProjects.IDTree.Selected.Rec;
-  if Rec = nil then Exit;
-  bNet := G_IsCloud;
-  if bNet then
+  if Assigned(stdProjects.IDTree.Selected) and Assigned(stdProjects.IDTree.Selected.Rec) then
   begin
-    tobtnRenane.Enabled := (Rec.ValueByName('Type').AsInteger = 1) and
-      (Rec.ValueByName('WebAuthorID').AsInteger = PHPWeb.UserID);
-  end;
+    bEnabled := True;
+    Rec := stdProjects.IDTree.Selected.Rec;
+    bNet := G_IsCloud;
+    if bNet then
+    begin
+      bEnabled := (Rec.ValueByName('Type').AsInteger = 1) and
+        (Rec.ValueByName('WebAuthorID').AsInteger = PHPWeb.UserID);
+    end;
+  end
+  else
+    bEnabled := False;
+  if bEnabled <> TAction(Sender).Enabled then
+    TAction(Sender).Enabled := bEnabled;
 end;
 
 procedure TProjectManagerFrame.CheckBidName(AID: Integer; ANewBidName: string);
@@ -1683,6 +1759,7 @@ begin
   end;
 end;
 
+<<<<<<< HEAD
 function TProjectManagerFrame.FileDownAndReceive(ADownURL: string; AReceiveKind: Integer): Boolean;
 var sLocalFile, sHint: string;
   bCanImp: Boolean;
@@ -1795,6 +1872,17 @@ begin
         ABegin := 1;
     end;
   end;
+=======
+procedure TProjectManagerFrame.actnExportUpdate(Sender: TObject);
+begin
+  TAction(Sender).Enabled := Assigned(stdProjects.IDTree.Selected);
+end;
+
+procedure TProjectManagerFrame.actnOpenBackupFolderUpdate(Sender: TObject);
+begin
+  TAction(Sender).Enabled := Assigned(stdProjects.IDTree.Selected) and
+    (stdProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = 1);
+>>>>>>> 3.1.5
 end;
 
 end.

+ 4 - 5
TenderPartition/tpSelectTendersFrm.dfm

@@ -21,9 +21,8 @@ object SelectTendersForm: TSelectTendersForm
   object lblTenderResult: TLabel
     Left = 8
     Top = 355
-    Width = 204
+    Width = 6
     Height = 12
-    Caption = #24403#21069#36873#20013#65306' '#26631#27573' %d '#20010#65292#37329#39069#21512#35745' %f'
   end
   object btnOk: TButton
     Left = 455
@@ -85,7 +84,7 @@ object SelectTendersForm: TSelectTendersForm
         Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection, goShowTreeLine]
         OptionsEx = []
         ColCount = 3
-        RowCount = 2
+        RowCount = 1
         ShowGridLine = False
         DefaultColWidth = 35
         DefaultFixedColWidth = 25
@@ -229,7 +228,7 @@ object SelectTendersForm: TSelectTendersForm
     ParentFieldName = 'ParentID'
     NextSiblingFieldName = 'NextSiblingID'
     TopLevelBold = True
-    Left = 500
-    Top = 193
+    Left = 100
+    Top = 177
   end
 end

+ 7 - 7
TenderPartition/tpTrialPegInputFrm.dfm

@@ -5,29 +5,29 @@ object TrialPegInputForm: TTrialPegInputForm
   Height = 123
   Caption = #35797#31639#26729#21495#33539#22260
   Color = clBtnFace
-  Font.Charset = DEFAULT_CHARSET
+  Font.Charset = ANSI_CHARSET
   Font.Color = clWindowText
-  Font.Height = -11
-  Font.Name = 'MS Sans Serif'
+  Font.Height = -12
+  Font.Name = #23435#20307
   Font.Style = []
   OldCreateOrder = False
   PixelsPerInch = 96
-  TextHeight = 13
+  TextHeight = 12
   object lblHint: TLabel
     Left = 8
     Top = 8
     Width = 132
-    Height = 13
+    Height = 12
     Caption = #35831#36755#20837#35797#31639#30340#26729#21495#33539#22260#65306
   end
   object lePeg: TLabeledEdit
     Left = 96
     Top = 32
     Width = 201
-    Height = 19
+    Height = 18
     Ctl3D = False
     EditLabel.Width = 60
-    EditLabel.Height = 13
+    EditLabel.Height = 12
     EditLabel.Caption = #36215#35755#26729#21495#65306
     LabelPosition = lpLeft
     ParentCtl3D = False

+ 25 - 0
Units/BillsClipboard.pas

@@ -17,9 +17,14 @@ type
     FUnits: string;
     FPrice: Double;
     FOrgQuantity: Double;
+    FOrgTotalPrice: Double;
     FMisQuantity: Double;
+    FMisTotalPrice: Double;
     FOthQuantity: Double;
+    FOthTotalPrice: Double;
     FQuantity: Double;
+    FTotalPrice: Double;
+    FCalcType: Integer;
     FDrawingCode: string;
     FAlias: string;
     FDgnQuantity1: Double;
@@ -135,9 +140,14 @@ begin
   vNode.FUnits := ANode.Rec.ValueByName('Units').AsString;
   vNode.FPrice := ANode.Rec.ValueByName('Price').AsFloat;
   vNode.FOrgQuantity := ANode.Rec.ValueByName('OrgQuantity').AsFloat;
+  vNode.FOrgTotalPrice := ANode.Rec.ValueByName('OrgTotalPrice').AsFloat;
   vNode.FMisQuantity := ANode.Rec.ValueByName('MisQuantity').AsFloat;
+  vNode.FMisTotalPrice := ANode.Rec.ValueByName('MisTotalPrice').AsFloat;
   vNode.FOthQuantity := ANode.Rec.ValueByName('OthQuantity').AsFloat;
+  vNode.FOthTotalPrice := ANode.Rec.ValueByName('OthTotalPrice').AsFloat;
   vNode.FQuantity := ANode.Rec.ValueByName('Quantity').AsFloat;
+  vNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
+  vNode.FCalcType := ANode.Rec.ValueByName('CalcType').AsInteger;
   vNode.FDrawingCode := ANode.Rec.ValueByName('DrawingCode').AsString;
   vNode.FAlias := ANode.Rec.ValueByName('Alias').AsString;
   vNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
@@ -221,9 +231,14 @@ begin
   ANode.Rec.ValueByName('Units').AsString := APasteNode.FUnits;
   ANode.Rec.ValueByName('Price').AsFloat := APasteNode.FPrice;
   ANode.Rec.ValueByName('OrgQuantity').AsFloat := QuantityRoundTo(APasteNode.FOrgQuantity);
+  ANode.Rec.ValueByName('OrgTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FOrgTotalPrice);
   ANode.Rec.ValueByName('MisQuantity').AsFloat := QuantityRoundTo(APasteNode.FMisQuantity);
+  ANode.Rec.ValueByName('MisTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FMisTotalPrice);
   ANode.Rec.ValueByName('OthQuantity').AsFloat := QuantityRoundTo(APasteNode.FOthQuantity);
+  ANode.Rec.ValueByName('OthTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FOthTotalPrice);
   ANode.Rec.ValueByName('Quantity').AsFloat := QuantityRoundTo(APasteNode.FQuantity);
+  ANode.Rec.ValueByName('TotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FTotalPrice);
+  ANode.Rec.ValueByName('CalcType').AsInteger := APasteNode.FCalcType;
   ANode.Rec.ValueByName('DrawingCode').AsString := APasteNode.FDrawingCode;
   ANode.Rec.ValueByName('Alias').AsString := APasteNode.FAlias;
   ANode.Rec.ValueByName('DgnQuantity1').AsFloat := QuantityRoundTo(APasteNode.FDgnQuantity1);
@@ -302,9 +317,14 @@ begin
   FUnits := AXmlNode.Attributes['Units'];
   FPrice := AXmlNode.Attributes['Price'];
   FOrgQuantity := AXmlNode.Attributes['OrgQuantity'];
+  FOrgTotalPrice := AXmlNode.Attributes['OrgTotalPrice'];
   FMisQuantity := AXmlNode.Attributes['MisQuantity'];
+  FMisTotalPrice := AXmlNode.Attributes['MisTotalPrice'];
   FOthQuantity := AXmlNode.Attributes['OthQuantity'];
+  FOthTotalPrice := AXmlNode.Attributes['OthTotalPrice'];
   FQuantity := AXmlNode.Attributes['Quantity'];
+  FTotalPrice := AXmlNode.Attributes['TotalPrice'];
+  FCalcType := AXmlNode.Attributes['CalcType'];
   FDrawingCode := AXmlNode.Attributes['DrawingCode'];
   FAlias := AXmlNode.Attributes['Alias'];
   FDgnQuantity1 := AXmlNode.Attributes['DgnQuantity1'];
@@ -325,9 +345,14 @@ begin
   AXmlNode.Attributes['Units'] := FUnits;
   AXmlNode.Attributes['Price'] := FPrice;
   AXmlNode.Attributes['OrgQuantity'] := FOrgQuantity;
+  AXmlNode.Attributes['OrgTotalPrice'] := FOrgTotalPrice;
   AXmlNode.Attributes['MisQuantity'] := FMisQuantity;
+  AXmlNode.Attributes['MisTotalPrice'] := FMisTotalPrice;
   AXmlNode.Attributes['OthQuantity'] := FOthQuantity;
+  AXmlNode.Attributes['OthTotalPrice'] := FOthTotalPrice;
   AXmlNode.Attributes['Quantity'] := FQuantity;
+  AXmlNode.Attributes['TotalPrice'] := FTotalPrice;
+  AXmlNode.Attributes['CalcType'] := FCalcType;
   AXmlNode.Attributes['DrawingCode'] := FDrawingCode;
   AXmlNode.Attributes['Alias'] := FAlias;
   AXmlNode.Attributes['DgnQuantity1'] := FDgnQuantity1;

+ 198 - 23
Units/BillsTree.pas

@@ -3,13 +3,13 @@ unit BillsTree;
 interface
 
 uses
-  sdIDTree, sdDB, mDataRecord;
+  sdIDTree, sdDB, mDataRecord, ZhAPI;
 
 type
-  TReCalculateTreeNode = procedure(AID: Integer) of Object;
-
   TBillsIDTreeNode = class(TsdIDTreeNode)
-  private
+  private     
+    FStageRec: TStageRecord;
+
     FDealQuantity: Double;
     FDealTotalPrice: Double;
     FQcQuantity: Double;
@@ -19,12 +19,12 @@ type
     FGatherTotalPrice: Double;
     FGatherQuantity: Double;
 
-    FStageRec: TStageRecord;
-
     function HasCountPrice: Boolean;
     function HasTotalPrice: Boolean;
 
     function GetRec: TBillsRecord;
+    function GetChapterParentID: Integer;
+    function GetChapterParent: TBillsIDTreeNode;
   public
     function CanUpLevel: Boolean; override;
     function CanDownLevel: Boolean; override;
@@ -40,8 +40,14 @@ type
     function CountPriceEnable: Boolean;
     function TotalPriceEnable: Boolean;
 
+    procedure RecodeChildrenCode(const AParentCode: string);
+    procedure RecodeChildrenB_Code(const AParentCode: string);
+
     property Rec: TBillsRecord read GetRec;
 
+    property ChapterParent: TBillsIDTreeNode read GetChapterParent;
+    property ChapterParentID: Integer read GetChapterParentID;
+
     property DealQuantity: Double read FDealQuantity write FDealQuantity;
     property DealTotalPrice: Double read FDealTotalPrice write FDealTotalPrice;
     property QcQuantity: Double read FQcQuantity write FQcQuantity;
@@ -50,16 +56,14 @@ type
     property PcTotalPrice: Double read FPcTotalPrice write FPcTotalPrice;
     property GatherQuantity: Double read FGatherQuantity write FGatherQuantity;
     property GatherTotalPrice: Double read FGatherTotalPrice write FGatherTotalPrice;
+
     // Cache Data
     property StageRec: TStageRecord read FStageRec write FStageRec;
   end;
 
-  TbitAfterDeleteNode = procedure (AParent: TsdIDTreeNode) of object;
+  TReCalculateNode = procedure(AID: Integer) of object;
 
   TBillsIDTree = class(TsdIDTree)
-  private
-    FDoOnAfterDeleteNode: TbitAfterDeleteNode;
-    FOnReCalcParent: TReCalculateTreeNode;
   protected
     function CreateItem: TsdIDTreeNode; override;
   public
@@ -67,10 +71,42 @@ type
     function DeleteNode(ANode: TsdIDTreeNode): Boolean; override;
 
     function Add(AParentID, ANextSiblingID: TsdTreeNodeID): TsdIDTreeNode; override;
-    procedure DoOnReCalcParent(AID: Integer);
 
-    property DoOnAfterDeleteNode: TbitAfterDeleteNode read FDoOnAfterDeleteNode write FDoOnAfterDeleteNode;
-    property OnReCalcParent: TReCalculateTreeNode read FOnReCalcParent write FOnReCalcParent;
+    procedure RecodeChildrenCode(ANode: TBillsIDTreeNode; AOrgCode, ANewCode: string);
+    procedure RecodeChildrenB_Code(ANode: TBillsIDTreeNode; AOrgCode, ANewCode: string);
+
+    procedure DoOnReCalcNode(AID: Integer); overload; virtual; abstract;
+    procedure DoOnReCalcNode(ANode: TsdIDTreeNode); overload; virtual; abstract;
+  end;
+
+  TCompileBillsIDTree = class(TBillsIDTree)
+  private
+    FOnReCalcNode: TReCalculateNode;
+  public
+    procedure DoOnReCalcNode(AID: Integer); overload; override;
+    procedure DoOnReCalcNode(ANode: TsdIDTreeNode); overload; override;
+
+    property OnReCalcNode: TReCalculateNode read FOnReCalcNode write FOnReCalcNode;
+  end;
+
+  TMeasureBillsIDTreeNode = class(TBillsIDTreeNode)
+  private
+    FStageRec: TStageRecord;
+  public
+    // Cache Data
+    property StageRec: TStageRecord read FStageRec write FStageRec;
+  end;
+
+  TMeasureBillsIDTree = class(TBillsIDTree)
+  private
+    FCompileTree: TCompileBillsIDTree;
+  protected
+    function CreateItem: TsdIDTreeNode; override;
+  public
+    procedure DoOnReCalcNode(AID: Integer); overload; override;
+    procedure DoOnReCalcNode(ANode: TsdIDTreeNode); overload; override;
+
+    property CompileTree: TCompileBillsIDTree read FCompileTree write FCompileTree;
   end;
 
   TEstimateIDTreeNode = class(TsdIDTreeNode)
@@ -85,6 +121,8 @@ type
 
 implementation
 
+uses SysUtils;
+
 { TBillsIDTree }
 
 function TBillsIDTree.Add(AParentID,
@@ -121,14 +159,61 @@ var
 begin
   vParent := ANode.Parent;
   Result := inherited DeleteNode(ANode);
-  if Assigned(FDoOnAfterDeleteNode) then
-    FDoOnAfterDeleteNode(vParent);
+  DoOnReCalcNode(vParent);
 end;
 
-procedure TBillsIDTree.DoOnReCalcParent(AID: Integer);
+procedure TBillsIDTree.RecodeChildrenB_Code(ANode: TBillsIDTreeNode;
+  AOrgCode, ANewCode: string);
+var
+  iCount, iTotal: Integer;
+  vChild: TBillsIDTreeNode;
 begin
-  if Assigned(FOnReCalcParent) then
-    FOnReCalcParent(AID);
+  if (ANewCode = '') or (AOrgCode = '') or (AOrgCode = ANewCode) then Exit;
+
+  iCount := 0;
+  iTotal := ANode.PosterityCount;
+  vChild := TBillsIDTreeNode(ANode.NextNode);
+  while (iCount < iTotal) and Assigned(vChild) do
+  begin
+    if vChild.Rec.B_Code.AsString <> '' then
+    begin
+      if Pos(AOrgCode+'-', vChild.Rec.B_Code.AsString) = 1 then
+      begin
+        vChild.Rec.B_Code.AsString := StringReplace(vChild.Rec.B_Code.AsString,
+            AOrgCode+'-', ANewCode+'-', []);
+        vChild.Rec.SetBoolValue(vChild.Rec.LockedInfo, False);
+      end;
+    end;
+    vChild := TBillsIDTreeNode(vChild.NextNode);
+    Inc(iCount);
+  end;
+end;
+
+procedure TBillsIDTree.RecodeChildrenCode(ANode: TBillsIDTreeNode;
+  AOrgCode, ANewCode: string);
+var
+  iCount, iTotal: Integer;
+  vChild: TBillsIDTreeNode;
+begin
+  if (ANewCode = '') or (AOrgCode = '') or (AOrgCode = ANewCode) then Exit;
+
+  iCount := 0;
+  iTotal := ANode.PosterityCount;
+  vChild := TBillsIDTreeNode(ANode.NextNode);
+  while (iCount < iTotal) and Assigned(vChild) do
+  begin
+    if vChild.Rec.Code.AsString <> '' then
+    begin
+      if Pos(AOrgCode+'-', vChild.Rec.Code.AsString) = 1 then
+      begin
+        vChild.Rec.Code.AsString := StringReplace(vChild.Rec.Code.AsString,
+            AOrgCode+'-', ANewCode+'-', []);
+        vChild.Rec.SetBoolValue(vChild.Rec.LockedInfo, False);
+      end;
+    end;
+    vChild := TBillsIDTreeNode(vChild.NextNode);
+    Inc(iCount);
+  end;
 end;
 
 { TBillsIDTreeNode }
@@ -199,9 +284,30 @@ begin
     Parent.Rec.ValueByName('Quantity').AsFloat := 0;
     Parent.Rec.ValueByName('Price').AsFloat := 0;
   end;
-                                                   
-  TBillsIDTree(Owner).OnReCalcParent(ParentID);
-  TBillsIDTree(Owner).OnReCalcParent(iOrgParentID);
+
+  TBillsIDTree(Owner).DoOnReCalcNode(ParentID);
+  TBillsIDTree(Owner).DoOnReCalcNode(iOrgParentID);
+end;
+
+function TBillsIDTreeNode.GetChapterParent: TBillsIDTreeNode;
+begin
+  Result := nil;
+  if Self.Level <= 1 then Exit;
+
+  Result := TBillsIDTreeNode(Self.Parent);
+  while Result.Level > 1 do
+    Result := TBillsIDTreeNode(Result.Parent);
+end;
+
+function TBillsIDTreeNode.GetChapterParentID: Integer;
+var
+  vNode: TBillsIDTreeNode;
+begin
+  vNode := GetChapterParent;
+  if Assigned(vNode) then
+    Result := vNode.ID
+  else
+    Result := -1;
 end;
 
 function TBillsIDTreeNode.GetRec: TBillsRecord;
@@ -254,6 +360,42 @@ begin
          or (Rec.AddPcTotalPrice.AsFloat <> 0);
 end;
 
+procedure TBillsIDTreeNode.RecodeChildrenB_Code(const AParentCode: string);
+var
+  iChild: Integer;
+  vChild: TBillsIDTreeNode;
+begin
+  if (AParentCode = '') then Exit;
+
+  for iChild := 0 to Self.ChildCount - 1 do
+  begin
+    vChild := TBillsIDTreeNode(Self.ChildNodes[iChild]);
+    if vChild.Rec.B_Code.AsString <> '' then
+    begin
+      vChild.Rec.SetStrValue(vChild.Rec.B_Code, AParentCode + '-' + GetLastSetmentOfCode(AParentCode));
+      vChild.Rec.SetBoolValue(vChild.Rec.LockedInfo, False);
+    end;
+  end;
+end;
+
+procedure TBillsIDTreeNode.RecodeChildrenCode(const AParentCode: string);
+var
+  iChild: Integer;
+  vChild: TBillsIDTreeNode;
+begin
+  if (AParentCode = '') then Exit;
+
+  for iChild := 0 to Self.ChildCount - 1 do
+  begin
+    vChild := TBillsIDTreeNode(Self.ChildNodes[iChild]);
+    if vChild.Rec.Code.AsString <> '' then
+    begin
+      vChild.Rec.SetStrValue(vChild.Rec.Code, AParentCode + '-' + GetLastSetmentOfCode(AParentCode));
+      vChild.Rec.SetBoolValue(vChild.Rec.LockedInfo, False);
+    end;
+  end;
+end;
+
 function TBillsIDTreeNode.TotalPriceEnable: Boolean;
 begin
   Result := not HasCountPrice;
@@ -277,8 +419,8 @@ begin
     Rec.ValueByName('Price').AsFloat := 0;
   end;
 
-  TBillsIDTree(Owner).OnReCalcParent(iOrgParentID);
-  TBillsIDTree(Owner).OnReCalcParent(ParentID);
+  TBillsIDTree(Owner).DoOnReCalcNode(iOrgParentID);
+  TBillsIDTree(Owner).DoOnReCalcNode(ParentID);
 end;
 
 { TEstimateIDTreeNode }
@@ -308,4 +450,37 @@ begin
   Result := TEstimateIDTreeNode.Create(Self);
 end;
 
+{ TCompileBillsIDTree }
+
+procedure TCompileBillsIDTree.DoOnReCalcNode(AID: Integer);
+begin
+  if (AID <> -1) and Assigned(FOnReCalcNode) then
+    FOnReCalcNode(AID);
+end;
+
+procedure TCompileBillsIDTree.DoOnReCalcNode(ANode: TsdIDTreeNode);
+begin
+  if Assigned(ANode) then
+    DoOnReCalcNode(ANode.ID);
+end;
+
+{ TMeasureBillsIDTree }
+
+procedure TMeasureBillsIDTree.DoOnReCalcNode(AID: Integer);
+begin
+  if Assigned(FCompileTree) then
+    FCompileTree.DoOnReCalcNode(AID);
+end;
+
+function TMeasureBillsIDTree.CreateItem: TsdIDTreeNode;
+begin
+  Result := TMeasureBillsIDTreeNode.Create(Self);  
+end;
+
+procedure TMeasureBillsIDTree.DoOnReCalcNode(ANode: TsdIDTreeNode);
+begin
+  if Assigned(FCompileTree) then
+    FCompileTree.DoOnReCalcNode(ANode);
+end;
+
 end.

+ 1 - 1
Units/ConstUnit.pas

@@ -61,7 +61,7 @@ const
 
 
 var
-  G_CompanyName, G_MeasureURL, G_Server, G_ServerType: string;
+  G_CompanyName, G_MeasureURL, G_Server, G_ServerType, G_GuideURL: string;
 
 implementation
 

+ 3 - 1
Units/DataBaseTables.pas

@@ -103,7 +103,7 @@ const
 
   {헌데鑒앴 -- 憩瑯긍서썹충}
   SBills = 'Bills';
-  tdBills: array [0..83] of TScFieldDef =(
+  tdBills: array [0..84] of TScFieldDef =(
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     (FieldName: 'ParentID'; FieldType: ftInteger; Size: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'NextSiblingID'; FieldType: ftInteger; Size: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
@@ -124,6 +124,8 @@ const
     (FieldName: 'XiMuCode'; FieldType: ftString; Size: 30; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 묏넋좆헌데탤埼긍뵀
     (FieldName: 'IndexCode'; FieldType: ftString; Size: 50; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 覽섬만淃ID
+    (FieldName: 'ChapterParentID'; FieldType: ftInteger; size: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // --------- End   괩깊淚痰 -------
     (FieldName: 'Code'; FieldType: ftString; Size: 50; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'B_Code'; FieldType: ftString; Size: 50; NotNull: False; PrimaryKey: False; ForceUpdate: False),

+ 23 - 12
Units/DetailExcelImport.pas

@@ -366,7 +366,7 @@ begin
   else
   begin
     while FCurRow <= iEndRow do
-      LoadBillsNode(AXlsFile, vXmj);
+      LoadBillsNode(AXlsFile, AParent);
   end;
 end;
 
@@ -531,20 +531,26 @@ var
   iEndRow: Integer;
 begin
   sName := Trim(GetCellValue(AXlsFile, FCurRow, FXmjLevel7Col));
-  if sName = '' then Exit;
-
-  vXmj := FCacheTree.FindXmjChild(AParent, '', sName);
-  if not Assigned(vXmj) then
+  if sName <> '' then
   begin
-    vXmj := FCacheTree.AddNode(AParent);
-    vXmj.Name := sName;
-  end;
+    vXmj := FCacheTree.FindXmjChild(AParent, '', sName);
+    if not Assigned(vXmj) then
+    begin
+      vXmj := FCacheTree.AddNode(AParent);
+      vXmj.Name := sName;
+    end;
 
-  with AXlsFile.CellMergedBounds[FCurRow, FXmjLevel7Col] do
-    iEndRow := FCurRow + Bottom - Top;
+    with AXlsFile.CellMergedBounds[FCurRow, FXmjLevel7Col] do
+      iEndRow := FCurRow + Bottom - Top;
 
-  while FCurRow <= iEndRow do
-    LoadBillsNode(AXlsFile, vXmj);
+    while FCurRow <= iEndRow do
+      LoadBillsNode(AXlsFile, vXmj);
+  end
+  else
+  begin
+    while FCurRow <= iEndRow do
+      LoadBillsNode(AXlsFile, AParent);  
+  end;
 end;
 
 procedure TPlaneFxBillsExcelImport.WriteNodes(ADataSet: TsdDataSet);
@@ -604,12 +610,17 @@ begin
 end;
 
 procedure TPlaneFxBillsExcelImport.EndImport;
+var
+  ParentRec: TsdDataRecord;
 begin
   FCacheTree.Free;
 
   FProjectData.BillsData.EnableEvents;
   FProjectData.ReConnectTree;
 
+  ParentRec := FProjectData.BillsData.sddBills.FindKey('idxID', ParentID);
+  FProjectData.BillsCompileData.sdvBillsCompile.LocateInControl(ParentRec);
+
   FProjectData.BillsCompileData.CalculateAll;
 
   CloseProgressHint;

+ 5 - 0
Units/ExcelImport.pas

@@ -828,6 +828,8 @@ begin
 end;
 
 procedure TGclBillsExcelImport.EndImport;
+var
+  ParentRec: TsdDataRecord;
 begin
   FSelectSheets.Free;
 
@@ -836,6 +838,9 @@ begin
   FProjectData.BillsData.EnableEvents;
   FProjectData.ReConnectTree;
 
+  ParentRec := FProjectData.BillsData.sddBills.FindKey('idxID', ParentID);
+  FProjectData.BillsCompileData.sdvBillsCompile.LocateInControl(ParentRec);
+
   FProjectData.BillsCompileData.CalculateAll;
 
   CloseProgressHint;

+ 4 - 4
Units/GclBillsGatherModel.pas

@@ -371,7 +371,7 @@ type
     function GetGclNode(const AB_Code, AName, AUnits: string; APrice: Double): TGclNode; overload;
     function GetGclNode(ARec: TBillsRecord): TGclNode; overload;
 
-    procedure AddBillsNode(ANode: TBillsIDTreeNode);
+    procedure AddBillsNode(ANode: TMeasureBillsIDTreeNode);
     procedure GatherBillsData;
     procedure GatherDealData;
     procedure GatherBGLData;
@@ -406,7 +406,7 @@ uses
 
 { TGclGatherModel }
 
-procedure TGclGatherModel.AddBillsNode(ANode: TBillsIDTreeNode);
+procedure TGclGatherModel.AddBillsNode(ANode: TMeasureBillsIDTreeNode);
 var
   vGclNode: TGclNode;
   vDetailGclNode: TDetailGclNode;
@@ -589,11 +589,11 @@ end;
 procedure TGclGatherModel.GatherBillsData;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   for i := 0 to FBillsTree.Count - 1 do
   begin
-    vNode := TBillsIDTreeNode(FBillsTree.Items[i]);
+    vNode := TMeasureBillsIDTreeNode(FBillsTree.Items[i]);
     if not vNode.HasChildren and (vNode.Rec.B_Code.AsString <> '') then
       AddBillsNode(vNode);
   end;

+ 1 - 1
Units/MCacheTree.pas

@@ -844,7 +844,7 @@ function TGclCacheTree.AddNodeByB_Code(
   function FindParent: TGclCacheNode;
   begin
     Result := FLastNode;
-    while Assigned(Result) and (Result.B_Code <> '') and (Pos(Result.B_Code + '-', AB_Code) <> 1) do
+    while Assigned(Result) and (Result <> Root) and (Result.B_Code <> '') and (Pos(Result.B_Code + '-', AB_Code) <> 1) do
       Result := TGclCacheNode(Result.Parent);
   end;
 

+ 83 - 4
Units/ProjectData.pas

@@ -95,6 +95,7 @@ type
     function GetPriceMarginReadOnly: Boolean;
     function GetStageIndex: Integer;
     procedure SetStageIndex(const Value: Integer);
+    function GetCanInsertNormalBills: Boolean;
   public
     constructor Create;
     destructor Destroy; override;
@@ -207,6 +208,7 @@ type
     property PriceMarginReadOnly: Boolean read GetPriceMarginReadOnly;
 
     property CanUnlockInfo: Boolean read FCanUnlockInfo write FCanUnlockInfo;
+    property CanInsertNormalBills: Boolean read GetCanInsertNormalBills;
 
     property ProjectName: string read FProjectName;
     // 磁盘上存储该项目的文件名称
@@ -475,6 +477,7 @@ begin
   FBillsData.Save;
   UpdateSysProgress(170, '正在保存数据');
 
+  FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
   FProjProperties.Save;
   UpdateSysProgress(180, '正在保存数据');
   FConnection.Save;
@@ -699,7 +702,8 @@ procedure TProjectData.ExportJson_Bills(const AFileName: string);
     for i := 0 to BillsMeasureData.BillsMeasureTree.Count - 1 do
     begin
       vRec := BillsMeasureData.BillsMeasureTree.Items[i].Rec;
-      ProgressProRun('导出用于Web展示的清单、汇总数据等... ' + IntToStr(i + 1), 0, pmtEdit);
+      if (i mod 100) = 0 then
+        ProgressProRun('生成汇总数据... ' + IntToStr(i), 0, pmtEdit, pptSet);
       if i = 0 then
         sSplit := ''
       else
@@ -1168,7 +1172,8 @@ procedure TProjectData.ImportCloudTenderFile(const AFileName: string);
                 '    Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo'+
                 '  From Bills In ''%s''';
 
-    sDealBillsSql = 'Insert Into DealBills Select * From DealBills In ''%s''';
+    sDealBillsSql = 'Insert Into DealBills Select ID, B_Code, Name, Units, Price, Quantity, TotalPrice'+
+                    '  From DealBills In ''%s''';
 
     sDealPaymentSql = 'Insert Into DealPayment (ID, Name, CalcType, IsMinus,'+
                       '    Formula, StartedPrice, SFormula, RangePrice, RFormula)'+
@@ -1222,8 +1227,10 @@ procedure TProjectData.ImportCloudTenderFile(const AFileName: string);
   procedure EndCopyData;
   begin
     OpenAllData;
-    ReConnectTree;
+    FProjProperties.Reload;
     FProjProperties.UpdateFlag := 1;
+    ReConnectTree;
+    ResetFloatDigitView;
     BillsCompileData.CalculateAll;
   end;
 
@@ -1549,14 +1556,78 @@ procedure TProjectData.ResetFloatDigitView;
     end;
   end;
 
+  procedure SetBillsGatherDigit;
+  begin
+    with FBillsGatherData.sdvGclBills do
+    begin
+      Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
+
+      Columns.FindColumn('DealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('DealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('BGLQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('BGLTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+
+      Columns.FindColumn('CurDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('CurDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('CurQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('CurQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('CurGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('CurGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+
+      Columns.FindColumn('PreDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('PreDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('PreQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('PreQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('PreGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('PreGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+
+      Columns.FindColumn('AddDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('AddDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('AddQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('AddQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('AddGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('AddGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+
+      Columns.FindColumn('EndDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('EndDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('EndQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('EndQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+      Columns.FindColumn('EndGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('EndGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+
+      Columns.FindColumn('Deal_BGLQuantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('Deal_BGLTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+    end;
+
+    with FBillsGatherData.sdvDetailGclBills do
+    begin
+      Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
+    end;
+
+    with FBillsGatherData.sdvDetailDealBills do
+    begin
+      Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+    end;
+
+    with FBillsGatherData.sdvDetailBGLBills do
+    begin
+      Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
+      Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
+    end;
+  end;
+
 begin
   SetBillsCompileDigit;
   SetBillsMeasureDigit;
+  SetBillsGatherDigit;
 end;
 
 function TProjectData.GetStageDataReadOnly: Boolean;
 begin
- if FPhaseData.Active then
+  if FPhaseData.Active then
     Result := FPhaseData.StageDataReadOnly
   else
     Result := True;
@@ -1713,4 +1784,12 @@ begin
   end;
 end;
 
+function TProjectData.GetCanInsertNormalBills: Boolean;
+begin
+  if FProjProperties.PhaseCount > 0 then
+    Result := CanUnlockInfo
+  else
+    Result := True;
+end;
+
 end.

+ 11 - 0
Units/ProjectProperty.pas

@@ -121,6 +121,7 @@ type
 
     procedure Open(AConnection: TADOConnection);
     procedure Save;
+    procedure Reload;
 
     {Submit-Audit-Reply}
     // ¹²¼ÆÖÕÉó¼ÆÁ¿ÆÚÊý
@@ -484,6 +485,16 @@ begin
   FUpdateFlag := GetIntPropertyDef('UpdateFlag', 0);
 end;
 
+procedure TProjProperties.Reload;
+begin
+  LoadBaseProperties;
+  LoadViewProperties;
+  LoadDealInfo;
+  LoadTechParameters;
+  LoadCalcParameters;
+  FUnlockInfoPassword := GetStrPropertyDef('UnlockInfoPassword', '');
+end;
+
 procedure TProjProperties.Save;
 begin
   SaveDealInfo;

+ 19 - 8
Units/ReportManager.pas

@@ -668,7 +668,10 @@ end;
 function TMemoryReportManager.GetMemoryDataSet(
   ADataSetID: Integer; AProjectData: TProjectData): TDataSet;
 begin
-  //ADataSetID := 49;
+  {if FrmHaBaiCustomizedData.hbGatherType = hbgt_CS then
+    ADataSetID := 51
+  else
+    ADataSetID := 50;}
   case ADataSetID of
     1: Result := FrmGridHeaderData.AssginData(AProjectData);   // 몹깊깊庫
     2: Result := FrmGclBillsBGData.AssignData(AProjectData, rmtPhaseGather, rmgtGather); // 묏넋좆헌데[굶퍅供냥]
@@ -685,8 +688,10 @@ begin
        // 02/03꼬겻, 07꼬겻, 08꼬겻, 09꼬겻, 11꼬겻, 12꼬겻, 16꼬겻, 17꼬겻, 18꼬겻, 19꼬겻,
        32, 33, 35, 36, 39, 40, 44,
        // 讀엑9, 讀엑06-1, 讀엑04, 讀엑01, 묏넋좆헌데쏵똑[맵據멕밗애땍齡], [밤땜凉헤땍齡]셕좆삠悧깊
-       45, 46, 47, 48, 49:
-       // 코촁뮴벗겜땍齡깊(連깊2, 連깊3, 連깊14, 連깊3-1, 連깊4-1)
+       45, 46, 47, 48, 49, 50,
+       // 코촁뮴벗겜땍齡깊(連깊2, 連깊3, 連깊14, 連깊3-1, 連깊4-1, 삔푯)
+       52, 53, 54, 55:
+       // 코촁뮴306벌돛땍齡(連깊2, 連깊3, 連깊3-1, 連깊4-1)
         Result := SelectProjectsAndAssignData(ADataSetID);
     14: Result := FrmGclBillsBGData.AssignData(AProjectData, rmtPhaseDeal, rmgtGather); // 묏넋좆헌데[굶퍅북谿]
     15: Result := FrmGclBillsBGData.AssignData(AProjectData, rmtPhaseQc, rmgtGather); // 묏넋좆헌데[굶퍅鑒좆긴뫘]
@@ -701,6 +706,7 @@ begin
     38: Result := FrmGclBillsPlaneData.AssignData(AProjectData); // 묏넋좆헌데틱충깊[르쉔0뵀憩瑯]
     42: Result := FrmGcl_XmjBillsData.AssignData(AProjectData, gxtFlowGcl); // 暾켓깃硫깊,憩瑯츠玖깊
     43: Result := FrmGcl_XmjBillsData.AssignData(AProjectData, gxtWithoutXmj); // 暾켓깃硫깊,데깃뙈헌데삠悧깊
+    51: Result := FrmHaBaiCustomizedData.AssignAssistantData(hbgt_CS); //코촁뮴벗겜、벌돛306땍齡깊--삔푯릅燎깊
   end;
   // For Inner Test
   //ShowTestForm(Result);
@@ -818,11 +824,16 @@ begin
       36: Result := FrmOtherReport1Data.AssignData(FTenders);
       39, 40: Result := FrmMentalCustomized1Data.AssignData(FTenders);
       44: Result := FrmCustomized2Data.AssignData(FTenders);
-      45: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt2);
-      46: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt3);
-      47: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt14);
-      48: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt3_1);
-      49: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt4_1);
+      45: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt2, True);
+      46: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt3, True);
+      47: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt14, True);
+      48: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt3_1, True);
+      49: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt4_1, True);
+      50: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt_CS, True);
+      52: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt2, False);
+      53: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt3, False);
+      54: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt3_1, False);
+      55: Result := FrmHaBaiCustomizedData.AssignData(FTenders, hbgt4_1, False);
       else Result := FrmBillsGatherData.AssignData(FTenders);
     end;
   end;

+ 29 - 15
Units/UtilMethods.pas

@@ -23,11 +23,11 @@ type
   function GetsdDataSetNewID(ADataSet: TsdDataSet; const AIndex: string): Integer;
 
   {Message}
-  procedure WarningMessage(const AMsg: string);
-  procedure ErrorMessage(const AMsg: string);
-  function QuestMessage(const AMsg: string): Boolean;
-  function QuestMessageYesNo(const AMsg: string): Boolean;
-  procedure TipMessage(const AMsg: string);
+  procedure WarningMessage(const AMsg: string; AHandle: THandle = 0);
+  procedure ErrorMessage(const AMsg: string; AHandle: THandle = 0);
+  function QuestMessage(const AMsg: string; AHandle: THandle = 0): Boolean;
+  function QuestMessageYesNo(const AMsg: string; AHandle: THandle = 0): Boolean;
+  procedure TipMessage(const AMsg: string; AHandle: THandle = 0);
   procedure DataSetErrorMessage(var Allow: Boolean; const AMsg: string);
 
   {Get Common Path}
@@ -181,29 +181,43 @@ begin
 end;
 
 {Message}
-procedure WarningMessage(const AMsg: string);
+
+function GetValidHandle(AHandle: THandle = 0): THandle;
+begin
+  if AHandle = 0 then
+  begin
+    if (Screen.ActiveForm <> nil) and (Screen.ActiveForm.HandleAllocated) then
+      Result := Screen.ActiveForm.Handle
+    else
+      Result := Application.Handle;
+  end
+  else
+    Result := AHandle;
+end;
+
+procedure WarningMessage(const AMsg: string; AHandle: THandle = 0);
 begin
-   MessageBox(Application.Handle, PChar(AMsg), PChar('¾¯¸æ'), MB_OK or MB_ICONWARNING);
+  MessageBox(GetValidHandle(AHandle), PChar(AMsg), PChar('¾¯¸æ'), MB_OK or MB_ICONWARNING);
 end;
 
-procedure ErrorMessage(const AMsg: string);
+procedure ErrorMessage(const AMsg: string; AHandle: THandle = 0);
 begin
-  MessageBox(Application.Handle, PChar(AMsg), PChar('´íÎó'), MB_OK or MB_ICONERROR);
+  MessageBox(GetValidHandle(AHandle), PChar(AMsg), PChar('´íÎó'), MB_OK or MB_ICONERROR);
 end;
 
-function QuestMessage(const AMsg: string): Boolean;
+function QuestMessage(const AMsg: string; AHandle: THandle = 0): Boolean;
 begin
-  Result := MessageBox(Application.Handle, PChar(AMsg), PChar('ѯÎÊ'), MB_OKCANCEL or MB_ICONQUESTION) = IDOK;
+  Result := MessageBox(GetValidHandle(AHandle), PChar(AMsg), PChar('ѯÎÊ'), MB_OKCANCEL or MB_ICONQUESTION) = IDOK;
 end;
 
-function QuestMessageYesNo(const AMsg: string): Boolean;
+function QuestMessageYesNo(const AMsg: string; AHandle: THandle = 0): Boolean;
 begin
-  Result := MessageBox(Application.Handle, PChar(AMsg), PChar('ѯÎÊ'), MB_YESNO or MB_ICONQUESTION) = IDYes;
+  Result := MessageBox(GetValidHandle(AHandle), PChar(AMsg), PChar('ѯÎÊ'), MB_YESNO or MB_ICONQUESTION) = IDYes;
 end;
 
-procedure TipMessage(const AMsg: string);
+procedure TipMessage(const AMsg: string; AHandle: THandle = 0);
 begin
-  MessageBox(Application.Handle, PChar(AMsg), PChar('Ìáʾ'), MB_OK or MB_ICONINFORMATION);
+  MessageBox(GetValidHandle(AHandle), PChar(AMsg), PChar('Ìáʾ'), MB_OK or MB_ICONINFORMATION);
 end;
 
 procedure DataSetErrorMessage(var Allow: Boolean; const AMsg: string);

+ 3 - 0
Units/mDataRecord.pas

@@ -31,6 +31,7 @@ type
     FJieCode: TsdValue;
     FXimuCode: TsdValue;
     FIndexCode: TsdValue;
+    FChapterParentID: TsdValue;
     // »ù´¡Êý¾Ý
     FCode: TsdValue;
     FB_Code: TsdValue;
@@ -119,6 +120,7 @@ type
     property JieCode: TsdValue read FJieCode;
     property XimuCode: TsdValue read FXimuCode;
     property IndexCode: TsdValue read FIndexCode;
+    property ChapterParentID: TsdValue read FChapterParentID;
 
     property Code: TsdValue read FCode;
     property B_Code: TsdValue read FB_Code;
@@ -483,6 +485,7 @@ begin
   FJieCode := ValueByName('JieCode');
   FXimuCode := ValueByName('XimuCode');
   FIndexCode := ValueByName('IndexCode');
+  FChapterParentID := ValueByName('ChapterParentID');
 
   FCode := ValueByName('Code');
   FB_Code := ValueByName('B_Code');

+ 10 - 0
res/UAC.manifest

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">  
+<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
+    <security> 
+      <requestedPrivileges> 
+        <requestedExecutionLevel level="requireAdministrator"/>
+      </requestedPrivileges> 
+    </security> 
+</trustInfo> 
+</assembly>

+ 1 - 0
res/uac.rc

@@ -0,0 +1 @@
+1 24 UAC.manifest